From 44673ae150b6dea8ecd7d8f766cec98161225c78 Mon Sep 17 00:00:00 2001 From: alanw Date: Thu, 11 May 2023 16:23:28 -0700 Subject: [PATCH 01/15] added beginning of OS detection and install commands --- functions | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/functions b/functions index 4c6f671..e2e4194 100644 --- a/functions +++ b/functions @@ -1083,4 +1083,69 @@ compare-versions() { fi } +find-pmgr(){ + # OS distribution auto-detection + if type lsb_release >/dev/null 2>&1; then + # linuxbase.org + OS=$(lsb_release -si) + OS=$(lsb_release -si) + VER=$(lsb_release -sr) + elif [ -f /etc/debian_version ]; then + # Older Debian/Ubuntu/etc. + ID=debian + OS=Debian + VER=$(cat /etc/debian_version) + elif [ -f /etc/lsb-release ]; then + # For Arch and some versions of Debian/Ubuntu without lsb_release command + . /etc/lsb-release + ID=$DISTRIB_ID + OS=$DISTRIB_ID + VER=$DISTRIB_RELEASE + VER=${VER:-$LSB_VERSION} + elif [ -f /etc/os-release ]; then + # freedesktop.org arch and systemd + . /etc/os-release + OS=$NAME + VER=$VERSION_ID + VER=${VER:-$VERSION} + elif [ -f /etc/redhat-release ]; then + # Older Red Hat, CentOS, etc. + OS=$(cat /etc/redhat-release | awk '{print $1}') + else + # Fall back to uname, e.g. "Linux ", also works for BSD, etc. + OS=$(uname -s) + VER=$(uname -r) + fi + + # Match distribution with available utilities + case $ID in + amzn | centos | fedora | rhel) + online_pmgr="yum" + offline_pmgr="rpm" + ;; + arch | Arch | manjaro) + online_pmgr="pacman" + offline_pmgr="pacman" + ;; + debian | ubuntu) + online_pmgr="apt-get" + offline_pmgr="dpkg" + ;; + opensuse) + online_pmgr="zypper" + offline_pmgr="zypper" + ;; + slackware) + online_pmgr="slackpkg" + offline_pmgr="installpkg" + ;; + sles) + online_pmgr="zypper" + offline_pmgr="rpm" + ;; + ubuntu + esac + "dpkg" "brew" "yum" "gdebi" "apt-get" "pacman" "emerge" "zypper" "dnf" "rpm" +} + set-boxtype From a0ac60edee2b02c46900a69e9e9d843d7cee005e Mon Sep 17 00:00:00 2001 From: alanw Date: Thu, 11 May 2023 16:38:36 -0700 Subject: [PATCH 02/15] porting over commands from python library --- functions | 140 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 134 insertions(+), 6 deletions(-) diff --git a/functions b/functions index e2e4194..12ca6f3 100644 --- a/functions +++ b/functions @@ -1068,7 +1068,7 @@ check-prbl-version(){ vercomp } -compare-versions() { +compare-versions(){ vercomp $1 $2 case $? in 0) op='=';; @@ -1087,7 +1087,7 @@ find-pmgr(){ # OS distribution auto-detection if type lsb_release >/dev/null 2>&1; then # linuxbase.org - OS=$(lsb_release -si) + ID=$(lsb_release -si) OS=$(lsb_release -si) VER=$(lsb_release -sr) elif [ -f /etc/debian_version ]; then @@ -1105,6 +1105,8 @@ find-pmgr(){ elif [ -f /etc/os-release ]; then # freedesktop.org arch and systemd . /etc/os-release + ID=${ID:-VERSION_ID} + ID=${ID:-VERSION} OS=$NAME VER=$VERSION_ID VER=${VER:-$VERSION} @@ -1127,7 +1129,7 @@ find-pmgr(){ online_pmgr="pacman" offline_pmgr="pacman" ;; - debian | ubuntu) + debian | ubuntu | Ubuntu) online_pmgr="apt-get" offline_pmgr="dpkg" ;; @@ -1143,9 +1145,135 @@ find-pmgr(){ online_pmgr="zypper" offline_pmgr="rpm" ;; - ubuntu esac - "dpkg" "brew" "yum" "gdebi" "apt-get" "pacman" "emerge" "zypper" "dnf" "rpm" + if packageExtension == 'deb' and ipm == 'dpkg': + pmgr = "dpkg" + pre = "" + if commandType == "install": + pre = "echo 'yes' | sudo " + post = " -i " + elif commandType == "queryLocalInstall": + pre = "sudo " + post = " -l "+packageName+" | grep -ic 'no packagesfound\|error'" + elif commandType == "queryLocalVer": + pre = "sudo " + post = " -l "+packageName+" | grep ii" + elif commandType == "remove": + pre = "echo 'yes' | sudo " + post = " -r " + elif commandType == "queryAvailVer": + pre = "sudo " + post = " -I "+packageName+" | grep -i version" + pmgrCMD = pre+ipm+post + + elif ipm == 'pacman': + pmgr = 'pacman' + pre = "sudo " + if commandType == "install": + post = " -S --noconfirm "+packageName + elif commandType == "queryLocalInstall": + pre = "if [[ $(sudo " + post = " -Ss "+packageName+" | grep '/"+packageName+"[^-,^_]' | grep -ic 'installed') == 1 ]] ; then echo 0 ; else echo 1 ; fi" + elif commandType == "queryLocalVersion": + post = " -Ss "+packageName+" | grep '/"+packageName+"[^-,^_]' | grep -i Installed | awk '{print $2}'" + elif commandType == "remove": + post = " -R --noconfirm "+packageName + elif commandType == "queryAvailVer": + post = " -Ss "+packageName+" | grep '/"+packageName+"[^-,^_]' | grep -iv 'installed' | awk '{print $2}'" + pmgrCMD = pre+pmgr+post + + elif ipm == 'apt-get' or ipm == 'apt': + pmgr = "apt" + pre = "sudo " + if commandType == "install": + post = "-get install -y "+packageName + elif commandType == "queryLocalInstall": + post = "-cache policy "+packageName+" | grep -ic 'none\|Unable'" + elif commandType == "queryLocalVersion": + post = "-cache policy "+packageName+" | grep -i Installed | awk '{print $2}'" + elif commandType == "remove": + post = "-get remove -y "+packageName + elif commandType == "queryAvailVer": + post = " list "+packageName+" 2>&1 | grep '^"+packageName+"\/' | head -n 1 | awk '{print $2}'" + pmgrCMD = pre+pmgr+post + + elif ipm == 'yum' or ipm == 'dnf': + pmgr = ipm + pre = "sudo " + if commandType == "install": + post = "-get install -y "+packageName + elif commandType == "queryLocalInstall": + post = "-cache policy "+packageName+"| grep -ic 'none\|Unable'" + elif commandType == "queryLocalVersion": + post = "-cache policy "+packageName+" | grep -i Installed " + elif commandType == "remove": + post = "-get remove -y"+packageName + elif commandType == "queryAvailVer": + post = "-I "+packageName+" | grep -i version" + pmgrCMD = pre+pmgr+post + + + # TODO: All package managers beyond this point need to be reworked to correctly function + elif ipm == 'emerge': + pmgr = "apt" + pre = "sudo " + if commandType == "install": + post = "-get install -y " + elif commandType == "queryLocalInstall": + post = "-cache policy "+packageName+"| grep -ic 'none\|Unable'" + elif commandType == "queryLocalVersion": + post = "-cache policy | grep -i Installed " + elif commandType == "remove": + post = "-get remove -y" + elif commandType == "queryAvailVer": + post = "-I | grep -i version" + pmgrCMD = pre+pmgr+post + + elif ipm == 'zypper': + pmgr = "apt" + pre = "sudo " + if commandType == "install": + post = "-get install -y " + elif commandType == "queryLocalInstall": + post = "-cache policy "+packageName+"| grep -ic 'none\|Unable'" + elif commandType == "queryLocalVersion": + post = "-cache policy | grep -i Installed " + elif commandType == "remove": + post = "-get remove -y" + elif commandType == "queryAvailVer": + post = "-I | grep -i version" + pmgrCMD = pre+pmgr+post + + elif ipm == 'brew': + pmgr = "apt" + pre = "sudo " + if commandType == "install": + post = "-get install -y "+packageName + elif commandType == "queryLocalInstall": + post = "-cache policy "+packageName+"| grep -ic 'none\|Unable'" + elif commandType == "queryLocalVersion": + post = "-cache policy "+packageName+" | grep -i Installed " + elif commandType == "remove": + post = "-get remove -y "+packageName + elif commandType == "queryAvailVer": + post = "-I "+packageName+" | grep '^"+packageName+" -" + pmgrCMD = pre+pmgr+post + + elif ipm == 'gdebi' and packageExtension == 'deb': + pmgr = "apt" + pre = "sudo " + pCMD = pre+pmgr + if commandType == "install": + post = "-get install -y "+packageName + elif commandType == "queryLocalInstall": + post = "-cache policy "+packageName+"| grep -ic 'none\|Unable'" + elif commandType == "queryLocalVersion": + post = "-cache policy "+packageName+" | grep -i Installed " + elif commandType == "remove": + post = "-get remove -y "+packageName + elif commandType == "queryAvailVer": + post = "-I "+packageName+" | grep -i version " + pmgrCMD = pCMD+post } -set-boxtype +set-boxtype \ No newline at end of file From 0449c9f6702fae83db372b707cdb196348403323 Mon Sep 17 00:00:00 2001 From: alanw Date: Tue, 23 May 2023 16:39:47 -0700 Subject: [PATCH 03/15] new algo testingnew algo testing --- functions | 239 ++++++++++++++++++++++++++---------------------------- 1 file changed, 117 insertions(+), 122 deletions(-) diff --git a/functions b/functions index 12ca6f3..a21fc52 100644 --- a/functions +++ b/functions @@ -1146,134 +1146,129 @@ find-pmgr(){ offline_pmgr="rpm" ;; esac - if packageExtension == 'deb' and ipm == 'dpkg': - pmgr = "dpkg" - pre = "" - if commandType == "install": - pre = "echo 'yes' | sudo " - post = " -i " - elif commandType == "queryLocalInstall": - pre = "sudo " - post = " -l "+packageName+" | grep -ic 'no packagesfound\|error'" - elif commandType == "queryLocalVer": - pre = "sudo " - post = " -l "+packageName+" | grep ii" - elif commandType == "remove": - pre = "echo 'yes' | sudo " - post = " -r " - elif commandType == "queryAvailVer": - pre = "sudo " - post = " -I "+packageName+" | grep -i version" - pmgrCMD = pre+ipm+post - elif ipm == 'pacman': - pmgr = 'pacman' - pre = "sudo " - if commandType == "install": - post = " -S --noconfirm "+packageName - elif commandType == "queryLocalInstall": - pre = "if [[ $(sudo " - post = " -Ss "+packageName+" | grep '/"+packageName+"[^-,^_]' | grep -ic 'installed') == 1 ]] ; then echo 0 ; else echo 1 ; fi" - elif commandType == "queryLocalVersion": - post = " -Ss "+packageName+" | grep '/"+packageName+"[^-,^_]' | grep -i Installed | awk '{print $2}'" - elif commandType == "remove": - post = " -R --noconfirm "+packageName - elif commandType == "queryAvailVer": - post = " -Ss "+packageName+" | grep '/"+packageName+"[^-,^_]' | grep -iv 'installed' | awk '{print $2}'" - pmgrCMD = pre+pmgr+post +install_packages(){ + declare -a packages=() + declare -a offline_packages=() - elif ipm == 'apt-get' or ipm == 'apt': - pmgr = "apt" - pre = "sudo " - if commandType == "install": - post = "-get install -y "+packageName - elif commandType == "queryLocalInstall": - post = "-cache policy "+packageName+" | grep -ic 'none\|Unable'" - elif commandType == "queryLocalVersion": - post = "-cache policy "+packageName+" | grep -i Installed | awk '{print $2}'" - elif commandType == "remove": - post = "-get remove -y "+packageName - elif commandType == "queryAvailVer": - post = " list "+packageName+" 2>&1 | grep '^"+packageName+"\/' | head -n 1 | awk '{print $2}'" - pmgrCMD = pre+pmgr+post + # Separate package names and file arguments + for arg in "$@"; do + if [[ -f $arg ]]; then + offline_packages+=("$arg") + else + packages+=("$arg") + fi + done - elif ipm == 'yum' or ipm == 'dnf': - pmgr = ipm - pre = "sudo " - if commandType == "install": - post = "-get install -y "+packageName - elif commandType == "queryLocalInstall": - post = "-cache policy "+packageName+"| grep -ic 'none\|Unable'" - elif commandType == "queryLocalVersion": - post = "-cache policy "+packageName+" | grep -i Installed " - elif commandType == "remove": - post = "-get remove -y"+packageName - elif commandType == "queryAvailVer": - post = "-I "+packageName+" | grep -i version" - pmgrCMD = pre+pmgr+post + local distro="" + local package_manager="" + # Detect distribution + if [ -f /etc/os-release ]; then + distro=$(awk -F= '/^ID=/{print $2}' /etc/os-release) + elif [ -f /etc/lsb-release ]; then + distro=$(awk -F= '/^DISTRIB_ID=/{print $2}' /etc/lsb-release) + elif [ -f /etc/debian_version ]; then + distro="debian" + elif [ -f /etc/redhat-release ]; then + distro="rhel" + elif [ -f /etc/SuSE-release ]; then + distro="opensuse" + elif [ -f /etc/slackware-version ]; then + distro="slackware" + elif [ "$(uname)" == "Darwin" ]; then + distro="macos" + else + echo "Unsupported distribution. Unable to determine the package manager." + return 1 + fi - # TODO: All package managers beyond this point need to be reworked to correctly function - elif ipm == 'emerge': - pmgr = "apt" - pre = "sudo " - if commandType == "install": - post = "-get install -y " - elif commandType == "queryLocalInstall": - post = "-cache policy "+packageName+"| grep -ic 'none\|Unable'" - elif commandType == "queryLocalVersion": - post = "-cache policy | grep -i Installed " - elif commandType == "remove": - post = "-get remove -y" - elif commandType == "queryAvailVer": - post = "-I | grep -i version" - pmgrCMD = pre+pmgr+post + # Detect package manager + case "$distro" in + "debian"|"ubuntu") + package_manager="apt-get" + ;; + "fedora"|"centos"|"rhel") + package_manager="yum" + ;; + "opensuse") + package_manager="zypper" + ;; + "arch") + package_manager="pacman" + ;; + "slackware") + package_manager="pkgtool" + ;; + "macos") + package_manager="brew" + ;; + *) + echo "Unsupported distribution. Unable to determine the package manager." + return 1 + ;; + esac - elif ipm == 'zypper': - pmgr = "apt" - pre = "sudo " - if commandType == "install": - post = "-get install -y " - elif commandType == "queryLocalInstall": - post = "-cache policy "+packageName+"| grep -ic 'none\|Unable'" - elif commandType == "queryLocalVersion": - post = "-cache policy | grep -i Installed " - elif commandType == "remove": - post = "-get remove -y" - elif commandType == "queryAvailVer": - post = "-I | grep -i version" - pmgrCMD = pre+pmgr+post - - elif ipm == 'brew': - pmgr = "apt" - pre = "sudo " - if commandType == "install": - post = "-get install -y "+packageName - elif commandType == "queryLocalInstall": - post = "-cache policy "+packageName+"| grep -ic 'none\|Unable'" - elif commandType == "queryLocalVersion": - post = "-cache policy "+packageName+" | grep -i Installed " - elif commandType == "remove": - post = "-get remove -y "+packageName - elif commandType == "queryAvailVer": - post = "-I "+packageName+" | grep '^"+packageName+" -" - pmgrCMD = pre+pmgr+post - - elif ipm == 'gdebi' and packageExtension == 'deb': - pmgr = "apt" - pre = "sudo " - pCMD = pre+pmgr - if commandType == "install": - post = "-get install -y "+packageName - elif commandType == "queryLocalInstall": - post = "-cache policy "+packageName+"| grep -ic 'none\|Unable'" - elif commandType == "queryLocalVersion": - post = "-cache policy "+packageName+" | grep -i Installed " - elif commandType == "remove": - post = "-get remove -y "+packageName - elif commandType == "queryAvailVer": - post = "-I "+packageName+" | grep -i version " - pmgrCMD = pCMD+post + # Install packages using package manager + case "$package_manager" in + "apt-get") + if [ "${#packages[@]}" -gt 0 ]; then + sudo apt-get update + sudo apt-get install "${packages[@]}" + fi + if [ "${#offline_packages[@]}" -gt 0 ]; then + sudo dpkg -i "${offline_packages[@]}" + fi + ;; + "yum") + if [ "${#packages[@]}" -gt 0 ]; then + sudo yum install "${packages[@]}" + fi + if [ "${#offline_packages[@]}" -gt 0 ]; then + sudo rpm -i "${offline_packages[@]}" + fi + ;; + "zypper") + if [ "${#packages[@]}" -gt 0 ]; then + sudo zypper refresh + sudo zypper install "${packages[@]}" + fi + if [ "${#offline_packages[@]}" -gt 0 ]; then + sudo rpm -i "${offline_packages[@]}" + fi + ;; + "pacman") + if [ "${#packages[@]}" -gt 0 ]; then + sudo pacman -Syu + sudo pacman -S "${packages[@]}" + fi + if [ "${#offline_packages[@]}" -gt 0 ]; then + sudo pacman -U "${offline_packages[@]}" + fi + ;; + "pkgtool") + for package in "${packages[@]}"; do + sudo installpkg "$package" + done + for package_file in "${offline_packages[@]}"; do + sudo installpkg "$package_file" + done + ;; + "brew") + if [ "${#packages[@]}" -gt 0 ]; then + brew install "${packages[@]}" + fi + if [ "${#offline_packages[@]}" -gt 0 ]; then + for package_file in "${offline_packages[@]}"; do + brew install "$package_file" + done + fi + ;; + *) + echo "Unsupported package manager." + return 1 + ;; + esac } set-boxtype \ No newline at end of file From ba446e52db5ed6da8f60602efb1ddeeb33c8c146 Mon Sep 17 00:00:00 2001 From: alanw Date: Thu, 25 May 2023 13:59:32 -0700 Subject: [PATCH 04/15] added offline package handling, refactored system detection --- functions | 163 ++++++++++++++++-------------------------------------- 1 file changed, 48 insertions(+), 115 deletions(-) diff --git a/functions b/functions index a21fc52..6210288 100644 --- a/functions +++ b/functions @@ -1083,7 +1083,7 @@ compare-versions(){ fi } -find-pmgr(){ +identify-system(){ # OS distribution auto-detection if type lsb_release >/dev/null 2>&1; then # linuxbase.org @@ -1118,40 +1118,19 @@ find-pmgr(){ OS=$(uname -s) VER=$(uname -r) fi +} - # Match distribution with available utilities - case $ID in - amzn | centos | fedora | rhel) - online_pmgr="yum" - offline_pmgr="rpm" - ;; - arch | Arch | manjaro) - online_pmgr="pacman" - offline_pmgr="pacman" - ;; - debian | ubuntu | Ubuntu) - online_pmgr="apt-get" - offline_pmgr="dpkg" - ;; - opensuse) - online_pmgr="zypper" - offline_pmgr="zypper" - ;; - slackware) - online_pmgr="slackpkg" - offline_pmgr="installpkg" - ;; - sles) - online_pmgr="zypper" - offline_pmgr="rpm" - ;; - esac +ID(){ + boxborder \ + "ID: $ID" \ + "OS: $OS" \ + "VER: $VER" +} install_packages(){ + # Separate package names and file arguments declare -a packages=() declare -a offline_packages=() - - # Separate package names and file arguments for arg in "$@"; do if [[ -f $arg ]]; then offline_packages+=("$arg") @@ -1159,85 +1138,21 @@ install_packages(){ packages+=("$arg") fi done + # Identify which distro is being run + identify-system - local distro="" - local package_manager="" - - # Detect distribution - if [ -f /etc/os-release ]; then - distro=$(awk -F= '/^ID=/{print $2}' /etc/os-release) - elif [ -f /etc/lsb-release ]; then - distro=$(awk -F= '/^DISTRIB_ID=/{print $2}' /etc/lsb-release) - elif [ -f /etc/debian_version ]; then - distro="debian" - elif [ -f /etc/redhat-release ]; then - distro="rhel" - elif [ -f /etc/SuSE-release ]; then - distro="opensuse" - elif [ -f /etc/slackware-version ]; then - distro="slackware" - elif [ "$(uname)" == "Darwin" ]; then - distro="macos" - else - echo "Unsupported distribution. Unable to determine the package manager." - return 1 - fi - - # Detect package manager - case "$distro" in - "debian"|"ubuntu") - package_manager="apt-get" - ;; - "fedora"|"centos"|"rhel") - package_manager="yum" - ;; - "opensuse") - package_manager="zypper" - ;; - "arch") - package_manager="pacman" - ;; - "slackware") - package_manager="pkgtool" - ;; - "macos") - package_manager="brew" - ;; - *) - echo "Unsupported distribution. Unable to determine the package manager." - return 1 - ;; - esac - - # Install packages using package manager - case "$package_manager" in - "apt-get") + # Match distribution with available utilities + # TODO: Add package name transformer lists + case $ID in + amzn | centos | fedora | rhel) if [ "${#packages[@]}" -gt 0 ]; then - sudo apt-get update - sudo apt-get install "${packages[@]}" + sudo yum install -y "${packages[@]}" fi if [ "${#offline_packages[@]}" -gt 0 ]; then - sudo dpkg -i "${offline_packages[@]}" + sudo rpm -i "${packages[@]}" fi ;; - "yum") - if [ "${#packages[@]}" -gt 0 ]; then - sudo yum install "${packages[@]}" - fi - if [ "${#offline_packages[@]}" -gt 0 ]; then - sudo rpm -i "${offline_packages[@]}" - fi - ;; - "zypper") - if [ "${#packages[@]}" -gt 0 ]; then - sudo zypper refresh - sudo zypper install "${packages[@]}" - fi - if [ "${#offline_packages[@]}" -gt 0 ]; then - sudo rpm -i "${offline_packages[@]}" - fi - ;; - "pacman") + arch | Arch | manjaro) if [ "${#packages[@]}" -gt 0 ]; then sudo pacman -Syu sudo pacman -S "${packages[@]}" @@ -1246,15 +1161,37 @@ install_packages(){ sudo pacman -U "${offline_packages[@]}" fi ;; - "pkgtool") - for package in "${packages[@]}"; do - sudo installpkg "$package" - done - for package_file in "${offline_packages[@]}"; do - sudo installpkg "$package_file" - done + debian | ubuntu | Ubuntu) + if [ "${#packages[@]}" -gt 0 ]; then + sudo apt-get update + sudo apt-get install "${packages[@]}" + fi + if [ "${#offline_packages[@]}" -gt 0 ]; then + sudo dpkg -i "${offline_packages[@]}" + fi ;; - "brew") + opensuse | sles) + if [ "${#packages[@]}" -gt 0 ]; then + sudo zypper refresh + sudo zypper install "${packages[@]}" + fi + if [ "${#offline_packages[@]}" -gt 0 ]; then + sudo rpm -i "${offline_packages[@]}" + fi + ;; + slackware) + if [ "${#packages[@]}" -gt 0 ]; then + for package in "${packages[@]}"; do + sudo installpkg "$package" + done + fi + if [ "${#offline_packages[@]}" -gt 0 ]; then + for package_file in "${offline_packages[@]}"; do + sudo installpkg "$package_file" + done + fi + ;; + brew) if [ "${#packages[@]}" -gt 0 ]; then brew install "${packages[@]}" fi @@ -1264,10 +1201,6 @@ install_packages(){ done fi ;; - *) - echo "Unsupported package manager." - return 1 - ;; esac } From 37f2332c11616255fd424c2b66dc54ae6df518d2 Mon Sep 17 00:00:00 2001 From: alanw Date: Thu, 25 May 2023 14:00:41 -0700 Subject: [PATCH 05/15] v1.4.0 - beta package managementv1.4.0 - beta package management --- functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions b/functions index 6210288..b559423 100644 --- a/functions +++ b/functions @@ -2,7 +2,7 @@ # pyr0ball script functions library # Initial Vars -functionsrev=1.3.0 +functionsrev=1.4.0 #scriptname="${BASH_SOURCE[0]##*/}" #rundir="${BASH_SOURCE[0]%/*}" #rundir_absolute=$(cd $rundir && pwd) From fc1b52538e1faa45a23cf4940ffc8cc24e3b7b74 Mon Sep 17 00:00:00 2001 From: alanw Date: Thu, 25 May 2023 14:38:22 -0700 Subject: [PATCH 06/15] refactored boxborder stylization --- functions | 295 ++++++++++++++++-------------------------------------- 1 file changed, 89 insertions(+), 206 deletions(-) diff --git a/functions b/functions index b559423..c8a7280 100644 --- a/functions +++ b/functions @@ -98,194 +98,101 @@ else BOXWIDTH=80 fi + set_borders() { + top_border=$1 + bottom_border=$2 + left_border=$3 + right_border=$4 + left_top_border=$5 + right_top_border=$6 + left_bottom_border=$7 + right_bottom_border=$8 + box_break_line=$9 +} + # Box Drawing characters case $OSTYPE in linux-gnu*|cygwin|msys) - light_h=$(echo -e "\u2500") - norm_h=$(echo -e "\u2501") - double_h=$(echo -e "\u2550") - light_v=$(echo -e "\u2502") - norm_v=$(echo -e "\u2503") - double_v=$(echo -e "\u2551") + light_h='\u2500' + norm_h='\u2501' + double_h='\u2550' + light_v='\u2502' + norm_v='\u2503' + double_v='\u2551' ;;& darwin* ) - light_h=$(echo -e "─") - norm_h=$(echo -e "━") - double_h=$(echo -e "═") - light_v=$(echo -e "│") - norm_v=$(echo -e "┃") - double_v=$(echo -e "║") + light_h='─' + norm_h='━' + double_h='═' + light_v='│' + norm_v='┃' + double_v='║' ;; esac - - -# Box border type single-line -box-norm(){ - # ---------------------------------------# + # Box border type single-line +box-norm() { case $OSTYPE in linux-gnu*|cygwin|msys) - top_border=${norm_h} - bottom_border=${norm_h} - left_border=${norm_v} - right_border=${norm_v} - left_top_border=$(echo -e "\u250f") - right_top_border=$(echo -e "\u2513") - left_bottom_border=$(echo -e "\u2517") - right_bottom_border=$(echo -e "\u251b") - box_break_line=$(echo -e "\u25AB") + set_borders "${norm_h}" "${norm_h}" "${norm_v}" "${norm_v}" "\u250f" "\u2513" "\u2517" "\u251b" "\u25AB" ;;& darwin* ) - top_border=${norm_h} - bottom_border=${norm_h} - left_border=${norm_v} - right_border=${norm_v} - left_top_border=$(echo -e "┏") - right_top_border=$(echo -e "┓") - left_bottom_border=$(echo -e "┗") - right_bottom_border=$(echo -e "┛") - box_break_line=$(echo -e "▫") + set_borders "${norm_h}" "${norm_h}" "${norm_v}" "${norm_v}" "┏" "┓" "┗" "┛" "▫" ;; esac - - # ---------------------------------------# } -# Box border type double-line -box-double(){ - # ---------------------------------------# + # Box border type double-line +box-double() { case $OSTYPE in linux-gnu*|cygwin|msys) - top_border=${double_h} - bottom_border=${double_h} - left_border=${double_v} - right_border=${double_v} - left_top_border=$(echo -e "\u2554") - right_top_border=$(echo -e "\u2557") - left_bottom_border=$(echo -e "\u255A") - right_bottom_border=$(echo -e "\u255D") - box_break_line=$(echo -e "\u25AB") + set_borders "${double_h}" "${double_h}" "${double_v}" "${double_v}" "\u2554" "\u2557" "\u255A" "\u255D" "\u25AB" ;;& darwin* ) - top_border=${double_h} - bottom_border=${double_h} - left_border=${double_v} - right_border=${double_v} - left_top_border=$(echo -e "╔") - right_top_border=$(echo -e "╗") - left_bottom_border=$(echo -e "╚") - right_bottom_border=$(echo -e "╝") - box_break_line=$(echo -e "▫") + set_borders "${double_h}" "${double_h}" "${double_v}" "${double_v}" "╔" "╗" "╚" "╝" "▫" ;; esac - # ---------------------------------------# } -# Box border type thick-line + # Box border type thick-line box-heavy(){ - # ---------------------------------------# case $OSTYPE in linux-gnu*|cygwin|msys) - top_border=$(echo -e "\u2580") - bottom_border=$(echo -e "\u2584") - left_border=$(echo -e "\u258C") - right_border=$(echo -e "\u2590") - left_top_border=$(echo -e "\u259B") - right_top_border=$(echo -e "\u259C") - left_bottom_border=$(echo -e "\u2599") - right_bottom_border=$(echo -e "\u259F") - box_break_line=$(echo -e "\u25AC") + set_borders "\u2580" "\u2584" "\u258C" "\u2590" "\u259B" "\u259C" "\u2599" "\u259F" "\u25AB" ;;& darwin* ) - top_border=$(echo -e "▀") - bottom_border=$(echo -e "▄") - left_border=$(echo -e "▌") - right_border=$(echo -e "▐") - left_top_border=$(echo -e "▛") - right_top_border=$(echo -e "▜") - left_bottom_border=$(echo -e "▙") - right_bottom_border=$(echo -e "▟") - box_break_line=$(echo -e "▫") + set_borders "▀" "▄" "▌" "▐" "▛" "▜" "▙" "▟" "▫" ;; esac - # ---------------------------------------# } -# Box border type thin-line + # Box border type thin-line box-light(){ - # ---------------------------------------# - #top_border=$(echo -e '\u23BA') case $OSTYPE in linux-gnu*|cygwin|msys) - top_border=${light_h} - bottom_border=${light_h} - left_border=${light_v} - right_border=${light_v} - left_top_border=$(echo -e "\u25AB") - right_top_border=$(echo -e "\u25AB") - left_bottom_border=$(echo -e "\u25AB") - right_bottom_border=$(echo -e "\u25AB") - box_break_line=$(echo -e "\u23AF") + set_borders "${light_h}" "${light_h}" "${light_v}" "${light_v}" "\u25AB" "\u25AB" "\u25AB" "\u25AB" "\u23AF" ;;& darwin* ) - top_border=${light_h} - bottom_border=${light_h} - left_border=${light_v} - right_border=${light_v} - left_top_border=$(echo -e "▫") - right_top_border=$(echo -e "▫") - left_bottom_border=$(echo -e "▫") - right_bottom_border=$(echo -e "▫") - box_break_line=$(echo -e "⎯") + set_borders "${light_h}" "${light_h}" "${light_v}" "${light_v}" "▫" "▫" "▫" "▫" "⎯" ;; esac - # ---------------------------------------# } -box-rounded(){ - # ---------------------------------------# + box-rounded(){ case $OSTYPE in linux-gnu*|cygwin|msys) - top_border=${light_h} - bottom_border=${light_h} - left_border=${light_v} - right_border=${light_v} - left_top_border=$(echo -e "\u256D") - right_top_border=$(echo -e "\u256E") - left_bottom_border=$(echo -e "\u2570") - right_bottom_border=$(echo -e "\u256F") - box_break_line=$(echo -e "\u25A2") + set_borders "${light_h}" "${light_h}" "${light_v}" "${light_v}" "\u256D" "\u256E" "\u2570" "\u256F" "\u25A2" ;;& darwin* ) - top_border=${light_h} - bottom_border=${light_h} - left_border=${light_v} - right_border=${light_v} - left_top_border=$(echo -e "╭") - right_top_border=$(echo -e "╮") - left_bottom_border=$(echo -e "╰") - right_bottom_border=$(echo -e "╯") - box_break_line=$(echo -e "▢") + set_borders "${light_h}" "${light_h}" "${light_v}" "${light_v}" "╭" "╮" "╰" "╯" "▢" ;; esac - # ---------------------------------------# } -box-singlechar(){ - # ---------------------------------------# - top_border=$borderchar - bottom_border=$borderchar - left_border=$borderchar - right_border=$borderchar - left_top_border=$borderchar - right_top_border=$borderchar - left_bottom_border=$borderchar - right_bottom_border=$borderchar - box_break_line="-" - # ---------------------------------------# + box-singlechar(){ + set_borders "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "-" } - -set-boxtype(){ + set-boxtype(){ case $boxtype in norm) box-norm ;; double) box-double ;; @@ -1083,52 +990,44 @@ compare-versions(){ fi } -identify-system(){ - # OS distribution auto-detection +identify_system() { if type lsb_release >/dev/null 2>&1; then - # linuxbase.org - ID=$(lsb_release -si) - OS=$(lsb_release -si) - VER=$(lsb_release -sr) - elif [ -f /etc/debian_version ]; then - # Older Debian/Ubuntu/etc. - ID=debian - OS=Debian - VER=$(cat /etc/debian_version) - elif [ -f /etc/lsb-release ]; then - # For Arch and some versions of Debian/Ubuntu without lsb_release command - . /etc/lsb-release - ID=$DISTRIB_ID - OS=$DISTRIB_ID - VER=$DISTRIB_RELEASE - VER=${VER:-$LSB_VERSION} + ID=$(lsb_release -si) + OS=$(lsb_release -si) + VER=$(lsb_release -sr) elif [ -f /etc/os-release ]; then - # freedesktop.org arch and systemd - . /etc/os-release - ID=${ID:-VERSION_ID} - ID=${ID:-VERSION} - OS=$NAME - VER=$VERSION_ID - VER=${VER:-$VERSION} + . /etc/os-release + ID=${ID:-$VERSION_ID} + ID=${ID:-$VERSION} + OS=$NAME + VER=$VERSION_ID + VER=${VER:-$VERSION} + elif [ -f /etc/lsb-release ]; then + . /etc/lsb-release + ID=$DISTRIB_ID + OS=$DISTRIB_ID + VER=$DISTRIB_RELEASE + VER=${VER:-$LSB_VERSION} + elif [ -f /etc/debian_version ]; then + ID=debian + OS=Debian + VER=$(cat /etc/debian_version) elif [ -f /etc/redhat-release ]; then - # Older Red Hat, CentOS, etc. - OS=$(cat /etc/redhat-release | awk '{print $1}') + OS=$(awk '{print $1}' /etc/redhat-release) else - # Fall back to uname, e.g. "Linux ", also works for BSD, etc. - OS=$(uname -s) - VER=$(uname -r) + OS=$(uname -s) + VER=$(uname -r) fi } -ID(){ + ID() { boxborder \ - "ID: $ID" \ - "OS: $OS" \ - "VER: $VER" + "ID: $ID" \ + "OS: $OS" \ + "VER: $VER" } -install_packages(){ - # Separate package names and file arguments + install_packages() { declare -a packages=() declare -a offline_packages=() for arg in "$@"; do @@ -1138,66 +1037,50 @@ install_packages(){ packages+=("$arg") fi done - # Identify which distro is being run - identify-system - - # Match distribution with available utilities - # TODO: Add package name transformer lists - case $ID in + identify_system + case $ID in amzn | centos | fedora | rhel) - if [ "${#packages[@]}" -gt 0 ]; then - sudo yum install -y "${packages[@]}" - fi - if [ "${#offline_packages[@]}" -gt 0 ]; then - sudo rpm -i "${packages[@]}" - fi + [ "${#packages[@]}" -gt 0 ] && run sudo yum install -y "${packages[@]}" + [ "${#offline_packages[@]}" -gt 0 ] && run sudo rpm -i "${packages[@]}" ;; arch | Arch | manjaro) if [ "${#packages[@]}" -gt 0 ]; then - sudo pacman -Syu - sudo pacman -S "${packages[@]}" - fi - if [ "${#offline_packages[@]}" -gt 0 ]; then - sudo pacman -U "${offline_packages[@]}" + run sudo pacman -Syu + run sudo pacman -S "${packages[@]}" fi + [ "${#offline_packages[@]}" -gt 0 ] && run sudo pacman -U "${offline_packages[@]}" ;; debian | ubuntu | Ubuntu) if [ "${#packages[@]}" -gt 0 ]; then - sudo apt-get update - sudo apt-get install "${packages[@]}" - fi - if [ "${#offline_packages[@]}" -gt 0 ]; then - sudo dpkg -i "${offline_packages[@]}" + run sudo apt-get update + run sudo apt-get install "${packages[@]}" fi + [ "${#offline_packages[@]}" -gt 0 ] && run sudo dpkg -i "${offline_packages[@]}" ;; opensuse | sles) if [ "${#packages[@]}" -gt 0 ]; then - sudo zypper refresh - sudo zypper install "${packages[@]}" - fi - if [ "${#offline_packages[@]}" -gt 0 ]; then - sudo rpm -i "${offline_packages[@]}" + run sudo zypper refresh + run sudo zypper install "${packages[@]}" fi + [ "${#offline_packages[@]}" -gt 0 ] && run sudo rpm -i "${offline_packages[@]}" ;; slackware) if [ "${#packages[@]}" -gt 0 ]; then for package in "${packages[@]}"; do - sudo installpkg "$package" + run sudo installpkg "$package" done fi if [ "${#offline_packages[@]}" -gt 0 ]; then for package_file in "${offline_packages[@]}"; do - sudo installpkg "$package_file" + run sudo installpkg "$package_file" done fi ;; brew) - if [ "${#packages[@]}" -gt 0 ]; then - brew install "${packages[@]}" - fi + [ "${#packages[@]}" -gt 0 ] && run brew install "${packages[@]}" if [ "${#offline_packages[@]}" -gt 0 ]; then for package_file in "${offline_packages[@]}"; do - brew install "$package_file" + run brew install "$package_file" done fi ;; From 64764f8d40c558cfd2e5cd9868d94ed222b4c3a2 Mon Sep 17 00:00:00 2001 From: alanw Date: Thu, 25 May 2023 14:44:14 -0700 Subject: [PATCH 07/15] v1.5.0 - optimization pass1 --- functions | 2 ++ 1 file changed, 2 insertions(+) diff --git a/functions b/functions index c8a7280..af58222 100644 --- a/functions +++ b/functions @@ -2,7 +2,9 @@ # pyr0ball script functions library # Initial Vars +functionsrev=1.5.0 functionsrev=1.4.0 +functionsrev=1.5.0 #scriptname="${BASH_SOURCE[0]##*/}" #rundir="${BASH_SOURCE[0]%/*}" #rundir_absolute=$(cd $rundir && pwd) From d9ad8811b4aa847cbcdedd03b09cb786d958d79c Mon Sep 17 00:00:00 2001 From: alanw Date: Thu, 25 May 2023 14:45:14 -0700 Subject: [PATCH 08/15] refactored boxborder functions for optimized prints --- functions | 140 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 90 insertions(+), 50 deletions(-) diff --git a/functions b/functions index af58222..3517458 100644 --- a/functions +++ b/functions @@ -3,8 +3,6 @@ # Initial Vars functionsrev=1.5.0 -functionsrev=1.4.0 -functionsrev=1.5.0 #scriptname="${BASH_SOURCE[0]##*/}" #rundir="${BASH_SOURCE[0]%/*}" #rundir_absolute=$(cd $rundir && pwd) @@ -112,15 +110,46 @@ fi box_break_line=$9 } +# # Box Drawing characters +# case $OSTYPE in +# linux-gnu*|cygwin|msys) +# light_h='\u2500' +# norm_h='\u2501' +# double_h='\u2550' +# light_v='\u2502' +# norm_v='\u2503' +# double_v='\u2551' +# ;;& +# darwin* ) +# light_h='─' +# norm_h='━' +# double_h='═' +# light_v='│' +# norm_v='┃' +# double_v='║' +# ;; +# esac + +# # Box border type single-line +# box-norm() { +# case $OSTYPE in +# linux-gnu*|cygwin|msys) +# set_borders "${norm_h}" "${norm_h}" "${norm_v}" "${norm_v}" "\u250f" "\u2513" "\u2517" "\u251b" "\u25AB" +# set_borders "${double_h}" "${double_h}" "${double_v}" "${double_v}" "\u2554" "\u2557" "\u255A" "\u255D" "\u25AB" +# set_borders "\u2580" "\u2584" "\u258C" "\u2590" "\u259B" "\u259C" "\u2599" "\u259F" "\u25AB" +# set_borders "${light_h}" "${light_h}" "${light_v}" "${light_v}" "\u25AB" "\u25AB" "\u25AB" "\u25AB" "\u23AF" +# set_borders "${light_h}" "${light_h}" "${light_v}" "${light_v}" "\u256D" "\u256E" "\u2570" "\u256F" "\u25A2" + + # Box Drawing characters case $OSTYPE in linux-gnu*|cygwin|msys) - light_h='\u2500' - norm_h='\u2501' - double_h='\u2550' - light_v='\u2502' - norm_v='\u2503' - double_v='\u2551' + light_h='─' + norm_h='━' + double_h='═' + light_v='│' + norm_v='┃' + double_v='║' ;;& darwin* ) light_h='─' @@ -132,11 +161,23 @@ case $OSTYPE in ;; esac + set_borders() { + top_border=$1 + bottom_border=$2 + left_border=$3 + right_border=$4 + left_top_border=$5 + right_top_border=$6 + left_bottom_border=$7 + right_bottom_border=$8 + box_break_line=$9 +} + # Box border type single-line box-norm() { case $OSTYPE in linux-gnu*|cygwin|msys) - set_borders "${norm_h}" "${norm_h}" "${norm_v}" "${norm_v}" "\u250f" "\u2513" "\u2517" "\u251b" "\u25AB" + set_borders "${norm_h}" "${norm_h}" "${norm_v}" "${norm_v}" "┏" "┓" "┗" "┛" "▫" ;;& darwin* ) set_borders "${norm_h}" "${norm_h}" "${norm_v}" "${norm_v}" "┏" "┓" "┗" "┛" "▫" @@ -148,7 +189,7 @@ box-norm() { box-double() { case $OSTYPE in linux-gnu*|cygwin|msys) - set_borders "${double_h}" "${double_h}" "${double_v}" "${double_v}" "\u2554" "\u2557" "\u255A" "\u255D" "\u25AB" + set_borders "${double_h}" "${double_h}" "${double_v}" "${double_v}" "╔" "╗" "╚" "╝" "▫" ;;& darwin* ) set_borders "${double_h}" "${double_h}" "${double_v}" "${double_v}" "╔" "╗" "╚" "╝" "▫" @@ -160,7 +201,7 @@ box-double() { box-heavy(){ case $OSTYPE in linux-gnu*|cygwin|msys) - set_borders "\u2580" "\u2584" "\u258C" "\u2590" "\u259B" "\u259C" "\u2599" "\u259F" "\u25AB" + set_borders "▀" "▄" "▌" "▐" "▛" "▜" "▙" "▟" "▫" ;;& darwin* ) set_borders "▀" "▄" "▌" "▐" "▛" "▜" "▙" "▟" "▫" @@ -172,7 +213,7 @@ box-heavy(){ box-light(){ case $OSTYPE in linux-gnu*|cygwin|msys) - set_borders "${light_h}" "${light_h}" "${light_v}" "${light_v}" "\u25AB" "\u25AB" "\u25AB" "\u25AB" "\u23AF" + set_borders "${light_h}" "${light_h}" "${light_v}" "${light_v}" "▫" "▫" "▫" "▫" "⎯" ;;& darwin* ) set_borders "${light_h}" "${light_h}" "${light_v}" "${light_v}" "▫" "▫" "▫" "▫" "⎯" @@ -183,7 +224,7 @@ box-light(){ box-rounded(){ case $OSTYPE in linux-gnu*|cygwin|msys) - set_borders "${light_h}" "${light_h}" "${light_v}" "${light_v}" "\u256D" "\u256E" "\u2570" "\u256F" "\u25A2" + set_borders "${light_h}" "${light_h}" "${light_v}" "${light_v}" "╭" "╮" "╰" "╯" "▢" ;;& darwin* ) set_borders "${light_h}" "${light_h}" "${light_v}" "${light_v}" "╭" "╮" "╰" "╯" "▢" @@ -191,6 +232,21 @@ box-light(){ esac } + box-singlechar(){ + set_borders "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "-" +} + + set-boxtype(){ + case $boxtype in + norm) box-norm ;; + double) box-double ;; + heavy) box-heavy ;; + light) box-light ;; + rounded) box-rounded ;; + char) box-singlechar ;; + esac +} + box-singlechar(){ set_borders "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "-" } @@ -208,43 +264,31 @@ box-light(){ #set-boxtype repchar() { - n=1 - while [ $n -le $2 ] ; do - echo -n "$1" - n=$((n+1)) - done + local string=$(printf "%${2}s" "") + echo -n "${string// /$1}" } -boxtop() { - echo -n "$left_top_border" - repchar "$top_border" $((BOXWIDTH-1)) - echo -n "$right_top_border" - echo + boxtop() { + printf "%s%s%s\n" "$left_top_border" "$(repchar "$top_border" "$((BOXWIDTH-1))")" "$right_top_border" } -boxbottom() { - echo -n "$left_bottom_border" - repchar "$bottom_border" $((BOXWIDTH-1)) - echo -n "$right_bottom_border" - echo + boxbottom() { + printf "%s%s%s\n" "$left_bottom_border" "$(repchar "$bottom_border" "$((BOXWIDTH-1))")" "$right_bottom_border" } -boxlinelog() { - local _cmd=${@:1} - #echo -e "$left_border $(logger echo -e "${1}")\r${ESC}[${BOXWIDTH}C$right_border" - logger echo -e "$left_border $_cmd\r${ESC}[${BOXWIDTH}C$right_border" + boxlinelog() { + logger printf "%s%s\r${ESC}[%sC%s\n" "$left_border" "$1" "$BOXWIDTH" "$right_border" } -boxline(){ - echo -e "$left_border $1\r${ESC}[${BOXWIDTH}C$right_border" + boxline(){ + printf "%s%s\r${ESC}[%sC%s\n" "$left_border" "$1" "$BOXWIDTH" "$right_border" } -boxseparator(){ - repchar "$box_break_line" $((BOXWIDTH-3)) - echo + boxseparator(){ + printf "%s\n" "$(repchar "$box_break_line" "$((BOXWIDTH-3))")" } -boxborder(){ + boxborder(){ boxtop for line in "$@" ; do boxline "$line" @@ -252,27 +296,23 @@ boxborder(){ boxbottom } -boxborderlog(){ - local _cmd=() + boxborderlog(){ boxtop for line in "$@" ; do - _cmd+=("$line") - done - for line in ${_cmd[@]} ; do boxlinelog "$line" done boxbottom } -subboxborder(){ - BOXWIDTH_ORG=$BOXWIDTH - BOXWIDTH=$(($BOXWIDTH*75/100)) - boxline $(boxtop) + subboxborder(){ + local box_width_org="$BOXWIDTH" + BOXWIDTH=$(("$BOXWIDTH"*75/100)) + boxline "$(boxtop)" for line in "$@" ; do - boxline $(boxline "$line") + boxline "$(boxline "$line")" done - boxline $(boxbottom) - BOXWIDTH=$BOXWIDTH_ORG + boxline "$(boxbottom)" + BOXWIDTH="$box_width_org" } # # For printing center-justified text. To change the padding character, replace the ' ' <~~ whitespace in front of the '{' in the padding variable From ee2d534155a809cf21c840280c15f952419ab4f3 Mon Sep 17 00:00:00 2001 From: alanw Date: Thu, 25 May 2023 14:48:21 -0700 Subject: [PATCH 09/15] v1.5.1 - refactored boxborders --- functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions b/functions index 3517458..d0aecb8 100644 --- a/functions +++ b/functions @@ -2,7 +2,7 @@ # pyr0ball script functions library # Initial Vars -functionsrev=1.5.0 +functionsrev=1.5.1 #scriptname="${BASH_SOURCE[0]##*/}" #rundir="${BASH_SOURCE[0]%/*}" #rundir_absolute=$(cd $rundir && pwd) From 1d187a0c4dc72ef1306f7dfb6c4a82c636c91f9b Mon Sep 17 00:00:00 2001 From: alanw Date: Thu, 25 May 2023 16:14:27 -0700 Subject: [PATCH 10/15] added colorization to logoadded colorization to logo --- functions | 92 +++++++++++++++++++++++++------------------------------ 1 file changed, 42 insertions(+), 50 deletions(-) diff --git a/functions b/functions index d0aecb8..a13e2d1 100644 --- a/functions +++ b/functions @@ -10,6 +10,9 @@ functionsrev=1.5.1 pretty_date="$(date +%Y-%m-%d_%H-%M-%S)" short_date="$(date +%Y-%m-%d)" +# ensure ctrl-c to cancel script ends the entire process and not just the current function +# trap ctrl_c INT # Commented out by default to prevent abnormal background exits + # return any cursor mods to normal on exit cleanup(){ tput cnorm @@ -376,26 +379,18 @@ run-and-log(){ fi } -logger(){ - if [ ! -z $logfile ] ; then - if [ ! -f $logfile ] ; then - run mkdir -p ${rundir%/*} - touch $logfile - fi - $@ 2>&1 | tee >( - while IFS= read -r line; do - # strip any escaped strings for logging output - _line=$(echo $line | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | tr -dc '[:print:]') - # only print out non-empty lines to log - if [[ "$_line" != "" ]] ; then - printf '[%s] %s\n' "${scriptname}][${pretty_date}" "$_line" - fi - done >> $logfile - ) - else - $@ - fi -} +logger(){ + if [[ -w "$logfile" ]]; then + "$@" 2>&1 | tee -a "$logfile" | while IFS= read -r line; do + # strip any escaped strings for logging output + _line="${line//[$'\t\r\x01-\x1F\x7F-\xFF']}" + # only print out non-empty lines to log + [[ -n $_line ]] && printf '[%s][%s] %s\n' "$scriptname" "$pretty_date" "$_line" >> "$logfile" + done + else + "$@" + fi +} # File handling functions @@ -573,38 +568,35 @@ ctrl_c(){ } # Cosmetics - +PRBL_LOGO=" + ${ESC}[38;5;202m_!*(xL}}xvr!,.${dfl} + ${ESC}[38;5;202m>}KM3${ong}nLL}}}}}LLTh${ESC}[38;5;202m%5u>.${dfl} + ${ESC}[38;5;202mP${ESC}[38;5;202m8}.${dfl} + ${ESC}[38;5;202m?g${ong}2!${ESC}[38;5;202m%888${ESC}[38;5;178mB${ylw}B${ESC}[38;5;178mev*${ong}${ESC}[38;5;178m***^${ong}!!!!!.L${ESC}[38;5;202mB&?${dfl} + ${ESC}[38;5;202m>gF${ong}=${ESC}[38;5;202mRg8${ong}8${ylw}#5${dfl} ${ESC}[38;5;202m,${ong}^}${ESC}[38;5;202m#Be-${dfl} + ${ESC}[38;5;202mPg${ong}'${ESC}[38;5;202ma88${ong}8${ylw}#B ${ESC}[38;5;202m,unnnnn}- .ZO${ong}_${ESC}[38;5;202mN${ESC}[38;5;208m#B${ESC}[38;5;202mgr${dfl} +${ESC}[38;5;202m-gZ${ong}-${ESC}[38;5;202mg88${ong}8${ylw}B, ${ESC}[38;5;202m.U88${ong}!${ESC}[38;5;202mj${ESC}[38;5;208m#B#${ESC}[38;5;202m${ESC}[38;5;202mQs.${dfl} +${ESC}[38;5;202m.NM${ong}-${ESC}[38;5;202mD88${ong}N${ylw}! .${ESC}[38;5;202mj888${ong}=${ESC}[38;5;202mX${ESC}[38;5;208mQQ${ESC}[38;5;202mQ${ong}O${ESC}[38;5;202mQQ=${dfl} + ${ESC}[38;5;202m28${ong}>u${ESC}[38;5;202m8g< ${ESC}[38;5;178m,${ong}!!!!!!!!!!!!!!!!${ESC}[38;5;178m>Lp${ESC}[38;5;202mQ888K${ong},${ESC}[38;5;202mQQ${ESC}[38;5;208mg${ESC}[38;5;202my ,V>${dfl} + ${ESC}[38;5;202m_OM${ong}:K${ESC}[38;5;202m? ${ylw}.&#${ong}Q${ESC}[38;5;202m88888888888888${ESC}[38;5;178m#${ylw}@@${ESC}[38;5;178m#${ESC}[38;5;202m888M${ong}:p${ESC}[38;5;202m#${ESC}[38;5;208m#Q${ESC}[38;5;202m8G! .${dfl} + ${ESC}[38;5;202m,WM${ong}!.!!${ESC}[38;5;202m^p${ESC}[38;5;178m#${ylw}@@${ESC}[38;5;178m#${ong}#${ESC}[38;5;202mQ88g8888Q${ong}B${ESC}[38;5;178m#${ylw}@@${ESC}[38;5;178m#Q${ESC}[38;5;202m888e${ong}!W${ESC}[38;5;202m#${ESC}[38;5;208m####${ESC}[38;5;202mBBg2!${dfl} + ${ESC}[38;5;202m.u&n${ong}^y${ESC}[38;5;202mg88${ong}8${ESC}[38;5;178mQ${ylw}##@${ESC}[38;5;178m@${ong}@${ESC}[38;5;202m@@@${ong}@${ESC}[38;5;178m@@${ylw}@#${ESC}[38;5;178mB8${ong}8${ESC}[38;5;202m88K${ong}*}${ESC}[38;5;202mQ${ESC}[38;5;208m###${ESC}[38;5;202mBQ${ong}Q${ESC}[38;5;202mQ${ESC}[38;5;208mBB${ESC}[38;5;202m##gL.${dfl} + ${ESC}[38;5;202m_nD${ong}j?${ESC}[38;5;202mxmPggg${ESC}[38;5;178m8${ylw}88Q${ESC}[38;5;178mQQQ${ylw}Q8${ESC}[38;5;178m88${ong}88${ESC}[38;5;202m8Wx${ong}?z${ESC}[38;5;202mQ${ESC}[38;5;208m#######${ESC}[38;5;202mQ${ESC}[38;5;208m#${ong}@${ESC}[38;5;202mQ8Z. r<${dfl} + ${ESC}[38;5;202m.^y${ong}Oj${ESC}[38;5;202mLLL${ESC}[38;5;208m}${ESC}[38;5;202mjP${ong}%OEOM${ESC}[38;5;202m5suLxL${ong}jQ${ESC}[38;5;202m#${ESC}[38;5;208m######${ESC}[38;5;214mQ${ESC}[38;5;208m###${ESC}[38;5;202mB88&2${ong}vvn${ESC}[38;5;202mWQ(${dfl} + ${ESC}[38;5;202m.!}${ong}%QQNWKessaG%gB${ESC}[38;5;202m###${ESC}[38;5;208m########${ESC}[38;5;202mB${ESC}[38;5;214mQ@@@${ESC}[38;5;208m#${ESC}[38;5;202mR?.${dfl} + ${ESC}[38;5;202m.!LP${ESC}[38;5;208m8B${ESC}[38;5;214m##${ESC}[38;5;202m#Q${ong}5${ESC}[38;5;202mV%8${ESC}[38;5;208mB##B88${ong}QQ${ESC}[38;5;202mB${ESC}[38;5;208m##B${ESC}[38;5;202mB${ESC}[38;5;214m#@@@@@${ong}Q${ESC}[38;5;202me?,${dfl} + ${ESC}[38;5;202m_*${ESC}[38;5;208mTW${ESC}[38;5;214m#${ESC}[38;5;202mP_ !K${ESC}[38;5;208mQ${ESC}[38;5;214m#${ESC}[38;5;202m@${ong}BM^^}${ESC}[38;5;202mOB${ESC}[38;5;208m##BB#${ESC}[38;5;202m#${ESC}[38;5;214m@@@#B${ESC}[38;5;202ma<${dfl} + ${ESC}[38;5;202m-${ESC}[38;5;208m<${ESC}[38;5;202m!. :j${ESC}[38;5;208mg${ESC}[38;5;214m##${ESC}[38;5;202mh: _ry${ESC}[38;5;208mW8BBB${ESC}[38;5;202mB#${ESC}[38;5;214m#@@@@@${ESC}[38;5;202m#}.${dfl} + ${ESC}[38;5;202m'!?${ESC}[38;5;214mn${ESC}[38;5;202mn?=. .-_,${ong}=${ESC}[38;5;202m^x${ESC}[38;5;214mAQ#@@${ESC}[38;5;202mB>${dfl} + ${ESC}[38;5;202m>s${ESC}[38;5;214mQ@${ESC}[38;5;202m@?${dfl} + ${ESC}[38;5;202m_n${ESC}[38;5;214mB${ESC}[38;5;202m#,${dfl} + ${ESC}[38;5;202m-hv${dfl} +" prbl-logo(){ - echo -e \ -" - _!*(xL}}xvr!,. - >}KM3nLL}}}}}LLTh%5u>. - P8}. - ?g2!%888BBev****^!!!!!.LB&? - >gF=Rg88#5 ,^}#Be- - Pg'a888#B ,unnnnn}- .ZO_N#Bgr --gZ-g888B, .U88!j#B#Qs. -.NM-D88N! .j888=XQQQOQQ= - 28>u8g< ,!!!!!!!!!!!!!!!!>LpQ888K,QQgy ,V> - _OM:K? .&#Q88888888888888#@@#888M:p##Q8G! . - ,WM!.!!^p#@@##Q88g8888QB#@@#Q888e!W#####BBg2! - .u&n^yg888Q##@@@@@@@@@@#B8888K*}Q###BQQQBB##gL. - _nDj?xPggg888QQQQQ888888Wx?zQ####BQB88&2vvnWQ( - .^yOjLLL}jP%OEOM5suLxLjQ#######Q#@Q8Z. r< - .!}%QQNWKessaG%gB###########BQ@@@#R?. - .!LP8B###Q5V%8B##B88QQB##BB#@@@@@Qe?, - _*TW#P_ !KQ#@BM^^}OB##BB#@@@@@@@Ba< - - - >sQ@@? - _nB#, - -hv -" + echo "${PRBL_LOGO}" } -# ensure ctrl-c to cancel script ends the entire process and not just the current function -# trap ctrl_c INT # Commented out by default to prevent abnormal background exits # Function for spinner status # usage: spin "command [args]" From a1e5b66a07eafda71bc20a6df71892af7e0f75a7 Mon Sep 17 00:00:00 2001 From: pyr0ball Date: Sat, 27 May 2023 21:17:02 -0700 Subject: [PATCH 11/15] repcahr optimizations --- functions | 61 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/functions b/functions index a643df5..b8fc88d 100644 --- a/functions +++ b/functions @@ -299,10 +299,14 @@ set-boxtype(){ #set-boxtype repchar() { - n=1 - while [ $n -le $2 ] ; do - echo -n "$1" - n=$((n+1)) + if [[ $# -ne 2 || ! $2 =~ ^[0-9]+$ ]]; then + warn "repcahr() Incorrect usage. Usage: rephar " + return 1 + fi + local char="$1" + local count="$2" + for (( i=0; i<$count; i++ )); do + printf "%s" "$char" done } @@ -331,8 +335,7 @@ boxline(){ } boxseparator(){ - repchar "$box_break_line" $((BOXWIDTH-3)) - echo + printf '%s\n' "$(repchar "$box_break_line" $((BOXWIDTH-3)))" } boxborder(){ @@ -343,6 +346,12 @@ boxborder(){ boxbottom } +boxlinelog() { + local _cmd=${@:1} + #echo -e "$left_border $(logger echo -e "${1}")\r${ESC}[${BOXWIDTH}C$right_border" + logger echo -e "$left_border $_cmd\r${ESC}[${BOXWIDTH}C$right_border" +} + boxborderlog(){ local _cmd=() boxtop @@ -355,15 +364,39 @@ boxborderlog(){ boxbottom } -subboxborder(){ - BOXWIDTH_ORG=$BOXWIDTH - BOXWIDTH=$(($BOXWIDTH*75/100)) - boxline $(boxtop) - for line in "$@" ; do - boxline $(boxline "$line") +subboxborder() { + level=${1:-0} + local indent=$((level*2)) + local border_char="━" + local top_border="" + local bottom_border="" + + # Set the border characters based on the level of nesting + if ((level==0)); then + left_border="$left_top_border" + right_border="$right_top_border" + top_border="$rep_char $border_char $indent" + bottom_border="$rep_char $border_char $indent" + else + left_border="$left_border" + right_border="$right_border" + top_border="$rep_char $border_char $indent" + bottom_border="$rep_char $border_char $indent" + fi + + # Generate the top border + boxline "$(boxborder "$top_border")" + ((level++)) + + # Generate the output lines + for line in "${@:2}" ; do + boxline "$(repchar " " $indent)$(boxline "$line")" + boxseparator done - boxline $(boxbottom) - BOXWIDTH=$BOXWIDTH_ORG + + # Generate the bottom border + ((level--)) + boxline "$(boxborder "$bottom_border")" } # # For printing center-justified text. To change the padding character, replace the ' ' <~~ whitespace in front of the '{' in the padding variable From 9293f97c7db0091a851534391472003770df29b1 Mon Sep 17 00:00:00 2001 From: pyr0ball Date: Sat, 27 May 2023 21:46:55 -0700 Subject: [PATCH 12/15] fixed spelling mistake --- functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions b/functions index df27265..d42aede 100644 --- a/functions +++ b/functions @@ -268,7 +268,7 @@ box-light(){ repchar() { if [[ $# -ne 2 || ! $2 =~ ^[0-9]+$ ]]; then - warn "repcahr() Incorrect usage. Usage: rephar " + warn "repchar() Incorrect usage. Usage: repchar " return 1 fi local char="$1" From b4b57291bd60f390b2822a1bc09dc0788646d80c Mon Sep 17 00:00:00 2001 From: pyr0ball Date: Sat, 27 May 2023 22:21:36 -0700 Subject: [PATCH 13/15] added function to validate a git repo directory --- functions | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/functions b/functions index d42aede..9c9017a 100644 --- a/functions +++ b/functions @@ -253,6 +253,7 @@ box-light(){ box-singlechar(){ set_borders "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "$borderchar" "-" } + set-boxtype(){ case $boxtype in norm) box-norm ;; @@ -298,7 +299,7 @@ boxseparator(){ printf '%s\n' "$(repchar "$box_break_line" $((BOXWIDTH-3)))" } - boxborder(){ +boxborder() { boxtop for line in "$@" ; do boxline "$line" @@ -563,14 +564,14 @@ chained-grep(){ } # Remove leading/trailing whitespace -trim() { +trim(){ local var=${@:2} var="${var#"${var%%[![:space:]]*}"}" var="${var%"${var##*[![:space:]]}"}" printf '%s' "$var" } -strip-html-tags() { +strip-html-tags(){ local input="$1" local stripped=$(echo "$input" | sed 's/<[^>]*>//g' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') echo "$stripped" @@ -602,6 +603,22 @@ run-from-url(){ return $ec } +check-git-repository(){ + repodir=${1:-$rundir} + if [ -z $repodir ] ; then + warn "check-git-repository() Incorrect usage. Usage: check-git-repository " + return 2 + fi + if git -C "$repodir" rev-parse --is-inside-work-tree >/dev/null 2>&1; then + echo "Directory '$repodir' is a valid Git repository." + return 0 + # Your script logic here + else + echo "Directory '$repodir' is not a valid Git repository" + return 1 + fi +} + # fancy script exits ctrl_c(){ From 3e82f01a28809ba58f193e4241cba27421a3bf8a Mon Sep 17 00:00:00 2001 From: pyr0ball Date: Fri, 9 Jun 2023 08:49:03 -0700 Subject: [PATCH 14/15] slight correction to logo --- functions | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions b/functions index 9c9017a..e093497 100644 --- a/functions +++ b/functions @@ -642,9 +642,9 @@ ${ESC}[38;5;202m.NM${ong}-${ESC}[38;5;202mD88${ong}N${ylw}! ${ESC}[38;5;202m_OM${ong}:K${ESC}[38;5;202m? ${ylw}.&#${ong}Q${ESC}[38;5;202m88888888888888${ESC}[38;5;178m#${ylw}@@${ESC}[38;5;178m#${ESC}[38;5;202m888M${ong}:p${ESC}[38;5;202m#${ESC}[38;5;208m#Q${ESC}[38;5;202m8G! .${dfl} ${ESC}[38;5;202m,WM${ong}!.!!${ESC}[38;5;202m^p${ESC}[38;5;178m#${ylw}@@${ESC}[38;5;178m#${ong}#${ESC}[38;5;202mQ88g8888Q${ong}B${ESC}[38;5;178m#${ylw}@@${ESC}[38;5;178m#Q${ESC}[38;5;202m888e${ong}!W${ESC}[38;5;202m#${ESC}[38;5;208m####${ESC}[38;5;202mBBg2!${dfl} ${ESC}[38;5;202m.u&n${ong}^y${ESC}[38;5;202mg88${ong}8${ESC}[38;5;178mQ${ylw}##@${ESC}[38;5;178m@${ong}@${ESC}[38;5;202m@@@${ong}@${ESC}[38;5;178m@@${ylw}@#${ESC}[38;5;178mB8${ong}8${ESC}[38;5;202m88K${ong}*}${ESC}[38;5;202mQ${ESC}[38;5;208m###${ESC}[38;5;202mBQ${ong}Q${ESC}[38;5;202mQ${ESC}[38;5;208mBB${ESC}[38;5;202m##gL.${dfl} - ${ESC}[38;5;202m_nD${ong}j?${ESC}[38;5;202mxmPggg${ESC}[38;5;178m8${ylw}88Q${ESC}[38;5;178mQQQ${ylw}Q8${ESC}[38;5;178m88${ong}88${ESC}[38;5;202m8Wx${ong}?z${ESC}[38;5;202mQ${ESC}[38;5;208m#######${ESC}[38;5;202mQ${ESC}[38;5;208m#${ong}@${ESC}[38;5;202mQ8Z. r<${dfl} + ${ESC}[38;5;202m_nD${ong}j?${ESC}[38;5;202mxmPggg${ESC}[38;5;178m8${ylw}88Q${ESC}[38;5;178mQQQ${ylw}Q8${ESC}[38;5;178m88${ong}88${ESC}[38;5;202m8Wx${ong}?z${ESC}[38;5;202mQ${ESC}[38;5;208m#########${ESC}[38;5;202mQ${ESC}[38;5;208m#${ong}@${ESC}[38;5;202mQ8Z.${dfl} ${ESC}[38;5;202m.^y${ong}Oj${ESC}[38;5;202mLLL${ESC}[38;5;208m}${ESC}[38;5;202mjP${ong}%OEOM${ESC}[38;5;202m5suLxL${ong}jQ${ESC}[38;5;202m#${ESC}[38;5;208m######${ESC}[38;5;214mQ${ESC}[38;5;208m###${ESC}[38;5;202mB88&2${ong}vvn${ESC}[38;5;202mWQ(${dfl} - ${ESC}[38;5;202m.!}${ong}%QQNWKessaG%gB${ESC}[38;5;202m###${ESC}[38;5;208m########${ESC}[38;5;202mB${ESC}[38;5;214mQ@@@${ESC}[38;5;208m#${ESC}[38;5;202mR?.${dfl} + ${ESC}[38;5;202m.!}${ong}%QQNWKessaG%gB${ESC}[38;5;202m###${ESC}[38;5;208m########${ESC}[38;5;202mB${ESC}[38;5;214mQ@@@${ESC}[38;5;208m#${ESC}[38;5;202mR?. r<${dfl} ${ESC}[38;5;202m.!LP${ESC}[38;5;208m8B${ESC}[38;5;214m##${ESC}[38;5;202m#Q${ong}5${ESC}[38;5;202mV%8${ESC}[38;5;208mB##B88${ong}QQ${ESC}[38;5;202mB${ESC}[38;5;208m##B${ESC}[38;5;202mB${ESC}[38;5;214m#@@@@@${ong}Q${ESC}[38;5;202me?,${dfl} ${ESC}[38;5;202m_*${ESC}[38;5;208mTW${ESC}[38;5;214m#${ESC}[38;5;202mP_ !K${ESC}[38;5;208mQ${ESC}[38;5;214m#${ESC}[38;5;202m@${ong}BM^^}${ESC}[38;5;202mOB${ESC}[38;5;208m##BB#${ESC}[38;5;202m#${ESC}[38;5;214m@@@#B${ESC}[38;5;202ma<${dfl} ${ESC}[38;5;202m-${ESC}[38;5;208m<${ESC}[38;5;202m!. :j${ESC}[38;5;208mg${ESC}[38;5;214m##${ESC}[38;5;202mh: _ry${ESC}[38;5;208mW8BBB${ESC}[38;5;202mB#${ESC}[38;5;214m#@@@@@${ESC}[38;5;202m#}.${dfl} From 7c13e1b9d3c00caf7a26a991150384955e78e540 Mon Sep 17 00:00:00 2001 From: pyr0ball Date: Thu, 15 Jun 2023 01:52:01 -0700 Subject: [PATCH 15/15] homogenized function names --- functions | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/functions b/functions index e093497..eeddb4a 100644 --- a/functions +++ b/functions @@ -1083,7 +1083,7 @@ compare-versions(){ fi } -identify_system() { +identify-system() { if type lsb_release >/dev/null 2>&1; then ID=$(lsb_release -si) OS=$(lsb_release -si) @@ -1120,7 +1120,7 @@ identify_system() { "VER: $VER" } - install_packages() { + install-packages() { declare -a packages=() declare -a offline_packages=() for arg in "$@"; do @@ -1130,7 +1130,7 @@ identify_system() { packages+=("$arg") fi done - identify_system + identify-system case $ID in amzn | centos | fedora | rhel) [ "${#packages[@]}" -gt 0 ] && run sudo yum install -y "${packages[@]}"