From 21a4210c16a119073ef7197211d72f9b4e6abc5d Mon Sep 17 00:00:00 2001 From: Brian Zalewski Date: Fri, 9 Dec 2022 07:57:44 +0000 Subject: [PATCH] Update .local/share/chezmoi/software.yml, .local/share/chezmoi/home/dot_local/bin/executable_install-program --- .../dot_local/bin/executable_install-program | 119 +++++++++++--- .local/share/chezmoi/software.yml | 155 +++++++++++++----- 2 files changed, 216 insertions(+), 58 deletions(-) diff --git a/.local/share/chezmoi/home/dot_local/bin/executable_install-program b/.local/share/chezmoi/home/dot_local/bin/executable_install-program index f3519ffd..f5efc886 100644 --- a/.local/share/chezmoi/home/dot_local/bin/executable_install-program +++ b/.local/share/chezmoi/home/dot_local/bin/executable_install-program @@ -97,9 +97,9 @@ async function downloadInstallData() { } // Creates the installOrders object which maps package managers to arrays of packages to install -async function generateInstallOrders() { +async function generateInstallOrders(pkgsToInstall) { const logStage = "Install Orders"; - const packagesToInstall = process.argv.slice(3); + const packagesToInstall = pkgsToInstall; const installerPreference = await OSTypeInstallerKey(); log( "info", @@ -348,6 +348,88 @@ async function generateInstallOrders() { 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, @@ -550,10 +632,9 @@ async function afterInstall(packageManager) { } } -async function ensureCurl() { - const curl = which.sync('curl', { nothrow: true }) - if (!curl) { - log("warn", "Ensure curl", `Installing curl because it is required for the binary install method`) +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 }); @@ -562,43 +643,43 @@ async function ensureCurl() { const pacman = which.sync("pacman", { nothrow: true }); const zypper = which.sync("zypper", { nothrow: true }); if (apk) { - $`sudo apk add curl`; + $`sudo apk add ${dep}`; } else if (apt) { if (updateDone[packageManager] !== true) { await beforeInstall('apt-get') } - await $`sudo apt-get install -y curl`; + await $`sudo apt-get install -y ${dep}`; } else if (dnf) { if (updateDone[packageManager] !== true) { await beforeInstall('dnf') } - await $`sudo dnf install -y curl`; + await $`sudo dnf install -y ${dep}`; } else if (yum) { if (updateDone[packageManager] !== true) { await beforeInstall('dnf') } - await $`sudo yum install -y curl`; + await $`sudo yum install -y ${dep}`; } else if (pacman) { if (updateDone[packageManager] !== true) { await beforeInstall('pacman') } - await $`sudo pacman -Sy curl`; + await $`sudo pacman -Sy ${dep}`; } else if (zypper) { if (updateDone[packageManager] !== true) { await beforeInstall('zypper') } - await $`sudo zypper install -y curl`; + await $`sudo zypper install -y ${dep}`; } } else if (osType === 'darwin') { if (updateDone['brew'] !== true) { await beforeInstall('brew') } - await $`brew install curl` + await $`brew install ${dep}` } else if (osType === 'windows') { if (updateDone['choco'] !== true) { await beforeInstall('choco') } - await `choco install -y curl` + await `choco install -y ${dep}` } } } @@ -780,7 +861,7 @@ async function ensurePackageManager(packageManager) { const zap = which.sync('zap', { nothrow: true }) if (!zap) { log("info", "Zap Installation", 'Installing Zap to handle AppImage installation') - await ensureCurl() + 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") { @@ -812,7 +893,7 @@ async function ensurePackageManager(packageManager) { ` ); } else if (packageManager === "binary") { - await ensureCurl() + await ensurePackage('curl') } else if (packageManager === "bpkg") { await ensureInstalled( "bpkg", @@ -1447,7 +1528,7 @@ async function updateSystemd(service) { } // main process -async function main() { +async function installSoftware(pkgsToInstall) { osType = await OSType(); osID = osType; if (osType === "linux") { @@ -1460,7 +1541,7 @@ async function main() { ); installData = await downloadInstallData(); log("info", "Install Orders", `Calculating the install orders`); - await generateInstallOrders(); + await generateInstallOrders(pkgsToInstall ? pkgsToInstall : process.argv.slice(3)); log( "info", "Ensure Package Manager Installed", @@ -1519,4 +1600,4 @@ async function main() { } // Start the main process -await main(); +await installSoftware(false); diff --git a/.local/share/chezmoi/software.yml b/.local/share/chezmoi/software.yml index 03f5c375..5f658973 100644 --- a/.local/share/chezmoi/software.yml +++ b/.local/share/chezmoi/software.yml @@ -1686,7 +1686,7 @@ softwarePackages: _service: false npm: editly elastic-agent: - _bin: null + _bin: elastic-agent _desc: >- [Elastic Agent](https://www.elastic.co/guide/en/fleet/current/elastic-agent-installation-configuration.html) is a single, unified way to add monitoring for logs, metrics, and other types of data to each host. A single agent makes it easier and faster to deploy monitoring across your infrastructure. The agent’s single, unified policy makes it easier to add integrations for new data sources. You can use Elastic Agent with Fleet. [Fleet](https://www.elastic.co/guide/en/kibana/current/fleet.html) is a Kibana service that allows you to add and manage integrations for popular services and platforms, as well as manage Elastic Agent installations. @@ -1694,7 +1694,7 @@ softwarePackages: _github: https://github.com/elastic/elastic-agent _home: https://www.elastic.co/ _name: Elastic Agent - _service: null + _service: true ansible: professormanhattan.elasticagent electron: _bin: electron @@ -2216,6 +2216,21 @@ softwarePackages: port: fzf xbps: fzf zypper: fzf + gawk: + _bin: gawk + _desc: An implementation of the AWK programming language + _docs: https://www.gnu.org/software/gawk/manual/ + _github: false + _home: https://www.gnu.org/software/gawk/ + _name: gawk + _service: false + apt: gawk + brew: gawk + choco: gawk + dnf: gawk + pacman: gawk + port: gawk + scoop: gawk google-assistant: _bin: null _desc: '[Google Assistant for Desktop](https://github.com/Melvin-Abraham/Google-Assistant-Unofficial-Desktop-Client) is a cross-platform unofficial Google Assistant Client for Desktop.' @@ -3055,14 +3070,20 @@ softwarePackages: cargo: htmlq github: github.com/mgdm/htmlq htop: - _bin: null + _bin: htop _desc: '[htop](https://htop.dev/) is an interactive system-monitor process-viewer and process-manager. It is designed as an alternative to the Unix program top. It shows a frequently updated list of the processes running on a computer, normally ordered by the amount of CPU usage.' - _docs: null - _github: null - _home: null + _docs: https://www.man7.org/linux/man-pages/man1/htop.1.html + _github: https://github.com/htop-dev/htop + _home: https://htop.dev/ _name: htop - _service: null - ansible: professormanhattan.htop + _service: false + ansible:darwin: professormanhattan.htop + ansible:linux: professormanhattan.htop + apt: htop + brew: htop + dnf: htop + pacman: htop + port: htop http-prompt: _bin: null _desc: null @@ -3796,15 +3817,35 @@ softwarePackages: _name: LSD (LSDeluxe) _service: null ansible: professormanhattan.lsd - lxdc: + lxc: + _bin: lxc + _desc: Linux Containers is an operating-system-level virtualization method for running multiple isolated Linux systems on a control host using a single Linux kernel. + _docs: https://linuxcontainers.org/lxc/documentation/ + _github: https://github.com/lxc/lxc + _home: https://linuxcontainers.org/lxc/ + _name: LXC + _service: true + _systemd: lxc + apt: lxc + brew: lxc + dnf: lxc + pacman: lxc + lxd: _bin: null _desc: '[LXD](https://linuxcontainers.org) is a next generation system container manager. It offers a user experience similar to virtual machines but using Linux containers instead' - _docs: null - _github: null - _home: null + _docs: https://linuxcontainers.org/lxd/docs/master/ + _github: https://github.com/lxc/lxd + _groups: + - lxd + _home: https://linuxcontainers.org/lxd/ _name: LXDC - _service: null + _service: false ansible: professormanhattan.lxdc + snap: lxd + lxdc: + _deps: + - lxc + - lxd m-cli: _bin: m _desc: Swiss Army Knife for macOS. A wrapper for many types of macOS-specific commands. @@ -4308,14 +4349,18 @@ softwarePackages: pacman: netcat scoop: netcat netdata: - _bin: null + _bin: netdata _desc: '[Netdata](https://www.netdata.cloud/) is an open source tool designed to collect real-time metrics, such as CPU usage, disk activity, bandwidth usage, website visits, etc., and then display them in live, easy-to-interpret charts.' _docs: https://learn.netdata.cloud/docs/ _github: https://github.com/netdata/netdata _home: https://www.netdata.cloud/ _name: Netdata - _service: null + _service: true ansible: professormanhattan.netdata + brew: netdata + pacman: netdata + port: netdata + script: curl https://my-netdata.io/kickstart.sh > /tmp/netdata-kickstart.sh && sh /tmp/netdata-kickstart.sh newman: _bin: null _desc: null @@ -5592,14 +5637,24 @@ softwarePackages: brew: ms-jpq/sad/sad pacman: sad samba: - _bin: null + _bin: samba _desc: '[Samba](https://www.samba.org/) is a free and open-source software that allows files to be shared across Windows and Linux systems simply and easily. To be exact, it is an open-source implementation of the SMB/CIFS protocol.' _docs: https://www.samba.org/samba/docs/ _github: https://github.com/samba-team/samba + _groups: + - sambausers _home: https://www.samba.org/ _name: Samba - _service: null - ansible: professormanhattan.samba + _service: true + _systemd: smbd + _systemd:dnf: smb + ansible:darwin: professormanhattan.samba + ansible:linux: professormanhattan.samba + apt: samba + brew: samba + dnf: samba + pacman: samba + port: samba4 sanoid: _bin: null _desc: '[Sanoid](https://github.com/jimsalterjrs/sanoid/) is a free and open source snapshot management tool. Sanoid is a policy-driven snapshot management tool for ZFS filesystems. When combined with the Linux KVM hypervisor, you can use it to make your systems functionally immortal.' @@ -5814,14 +5869,18 @@ softwarePackages: _service: false ansible: professormanhattan.shc shdoc: - _bin: null + _deps:script: + - gawk + _bin: shdoc _desc: '[shdoc](https://github.com/reconquest/shdoc) is a tool to generate Documentation for shell scripts (bash, sh, zsh)' _docs: null - _github: null + _github: https://github.com/reconquest/shdoc _home: null _name: shdoc _service: null ansible: professormanhattan.shdoc + script: cd /tmp && git clone --recursive https://github.com/reconquest/shdoc && cd shdoc && sudo make install + yay: shdoc-git shellcheck: _bin: shellcheck _desc: A static analysis tool for shell scripts @@ -6095,14 +6154,16 @@ softwarePackages: brew: hudochenkov/sshpass/sshpass dnf: sshpass ssh-tarpit: - _bin: null + _bin: endlessh _desc: '[Endlessh](https://github.com/skeeto/endlessh) is an SSH tarpit that very slowly sends an endless, random SSH banner. It keeps SSH clients locked up for hours or even days at a time. The purpose is to put your real SSH server on another port and then let the script kiddies get stuck in this tarpit instead of bothering a real server.' - _docs: null - _github: null - _home: null + _docs: https://github.com/skeeto/endlessh + _github: https://github.com/skeeto/endlessh + _home: https://github.com/skeeto/endlessh _name: Endlessh - _service: null + _service: true ansible: professormanhattan.sshtarpit + apt: endlessh + dnf: endlessh ssl-proxy: _bin: null _desc: Simple zero-config SSL reverse proxy with real autogenerated certificates @@ -6469,14 +6530,17 @@ softwarePackages: choco: terraform pacman: terraform tfenv: - _bin: null + _bin: tfenv _desc: '[tfenv](https://github.com/tfutils/tfenv) is a Terraform version manager inspired by [rbenv](https://github.com/rbenv/rbenv). It supports macOS, Linux, and Windows.' - _docs: null - _github: null - _home: null + _docs: https://github.com/tfutils/tfenv#usage + _github: https://github.com/tfutils/tfenv + _home: https://github.com/tfutils/tfenv _name: tfenv - _service: null - ansible: professormanhattan.tfenv + _service: false + ansible:darwin: professormanhattan.tfenv + ansible:linux: professormanhattan.tfenv + brew: tfenv + port: tfenv tflint: _bin: null _desc: '[tflint](https://github.com/terraform-linters/tflint) is a framework that can help in finding possible errors for major cloud providers, warn about deprecated syntax and unused declarations and enforce best practices. This role installs tflint on nearly any platform.' @@ -6735,8 +6799,14 @@ softwarePackages: _github: https://github.com/hashicorp/vagrant _home: https://www.vagrantup.com/ _name: Vagrant - _service: null + _service: false + _snapClassic: true ansible: professormanhattan.vagrant + choco: vagrant + dnf: vagrant + pacman: vagrant + scoop: vagrant + snap: vagrant vault: _bin: null _desc: '[HashiCorp Vault](https://www.vaultproject.io/) secures, stores, and tightly controls access to tokens, passwords, certificates, API keys, and other secrets. Basically, it is a tool for managing any data that you want to tightly control access to. It also has some advanced integrations with systems like AWS.' @@ -6984,14 +7054,15 @@ softwarePackages: brew: hashicorp/tap/waypoint scoop: waypoint wazuh: - _bin: null + _bin: wazuh _desc: '[Wazuh](https://wazuh.com/) is a free, open source and enterprise-ready security monitoring solution for threat detection, integrity monitoring, incident response and compliance.' _docs: https://documentation.wazuh.com/current/index.html _github: https://github.com/wazuh/wazuh _home: https://wazuh.com/ _name: Wazuh - _service: null + _service: true ansible: professormanhattan.wazuh + choco: wazuh-agent websocat: _bin: null _desc: CLI for interacting with web sockets @@ -7170,14 +7241,20 @@ softwarePackages: _service: null npm: '@cloudflare/wrangler' wrk: - _bin: null + _bin: wrk _desc: '[wrk](https://github.com/reconquest/wrk) is a modern HTTP benchmarking tool capable of generating significant load when run on a single multi-core CPU. It combines a multithreaded design with scalable event notification systems such as epoll and kqueue' - _docs: null - _github: null - _home: null + _docs: https://github.com/blangel/wrk + _github: https://github.com/wg/wrk + _home: https://github.com/blangel/wrk _name: wrk - _service: null + _service: false ansible: professormanhattan.wrk + apt: wrk + brew: wrk + dnf: wrk + pacman: wrk + port: wrk + xbps: wrk wsl: _bin: null _desc: For example, this role sets the timezone, sets the hostname, sets up the swap space, ensures auto-login is either disabled or enabled, and customizes GRUB (on Linux). It also ensures that specified groups are present on the system. On Windows, the role ensures all the available updates are installed, ensures [Scoop](https://scoop.sh/) is installed, and ensures common dependencies like [Bandizip](https://en.bandisoft.com/bandizip/) (a compressed-file manager) are installed.