#!/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