105 lines
2.3 KiB
Bash
Executable File
105 lines
2.3 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
PLUGIN_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
DATA_DIR="$PLUGIN_DIR/data"
|
|
JOB_DIR="$DATA_DIR/jobs/pending"
|
|
PROCESSING_DIR="$DATA_DIR/jobs/processing"
|
|
DONE_DIR="$DATA_DIR/jobs/done"
|
|
WORKER_LOCK_DIR="$DATA_DIR/worker.lock"
|
|
DB_LOCK_DIR="$DATA_DIR/lock"
|
|
PID_DIR="$DATA_DIR/pids"
|
|
CANCEL_DIR="$DATA_DIR/cancel"
|
|
|
|
mkdir -p "$JOB_DIR" "$PROCESSING_DIR" "$DONE_DIR" "$PID_DIR" "$CANCEL_DIR" "$DB_LOCK_DIR"
|
|
|
|
if ! mkdir "$WORKER_LOCK_DIR" 2>/dev/null; then
|
|
exit 0
|
|
fi
|
|
|
|
cleanup() {
|
|
rmdir "$WORKER_LOCK_DIR" 2>/dev/null || true
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
db_lock_path_for_db() {
|
|
local db_name="$1"
|
|
local safe
|
|
safe="$(printf '%s' "$db_name" | tr -c 'A-Za-z0-9_.-' '_')"
|
|
printf '%s/%s.lock' "$DB_LOCK_DIR" "$safe"
|
|
}
|
|
|
|
release_db_lock_later() {
|
|
local lock_path="$1"
|
|
if [ -z "$lock_path" ]; then
|
|
return 0
|
|
fi
|
|
(
|
|
sleep 10
|
|
rm -f "$lock_path" 2>/dev/null || true
|
|
) >/dev/null 2>&1 &
|
|
}
|
|
|
|
while true; do
|
|
JOB_FILE=$(ls -1 "$JOB_DIR"/*.env 2>/dev/null | head -n 1)
|
|
if [ -z "${JOB_FILE:-}" ]; then
|
|
break
|
|
fi
|
|
|
|
BASE_NAME="$(basename "$JOB_FILE")"
|
|
RUN_FILE="$PROCESSING_DIR/$BASE_NAME"
|
|
mv "$JOB_FILE" "$RUN_FILE"
|
|
JOB_ID="${BASE_NAME%.env}"
|
|
PID_FILE="$PID_DIR/${JOB_ID}.pid"
|
|
|
|
JOB_TYPE="restore"
|
|
DB_NAME=""
|
|
DB_LOCK_FILE=""
|
|
# shellcheck disable=SC1090
|
|
source "$RUN_FILE" || true
|
|
JOB_TYPE="${JOB_TYPE:-restore}"
|
|
DB_NAME="${DB_NAME:-}"
|
|
DB_LOCK_FILE="${DB_LOCK_FILE:-}"
|
|
|
|
LOCK_PATH=""
|
|
if [ -n "$DB_LOCK_FILE" ]; then
|
|
case "$DB_LOCK_FILE" in
|
|
"$DB_LOCK_DIR"/*.lock) LOCK_PATH="$DB_LOCK_FILE" ;;
|
|
*) LOCK_PATH="" ;;
|
|
esac
|
|
fi
|
|
if [ -z "$LOCK_PATH" ] && [ -n "$DB_NAME" ]; then
|
|
LOCK_PATH="$(db_lock_path_for_db "$DB_NAME")"
|
|
fi
|
|
|
|
RUNNER="$PLUGIN_DIR/scripts/restore.sh"
|
|
if [ "$JOB_TYPE" = "backup" ]; then
|
|
RUNNER="$PLUGIN_DIR/scripts/backup.sh"
|
|
fi
|
|
|
|
set +e
|
|
"$RUNNER" "$RUN_FILE" &
|
|
RUN_PID=$!
|
|
echo "PID=${RUN_PID}" >> "$RUN_FILE"
|
|
echo "${RUN_PID}" > "$PID_FILE"
|
|
wait "$RUN_PID"
|
|
EXIT_CODE=$?
|
|
set -e
|
|
|
|
rm -f "$PID_FILE"
|
|
|
|
CANCEL_FLAG="${CANCEL_DIR}/${JOB_ID}.flag"
|
|
if [ -f "$CANCEL_FLAG" ]; then
|
|
rm -f "$CANCEL_FLAG"
|
|
mv "$RUN_FILE" "$DONE_DIR/${JOB_ID}.cancel"
|
|
elif [ "$EXIT_CODE" -eq 0 ]; then
|
|
mv "$RUN_FILE" "$DONE_DIR/${JOB_ID}.ok"
|
|
else
|
|
mv "$RUN_FILE" "$DONE_DIR/${JOB_ID}.fail"
|
|
fi
|
|
|
|
release_db_lock_later "$LOCK_PATH"
|
|
done
|
|
|
|
exit 0
|