From 9f315c2f2f7ad3b902ee76243961e113f19eb83b Mon Sep 17 00:00:00 2001 From: Brian Zalewski Date: Mon, 28 Nov 2022 01:11:00 +0000 Subject: [PATCH] Update dotfiles/.local/share/chezmoi/home/dot_local/bin/executable_install-software, dotfiles/.local/share/chezmoi/home/dot_local/Taskfile-local.yml, dotfiles/.local/share/chezmoi/home/private_dot_config/shell/functions, dotfiles/.local/share/chezmoi/home/.chezmoiremove, dotfiles/.local/share/chezmoi/home/.chezmoi.yaml.tmpl, dotfiles/.local/share/chezmoi/home/dot_local/bin/executable_load-secrets, dotfiles/.local/share/chezmoi/home/private_dot_config/shell/aliases.tmpl, dotfiles/.local/share/chezmoi/software.yml, dotfiles/.local/share/chezmoi/home/.chezmoidata.yaml Deleted dotfiles/.local/share/chezmoi/home/symlink_Taskfile.yml, dotfiles/.local/share/chezmoi/home/dot_local/symlink_Taskfile-upstream.yml.tmpl, dotfiles/.local/share/chezmoi/home/dot_bash_profile --- .../share/chezmoi/home/.chezmoi.yaml.tmpl | 13 +- .../share/chezmoi/home/.chezmoidata.yaml | 2 +- .../.local/share/chezmoi/home/.chezmoiremove | 1 + .../share/chezmoi/home/dot_bash_profile | 16 - .../chezmoi/home/dot_local/Taskfile-local.yml | 10 + .../dot_local/bin/executable_install-software | 978 ++++++++++-------- .../dot_local/bin/executable_load-secrets | 3 + .../symlink_Taskfile-upstream.yml.tmpl | 3 - .../private_dot_config/shell/aliases.tmpl | 5 + .../home/private_dot_config/shell/functions | 2 +- .../share/chezmoi/home/symlink_Taskfile.yml | 8 - dotfiles/.local/share/chezmoi/software.yml | 7 +- 12 files changed, 560 insertions(+), 488 deletions(-) delete mode 100644 dotfiles/.local/share/chezmoi/home/dot_bash_profile create mode 100644 dotfiles/.local/share/chezmoi/home/dot_local/bin/executable_load-secrets delete mode 100644 dotfiles/.local/share/chezmoi/home/dot_local/symlink_Taskfile-upstream.yml.tmpl delete mode 100644 dotfiles/.local/share/chezmoi/home/symlink_Taskfile.yml diff --git a/dotfiles/.local/share/chezmoi/home/.chezmoi.yaml.tmpl b/dotfiles/.local/share/chezmoi/home/.chezmoi.yaml.tmpl index f83f7346..4e54cebe 100644 --- a/dotfiles/.local/share/chezmoi/home/.chezmoi.yaml.tmpl +++ b/dotfiles/.local/share/chezmoi/home/.chezmoi.yaml.tmpl @@ -1,12 +1,12 @@ -{{- $name := "Megabyte Labs" -}} -{{- $email := "noreply@megabyte.space" -}} +{{- $name := "Brian Zalewski" -}} +{{- $email := "brian@megabyte.space" -}} {{- $restricted := false -}} {{- $work := false -}} {{- $gpgKeyId := "0xF0A300E4199A1C33" -}} -{{- $gmailAddress := "noreply@gmail.com" -}} +{{- $gmailAddress := "blzalewski@gmail.com" -}} {{- $gmailAddressAppPassword := "" -}} {{- $domain := "megabyte.space" -}} -{{- $cloudflareUsername := "" -}} +{{- $cloudflareUsername := "brian@megabyte.space" -}} {{- $cloudflareToken := "" -}} {{- $cloudflareAccessKeyId := "" -}} {{- $cloudflareSecretAccessKey := "" -}} @@ -19,7 +19,7 @@ {{- $slackApiToken := "" -}} {{- $tabbyConfigId := "" -}} {{- $tabbySyncToken := "" -}} -{{- $timezone := "" -}} +{{- $timezone := "America/New_York" -}} {{- $toolchains := list "docker" "iac" "java" "kubernetes" "node" "python" "rust" "extra" "gpg" -}} {{- $data := . }} @@ -102,11 +102,10 @@ {{- $gpgKeyId = promptStringOnce $data.user "gpgKeyId" "Public GPG key ID" $gpgKeyId -}} {{- $domain = promptStringOnce $data.user "domain" "Domain" $domain -}} {{- $timezone = promptStringOnce $data.user "timezone" "Timezone" $timezone -}} -{{- $cloudflareUsername = promptStringOnce $data.user "cloudflareUsername" "CloudFlare E-Mail" $email -}} {{- $cloudflareToken = promptStringOnce $data.user "cloudflareToken" "CloudFlare API Token" $cloudflareToken -}} +{{- $githubUsername = promptStringOnce $data.user "githubUsername" "GitHub username" $githubUsername -}} {{- $gitlabReadToken = promptStringOnce $data.user "gitlabReadToken" "GitLab read-only token (See: https://github.com/gabrie30/ghorg#scm-provider-setup)" $gitlabReadToken }} {{- $githubReadToken = promptStringOnce $data.user "githubReadToken" "GitHub read-only token (See: https://github.com/gabrie30/ghorg#scm-provider-setup)" $githubReadToken }} -{{- $githubUsername = promptStringOnce $data.user "githubUsername" "GitHub username" $githubUsername -}} {{- $gmailAddress = promptStringOnce $data.user "gmailAddress" "G-mail address" $gmailAddress -}} {{- $gmailAddressAppPassword = promptStringOnce $data.user "gmailAddressAppPassword" "G-mail app password" $gmailAddressAppPassword -}} {{- $ngrokAuthToken = promptStringOnce $data.user "ngrokAuthToken" "Ngrok authentication token" $ngrokAuthToken -}} diff --git a/dotfiles/.local/share/chezmoi/home/.chezmoidata.yaml b/dotfiles/.local/share/chezmoi/home/.chezmoidata.yaml index 15f4fb3d..77dd096d 100644 --- a/dotfiles/.local/share/chezmoi/home/.chezmoidata.yaml +++ b/dotfiles/.local/share/chezmoi/home/.chezmoidata.yaml @@ -98,7 +98,7 @@ softwareGroups: - rsync - sd - shellcheck - - sops + - skate - sqlite - ssh-vault - sysbench diff --git a/dotfiles/.local/share/chezmoi/home/.chezmoiremove b/dotfiles/.local/share/chezmoi/home/.chezmoiremove index 96f27ae7..55d267f7 100644 --- a/dotfiles/.local/share/chezmoi/home/.chezmoiremove +++ b/dotfiles/.local/share/chezmoi/home/.chezmoiremove @@ -3,6 +3,7 @@ .asdf Brewfile .bash_logout +.bash_profile .cargo .dircolors .gitconfig diff --git a/dotfiles/.local/share/chezmoi/home/dot_bash_profile b/dotfiles/.local/share/chezmoi/home/dot_bash_profile deleted file mode 100644 index 2d061264..00000000 --- a/dotfiles/.local/share/chezmoi/home/dot_bash_profile +++ /dev/null @@ -1,16 +0,0 @@ -# Prefer US English -export LANG="en_US" - -# Detect support for advanced terminal features -if [ "$0" = 'bash' ] || [ "$0" = '/bin/bash' ]; then - export BASH_SUPPORT=true -fi - -# Ensure scripts in ~/.local/bin are executable -find "$HOME/.local/bin" -maxdepth 1 -type f ! -executable | while read LOCAL_BIN_FILE; do - chmod +x "$LOCAL_BIN_FILE" -done -export PATH="$PATH:$HOME/.local/bin" - -# Source the main Bash config -. "$HOME/.bashrc" diff --git a/dotfiles/.local/share/chezmoi/home/dot_local/Taskfile-local.yml b/dotfiles/.local/share/chezmoi/home/dot_local/Taskfile-local.yml index e69de29b..ee35536c 100644 --- a/dotfiles/.local/share/chezmoi/home/dot_local/Taskfile-local.yml +++ b/dotfiles/.local/share/chezmoi/home/dot_local/Taskfile-local.yml @@ -0,0 +1,10 @@ +--- +version: '3' + +# This is your local Taskfile.yml file. You can define tasks and scripts while leveraging some of the nifty +# features of https://taskfile.dev. You can safely place your scripts here and they will be combined with +# a veteran stack of Taskfile.yml files. You can access the tasks defined here by running +# `run local:default` for example. You must keep all the tasks in this file without including other files +# because the main Taskfile.yml is a symlinked one. Anyway, try `run local:default`. +tasks: + default: echo "Get started on https://taskfile.dev" diff --git a/dotfiles/.local/share/chezmoi/home/dot_local/bin/executable_install-software b/dotfiles/.local/share/chezmoi/home/dot_local/bin/executable_install-software index f399a8fb..832e7e86 100644 --- a/dotfiles/.local/share/chezmoi/home/dot_local/bin/executable_install-software +++ b/dotfiles/.local/share/chezmoi/home/dot_local/bin/executable_install-software @@ -1,311 +1,372 @@ #!/usr/bin/env zx -# yq e -o=j '.' .chezmoidata.yaml -let response = await fetch('https://gitlab.com/megabyte-labs/misc/dotfiles/-/raw/master/dotfiles/.local/share/chezmoi/software.json') -if (response.ok) { - const installData = await response.json() -} else { - await $`logg error 'Error acquiring software installation map'` +const execSync = require('child_process').execSync + +$.log = (entry) => { + if (entry.kind === 'cmd' && entry.cmd.substring(0, 4) === 'logg') { + return + } else { + log(entry) + } } -const installOrders = {} -const installOrdersPre = [] -const installOrdersPost = [] -const osType = OSType() -const osID = osType == 'linux' ? releaseID() : osType +let installData +const installOrders = {}; +const installOrdersPre = []; +const installOrdersPost = []; +const osType = await OSType(); +let osID = osType +if(osType === 'linux') { + osID = await realeaseID() +} -### Creates the installOrders object which maps package managers to arrays of packages to install -function generateInstallOrders() { - const packagesToInstall = process.argv.slice(1) - const preferenceOrder = installData.installerPreference[OSTypeInstallerKey()] - const softwarePackages = installData.softwarePackages - for(let package of packagesToInstall) { - if (softwarePackages[package + ':' osID]) { - const packageKey = package + ':' + osID - } else if (softwarePackages[package + ':' + osType]) { - const packageKey = package + ':' + osType - } else if (softwarePackages[package]) { - const packageKey = package +// Download the installation map +async function downloadInstallData() { + const response = await fetch( + "https://gitlab.com/megabyte-labs/misc/dotfiles/-/raw/master/dotfiles/.local/share/chezmoi/software.json" + ); + if (response.ok) { + return await response.json() + } else { + await $`logg error 'Failed to download the installation map'` + } +} + +// Creates the installOrders object which maps package managers to arrays of packages to install +async function generateInstallOrders() { + const packagesToInstall = process.argv.slice(3); + const installerPreference = await OSTypeInstallerKey() + const preferenceOrder = installData.installerPreference[installerPreference]; + await $`logg 'Preference order acquired:'` + console.log(preferenceOrder) + const softwarePackages = installData.softwarePackages; + 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 { - $`logg '\`'"${package}'\` not found in the installation map'` - continue + await $`logg warn 'The package \`${pkg}\` was not found in the installation map'` + continue; } - $`logg '\`'"${package}'\` found in the installation map using \`'"${packageKey}"'\`'` for (let preference of preferenceOrder) { - if (softwarePackages[packageKey][preference + ':' + osID]) { - updateInstallMaps(preference, softwarePackages[packageKey], preference + ':' + osID) - } else if (softwarePackages[packageKey][preference + ':' + osType]) { - updateInstallMaps(preference, softwarePackages[packageKey], preference + ':' + osType) + if (softwarePackages[packageKey][preference + ":" + osID]) { + await updateInstallMaps( + preference, + softwarePackages[packageKey], + preference + ":" + osID, + pkg, + packageKey + ); + break + } else if (softwarePackages[packageKey][preference + ":" + osType]) { + await updateInstallMaps( + preference, + softwarePackages[packageKey], + preference + ":" + osType, + pkg, + packageKey + ); + break } else if (softwarePackages[packageKey][preference]) { - updateInstallMaps(preference, softwarePackages[packageKey], preference) + await updateInstallMaps(preference, softwarePackages[packageKey], preference, pkg, packageKey); + break } } } - return installOrders + return installOrders; } -### Update install, pre-hook, and post-hook objects -function updateInstallMaps(preference, packages, scopedPreference) { - const preHook = getHook(packages, 'pre', scopedPreference, preference) +// Update install, pre-hook, and post-hook objects +async function updateInstallMaps(preference, packages, scopedPreference, pkg, packageKey) { + const preHook = getHook(packages, "pre", scopedPreference, preference); if (preHook) { - installOrdersPre.concat(typeof preHook === 'string' ? [preHook] : preHook) + installOrdersPre.concat(typeof preHook === "string" ? [preHook] : preHook); } - const postHook(packages, 'post', scopedPreference, preference) + const postHook = getHook(packages, "post", scopedPreference, preference); if (postHook) { - installOrdersPost.concat(typeof postHook === 'string' ? [postHook] : postHook) + installOrdersPost.concat( + typeof postHook === "string" ? [postHook] : postHook + ); } if (!installOrders[preference]) { - installOrders[preference] = [] + installOrders[preference] = []; } - const newPackages = packages[scopedPreference] - installOrders[preference].concat(typeof newPackages === 'string' ? [newPackages] : newPackages) + await $`logg 'Found a match for the package \`${pkg}\` (${packageKey} via ${scopedPreference})'` + const newPackages = packages[scopedPreference]; + installOrders[preference] = installOrders[preference].concat( + typeof newPackages === "string" ? [newPackages] : newPackages + ); } -### Get pre / post install hooks +// Get pre / post install hooks function getHook(packages, hook, scopedPreference, preference) { - const hookLabel = '_' + hook + ':' + const hookLabel = "_" + hook + ":"; if (packages[hookLabel + scopedPreference]) { - return packages[hookLabel + scopedPreference] + return packages[hookLabel + scopedPreference]; } else if (packages[hookLabel + preference]) { - return packages[hookLabel + preference] + return packages[hookLabel + preference]; } else if (packages[hookLabel + osID]) { - return packages + return packages; } else if (packages[hookLabel + osType]) { - return packages[hookLabel + osType] - } else if (packages['_pre']) { - return packages['_pre'] + return packages[hookLabel + osType]; + } else if (packages["_" + hook]) { + return packages["_" + hook]; } } -### Acquire OS type installer key (for the installerPreference data key) +// Acquire OS type installer key (for the installerPreference data key) async function OSTypeInstallerKey() { - const osTypeKey = await $` - if [ -d /Applications ] && [ -d /Library ]; then - echo 'darwin' - elif command -v apt > /dev/null; then - echo 'apt' - elif command -v dnf > /dev/null; then - echo 'dnf' - elif command -v pacman > /dev/null; then - echo 'pacman' - elif command -v zypper > /dev/null; then - echo 'zypper' - elif command -v pkg > /dev/null; then - echo 'freebsd' - else - echo 'windows' - fi - ` - return osTypeKey + const apt = which.sync('apt-get', { nothrow: true }) + const dnf = which.sync('dnf', { nothrow: true }) + const freebsd = which.sync('pkg', { 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 (freebsd) { + return 'freebsd' + } else { + const macOS = await $`test -d /Applications && test -d Library` + if (macOS.exitCode === 0) { + return 'darwin' + } else { + return 'windows' + } + } } -### Acquire OS type +// Acquire OS type async function OSType() { - const osType = await $` - if [ -d /Applications ] && [ -d /Library ]; then - echo 'darwin' - elif [ -f /etc/os-release ]; then - echo 'linux' - else - echo 'windows' - fi - ` - return 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) +// Acquire release ID (for Linux) async function releaseID() { const ID = await $` - . /etc/os-release - echo $ID - ` - return ID + if [ -f /etc/os-release ]; then + . /etc/os-release + echo -n $ID + fi + `; + return ID.stdout; } -### Post-install hook +// Post-install hook async function afterInstall(packageManager) { - const PACKAGE_MANAGER = packageManager - await $` - if [ "$PACKAGE_MANAGER" = 'appimage' ]; then - elif [ "$PACKAGE_MANAGER" = 'apk' ]; then - elif [ "$PACKAGE_MANAGER" = 'apt' ]; then - elif [ "$PACKAGE_MANAGER" = 'basher' ]; then - elif [ "$PACKAGE_MANAGER" = 'binary' ]; then - elif [ "$PACKAGE_MANAGER" = 'bpkg' ]; then - elif [ "$PACKAGE_MANAGER" = 'brew' ]; then - elif [ "$PACKAGE_MANAGER" = 'cargo' ]; then - elif [ "$PACKAGE_MANAGER" = 'cask' ]; then - elif [ "$PACKAGE_MANAGER" = 'choco' ]; then - elif [ "$PACKAGE_MANAGER" = 'crew' ]; then - elif [ "$PACKAGE_MANAGER" = 'dnf' ]; then - elif [ "$PACKAGE_MANAGER" = 'flatpak' ]; then - elif [ "$PACKAGE_MANAGER" = 'gem' ]; then - elif [ "$PACKAGE_MANAGER" = 'go' ]; then - elif [ "$PACKAGE_MANAGER" = 'nix' ]; then - elif [ "$PACKAGE_MANAGER" = 'npm' ]; then - elif [ "$PACKAGE_MANAGER" = 'pacman' ]; then - elif [ "$PACKAGE_MANAGER" = 'pkg' ]; then - elif [ "$PACKAGE_MANAGER" = 'port' ]; then - elif [ "$PACKAGE_MANAGER" = 'scoop' ]; then - elif [ "$PACKAGE_MANAGER" = 'snap' ]; then - elif [ "$PACKAGE_MANAGER" = 'whalebrew' ]; then - elif [ "$PACKAGE_MANAGER" = 'winget' ]; then - elif [ "$PACKAGE_MANAGER" = 'yay' ]; then - elif [ "$PACKAGE_MANAGER" = 'zypper' ]; then - fi - ` + if (packageManager === 'appimage') { + } else if (packageManager === 'ansible') { + await $`logg 'Ensuring temporary passwordless sudo privileges used by Ansible are removed'` + await $`sudo sed -i '/# TEMPORARY FOR ANSIBLE INSTALL/d' /etc/sudoers` + } else if (packageManager === 'apk') { + } else if (packageManager === '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 === 'crew') { + } else if (packageManager === 'dnf') { + } else if (packageManager === 'flatpak') { + } else if (packageManager === 'snap') { + } else if (packageManager === 'whalebrew') { + } else if (packageManager === 'winget') { + } else if (packageManager === 'yay') { + } else if (packageManager === 'zypper') { + } } -### Pre-install hook +// Pre-install hook async function beforeInstall(packageManager) { - const PACKAGE_MANAGER = packageManager - await $` - if [ "$PACKAGE_MANAGER" = 'appimage' ]; then - elif [ "$PACKAGE_MANAGER" = 'apk' ]; then - elif [ "$PACKAGE_MANAGER" = 'apt' ]; then - sudo apt-get update - elif [ "$PACKAGE_MANAGER" = 'ansible' ]; then - elif [ "$PACKAGE_MANAGER" = 'basher' ]; then - elif [ "$PACKAGE_MANAGER" = 'binary' ]; then - elif [ "$PACKAGE_MANAGER" = 'bpkg' ]; then - elif [ "$PACKAGE_MANAGER" = 'brew' ]; then - elif [ "$PACKAGE_MANAGER" = 'cargo' ]; then - elif [ "$PACKAGE_MANAGER" = 'cask' ]; then - elif [ "$PACKAGE_MANAGER" = 'choco' ]; then - elif [ "$PACKAGE_MANAGER" = 'crew' ]; then - elif [ "$PACKAGE_MANAGER" = 'dnf' ]; then - elif [ "$PACKAGE_MANAGER" = 'flatpak' ]; then - elif [ "$PACKAGE_MANAGER" = 'gem' ]; then - elif [ "$PACKAGE_MANAGER" = 'go' ]; then - elif [ "$PACKAGE_MANAGER" = 'nix' ]; then - elif [ "$PACKAGE_MANAGER" = 'npm' ]; then - elif [ "$PACKAGE_MANAGER" = 'pacman' ]; then - sudo pacman -Syu - elif [ "$PACKAGE_MANAGER" = 'pipx' ]; then - elif [ "$PACKAGE_MANAGER" = 'pkg' ]; then - elif [ "$PACKAGE_MANAGER" = 'port' ]; then - elif [ "$PACKAGE_MANAGER" = 'scoop' ]; then - elif [ "$PACKAGE_MANAGER" = 'snap' ]; then - elif [ "$PACKAGE_MANAGER" = 'whalebrew' ]; then - elif [ "$PACKAGE_MANAGER" = 'winget' ]; then - elif [ "$PACKAGE_MANAGER" = 'yay' ]; then - elif [ "$PACKAGE_MANAGER" = 'zypper' ]; then - fi - ` + if (packageManager === 'appimage') { + } else if (packageManager === 'ansible') { + await $`logg 'Temporarily enabling passwordless sudo for Ansible role installations'` + await $`sudo echo "$(whoami) ALL=(ALL:ALL) NOPASSWD: ALL # TEMPORARY FOR ANSIBLE INSTALL" > /etc/sudoers` + } else if (packageManager === 'apk') { + } else if (packageManager === 'apt') { + await $`sudo apt-get update` + } 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') { + await $`sudo pacman -Syu` + } else if (packageManager === 'pipx') { + } else if (packageManager === 'pkg') { + } else if (packageManager === 'port') { + } else if (packageManager === 'scoop') { + } else if (packageManager === 'crew') { + } else if (packageManager === 'dnf') { + } else if (packageManager === 'flatpak') { + } else if (packageManager === 'snap') { + } else if (packageManager === 'whalebrew') { + } else if (packageManager === 'winget') { + } else if (packageManager === 'yay') { + } else if (packageManager === 'zypper') { + } } -let packageManagerInstalled = {} -### Ensure the package manager is available -async function ensurePackageManager(packageManager) { - if(packageManagerInstalled[packageManager]) { - return +async function ensureInstalled(bin, callback) { + const installed = which.sync(bin, { nothrow: true }) + if (installed) { + await $`logg '\`${bin}\` is available'` } else { - packageManagerInstalled[packageManager] = true + await $`logg warn '\`${bin}\` is not installed!'` + if (callback) { + await $`${callback}` + } else { + await $`logg error 'There does not appear to be an installation method available for \`${bin}\`'` + } } - const PACKAGE_MANAGER = packageManager - if(packageManager === 'ansible') { - await ensurePackageManager('pipx') +} + +// Ensure the package manager is available +let packageManagerInstalled = {}; +async function ensurePackageManager(packageManager) { + await $`logg 'Ensuring \`${packageManager}\` is set up'` + if (packageManagerInstalled[packageManager]) { + return; + } else { + packageManagerInstalled[packageManager] = true; } - if(packageManager === 'gem' || packageManager === 'go' || packageManager === 'npm' || packageManager === 'pipx' || packageManager === 'whalebrew') { - await ensurePackageManager('brew') + if (packageManager === "ansible") { + await ensurePackageManager("pipx"); } - await $` - if [ "$PACKAGE_MANAGER" = 'appimage' ]; then - # Do nothing - elif [ "$PACKAGE_MANAGER" = 'ansible' ]; then + if ( + packageManager === "gem" || + packageManager === "go" || + packageManager === "npm" || + packageManager === "pipx" || + packageManager === "whalebrew" + ) { + await ensurePackageManager("brew"); + } + if (packageManager === 'appimage') { + } else if (packageManager === 'ansible') { + $` if [ ! -f "$HOME/.cache/megabytelabs/ansible-installed" ] || ! command -v ansible > /dev/null; then pipx install ansible pipx inject ansible PyObjC PyObjC-core docker lxml netaddr pexpect python-vagrant pywinrm requests-credssp watchdog touch "$HOME/.cache/megabytelabs/ansible-installed" else - logg '`ansible` and its supporting packages appear to be installed' + logg '\`ansible\` and its supporting packages appear to be installed' fi - elif [ "$PACKAGE_MANAGER" = 'apk' ]; then - if command -v apk > /dev/null; then - logg '`apk` is available' + ` + } 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') { + } else if (packageManager === 'bpkg') { + await ensureInstalled('bpkg', ` + # TODO + echo "Bash script that installs bpkg here" + `) + } else if (packageManager === 'brew' || packageManager === 'cask') { + 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 - logg error '`apk` is not installed' && exit 102 - fi - elif [ "$PACKAGE_MANAGER" = 'apt' ]; then - if command -v apt > /dev/null; then - logg '`apt` is available' - else - logg error '`apt` is not installed' && exit 103 - fi - elif [ "$PACKAGE_MANAGER" = 'basher' ]; then - if command -v basher > /dev/null; then - logg '`basher` is available' - else - # TODO - Install basher - fi - elif [ "$PACKAGE_MANAGER" = 'binary' ]; then - # Do nothing - elif [ "$PACKAGE_MANAGER" = 'bpkg' ]; then - if command -v bpkg > /dev/null; then - logg '`bpkg` is available' - else - # TODO - Install bpkg - fi - elif [ "$PACKAGE_MANAGER" = 'brew' ] || [ "$PACKAGE_MANAGER" = 'cask' ]; then - if command -v brew > /dev/null; then - logg '`brew` is available' - else - if ! command -v brew > /dev/null; then - 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 - logg info '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 - logg warn '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 + logg info '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 + logg warn '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 - fi + done + brew update --force --quiet fi fi fi - elif [ "$PACKAGE_MANAGER" = 'cargo' ]; then - if command -v cargo > /dev/null; then - logg '`cargo` is available' - else - # TODO - Install Cargo via Homebrew based method - fi - elif [ "$PACKAGE_MANAGER" = 'choco' ]; then - if command -v choco > /dev/null; then - logg '`choco` is available' - else - logg 'Installing Chocolatey' - 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'))" - fi - elif [ "$PACKAGE_MANAGER" = 'crew' ]; then - if command -v crew > /dev/null; then - logg '`crew` is available' - else - # Source: https://github.com/chromebrew/chromebrew - curl -Ls git.io/vddgY | bash - fi - elif [ "$PACKAGE_MANAGER" = 'dnf' ]; then - if command -v dnf > /dev/null; then - logg '`dnf` is available' - elif command -v yum > /dev/null; then - logg '`yum` is available' - else - logg 'Both `dnf` and `yum` are not available' && exit 110 - fi - elif [ "$PACKAGE_MANAGER" = 'flatpak' ]; then - if command -v flatpak > /dev/null; then - logg '`flatpak` is available' - else - if command -v apk > /dev/null; then - sudo apk add flatpak - elif command -v apt > /dev/null; then + `) + } 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) { + await $`logg '\`dnf\` is available'` + } else if (yum) { + await $`logg '\`yum\` is available'` + } else { + await $`logg error 'Both \`dnf\` and \`yum\` are not available'` + } + } else if (packageManager === 'flatpak') { + const flatpak = which.sync('flatpak', { nothrow: true }) + if (flatpak) { + await $`logg '\`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 @@ -313,117 +374,102 @@ async function ensurePackageManager(packageManager) { if [ -f /usr/bin/plasmashell ]; then sudo apt install -y plasmashell fi - elif command -v dnf > /dev/null; then - sudo dnf install -y flatpak - elif command -v yum > /dev/null; then - sudo yum install -y flatpak - elif command -v pacman > /dev/null; then - sudo pacman -S flatpak - elif command -v xbps-install > /dev/null; then - sudo xbps-install -S flatpak - elif command -v zypper > /dev/null; then - sudo zypper install -y flatpak - fi - flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo - logg warn '`flatpak` may require a reboot to work properly' - fi - elif [ "$PACKAGE_MANAGER" = 'gem' ]; then - if command -v gem > /dev/null; then - logg '`gem` is available' - else - # TODO - is this enough to make `gem install` available? - brew install ruby - fi - elif [ "$PACKAGE_MANAGER" = 'go' ]; then - if command -v go > /dev/null; then - logg '`go` is available' - else - brew install go - fi - elif [ "$PACKAGE_MANAGER" = 'nix' ]; then - if command -v nix > /dev/null; then - logg '`nix` is available' - elif [ -d /Applications ] && [ -d /Library ]; then - # macOS + ` + } 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 { + await $`logg error '\`flatpak\` failed to install!'` + } + await $`logg '\`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 - # Linux sh <(curl -L https://nixos.org/nix/install) --daemon fi - elif [ "$PACKAGE_MANAGER" = 'npm' ]; then - if command -v volta > /dev/null && command -v npm > /dev/null && command -v node > /dev/null; then - logg '`volta`, `npm`, and `node` are all available' - else - if ! command -v volta > /dev/null; then - if ! command -v volta > /dev/null; then - logg 'Installing `volta` via `brew`' - brew install volta - fi - logg 'Ensuring `node` and `npm` are installed using `volta`' - if [ -z "$VOLTA_HOME" ]; then - volta setup - fi - export PATH="$VOLTA_HOME/bin:$PATH" - volta install node + `) + } 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) { + await $`logg '\`npm\`, \`node\`, and \`volta\` are available'` + } else { + if (!volta) { + await $`brew install volta` + } + await $` + if [ -z "$VOLTA_HOME" ]; then + volta setup fi - fi - elif [ "$PACKAGE_MANAGER" = 'pacman' ]; then - if command -v pacman > /dev/null; then - logg '`pacman` is available' - else - logg '`pacman` is not installed' && exit 106 - fi - elif [ "$PACKAGE_MANAGER" = 'pipx' ]; then - if command -v pipx > /dev/null; then - logg '`pipx` is available' - else - brew install pipx - pipx ensurepath - fi - elif [ "$PACKAGE_MANAGER" = 'pkg' ]; then - if command -v pkg > /dev/null; then - logg '`pkg` is available' - else - logg '`pkg` is not installed' && exit 107 - elif [ "$PACKAGE_MANAGER" = 'port' ]; then - if command -v port > /dev/null; then - logg '`port` is available' - else - # TODO - Install port on macOS - fi - elif [ "$PACKAGE_MANAGER" = 'scoop' ]; then - if command -v scoop > /dev/null; then - logg '`scoop` is available' - else - # TODO - does this work? can we run PowerShell in a bash script? - powershell 'Set-ExecutionPolicy RemoteSigned -Scope CurrentUser' - powershell 'irm get.scoop.sh | iex' - fi - elif [ "$PACKAGE_MANAGER" = 'snap' ]; then - if command -v snap > /dev/null; then - logg '`snap` is available' - else - logg 'Installing `snap` via system package manager' - if command -v apt > /dev/null; then - # Source: https://snapcraft.io/docs/installing-snap-on-linux-mint + 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') { + await ensureInstalled('port', ` + echo "TODO - script that installs port on macOS here" + `) + } 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 - elif command -v dnf > /dev/null; then + ` + // 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 - elif command -v yum > /dev/null; then + ` + } 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 - elif command -v pacman > /dev/null; then + ` + } 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 @@ -435,134 +481,166 @@ async function ensurePackageManager(packageManager) { sudo ln -s /var/lib/snapd/snap /snap fi fi - elif command -v zypper > /dev/null; then - # TODO: See https://snapcraft.io/docs/installing-snap-on-opensuse - else - logg 'Could not find a package manager to install `snap` with' - fi - if command -v snap > /dev/null; then - logg 'Ensuring latest `snap` is available by running `sudo snap install core`' - sudo snap install core - 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 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 - elif [ "$PACKAGE_MANAGER" = 'whalebrew' ]; - if command -v whalebrew > /dev/null; then - logg '`whalebrew` is available' - else - logg 'Installing `whalebrew` via `brew`' - brew install whalebrew - fi - elif [ "$PACKAGE_MANAGER" = 'winget' ]; then - # TODO - elif [ "$PACKAGE_MANAGER" = 'yay' ]; then - if command -v yay > /dev/null; then - logg '`yay` is available' - else - logg 'Installing `yay` requirements' - sudo pacman -S --needed base-devel git - if [ -d /usr/local/src ]; then - logg 'Cloning `yay` source code to `/usr/local/src/yay`' - git clone https://aur.archlinux.org/yay.git /usr/local/src/yay - cd /usr/local/src/yay - makepkg -si - logg '`yay` installed` - else - logg error '`/usr/local/src` is not present on the system' && exit 105 - fi - fi - elif [ "$PACKAGE_MANAGER" = 'zypper' ]; then - if command -v zypper > /dev/null; then - logg '`zypper` is available' - else - logg '`zypper` is not installed' && exit 104 - fi - fi - ` + ` + } else if (packageManager === 'zypper') { + await ensureInstalled('zypper', false) + } } -### Installs a list of packages via the specified package manager +// Installs a list of packages via the specified package manager async function installPackageList(packageManager, packages) { - const PACKAGE_MANAGER = packageManager - const PACKAGES = packages - await $` - logg 'Installing '"${PACKAGES}"' via `'"${PACKAGE_MANAGER}"'`' - if [ "$PACKAGE_MANAGER" = 'appimage' ]; then - elif [ "$PACKAGE_MANAGER" = 'apk' ]; then - sudo apk add ${PACKAGES} - elif [ "$PACKAGE_MANAGER" = 'apt' ]; then - sudo apt-get install -y ${PACKAGES} - elif [ "$PACKAGE_MANAGER" = 'ansible' ]; then - elif [ "$PACKAGE_MANAGER" = 'basher' ]; then - elif [ "$PACKAGE_MANAGER" = 'binary' ]; then - elif [ "$PACKAGE_MANAGER" = 'bpkg' ]; then - elif [ "$PACKAGE_MANAGER" = 'brew' ]; then - brew install ${PACKAGES} - elif [ "$PACKAGE_MANAGER" = 'cargo' ]; then - elif [ "$PACKAGE_MANAGER" = 'cask' ]; then - brew install --cask ${PACKAGES} - elif [ "$PACKAGE_MANAGER" = 'choco' ]; then - choco install -y ${choco} - elif [ "$PACKAGE_MANAGER" = 'crew' ]; then - elif [ "$PACKAGE_MANAGER" = 'dnf' ]; - if command -v dnf > /dev/null; then - dnf install -y ${PACKAGES} - elif command -v yum > /dev/null; then - yum install -y ${PACKAGES} - else - logg warn 'Both `dnf` and `yum` are not present on the system' - fi - elif [ "$PACKAGE_MANAGER" = 'flatpak' ]; then - elif [ "$PACKAGE_MANAGER" = 'gem' ]; then - gem install ${PACKAGES} - elif [ "$PACKAGE_MANAGER" = 'go' ]; then - for GO_PACKAGE in ${PACKAGES}; do - go install "$GO_PACKAGE" - elif [ "$PACKAGE_MANAGER" = 'nix' ]; then - # TODO - elif [ "$PACKAGE_MANAGER" = 'npm' ]; then - volta install ${PACKAGES} - elif [ "$PACKAGE_MANAGER" = 'pacman' ]; then - sudo pacman -Sy --noconfirm --needed ${PACKAGES} - elif [ "$PACKAGE_MANAGER" = 'pipx' ]; then - elif [ "$PACKAGE_MANAGER" = 'pkg' ]; then - # TODO - elif [ "$PACKAGE_MANAGER" = 'port' ]; then - sudo port install ${PACKAGES} - elif [ "$PACKAGE_MANAGER" = 'scoop' ]; then - scoop install ${PACKAGES} - elif [ "$PACKAGE_MANAGER" = 'snap' ]; then - sudo snap install -y ${PACKAGES} - elif [ "$PACKAGE_MANAGER" = 'whalebrew' ]; then - elif [ "$PACKAGE_MANAGER" = 'winget' ]; then - elif [ "$PACKAGE_MANAGER" = 'yay' ]; then - elif [ "$PACKAGE_MANAGER" = 'zypper' ]; then - fi - ` + try { + if (packageManager === 'appimage') { + } else if (packageManager === 'ansible') { + for (const role of packages) { + await $`ansible localhost -m include_role -a name=${role}` + } + } else if (packageManager === 'apk') { + await $`sudo apk add ${packages}` + } else if (packageManager === 'apt') { + await $`sudo apt-get install -y ${packages}` + } else if (packageManager === 'basher') { + } else if (packageManager === 'binary') { + } else if (packageManager === 'brew') { + await $`brew install ${packages}` + } else if (packageManager === 'cask') { + await $`brew install --cask ${packages}` + } else if (packageManager === 'cargo') { + for (const cargoPkg of packages) { + await $`cargo install ${cargoPkg}` + } + } else if (packageManager === 'choco') { + await $`choco install -y ${packages}` + } else if (packageManager === 'crew') { + } else if (packageManager === 'dnf') { + const dnf = which.sync('dnf', { nothrow: true }) + const yum = which.sync('yum', { nothrow: true }) + if (dnf) { + await $`dnf install -y ${packages}` + } else if (yum) { + await $`yum install -y ${packages}` + } + } else if (packageManager === 'flatpak') { + for (const flatPkg of packages) { + await $`sudo flatpak install flathub ${flatPkg}` + } + } else if (packageManager === 'gem') { + for (const gem of packages) { + await $`gem install ${gem}` + } + } else if (packageManager === 'go') { + for (const goPkg of packages) { + await $`go install ${goPkg}` + } + } else if (packageManager === 'nix') { + } else if (packageManager === 'npm') { + for (const npmPkg of packages) { + await $`volta install ${npmPkg}` + } + } else if (packageManager === 'pacman') { + await $`sudo pacman -Sy --noconfirm --needed ${packages}` + } else if (packageManager === 'pipx') { + for (const pipxPkg of packages) { + await $`pipx install ${pipxPkg}` + } + } else if (packageManager === 'pkg') { + } else if (packageManager === 'port') { + for (const portPkg of packages) { + await $`sudo port install ${portPkg}` + } + } else if (packageManager === 'scoop') { + for (const scoopPkg of packages) { + await $`scoop install ${scoopPkg}` + } + } else if (packageManager === 'snap') { + for (const snapPkg of packages) { + await $`sudo snap install -y ${snapPkg}` + } + } else if (packageManager === 'whalebrew') { + for (const whalePkg of packages) { + await $`whalebrew install ${snapPkg}` + } + } else if (packageManager === 'winget') { + } else if (packageManager === 'yay') { + for (const yayPkg of packages) { + await $`yay -Sy --noconfirm --needed ${yayPkg}` + } + } else if (packageManager === 'zypper') { + await $`sudo zypper install -y ${zypPkg}` + } + } catch (e) { + await $`logg error 'Failed to install via \`${packageManager}\`'` + await $`logg 'Proceeding with the installation..'` + } } +// main process async function main() { - const installOrders = generateInstallOrders() - const packageManagers = Object.keys(installOrders) + await $`logg 'Fetching the latest version of the installation map'` + installData = await downloadInstallData(); + await $`logg 'Calculating the install orders'` + await generateInstallOrders(); + await $`logg 'Ensuring any package managers that will be used are installed / configured'` + const packageManagers = Object.keys(installOrders); for (const packageManager of packageManagers) { - await ensurePackageManager(packageManager) + await ensurePackageManager(packageManager); } + await $`logg 'The install orders were generated:'` + console.log(installOrders) + await $`logg 'Running package manager pre-installation steps'` for (const packageManager of packageManagers) { - await beforeInstall(packageManager) + await beforeInstall(packageManager); } + await $`logg 'Running package-specific pre-installation steps'` for (const script of installOrdersPre) { - await $`${script}` + await $`${script}`; } + await $`logg 'Installing the packages'` for (const packageManager of packageManagers) { - const asyncOrders = [] - asyncOrders.push(Promise.resolve(installPackageList(packageManager, installOrders[packageManager]))) - await Promise.all(asyncOrders) + const asyncOrders = []; + asyncOrders.push( + Promise.resolve( + installPackageList(packageManager, installOrders[packageManager]) + ) + ); + await Promise.all(asyncOrders); } + await $`logg 'Running package-specific post-installation steps'` for (const script of installOrdersPost) { - await $`${script}` + await $`${script}`; } + await $`logg 'Running package manager post-installation steps'` for (const packageManager of packageManagers) { - await afterInstall(packageManager) + await afterInstall(packageManager); } + await $`logg success 'Done!'` } -main() +// Start the main process +await main(); diff --git a/dotfiles/.local/share/chezmoi/home/dot_local/bin/executable_load-secrets b/dotfiles/.local/share/chezmoi/home/dot_local/bin/executable_load-secrets new file mode 100644 index 00000000..13128300 --- /dev/null +++ b/dotfiles/.local/share/chezmoi/home/dot_local/bin/executable_load-secrets @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +logg \ No newline at end of file diff --git a/dotfiles/.local/share/chezmoi/home/dot_local/symlink_Taskfile-upstream.yml.tmpl b/dotfiles/.local/share/chezmoi/home/dot_local/symlink_Taskfile-upstream.yml.tmpl deleted file mode 100644 index 502549ba..00000000 --- a/dotfiles/.local/share/chezmoi/home/dot_local/symlink_Taskfile-upstream.yml.tmpl +++ /dev/null @@ -1,3 +0,0 @@ -{{- if true -}} -{{ .chezmoi.homeDir }}/.local/src/shared-common/Taskfile.yml -{{- end -}} \ No newline at end of file diff --git a/dotfiles/.local/share/chezmoi/home/private_dot_config/shell/aliases.tmpl b/dotfiles/.local/share/chezmoi/home/private_dot_config/shell/aliases.tmpl index ade0b7e9..6b077f98 100644 --- a/dotfiles/.local/share/chezmoi/home/private_dot_config/shell/aliases.tmpl +++ b/dotfiles/.local/share/chezmoi/home/private_dot_config/shell/aliases.tmpl @@ -114,6 +114,11 @@ if ! command -v pip > /dev/null; then alias pip='pip3' fi +# Masked sudo password entry +if command -v gum > /dev/null; then + alias please="gum input --password | sudo -nS" +fi + # Show open ports alias ports='sudo netstat -tulanp' diff --git a/dotfiles/.local/share/chezmoi/home/private_dot_config/shell/functions b/dotfiles/.local/share/chezmoi/home/private_dot_config/shell/functions index 54546685..cbcd3f24 100644 --- a/dotfiles/.local/share/chezmoi/home/private_dot_config/shell/functions +++ b/dotfiles/.local/share/chezmoi/home/private_dot_config/shell/functions @@ -135,4 +135,4 @@ update-all() { npm update -g || true chezmoi upgrade z4h update -} \ No newline at end of file +} diff --git a/dotfiles/.local/share/chezmoi/home/symlink_Taskfile.yml b/dotfiles/.local/share/chezmoi/home/symlink_Taskfile.yml deleted file mode 100644 index 37501977..00000000 --- a/dotfiles/.local/share/chezmoi/home/symlink_Taskfile.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -version: '3' - -# Tasks defined here can be run by running `run local:default` for example if you wanted -# to run the task named default. See: https://taskfile.dev/. It is set up like this -# so you can also access our set of bundled tasks located in the `~/.local` folder. -tasks: - default: echo "Default task" diff --git a/dotfiles/.local/share/chezmoi/software.yml b/dotfiles/.local/share/chezmoi/software.yml index 88242d32..387cf802 100644 --- a/dotfiles/.local/share/chezmoi/software.yml +++ b/dotfiles/.local/share/chezmoi/software.yml @@ -154,8 +154,6 @@ softwarePackages: port: bat scoop: bat zypper: bat - blockinfile: - go: github.com/ProfessorManhattan/blockinfile@latest bundler: gem: bundler bash-completion: @@ -735,6 +733,11 @@ softwarePackages: npm: share-cli sharp: npm: sharp-cli + skate: + brew: charmbracelet/tap/skate + go: github.com/charmbracelet/skate@latest + nix: nixpkgs.skate + pacman: skate shotcut: _snapClassic: true ansible: professormanhattan.shotcut