diff --git a/sdata/lib/functions.sh b/sdata/lib/functions.sh index b6dcae99d..0fe24f0ed 100644 --- a/sdata/lib/functions.sh +++ b/sdata/lib/functions.sh @@ -80,6 +80,50 @@ function prevent_sudo_or_root(){ root) echo -e "${STY_RED}[$0]: This script is NOT to be executed with sudo or as root. Aborting...${STY_RST}";exit 1;; esac } + +# Initialize sudo session and keep it alive in background +# Store PID in a global variable that can be accessed by trap +declare -g SUDO_KEEPALIVE_PID="" + +function sudo_init_keepalive(){ + # Check if sudo is available + if ! command -v sudo >/dev/null 2>&1; then + return 0 + fi + + # Skip if already initialized + if [[ -n "$SUDO_KEEPALIVE_PID" ]] && kill -0 "$SUDO_KEEPALIVE_PID" 2>/dev/null; then + return 0 + fi + + # Prompt for sudo password once at the beginning + echo -e "${STY_CYAN}[$0]: Requesting sudo privileges for installation...${STY_RST}" + if ! sudo -v; then + echo -e "${STY_RED}[$0]: Failed to obtain sudo privileges. Aborting...${STY_RST}" + exit 1 + fi + + # Start background process to keep sudo session alive + # This updates the sudo timestamp every 60 seconds + ( + while true; do + sleep 60 + sudo -v 2>/dev/null || exit 0 + done + ) & + SUDO_KEEPALIVE_PID=$! + + echo -e "${STY_GREEN}[$0]: Sudo session initialized and will be kept alive (PID: $SUDO_KEEPALIVE_PID)${STY_RST}" +} + +# Stop the sudo keepalive background process +function sudo_stop_keepalive(){ + if [[ -n "$SUDO_KEEPALIVE_PID" ]] && kill -0 "$SUDO_KEEPALIVE_PID" 2>/dev/null; then + kill "$SUDO_KEEPALIVE_PID" 2>/dev/null + wait "$SUDO_KEEPALIVE_PID" 2>/dev/null + SUDO_KEEPALIVE_PID="" + fi +} function git_auto_unshallow(){ # We need this function for latest_commit_hash to work properly if [[ -f "$(git rev-parse --git-dir)/shallow" ]]; then diff --git a/setup b/setup index 8a6e2d82f..9174eeb93 100755 --- a/setup +++ b/setup @@ -71,6 +71,10 @@ case ${SUBCMD_NAME} in $function done pause + # Initialize sudo keepalive for the entire install process + sudo_init_keepalive + # Set trap to cleanup when this subcommand exits + trap sudo_stop_keepalive EXIT INT TERM if [[ "${SKIP_ALLGREETING}" != true ]]; then source ${SUBCMD_DIR}/0.greeting.sh fi @@ -89,6 +93,10 @@ case ${SUBCMD_NAME} in $function done pause + # Initialize sudo keepalive for dependency installation + sudo_init_keepalive + # Set trap to cleanup when this subcommand exits + trap sudo_stop_keepalive EXIT INT TERM if [[ "${SKIP_ALLDEPS}" != true ]]; then source ${SUBCMD_DIR}/1.deps-router.sh fi @@ -98,6 +106,10 @@ case ${SUBCMD_NAME} in $function done pause + # Initialize sudo keepalive for setup steps + sudo_init_keepalive + # Set trap to cleanup when this subcommand exits + trap sudo_stop_keepalive EXIT INT TERM if [[ "${SKIP_ALLSETUPS}" != true ]]; then source ${SUBCMD_DIR}/2.setups.sh fi