#!/usr/bin/env bash set +x set -Eeuo pipefail umask 077 : "${QUOTE_SNAPSHOT_FILE:?}" : "${TARGET_SSH_KEY:?}" "${TARGET_SSH_USER:?}" "${TARGET_SSH_HOST:?}" "${TARGET_SSH_KNOWN_HOSTS:?}" : "${GRAY_DEPLOY_DIR:?}" "${SOURCE_COMMIT:?}" "${BUILD_NUMBER:?}" [[ "$TARGET_SSH_USER" =~ ^[A-Za-z0-9_.-]+$ && "$TARGET_SSH_HOST" =~ ^[A-Za-z0-9.-]+$ ]] || exit 2 [[ "$SOURCE_COMMIT" =~ ^[a-f0-9]{40}$ && "$BUILD_NUMBER" =~ ^[1-9][0-9]*$ ]] || exit 2 root=$GRAY_DEPLOY_DIR [[ "$root" == /*/gray-logistics-chat && "$root" != *..* ]] || exit 2 release_id="${SOURCE_COMMIT:0:12}-b$BUILD_NUMBER" release="$root/releases/$release_id" quote_sha=$(sha256sum "$QUOTE_SNAPSHOT_FILE" | awk '{print $1}') ssh_options=(-i "$TARGET_SSH_KEY" -o BatchMode=yes -o StrictHostKeyChecking=yes -o "UserKnownHostsFile=$TARGET_SSH_KNOWN_HOSTS" -o ConnectTimeout=12) target="$TARGET_SSH_USER@$TARGET_SSH_HOST" scp "${ssh_options[@]}" "$QUOTE_SNAPSHOT_FILE" "$target:$release/quote-input.json" ssh "${ssh_options[@]}" "$target" bash -s -- "$root" "$release_id" "$SOURCE_COMMIT" "$quote_sha" <<'IMPORT' set -Eeuo pipefail umask 077 root=$1 release_id=$2 source_commit=$3 quote_sha=$4 [[ "$root" == /*/gray-logistics-chat && "$root" != *..* ]] || exit 2 [[ "$release_id" =~ ^[a-f0-9]{12}-b[0-9]+$ && "$source_commit" =~ ^[a-f0-9]{40}$ ]] || exit 2 [[ "$quote_sha" =~ ^[a-f0-9]{64}$ ]] || exit 2 release="$root/releases/$release_id" [[ "$(cat "$root/.project")" == baiyue-logistics-chat-gray ]] || exit 2 input="$root/data/imports/quotes-$release_id" owned_input=0 cleanup() { rm -f -- "$release/quote-input.json" if [[ "$owned_input" == 1 ]]; then rm -f -- "$input/quotes.json" rmdir -- "$input" 2>/dev/null || true fi } trap cleanup EXIT [[ "$(cat "$root/current-release")" == "$release" ]] || exit 2 container=baiyue-logistics-chat-gray [[ "$(docker inspect --format '{{index .Config.Labels "com.docker.compose.project"}}' "$container")" == baiyue-logistics-chat-gray ]] || exit 2 [[ "$(docker inspect --format '{{index .Config.Labels "org.opencontainers.image.revision"}}' "$container")" == "$source_commit" ]] || exit 2 printf '%s %s\n' "$quote_sha" "$release/quote-input.json" | sha256sum --check --status [[ ! -e "$input" ]] || { echo 'Existing quote import input requires inspection.' >&2; exit 2; } install -d -m 700 -o 10001 -g 10001 "$root/data/imports" "$input" owned_input=1 install -m 600 -o 10001 -g 10001 "$release/quote-input.json" "$input/quotes.json" docker exec "$container" python -c 'import pathlib,sqlite3,sys; p=pathlib.Path("/var/lib/baiyue-logistics-chat/backups")/("pre-quote-import-"+sys.argv[1]+".db"); p.parent.mkdir(exist_ok=True); assert not p.exists(); source=sqlite3.connect("/var/lib/baiyue-logistics-chat/history.db"); target=sqlite3.connect(str(p)); source.backup(target); target.close(); source.close(); print("Chat SQLite backup completed before quote import.")' "$release_id" docker exec "$container" python scripts/import_quote_data.py \ --db /var/lib/baiyue-logistics-chat/history.db --snapshot "/var/lib/baiyue-logistics-chat/imports/quotes-$release_id/quotes.json" --activate echo 'General quote version activated; order data and customer grants preserved.' IMPORT