From b24e2f6b0bbc66e43e1ba957295d37e836b5b43e Mon Sep 17 00:00:00 2001 From: alanw Date: Tue, 20 Jun 2023 14:50:37 -0700 Subject: [PATCH] refactored package check to return values based on logic --- functions | 201 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 172 insertions(+), 29 deletions(-) diff --git a/functions b/functions index 75c82e9..95637b1 100644 --- a/functions +++ b/functions @@ -2,7 +2,7 @@ # pyr0ball script functions library # Initial Vars -functionsrev=1.6.3 +functionsrev=1.6.4 #scriptname="${BASH_SOURCE[0]##*/}" #rundir="${BASH_SOURCE[0]%/*}" #runuser="$(whoami)" @@ -1180,9 +1180,12 @@ install-packages(){ esac } -check-packages(){ +check-packages() { + # Utilizes system package manager to check for installed packages + # Declare arrays for online and offline packages declare -a packages=() declare -a offline_packages=() + # Separate online and offline packages for arg in "$@"; do if [[ -f $arg ]]; then offline_packages+=("$arg") @@ -1190,51 +1193,191 @@ check-packages(){ packages+=("$arg") fi done + # Identify the system identify-system - case $ID in + # Check packages based on system type + case $ID in amzn | centos | fedora | rhel) - [ "${#packages[@]}" -gt 0 ] && run sudo yum list installed "${packages[@]}" - [ "${#offline_packages[@]}" -gt 0 ] && run sudo rpm -q "${packages[@]}" - ;; - arch | Arch | manjaro) - if [ "${#packages[@]}" -gt 0 ]; then - run sudo pacman -Qs "${packages[@]}" - fi - [ "${#offline_packages[@]}" -gt 0 ] && run sudo pacman -Q "${offline_packages[@]}" - ;; - debian | ubuntu | Ubuntu) - if [ "${#packages[@]}" -gt 0 ]; then - run sudo dpkg -s "${packages[@]}" - fi - [ "${#offline_packages[@]}" -gt 0 ] && run sudo dpkg -s "${offline_packages[@]}" - ;; - opensuse | sles) - if [ "${#packages[@]}" -gt 0 ]; then - run sudo zypper se "${packages[@]}" - fi - [ "${#offline_packages[@]}" -gt 0 ] && run sudo rpm -q "${offline_packages[@]}" - ;; - slackware) + # Check online packages if [ "${#packages[@]}" -gt 0 ]; then for package in "${packages[@]}"; do - run sudo slackpkg search "$package" + if yum list installed "$package" >/dev/null 2>&1; then + installed_version=$(yum list installed "$package" | grep "$package" | awk '{print $2}') + available_version=$(yum list available "$package" | grep "$package" | awk '{print $2}') + if [ "$installed_version" = "$available_version" ]; then + return 0 + elif [ "$installed_version" \> "$available_version" ]; then + return 3 + else + return 1 + fi + else + return 2 + fi done fi + # Check offline packages if [ "${#offline_packages[@]}" -gt 0 ]; then for package_file in "${offline_packages[@]}"; do - run sudo slackpkg search "$package_file" + if rpm -q --quiet "$package_file"; then + installed_version=$(rpm -q "$package_file" --qf "%{VERSION}") + return 0 + else + return 2 + fi + done + fi + ;; + arch | Arch | manjaro) + # Check online packages + if [ "${#packages[@]}" -gt 0 ]; then + for package in "${packages[@]}"; do + if pacman -Q "$package" >/dev/null 2>&1; then + installed_version=$(pacman -Q "$package" | awk '{print $2}') + available_version=$(pacman -Si "$package" | grep "Version" | awk '{print $3}') + if [ "$installed_version" = "$available_version" ]; then + return 0 + elif [ "$installed_version" \> "$available_version" ]; then + return 3 + else + return 1 + fi + else + return 2 + fi + done + fi + # Check offline packages + if [ "${#offline_packages[@]}" -gt 0 ]; then + for package_file in "${offline_packages[@]}"; do + if pacman -Qp "$package_file" >/dev/null 2>&1; then + installed_version=$(pacman -Qp "$package_file" | awk '{print $2}') + return 0 + else + return 2 + fi + done + fi + ;; + debian | ubuntu | Ubuntu) + # Check online packages + if [ "${#packages[@]}" -gt 0 ]; then + for package in "${packages[@]}"; do + if dpkg -s "$package" >/dev/null 2>&1; then + installed_version=$(dpkg -s "$package" | grep -E "^Version:" | awk '{print $2}') + available_version=$(apt-cache show "$package" | grep -E "^Version:" | awk '{print $2}') + if [ "$installed_version" = "$available_version" ]; then + return 0 + elif [ "$installed_version" \> "$available_version" ]; then + return 3 + else + return 1 + fi + else + return 2 + fi + done + fi + # Check offline packages + if [ "${#offline_packages[@]}" -gt 0 ]; then + for package_file in "${offline_packages[@]}"; do + if dpkg -I "$package_file" >/dev/null 2>&1; then + installed_version=$(dpkg -I "$package_file" | grep -E "^ Version:" | awk '{print $3}') + return 0 + else + return 2 + fi + done + fi + ;; + opensuse | sles) + # Check online packages + if [ "${#packages[@]}" -gt 0 ]; then + for package in "${packages[@]}"; do + if zypper info "$package" >/dev/null 2>&1; then + installed_version=$(zypper info "$package" | grep "Version" | awk '{print $3}') + available_version=$(zypper se -i "$package" | grep "Version" | awk '{print $3}') + if [ "$installed_version" = "$available_version" ]; then + return 0 + elif [ "$installed_version" \> "$available_version" ]; then + return 3 + else + return 1 + fi + else + return 2 + fi + done + fi + # Check offline packages + if [ "${#offline_packages[@]}" -gt 0 ]; then + for package_file in "${offline_packages[@]}"; do + if rpm -q --quiet "$package_file"; then + installed_version=$(rpm -q "$package_file" --qf "%{VERSION}") + return 0 + else + return 2 + fi + done + fi + ;; + slackware) + # Check online packages + if [ "${#packages[@]}" -gt 0 ]; then + for package in "${packages[@]}"; do + if slackpkg search "$package" >/dev/null 2>&1; then + installed_version=$(slackpkg search "$package" | awk '{print $3}') + return 0 + else + return 2 + fi + done + fi + # Check offline packages + if [ "${#offline_packages[@]}" -gt 0 ]; then + for package_file in "${offline_packages[@]}"; do + if slackpkg search "$package_file" >/dev/null 2>&1; then + installed_version=$(slackpkg search "$package_file" | awk '{print $3}') + return 0 + else + return 2 + fi done fi ;; brew) - [ "${#packages[@]}" -gt 0 ] && run brew list "${packages[@]}" + # Check online packages + if [ "${#packages[@]}" -gt 0 ]; then + for package in "${packages[@]}"; do + if brew list "$package" >/dev/null 2>&1; then + installed_version=$(brew list --versions "$package" | awk '{print $2}') + available_version=$(brew info "$package" | head -n 1 | awk '{print $3}') + if [ "$installed_version" = "$available_version" ]; then + return 0 + elif [ "$installed_version" \> "$available_version" ]; then + return 3 + else + return 1 + fi + else + return 2 + fi + done + fi + # Check offline packages if [ "${#offline_packages[@]}" -gt 0 ]; then for package_file in "${offline_packages[@]}"; do - run brew list "$package_file" + if brew list "$package_file" >/dev/null 2>&1; then + installed_version=$(brew list --versions "$package_file" | awk '{print $2}') + return 0 + else + return 2 + fi done fi ;; esac } + set-boxtype