From 9d16e1d42e0e796cf16061843519bebbb34e825d Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Wed, 21 Jun 2023 22:42:42 -0400 Subject: [PATCH] Add locking to poudboot. --- ansible/roles/poudriere/files/poudboot.bash | 61 +++++++++++++++------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/ansible/roles/poudriere/files/poudboot.bash b/ansible/roles/poudriere/files/poudboot.bash index 5645a38..7274b27 100644 --- a/ansible/roles/poudriere/files/poudboot.bash +++ b/ansible/roles/poudriere/files/poudboot.bash @@ -5,26 +5,56 @@ set -euo pipefail IFS=$'\n\t' DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +: ${LOCKFILE:="/var/run/poudboot.lock"} + +############## Setup ######################### + +# function cleanup { +# for f in "${folders[@]}"; do +# log "Deleting $f" +# rm -rf "$f" +# done +# } +# folders=() +# for sig in EXIT INT QUIT HUP TERM; do +# trap "set +e; cleanup" "$sig" +# done + +function die { + local status_code="$1" + shift + (>&2 echo "${@}") + exit "$status_code" +} + +function log { + (>&2 echo "${@}") +} + +function run_locked { + if [ "${RUN_LOCKED:-}" != "RUN" ]; then + exec env RUN_LOCKED=RUN flock --nonblock $LOCKFILE $0 $@ + fi + +} + +############## Program ######################### + function main { - COMMAND="$1" - shift 1 + local COMMAND="$1" if [ "$COMMAND" = "start" ]; then + run_locked "${@}" + shift 1 cmd_start "${@}" elif [ "$COMMAND" = "stop" ]; then + shift 1 cmd_stop "${@}" else die 1 "Unrecognized command: $COMMAND" fi } -function die { - exit_code="$1" - shift 1 - (>&2 echo "${@}") - exit "$exit_code" -} - function abort_if_jobs_running { if [[ $(sudo poudriere status) != *"No running builds"* ]]; then echo "There is already a poudriere build in progress, exiting." @@ -40,21 +70,18 @@ function build { function cmd_start { abort_if_jobs_running - # Allow command failures without quitting the script because some - # package sets might fail whereas others may succeed based on which - # packages are in each set. - set +e - for conf in /opt/poudriere/build_configs/*; do ( + # Allow command failures without quitting the script because some + # package sets might fail whereas others may succeed based on which + # packages are in each set. + set +e + source "$conf" build -j "$JAIL" -p "$PORTS" -z "$SET" -f /usr/local/etc/poudriere.d/$JAIL-$PORTS-$SET-pkglist ) done - # Re-enable exiting on failed commands - set -e - # Cleanup old unused dist files for conf in /opt/poudriere/build_configs/*; do (