27 lines
939 B
Bash
Executable File
27 lines
939 B
Bash
Executable File
#!/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 "$@"
|