#!/usr/bin/env bash set -euo pipefail umask 077 entry="$(cd "$(dirname "$0")" && pwd -P)/gate-lane.mjs" verb="${1:-run}" if [ "$verb" = status ]; then exec node "$entry" "$@"; fi state="$(node "$entry" lock-dir "$@")" lane=a exclusive=0 args=("$@") for ((i=0;i<${#args[@]};i++)); do case "${args[i]}" in --lane) lane="${args[i+1]:-}" ;; --exclusive) exclusive=1 ;; esac done case "$verb" in recover|prepare-image) exclusive=1;; esac case "$lane" in a|b) ;; *) echo 'gate-lane: refused: invalid lane' >&2; exit 2;; esac if [ "$exclusive" = 1 ]; then exec 3>>"$state/a.lock" 4>>"$state/b.lock" 5>>"$state/image.lock" flock -n 3 && flock -n 4 && flock -n -x 5 || { echo 'gate-lane: refused: lane or image lock busy' >&2; exit 2; } else exec 3>>"$state/$lane.lock" 5>>"$state/image.lock" flock -n 3 && flock -n -s 5 || { echo 'gate-lane: refused: lane or image lock busy' >&2; exit 2; } fi exec node "$entry" --locked "$@"