From bf3151a15a6838c5f97c197143d877804b8866ff Mon Sep 17 00:00:00 2001 From: Matt McKinnon Date: Thu, 1 Nov 2018 14:19:59 -0400 Subject: [PATCH] modify wait_for_apt function (and others based on it) to rely on the apt exit code to know if the apt process is locked or not. --- bootstrap-salt.sh | 60 ++++++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/bootstrap-salt.sh b/bootstrap-salt.sh index 23195f0..4376cc3 100755 --- a/bootstrap-salt.sh +++ b/bootstrap-salt.sh @@ -18,7 +18,7 @@ #====================================================================================================================== set -o nounset # Treat unset variables as an error -__ScriptVersion="2018.08.15" +__ScriptVersion="2018.11.01" __ScriptName="bootstrap-salt.sh" __ScriptFullName="$0" @@ -1798,24 +1798,26 @@ __function_defined() { # process is finished so the script doesn't exit on a locked proc. #---------------------------------------------------------------------------------------------------------------------- __wait_for_apt(){ - echodebug "Checking if apt process is currently running." - # Timeout set at 15 minutes WAIT_TIMEOUT=900 - while ps -C apt,apt-get,aptitude,dpkg >/dev/null; do - sleep 1 - WAIT_TIMEOUT=$((WAIT_TIMEOUT - 1)) + # Set an initial exit code to 100; which matches the exit code of a locked apt process + (exit 100) - # If timeout reaches 0, abort. - if [ "$WAIT_TIMEOUT" -eq 0 ]; then - echoerror "Apt, apt-get, aptitude, or dpkg process is taking too long." - echoerror "Bootstrap script cannot proceed. Aborting." - return 1 - fi + while [ $? -eq 100 ]; do + sleep 1 + WAIT_TIMEOUT=$((WAIT_TIMEOUT - 1)) + + # If timeout reaches 0, abort. + if [ "$WAIT_TIMEOUT" -eq 0 ]; then + echoerror "Apt, apt-get, aptitude, or dpkg process is taking too long." + echoerror "Bootstrap script cannot proceed. Aborting." + return 1 + fi + + # Run our commands last to get the right (or wrong) exit code + "${@}" done - - echodebug "No apt processes are currently running." } #--- FUNCTION ------------------------------------------------------------------------------------------------------- @@ -1824,8 +1826,7 @@ __wait_for_apt(){ # PARAMETERS: packages #---------------------------------------------------------------------------------------------------------------------- __apt_get_install_noinput() { - __wait_for_apt - apt-get install -y -o DPkg::Options::=--force-confold "${@}"; return $? + __wait_for_apt apt-get install -y -o DPkg::Options::=--force-confold "${@}"; return $? } # ---------- end of function __apt_get_install_noinput ---------- @@ -1834,8 +1835,7 @@ __apt_get_install_noinput() { # DESCRIPTION: (DRY) apt-get upgrade with noinput options #---------------------------------------------------------------------------------------------------------------------- __apt_get_upgrade_noinput() { - __wait_for_apt - apt-get upgrade -y -o DPkg::Options::=--force-confold; return $? + __wait_for_apt apt-get upgrade -y -o DPkg::Options::=--force-confold; return $? } # ---------- end of function __apt_get_upgrade_noinput ---------- @@ -1845,11 +1845,10 @@ __apt_get_upgrade_noinput() { # PARAMETERS: url #---------------------------------------------------------------------------------------------------------------------- __apt_key_fetch() { - __wait_for_apt url=$1 # shellcheck disable=SC2086 - apt-key adv ${_GPG_ARGS} --fetch-keys "$url"; return $? + __wait_for_apt apt-key adv ${_GPG_ARGS} --fetch-keys "$url"; return $? } # ---------- end of function __apt_key_fetch ---------- @@ -2634,8 +2633,7 @@ __install_saltstack_ubuntu_repository() { __apt_key_fetch "$SALTSTACK_UBUNTU_URL/SALTSTACK-GPG-KEY.pub" || return 1 - __wait_for_apt - apt-get update || return 1 + __wait_for_apt apt-get update || return 1 } install_ubuntu_deps() { @@ -2647,8 +2645,7 @@ install_ubuntu_deps() { __enable_universe_repository || return 1 - __wait_for_apt - apt-get update || return 1 + __wait_for_apt apt-get update || return 1 fi __PACKAGES='' @@ -2704,8 +2701,7 @@ install_ubuntu_stable_deps() { # No user interaction, libc6 restart services for example export DEBIAN_FRONTEND=noninteractive - __wait_for_apt - apt-get update || return 1 + __wait_for_apt apt-get update || return 1 if [ "${_UPGRADE_SYS}" -eq $BS_TRUE ]; then if [ "${_INSECURE_DL}" -eq $BS_TRUE ]; then @@ -2725,8 +2721,7 @@ install_ubuntu_stable_deps() { } install_ubuntu_git_deps() { - __wait_for_apt - apt-get update || return 1 + __wait_for_apt apt-get update || return 1 if ! __check_command_exists git; then __apt_get_install_noinput git-core || return 1 @@ -3033,8 +3028,7 @@ __install_saltstack_debian_repository() { __apt_key_fetch "$SALTSTACK_DEBIAN_URL/SALTSTACK-GPG-KEY.pub" || return 1 - __wait_for_apt - apt-get update || return 1 + __wait_for_apt apt-get update || return 1 } install_debian_deps() { @@ -3045,8 +3039,7 @@ install_debian_deps() { # No user interaction, libc6 restart services for example export DEBIAN_FRONTEND=noninteractive - __wait_for_apt - apt-get update || return 1 + __wait_for_apt apt-get update || return 1 if [ "${_UPGRADE_SYS}" -eq $BS_TRUE ]; then # Try to update GPG keys first if allowed @@ -3165,8 +3158,7 @@ install_debian_8_git_deps() { /etc/apt/sources.list.d/backports.list fi - __wait_for_apt - apt-get update || return 1 + __wait_for_apt apt-get update || return 1 # python-tornado package should be installed from backports repo __PACKAGES="${__PACKAGES} python-backports.ssl-match-hostname python-tornado/jessie-backports"