From d0332747e49a6c1f3879211210c1252458323c50 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 8 Jul 2021 10:48:44 +0200 Subject: setup_target: Don't try to install packages already installed --- core/bin/setup_target | 10 +++++++--- core/includes/packagemanager.inc | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/core/bin/setup_target b/core/bin/setup_target index ebb8218e..ae96b691 100755 --- a/core/bin/setup_target +++ b/core/bin/setup_target @@ -72,6 +72,7 @@ unset_required_vars () { # Install all the packages from all selected modules in current target install_all_packages () { local module file config + declare -a missing declare -A packages dupcheck packages=() for module in "${!MODULE_PATHS[@]}"; do @@ -97,9 +98,12 @@ install_all_packages () { dupcheck["$file"]=1 done done - pinfo "Making sure required packages are installed..." - pdebug "List: ${!packages[*]}" - install_packages "${!packages[@]}" + missing=( $( filter_installed_packages "${!packages[@]}" ) ) + if [ "${#missing[@]}" -gt 0 ]; then + pinfo "Making sure required packages are installed..." + pinfo "Potentially missing: ${missing[*]}" + install_packages "${missing[@]}" + fi unset_required_vars } diff --git a/core/includes/packagemanager.inc b/core/includes/packagemanager.inc index 1e5b236d..f50455a2 100644 --- a/core/includes/packagemanager.inc +++ b/core/includes/packagemanager.inc @@ -82,6 +82,30 @@ list_packet_files() { list_content_packages --files } +# +# Pass list of packages, returns filtered list, with packages removed +# that are already installed +# +filter_installed_packages() { + local i + if [ "$PACKET_HANDLER" == "dpkg" ]; then + declare -A existing + for i in $( dpkg -l "$@" 2> /dev/null | awk '$1 == "ii" {print $2}' ); do + existing["$i"]=1 + done + for i in "$@"; do + [ -n "${existing["${i}"]}" ] || [ -n "${existing["${i}:${AMD64_X86}"]}" ] || echo "$i" + done + elif [ "$PACKET_HANDLER" == "rpm" ]; then + for i in "$@"; do + rpm --quiet -q "$i" &> /dev/null || echo "$i" + done + else + pwarning "'Don't know how to determine installation status of packages for $PACKET_HANDLER" + echo "$@" + fi +} + # # install individual package depending on package manager # -- cgit v1.2.3-55-g7522