From 9d67cd5a7c2c7e0fdc84cc2379d47e4cd74a2329 Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Thu, 18 Apr 2024 12:16:45 +0200 Subject: [PATCH] Add rebuild feature in BETA --- check_container_upgrade | 69 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/check_container_upgrade b/check_container_upgrade index dc80aca..380c99c 100755 --- a/check_container_upgrade +++ b/check_container_upgrade @@ -13,6 +13,9 @@ DEBUG=0 MAX_PARALLEL_CHECKS=4 ONLY_CONTAINERS=() EXCLUDED_CONTAINERS=( buildx_buildkit_default ) +REBUILD=0 +REBUILD_LOCK_FILE="/var/tmp/$( basename $0 ).lock" +REBUILD_LOG_FILE="/var/tmp/$( basename $0 ).log" declare -rA CHECK_PLUGINS=( ["/usr/lib/nagios/plugins/check_apt"]="/usr/lib/nagios/plugins/check_apt -u -U -t 60 -l" ["/usr/lib/nagios/plugins/check_apk"]="/usr/lib/nagios/plugins/check_apk" @@ -56,6 +59,10 @@ Usage : $(basename $0) [-d] [-E /path/to/engine] [container1,...] -x [container] Exclude specified container (could be repeat) -M [integer] Max number of container checks to run in parallel (default: $MAX_PARALLEL_CHECKS, 0=no limit) -f [docker-compose.yml] To check upgrade on docker compose project, specified the path of the docker-compose.yml file + -b|--build|--rebuild Trigger container build if upgrade detected (only possible if a docker compose file if provided) + /!\\ WARNING /!\\ Beta feature, not really tested yet! + --rebuild-lock Specify rebuild lock file path (default: ${REBUILD_LOCK_FILE}) + --rebuild-log Specify rebuild log file path (default: ${REBUILD_LOG_FILE}) -d Debug mode -X Enable bash tracing (=set -x) -h Show this message @@ -87,6 +94,17 @@ do ((idx++)) DOCKERCOMPOSE_FILE=${!idx} ;; + -b|--build|--rebuild) + REBUILD=1 + ;; + --rebuild-lock) + ((idx++)) + REBUILD_LOCK_FILE="${!idx}" + ;; + --rebuild-log) + ((idx++)) + REBUILD_LOG_FILE="${!idx}" + ;; -x) ((idx++)) EXCLUDED_CONTAINERS+=( ${!idx} ) @@ -142,6 +160,7 @@ declare -A CONTAINER_PID declare -A UP_TO_DATE declare -A ERRORS declare -A UNKNOWNS +UPGRADABLE_CONTAINERS=( ) CHECKED_CONTAINERS=( ) debug "List running containers..." @@ -238,7 +257,7 @@ do UP_TO_DATE+=( ["$container"]=$STATUS ) else ERRORS+=( ["$container"]=$STATUS ) - [ $ex -ge 3 ] && UNKNOWNS+=( "$container" ) + [ $ex -ge 3 ] && UNKNOWNS+=( "$container" ) || UPGRADABLE_CONTAINERS+=( "$container" ) fi [ $EXIT_CODE -ge $ex ] && continue [ $ex -gt 3 ] && ex=3 @@ -263,6 +282,8 @@ fi debug "Final exit code: $EXIT_CODE" debug "Check containers (${#CHECKED_CONTAINERS[@]}): $( implode ", " "${CHECKED_CONTAINERS[@]}" )" +debug "Up-to-date containers (${#UP_TO_DATE[@]}): $( implode ", " "${!UP_TO_DATE[@]}" )" +debug "Upgradable containers (${#UPGRADABLE_CONTAINERS[@]}): $( implode ", " "${UPGRADABLE_CONTAINERS[@]}" )" debug "Containers with errors (${#ERRORS[@]}): $( implode ", " "${!ERRORS[@]}" )" debug "Not found containers (${#NOTFOUNDS[@]}): $( implode ", " "${NOTFOUNDS[@]}" )" @@ -270,6 +291,7 @@ debug "Not found containers (${#NOTFOUNDS[@]}): $( implode ", " "${NOTFOUNDS[@]} let CONTAINER_COUNTS=${#CHECKED_CONTAINERS[@]}+${#NOTFOUNDS[@]} PERF_DATA=( "uptodate_containers=${#UP_TO_DATE[@]};;;0;$CONTAINER_COUNTS" + "upgradable_containers=${#UPGRADABLE_CONTAINERS[@]};;;0;$CONTAINER_COUNTS" "containers_with_errors=${#ERRORS[@]};1;;0;$CONTAINER_COUNTS" "unknown_state_containers=${#UNKNOWNS[@]};;;0;$CONTAINER_COUNTS" ) @@ -293,6 +315,51 @@ esac # Add performance data echo " |$( implode " " "${PERF_DATA[@]}" )" +# Trigger container build (if need, enabled and docker compose file is provided) +if [ $REBUILD -eq 1 ] +then + if [ ${#UPGRADABLE_CONTAINERS[@]} -eq 0 ] + then + debug "No upgradable container to rebuild" + if [ -e "$REBUILD_LOCK_FILE" ] + then + debug "Remove previous rebuild lock file ($REBUILD_LOCK_FILE)" + rm -f "$REBUILD_LOCK_FILE" + fi + elif [ -z "$DOCKERCOMPOSE_FILE" ] + then + echo + echo "WARNING: No docker compose file provided, can't trigger rebuild of following container(s):" + echo "- $( implode "\n- " ${UPGRADABLE_CONTAINERS[@]} )" + elif [ -e "$REBUILD_LOCK_FILE" ] + then + REBUILD_PID=$(cat $REBUILD_LOCK_FILE) + echo + if [ -d "/proc/$REBUILD_PID" ] + then + echo "Rebuild already triggered on $( stat --format %y "$REBUILD_LOCK_FILE" ) (PID: $REBUILD_PID)" + echo "You could follow it in its log file: ${REBUILD_LOG_FILE}" + else + echo "Container images already rebuilt (see ${REBUILD_LOG_FILE} for details)." + echo "You could recreate and restart them using the following command:" + echo + echo " $COMPOSE_BIN -f $DOCKERCOMPOSE_FILE up -d --no-deps ${UPGRADABLE_CONTAINERS[@]}" + fi + echo + else + echo + echo "Trigger rebuild of following container(s): ${UPGRADABLE_CONTAINERS[@]}" + echo "You could follow the rebuild process in its log file: ${REBUILD_LOG_FILE}" + echo "You will able to recreate and restart them using the following command:" + echo + echo " $COMPOSE_BIN -f $DOCKERCOMPOSE_FILE up -d --no-deps ${UPGRADABLE_CONTAINERS[@]}" + echo + + $COMPOSE_BIN -f $DOCKERCOMPOSE_FILE build --no-cache ${UPGRADABLE_CONTAINERS[@]} > $REBUILD_LOG_FILE 2>&1 & + echo $! > "$REBUILD_LOCK_FILE" + fi +fi + # Display details, starting by errors for container in ${!ERRORS[@]} do