#!/bin/sh # Only this release. Default reversible quiesce; --remove-new-objects is permanent. set -eu BASE=/home/www/qwen-vllm/dify-integration-20261009 ID=7c3ca77d77cac063d6b98310e59d2a73b896a0f5171ba002d41eccab1c067a59 MODE=${1:---quiesce} case "$MODE" in --quiesce|--restore|--remove-new-objects) ;; *) echo 'usage: ROLLBACK.sh [--quiesce|--restore|--remove-new-objects]' >&2; exit 2;; esac python3 - "$BASE" <<'PY' import json,pathlib,sys r=json.loads((pathlib.Path(sys.argv[1])/'resources.private.json').read_text()) expected={'app_id':'ea0d7293-3d89-425d-a236-015fac7e2470','key_id':'ecfb7628-1369-41fa-b132-d24074af8470','asr_model_id':'e55a7374-a43e-4b86-9323-005a2a72458b','asr_credential_id':'01a11f7e-a148-7b9c-82c7-ffc1425b40ee','asr_default_id':'56ca4093-61fa-446b-ad77-b10deb9daaa4'} assert all(r.get(k)==v for k,v in expected.items()),'RESOURCE_IDENTITY_MISMATCH' print('EXACT_NEW_RESOURCES_VERIFIED') PY ACTUAL=$(docker inspect --format '{{.Id}}' followup-asr-bridge-20261009) [ "$ACTUAL" = "$ID" ] || { echo 'BRIDGE_IDENTITY_MISMATCH' >&2; exit 3; } [ "$(docker inspect --format '{{index .Config.Labels "com.zyt.release"}}' "$ID")" = followup-dify-20261009 ] || exit 4 if [ "$MODE" = --restore ]; then docker start "$ID" for n in 1 2 3 4 5 6 7 8 9 10; do if docker exec "$ID" python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/health',timeout=4).read()"; then break; fi sleep 1 done docker exec "$ID" python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/health',timeout=4).read()" python3 "$BASE/host_operator.py" enable echo RESTORED_NEW_ASR_APP_AND_BRIDGE elif [ "$MODE" = --quiesce ]; then python3 "$BASE/host_operator.py" disable docker stop --time 10 "$ID" echo NEW_ASR_APP_AND_BRIDGE_QUIESCED else python3 "$BASE/host_operator.py" remove docker stop --time 10 "$ID" docker rm "$ID" echo NEW_APP_MODEL_DEFAULT_BRIDGE_REMOVED_SHARED_RESOURCES_PRESERVED fi