117 lines
2.9 KiB
Bash
Executable File
117 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
MANAGER_DIR="${ROOT_DIR}/manager-solution"
|
|
CONFIG_FILE="${MANAGER_DIR}/manager/config.json"
|
|
ENV_FILE="${MANAGER_DIR}/.env"
|
|
|
|
if [[ ! -f "${CONFIG_FILE}" ]]; then
|
|
echo "Missing config file: ${CONFIG_FILE}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
load_env_file() {
|
|
local file="$1"
|
|
if [[ -f "${file}" ]]; then
|
|
set -a
|
|
# shellcheck disable=SC1090
|
|
source "${file}"
|
|
set +a
|
|
fi
|
|
}
|
|
|
|
docker_container_exists() {
|
|
docker container inspect "$1" >/dev/null 2>&1
|
|
}
|
|
|
|
docker_volume_exists() {
|
|
docker volume inspect "$1" >/dev/null 2>&1
|
|
}
|
|
|
|
docker_image_exists() {
|
|
docker image inspect "$1" >/dev/null 2>&1
|
|
}
|
|
|
|
load_env_file "${ENV_FILE}"
|
|
|
|
MANAGER_CONTAINER_NAME="${FIS_MANAGER_CONTAINER_NAME:-fis_manager}"
|
|
MANAGER_IMAGE_NAME="${FIS_MANAGER_IMAGE:-fis-manager:local}"
|
|
|
|
echo "Stopping manager stack"
|
|
if [[ -f "${MANAGER_DIR}/docker-compose.yml" ]]; then
|
|
(
|
|
cd "${MANAGER_DIR}"
|
|
docker compose down --remove-orphans || true
|
|
)
|
|
fi
|
|
|
|
if docker_container_exists "${MANAGER_CONTAINER_NAME}"; then
|
|
echo "Removing manager container ${MANAGER_CONTAINER_NAME}"
|
|
docker rm -f "${MANAGER_CONTAINER_NAME}" || true
|
|
fi
|
|
|
|
if docker_image_exists "${MANAGER_IMAGE_NAME}"; then
|
|
echo "Removing manager image ${MANAGER_IMAGE_NAME}"
|
|
docker rmi -f "${MANAGER_IMAGE_NAME}" || true
|
|
fi
|
|
|
|
mapfile -t USER_RESOURCES < <(
|
|
python3 - "${CONFIG_FILE}" <<'PY'
|
|
import json
|
|
import sys
|
|
|
|
with open(sys.argv[1], encoding="utf-8") as handle:
|
|
config = json.load(handle)
|
|
|
|
defaults = config.get("defaults", {})
|
|
container_prefix = defaults.get("container_prefix", "fis-")
|
|
default_volumes = defaults.get("volumes", {})
|
|
|
|
for user in config.get("users", []):
|
|
user_id = str(user["id"])
|
|
container_name = user.get("container_name") or f"{container_prefix}{user_id}"
|
|
|
|
volumes = {}
|
|
volumes.update(default_volumes)
|
|
volumes.update(user.get("volumes", {}))
|
|
|
|
resolved_volumes = []
|
|
for volume_name in volumes:
|
|
resolved_volumes.append(volume_name.format(id=user_id, port=user["port"]))
|
|
|
|
print(f"CONTAINER\t{container_name}")
|
|
for volume_name in resolved_volumes:
|
|
print(f"VOLUME\t{volume_name}")
|
|
PY
|
|
)
|
|
|
|
declare -A USER_CONTAINERS=()
|
|
declare -A USER_VOLUMES=()
|
|
|
|
for resource in "${USER_RESOURCES[@]}"; do
|
|
kind="${resource%%$'\t'*}"
|
|
value="${resource#*$'\t'}"
|
|
if [[ "${kind}" == "CONTAINER" ]]; then
|
|
USER_CONTAINERS["${value}"]=1
|
|
elif [[ "${kind}" == "VOLUME" ]]; then
|
|
USER_VOLUMES["${value}"]=1
|
|
fi
|
|
done
|
|
|
|
for container_name in "${!USER_CONTAINERS[@]}"; do
|
|
if docker_container_exists "${container_name}"; then
|
|
echo "Removing user container ${container_name}"
|
|
docker rm -f "${container_name}" || true
|
|
fi
|
|
done
|
|
|
|
for volume_name in "${!USER_VOLUMES[@]}"; do
|
|
if docker_volume_exists "${volume_name}"; then
|
|
echo "Removing user volume ${volume_name}"
|
|
docker volume rm "${volume_name}" || true
|
|
fi
|
|
done
|
|
|
|
echo "Cleanup completed"
|