106 lines
2.8 KiB
Bash
Executable File
106 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
# shellcheck source=scripts/common.sh
|
|
source "$SCRIPT_DIR/scripts/common.sh"
|
|
|
|
REUSE_ENV_FROM=""
|
|
UPDATE_PACKAGE_IMAGE=1
|
|
|
|
usage() {
|
|
cat <<'USAGE'
|
|
Usage: ./upgrade.sh [--reuse-env-from /path/to/.env] [--keep-reused-image]
|
|
|
|
By default, --reuse-env-from creates the new .env from this package's
|
|
.env.example first, then overlays existing user settings from the old .env.
|
|
Image tags are intentionally kept from the new package so the upgraded service
|
|
actually runs the new packaged runtime and monitor images. Use
|
|
--keep-reused-image only when you intentionally want to keep previous image tags.
|
|
USAGE
|
|
}
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--reuse-env-from)
|
|
REUSE_ENV_FROM="$2"
|
|
shift 2
|
|
;;
|
|
--keep-reused-image)
|
|
UPDATE_PACKAGE_IMAGE=0
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
die "unknown option: $1"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
env_get_key() {
|
|
local env_path="$1"
|
|
local key="$2"
|
|
awk -F= -v key="$key" '$1 == key {sub(/^[^=]*=/, ""); print; exit}' "$env_path"
|
|
}
|
|
|
|
env_set_key() {
|
|
local env_path="$1"
|
|
local key="$2"
|
|
local value="$3"
|
|
local tmp_env
|
|
if grep -q "^${key}=" "$env_path"; then
|
|
tmp_env="$(mktemp)"
|
|
awk -v key="$key" -v value="$value" '
|
|
BEGIN { done=0 }
|
|
$0 ~ "^" key "=" { print key "=" value; done=1; next }
|
|
{ print }
|
|
END { if (!done) print key "=" value }
|
|
' "$env_path" > "$tmp_env"
|
|
mv "$tmp_env" "$env_path"
|
|
else
|
|
printf '%s=%s\n' "$key" "$value" >> "$env_path"
|
|
fi
|
|
}
|
|
|
|
overlay_reused_env() {
|
|
local source_env="$1"
|
|
local target_env="$2"
|
|
local key
|
|
local value
|
|
while IFS='=' read -r key _; do
|
|
[[ -n "$key" ]] || continue
|
|
[[ "$key" =~ ^[A-Za-z_][A-Za-z0-9_]*$ ]] || continue
|
|
case "$key" in
|
|
RPKI_IMAGE|PROMETHEUS_IMAGE|GRAFANA_IMAGE)
|
|
[[ "$UPDATE_PACKAGE_IMAGE" == "0" ]] || continue
|
|
;;
|
|
esac
|
|
value="$(env_get_key "$source_env" "$key")"
|
|
env_set_key "$target_env" "$key" "$value"
|
|
done < <(grep -E '^[A-Za-z_][A-Za-z0-9_]*=' "$source_env" || true)
|
|
}
|
|
|
|
if [[ -n "$REUSE_ENV_FROM" ]]; then
|
|
[[ -f "$REUSE_ENV_FROM" ]] || die "missing reuse env file: $REUSE_ENV_FROM"
|
|
if [[ ! -f "$ENV_FILE" ]]; then
|
|
[[ -f "$ENV_EXAMPLE" ]] || die "missing $ENV_EXAMPLE"
|
|
cp "$ENV_EXAMPLE" "$ENV_FILE"
|
|
overlay_reused_env "$REUSE_ENV_FROM" "$ENV_FILE"
|
|
log "created new package env from .env.example and overlaid user settings from $REUSE_ENV_FROM"
|
|
else
|
|
log "keeping existing env at $ENV_FILE; reuse source ignored: $REUSE_ENV_FROM"
|
|
fi
|
|
fi
|
|
|
|
load_env
|
|
create_data_dirs
|
|
install_docker_if_missing
|
|
load_installer_images
|
|
ensure_binfmt_if_needed
|
|
verify_runtime_image
|
|
verify_monitor_images
|
|
compose_cmd --profile core --profile sidecar --profile monitor up -d --force-recreate
|
|
"$SCRIPT_DIR/status.sh" --brief || true
|