#!/usr/bin/env bash set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" CONFIG="${EXOPLASIM_CONFIG:-$ROOT/config/web.json}" [[ "$CONFIG" = /* ]] || CONFIG="$ROOT/$CONFIG" readarray -t V < <(EXOPLASIM_CONFIG="$CONFIG" php -r ' require $argv[1]."/web/config/lab.php"; $c=lab_config(); foreach([$c["storage_root"],$c["worker_user"],$c["python"],$c["worker_memory_bytes"],$c["limits"]["max_cpus"]*100,$c["worker_nice"],$c["jobs"],$c["runtime"],$c["database"],$c["catalog"],$c["public_root"],$c["runtime_lock"]] as $v)echo $v,"\n"; ' "$ROOT") DATA=${V[0]}; WORKER=${V[1]}; PYTHON=${V[2]}; MEMORY=${V[3]}; CPU=${V[4]}; NICE=${V[5]} JOBS=${V[6]}; RUNTIME=${V[7]}; DATABASE_FILE=${V[8]}; DATABASE_DIR="$(dirname "$DATABASE_FILE")"; CATALOG=${V[9]}; PUBLIC=${V[10]}; RUNTIME_LOCK=${V[11]} [[ "$PUBLIC" = /* ]] || PUBLIC="$ROOT/$PUBLIC" PHP_CLI="$(command -v php)" if [[ "${1:-}" == '--dry-run' ]]; then printf 'Would publish PHP entry and browser assets to %s, install PHP worker from %s, and preserve runtime data in %s. No nginx configuration changes.\n' "$PUBLIC" "$ROOT" "$DATA" exit 0 fi mkdir -p "$DATA" exec 9>"$RUNTIME_LOCK" flock -n 9 || { printf 'A runtime installation or job claim is in progress.\n' >&2; exit 1; } if [[ -f "$DATABASE_FILE" ]]; then ACTIVE_JOBS=$("$PHP_CLI" -r '$db=new PDO("sqlite:".$argv[1]);echo (int)$db->query("SELECT COUNT(*) FROM jobs WHERE status IN (\"queued\",\"running\")")->fetchColumn();' "$DATABASE_FILE") if ((ACTIVE_JOBS > 0)); then printf 'Refusing to change runtime files while %s jobs are active.\n' "$ACTIVE_JOBS" >&2; exit 1; fi fi mkdir -p "$ROOT/tmp" UNIT_PATH=/etc/systemd/system/exoplasim-worker.service sed -e "s|@WORKER_USER@|$WORKER|g" -e "s|@PROJECT_ROOT@|$ROOT|g" -e "s|@CONFIG_FILE@|$CONFIG|g" -e "s|@PHP_CLI@|$PHP_CLI|g" -e "s|@JOBS@|$JOBS|g" -e "s|@RUNTIME@|$RUNTIME|g" -e "s|@DATABASE_DIR@|$DATABASE_DIR|g" -e "s|@MEMORY_MAX@|$MEMORY|g" -e "s|@CPU_QUOTA@|$CPU|g" -e "s|@NICE@|$NICE|g" "$ROOT/deploy/exoplasim-worker.service" > "$ROOT/tmp/exoplasim-worker.service" getent passwd "$WORKER" >/dev/null || useradd --system --home-dir "$DATA" --shell /usr/sbin/nologin "$WORKER" install -d -o root -g root -m 0755 "$DATA" if [[ ! -e "$RUNTIME_LOCK" ]]; then : > "$RUNTIME_LOCK"; fi chmod 0644 "$RUNTIME_LOCK" install -d -o "$WORKER" -g www-data -m 0750 "$RUNTIME" install -d -o www-data -g www-data -m 2770 "$DATABASE_DIR" install -d -o "$WORKER" -g www-data -m 2750 "$JOBS" install -d -o root -g root -m 0755 "$(dirname "$CATALOG")" "$PYTHON" "$ROOT/scripts/web/parameters.py" --config "$CONFIG" --output "$CATALOG" chown root:root "$CATALOG" chmod 0644 "$CATALOG" install -d -o "$WORKER" -g "$WORKER" -m 0750 "$RUNTIME/python" rsync -a --delete --exclude='.git' --exclude='tmp' "$ROOT/exoplasim/" "$RUNTIME/python/exoplasim/" chown -R "$WORKER:$WORKER" "$RUNTIME/python/exoplasim" chmod -R u+rwX,go-w "$RUNTIME/python/exoplasim" setfacl -m u:www-data:--x,u:"$WORKER":--x /root install -d -m 0755 "$PUBLIC" rsync -a --delete --include='*/' --include='*.js' --exclude='*' "$ROOT/web/js/" "$PUBLIC/js/" install -d -m 0755 "$PUBLIC/themes/exoplasim/css" rsync -a --delete --include='*.css' --exclude='*' "$ROOT/web/themes/exoplasim/css/" "$PUBLIC/themes/exoplasim/css/" "$PHP_CLI" -r 'file_put_contents($argv[1]."/index.php", "