#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" SERVER_ENV_FILE="${ROOT_DIR}/deploy/server/.env" CONSOLE_ENV_FILE="${ROOT_DIR}/deploy/console/.env" MODE="${RPKI_RTR_SERVER_MODE:-tcp}" SERVER_PROJECT="${RPKI_RTR_COMPOSE_PROJECT:-rpki-rtr}" CONSOLE_PROJECT="${RPKI_CONSOLE_COMPOSE_PROJECT:-rpki-console}" usage() { cat <<'EOF' Usage: scripts/03_shutdown.sh [options] Stop services started by scripts/01_start.sh. Options: --mode MODE Server mode: tcp|tls|ssh|base. Default: tcp -h, --help Show this help. EOF } log() { printf '[03_shutdown] %s\n' "$*" >&2 } stage() { printf '\n====== %s ======\n' "$*" >&2 } die() { printf '[03_shutdown] ERROR: %s\n' "$*" >&2 exit 1 } compose_file_for_mode() { case "$1" in tcp) printf '%s\n' "${ROOT_DIR}/deploy/server/docker-compose.tcp.yml" ;; tls) printf '%s\n' "${ROOT_DIR}/deploy/server/docker-compose.tls.yml" ;; ssh) printf '%s\n' "${ROOT_DIR}/deploy/server/docker-compose.ssh.yml" ;; base) printf '%s\n' "${ROOT_DIR}/deploy/server/docker-compose.yml" ;; *) die "unsupported mode '$1', expected tcp|tls|ssh|base" ;; esac } while [ "$#" -gt 0 ]; do case "$1" in --mode) [ "$#" -ge 2 ] || die "--mode requires a value" MODE="$2" shift 2 ;; -h|--help) usage exit 0 ;; *) die "unknown option: $1" ;; esac done SERVER_COMPOSE_FILE="$(compose_file_for_mode "${MODE}")" CONSOLE_COMPOSE_FILE="${ROOT_DIR}/deploy/console/docker-compose.yml" stage "Checking Docker" command -v docker >/dev/null 2>&1 || die "docker command not found" if docker compose version >/dev/null 2>&1; then COMPOSE_BIN=(docker compose) elif command -v docker-compose >/dev/null 2>&1 && docker-compose version >/dev/null 2>&1; then COMPOSE_BIN=(docker-compose) else die "docker compose is not available" fi stage "Stopping Console" if [ -f "${CONSOLE_ENV_FILE}" ] && [ -f "${CONSOLE_COMPOSE_FILE}" ]; then "${COMPOSE_BIN[@]}" --env-file "${CONSOLE_ENV_FILE}" -p "${CONSOLE_PROJECT}" -f "${CONSOLE_COMPOSE_FILE}" down --remove-orphans else log "console compose/env not found, skip" fi stage "Stopping RTR Server" if [ -f "${SERVER_ENV_FILE}" ] && [ -f "${SERVER_COMPOSE_FILE}" ]; then "${COMPOSE_BIN[@]}" --env-file "${SERVER_ENV_FILE}" -p "${SERVER_PROJECT}" -f "${SERVER_COMPOSE_FILE}" down --remove-orphans else log "server compose/env not found, skip" fi stage "Shutdown Finished"