#!/usr/bin/env bash
set -Eeuo pipefail
umask 077
STEP_ID="STEP_050M07R15B2_GENERATION_BUILDER_R06_PUBLIC_COLLISION_REPAIR_AND_REPORT_CONTINUATION"
STEP_LABEL="step050m07r15b2_generation_builder_r06_final"
R05_STEP_ID="STEP_050M07R15B2_GENERATION_BUILDER_R05_STEP_REPORT_CONTINUATION"
R03_STEP_ID="STEP_050M07R15B2_GENERATION_BUILDER_R03_CONTINUATION"
R03_TARGET_BASE="/var/lib/router-egress-recovery/steps/$R03_STEP_ID"
EXPECTED_PUBLISHER_SHA256="e78430b57afbd0ae27fc575fc4de78bb267c76caf04ec935b01e9b2f89840e32"
EXPECTED_REINDEX_SHA256="09add0b861e9eba9793b3188dd8e91811cbef8a8da095f216b9a5efcbfdec61c"
EXPECTED_COMMIT="acdd5c8dc7990d48d492cc567b0a1506af96a826"
EXPECTED_TREE="a11117d70e206ddb812076757e1d5003ae76ec5f"
EXPECTED_FILE_COUNT="33"
EXPECTED_BUILDER_SHA256="d601eccb9380d6ce38c86b8881e13adf6dd4e2c4454f95fcd3768ab06b16c92e"
EXPECTED_PROFILE_SHA256="ea812e1ecd223e7fb45d0c416d653be8bba499b73c5a6fd6548599eb214bfbf3"
EXPECTED_GENERATION_ID="r15b2-20260716-215914"
EXPECTED_SOURCE_FOLDER="20260716-215921_vm101_git_source_acdd5c8dc799"
EXPECTED_SOURCE_ARCHIVE="wg-paid-vm101-acdd5c8dc799.tar.gz"
EXPECTED_SOURCE_ARCHIVE_SHA256="d6095ed58da0c3fec1f000fd0a45ab39681e15617745ce70c8cd4fd79925ece6"
EXPECTED_MODEL_FOLDER="20260716-221926_vm101_model_generation_builder_r15b2"
EXPECTED_METHODS_FOLDER="20260716-221927_vm101_methods_generation_builder_r15b2"
EXPECTED_PLAN_FOLDER="20260716-221927_local_architecture_plan_vm101_autonomous_hmn_recovery_r15b2"
BUNDLE_DIR="$(cd "$(dirname "$0")" && pwd -P)"
SELF="$(readlink -f "$0")"
BUNDLE_ZIP="${BUNDLE_ZIP:?BUNDLE_ZIP required}"
EXPECTED_BUNDLE_SHA256="${EXPECTED_BUNDLE_SHA256:?EXPECTED_BUNDLE_SHA256 required}"
EXPECTED_INSTALLER_SHA256="${EXPECTED_INSTALLER_SHA256:?EXPECTED_INSTALLER_SHA256 required}"
source "$BUNDLE_DIR/plans/current-links.env"
LATEST_ROOT_URL="https://reports.secret-studio.ru/latest/"; OLD_ROOT_URL="https://reports.secret-studio.ru/old/"
TS="$(date -u +%Y%m%d-%H%M%S)"; BASE=/opt/router-ops
STEP_DIR="$BASE/steps/${TS}_${STEP_ID}"; mkdir -p "$STEP_DIR"; chmod 700 "$STEP_DIR"
STEP_FILE="$STEP_DIR/step-code.sh"; cp -a "$SELF" "$STEP_FILE"; chmod 700 "$STEP_FILE"
BUNDLE_COPY="$STEP_DIR/$(basename "$BUNDLE_ZIP")"; cp -a "$BUNDLE_ZIP" "$BUNDLE_COPY"
REPORT="$STEP_DIR/report.txt"; FACTS="$STEP_DIR/facts.json"; VERIFY="$STEP_DIR/verify.txt"; ROLLBACK="$STEP_DIR/rollback.sh"
MAIN_LOG="$STEP_DIR/main.log"; PROGRESS_LOG="$STEP_DIR/progress.log"; TRANSFER_VERIFY="$STEP_DIR/transfer-verify.txt"
PHASES="$STEP_DIR/phases.txt"; HTTP_LOG="$STEP_DIR/http-verify.log"; VM101_LOG="$STEP_DIR/vm101-authoritative-postcheck.log"
COLLISION_PROOF="$STEP_DIR/public-collision-proof.txt"; COLLISION_HELPER_LOG="$STEP_DIR/public-collision-helper.log"
COLLISION_BACKUP_ROOT="$STEP_DIR/public-collision-backup"; STEP_PUBLISH_LOG="$STEP_DIR/step-publish.log"; PUBLISH_HELPER_LOG="$STEP_DIR/publish-helper.log"
SAFE_PUBLISH="$STEP_DIR/publish-safe"; mkdir -p "$SAFE_PUBLISH" "$COLLISION_BACKUP_ROOT"; : > "$HTTP_LOG"
PUBLISHER="$BASE/bin/router-publish-report"; REINDEX="$BASE/bin/router-public-reindex"; TOKEN_FILE="$BASE/public/.router-public-token"; STATE_DIR="$BASE/state"; REPO_DIR="$STATE_DIR/source-repositories/wg-paid-vm101"
RESULT=STOP_NOT_STARTED; STOP_REASON=none; CURRENT_PHASE=initialization; COPY_VERIFY=FAIL; STEP_WAS_NOT_STARTED=true
CORE_CHANGE_COMPLETE=true; CORE_CHANGE_REPEATED=false; CANDIDATE_TESTING_REPEATED=false; TARGET_INSTALLER_RERUN=false
MACHINE_GIT_COMPLETE=true; MACHINE_GIT_REPEATED=false; EXACT_CLONE_REPEATED=false; SOURCE_PUBLICATION_REPEATED=false
MODEL_PUBLICATION_REPEATED=false; METHODS_PUBLICATION_REPEATED=false; PLAN_PUBLICATION_REPEATED=false; ROUTER_MACHINE_CLOSE_RERUN=false
PUBLIC_COLLISION_PRESENT=unknown; PUBLIC_COLLISION_REPAIR_APPLIED=false; COLLISION_BACKUP_DIR=""; STEP_REPORT_PUBLICATION_COMPLETE=false
PUBLISHER_RC=not_run; PUBLICATION_RC_SALVAGED=false; HTTP_VERIFY_PASS=false; RUNTIME_IMPACT=false
STEP_REPORT_URL=""; FACTS_URL=""; VERIFY_URL=""; ROLLBACK_URL=""; PUBLIC_OBJECT_KIND=step-report; PREVIOUS_MOVED_COUNT=unknown; STEP_PUBLISHED_DIR=""
TOKEN=""; LATEST_LOCAL=""; OLD_LOCAL=""; R05_STEP_DIR=""
exec 3>&1; exec >>"$MAIN_LOG" 2>&1
progress(){ printf '>>> [%s] %s\n' "$(date '+%F %T')" "$*" | tee -a "$PROGRESS_LOG" >&3; }
phase(){ CURRENT_PHASE="$1"; printf '%s=started\n' "$1" >> "$PHASES"; progress "$1"; }
value(){ awk -F= -v k="$1" '$1==k{print substr($0,index($0,"=")+1)}' "$2" | tail -n1; }
check_url(){ local n="$1" u="$2" o="$3" s="${4:-}" c a; c="$(curl --resolve reports.secret-studio.ru:443:10.71.100.84 -sS -o "$o" -w '%{http_code}' "$u")"; echo "${n}_CODE=$c" >> "$HTTP_LOG"; [[ "$c" == 200 ]]; if [[ -n "$s" ]]; then a="$(sha256sum "$o"|awk '{print $1}')"; echo "${n}_SHA256=$a" >> "$HTTP_LOG"; [[ "$a" == "$s" ]]; fi; }
write_rollback(){ cat > "$ROLLBACK" <<EOF
#!/usr/bin/env bash
set -Eeuo pipefail
BASE=/opt/router-ops
TOKEN=\$(cat \"$TOKEN_FILE\")
LATEST=\"\$BASE/public/r/\$TOKEN/latest\"
OLD=\"\$BASE/public/r/\$TOKEN/old\"
BACKUP_DIR=\"$COLLISION_BACKUP_DIR\"
PUBLISHED_DIR=\"$STEP_PUBLISHED_DIR\"
if [[ -n \"\$PUBLISHED_DIR\" && -d \"\$PUBLISHED_DIR\" ]]; then mv \"\$PUBLISHED_DIR\" \"${STEP_DIR}/rollback-r06-published\"; fi
if [[ -n \"\$BACKUP_DIR\" && -d \"\$BACKUP_DIR\" ]]; then NAME=\$(basename \"\$BACKUP_DIR\"); [[ ! -e \"\$LATEST/\$NAME\" ]]; mv \"\$BACKUP_DIR\" \"\$LATEST/\$NAME\"; fi
\"$REINDEX\"
echo RESULT=PASS_R15B2_R06_PUBLICATION_ROLLBACK
EOF
chmod 700 "$ROLLBACK"; }
write_docs(){
cat > "$REPORT" <<EOF
RESULT=$RESULT
STOP_REASON=$STOP_REASON
STEP_ID=$STEP_ID
CURRENT_PHASE=$CURRENT_PHASE
CONTINUATION_FROM=$R05_STEP_ID
CORE_CHANGE_COMPLETE=true
CORE_CHANGE_REPEATED=false
CANDIDATE_TESTING_REPEATED=false
MACHINE_GIT_REPEATED=false
SOURCE_PUBLICATION_REPEATED=false
MODEL_PUBLICATION_REPEATED=false
METHODS_PUBLICATION_REPEATED=false
PLAN_PUBLICATION_REPEATED=false
ROUTER_MACHINE_CLOSE_RERUN=false
PUBLIC_COLLISION_PRESENT=$PUBLIC_COLLISION_PRESENT
PUBLIC_COLLISION_REPAIR_APPLIED=$PUBLIC_COLLISION_REPAIR_APPLIED
COLLISION_BACKUP_DIR=$COLLISION_BACKUP_DIR
STEP_REPORT_PUBLICATION_COMPLETE=$STEP_REPORT_PUBLICATION_COMPLETE
PUBLISHER_RC=$PUBLISHER_RC
PUBLICATION_RC_SALVAGED=$PUBLICATION_RC_SALVAGED
VM101_GIT_COMMIT=$EXPECTED_COMMIT
VM101_GIT_TREE=$EXPECTED_TREE
VM101_GIT_FILE_COUNT=$EXPECTED_FILE_COUNT
GENERATION_ID=$EXPECTED_GENERATION_ID
STAGING_GENERATION_COUNT=1
GENERATION_VALIDATOR=PASS
ACTIVE_GENERATION_CREATED=false
ACTIVE_SLOTS_CHANGED=false
ENDPOINTS_UNCHANGED=PASS
TABLES_201_205=PASS
RECOVERY_SERVICES=PASS
SERVICE_RESTARTS=none
TRAFFIC_INTERRUPTION=false
RUNTIME_IMPACT=false
STEP_REPORT_URL=$STEP_REPORT_URL
LOCAL_M07_PLAN_URL=$LOCAL_M07_PLAN_URL
GLOBAL_PROJECT_PLAN_URL=$GLOBAL_PROJECT_PLAN_URL
ACCESS_MAP_URL=$ACCESS_MAP_URL
VM100_PUBLIC_URL=$VM100_PUBLIC_URL
VM101_PUBLIC_URL=$VM101_PUBLIC_URL
VM121_PUBLIC_URL=$VM121_PUBLIC_URL
VM101_MODEL_URL=$VM101_MODEL_URL
VM101_METHODS_URL=$VM101_METHODS_URL
VM130_SOURCE_URL=$VM130_SOURCE_URL
LATEST_ROOT_URL=$LATEST_ROOT_URL
OLD_ROOT_URL=$OLD_ROOT_URL
FACTS_URL=$FACTS_URL
VERIFY_URL=$VERIFY_URL
ROLLBACK_URL=$ROLLBACK_URL
PUBLIC_OBJECT_KIND=$PUBLIC_OBJECT_KIND
PREVIOUS_MOVED_COUNT=$PREVIOUS_MOVED_COUNT
COPY_VERIFY=$COPY_VERIFY
STEP_SHA256=$(sha256sum "$STEP_FILE"|awk '{print $1}')
HTTP_VERIFY_PASS=$HTTP_VERIFY_PASS
EOF
cp "$REPORT" "$VERIFY"
python3 - "$REPORT" "$FACTS" <<'PY2'
import json,sys
D={}
for line in open(sys.argv[1],encoding='utf-8'):
 if '=' in line:
  k,v=line.rstrip('\n').split('=',1)
  if v=='true': v=True
  elif v=='false': v=False
  elif v.isdigit(): v=int(v)
  D[k.lower()]=v
json.dump(D,open(sys.argv[2],'w',encoding='utf-8'),indent=2,sort_keys=True); open(sys.argv[2],'a').write('\n')
PY2
}
restore_on_failure(){
  [[ "$PUBLIC_COLLISION_REPAIR_APPLIED" == true && "$STEP_REPORT_PUBLICATION_COMPLETE" != true ]] || return 0
  mapfile -t now < <(find "$LATEST_LOCAL" -mindepth 1 -maxdepth 1 -type d -name '*_step*' -printf '%p\n'|sort)
  if [[ ${#now[@]} -eq 0 && -n "$COLLISION_BACKUP_DIR" && -d "$COLLISION_BACKUP_DIR" ]]; then mv "$COLLISION_BACKUP_DIR" "$LATEST_LOCAL/$(basename "$COLLISION_BACKUP_DIR")"; "$REINDEX" >/dev/null 2>&1 || true; PUBLIC_COLLISION_REPAIR_APPLIED=false; fi
}
print_final(){ write_docs; { echo RESULT=$RESULT; echo STEP_REPORT_URL=${STEP_REPORT_URL:-PENDING_NOT_PUBLISHED}; echo LOCAL_M07_PLAN_URL=$LOCAL_M07_PLAN_URL; echo GLOBAL_PROJECT_PLAN_URL=$GLOBAL_PROJECT_PLAN_URL; echo ACCESS_MAP_URL=$ACCESS_MAP_URL; echo VM100_PUBLIC_URL=$VM100_PUBLIC_URL; echo VM101_PUBLIC_URL=$VM101_PUBLIC_URL; echo VM121_PUBLIC_URL=$VM121_PUBLIC_URL; echo VM101_MODEL_URL=$VM101_MODEL_URL; echo VM101_METHODS_URL=$VM101_METHODS_URL; echo VM130_SOURCE_URL=$VM130_SOURCE_URL; echo LATEST_ROOT_URL=$LATEST_ROOT_URL; echo OLD_ROOT_URL=$OLD_ROOT_URL; echo FACTS_URL=${FACTS_URL:-PENDING_NOT_PUBLISHED}; echo VERIFY_URL=${VERIFY_URL:-PENDING_NOT_PUBLISHED}; echo ROLLBACK_URL=${ROLLBACK_URL:-PENDING_NOT_PUBLISHED}; echo PUBLIC_OBJECT_KIND=$PUBLIC_OBJECT_KIND; echo PREVIOUS_MOVED_COUNT=$PREVIOUS_MOVED_COUNT; echo PUBLIC_COLLISION_REPAIR_APPLIED=$PUBLIC_COLLISION_REPAIR_APPLIED; echo COPY_VERIFY=$COPY_VERIFY; echo STEP_SHA256=$(sha256sum "$STEP_FILE"|awk '{print $1}'); echo PUBLISHER_RC=$PUBLISHER_RC; echo PUBLICATION_RC_SALVAGED=$PUBLICATION_RC_SALVAGED; echo HTTP_VERIFY_PASS=$HTTP_VERIFY_PASS; echo RUNTIME_IMPACT=false; } >&3; }
stop(){ trap - ERR; RESULT="$1"; STOP_REASON="$2"; restore_on_failure; write_rollback; print_final; exit 1; }
trap 'stop STOP_R15B2_R06_UNEXPECTED_ERROR "phase=${CURRENT_PHASE};line=${LINENO};rc=$?"' ERR
write_rollback; write_docs
phase transfer_verification
AZ="$(sha256sum "$BUNDLE_COPY"|awk '{print $1}')"; AI="$(sha256sum "$STEP_FILE"|awk '{print $1}')"; [[ "$AZ" == "$EXPECTED_BUNDLE_SHA256" && "$AI" == "$EXPECTED_INSTALLER_SHA256" ]] || stop STOP_COPY_OR_TRANSFER_ERROR sha
(cd "$BUNDLE_DIR" && sha256sum -c manifest.sha256) > "$STEP_DIR/manifest-check.log" 2>&1 || stop STOP_COPY_OR_TRANSFER_ERROR manifest
bash -n "$STEP_FILE"; for f in "$BUNDLE_DIR"/scripts/vm130/*.sh "$BUNDLE_DIR"/tests/*.sh; do bash -n "$f"; done; for f in "$BUNDLE_DIR"/scripts/vm101/*.sh; do sh -n "$f"; done
for f in "$BUNDLE_DIR"/tests/test-*.sh; do bash "$f" >> "$STEP_DIR/local-fixtures.log" 2>&1 || stop STOP_COPY_OR_TRANSFER_ERROR "fixture:$(basename "$f")"; done
COPY_VERIFY=PASS; STEP_WAS_NOT_STARTED=false
printf 'EXPECTED_BUNDLE_SHA256=%s\nACTUAL_BUNDLE_SHA256=%s\nEXPECTED_INSTALLER_SHA256=%s\nACTUAL_INSTALLER_SHA256=%s\nCOPY_VERIFY=PASS\nSTEP_SHA256=%s\n' "$EXPECTED_BUNDLE_SHA256" "$AZ" "$EXPECTED_INSTALLER_SHA256" "$AI" "$AI" > "$TRANSFER_VERIFY"
phase vm130_preflight
for c in bash python3 sha256sum awk grep sed find sort comm curl git ssh tar gzip cmp xargs flock; do command -v "$c" >/dev/null; done
[[ "$(sha256sum "$PUBLISHER"|awk '{print $1}')" == "$EXPECTED_PUBLISHER_SHA256" ]]; [[ "$(sha256sum "$REINDEX"|awk '{print $1}')" == "$EXPECTED_REINDEX_SHA256" ]]; [[ -s "$TOKEN_FILE" ]]
TOKEN="$(cat "$TOKEN_FILE")"; LATEST_LOCAL="$BASE/public/r/$TOKEN/latest"; OLD_LOCAL="$BASE/public/r/$TOKEN/old"; [[ -d "$LATEST_LOCAL" && -d "$OLD_LOCAL" ]]
phase r05_artifact_discovery
R05_STEP_DIR="$(find "$BASE/steps" -maxdepth 1 -type d -name "*_${R05_STEP_ID}" -print|sort|tail -n1)"; [[ -d "$R05_STEP_DIR" ]]
grep -qx RESULT=STOP_R15B2_R05_STEP_REPORT_PUBLICATION_FAILED "$R05_STEP_DIR/report.txt"; [[ -s "$R05_STEP_DIR/step-publish.log" ]]
phase existing_canonical_publication_verification
for d in "$LATEST_LOCAL/$EXPECTED_SOURCE_FOLDER" "$LATEST_LOCAL/$EXPECTED_MODEL_FOLDER" "$LATEST_LOCAL/$EXPECTED_METHODS_FOLDER" "$LATEST_LOCAL/$EXPECTED_PLAN_FOLDER"; do [[ -d "$d" && -s "$d/index.html" ]]; done
[[ "$(sha256sum "$LATEST_LOCAL/$EXPECTED_SOURCE_FOLDER/$EXPECTED_SOURCE_ARCHIVE"|awk '{print $1}')" == "$EXPECTED_SOURCE_ARCHIVE_SHA256" ]]
phase vm101_authoritative_postcheck
ssh -o BatchMode=yes -o ConnectTimeout=20 pve-mgts "ssh -o BatchMode=yes -o ConnectTimeout=20 -i /root/.ssh/pve_to_openwrt_mgts_ed25519 root@10.71.100.2 '/bin/sh -s -- $EXPECTED_BUILDER_SHA256 $EXPECTED_PROFILE_SHA256 $EXPECTED_COMMIT $EXPECTED_TREE $EXPECTED_GENERATION_ID $R03_TARGET_BASE'" < "$BUNDLE_DIR/scripts/vm101/vm101-r06-authoritative-postcheck.sh" > "$VM101_LOG" || stop STOP_R15B2_R06_VM101_POSTCHECK_FAILED rc
grep -qx RESULT=PASS_R15B2_R06_VM101_AUTHORITATIVE_POSTCHECK "$VM101_LOG"
phase public_collision_detection_and_repair
set +e
bash "$BUNDLE_DIR/scripts/vm130/repair-step-report-collision.sh" "$LATEST_LOCAL" "$OLD_LOCAL" "$COLLISION_BACKUP_ROOT" "$COLLISION_PROOF" "$REINDEX" > "$COLLISION_HELPER_LOG" 2>&1
CRC=$?
set -e
[[ $CRC -eq 0 ]] || stop STOP_R15B2_R06_PUBLIC_COLLISION_REPAIR_FAILED "rc=$CRC"
PUBLIC_COLLISION_PRESENT="$(value COLLISION_PRESENT "$COLLISION_HELPER_LOG")"; PUBLIC_COLLISION_REPAIR_APPLIED="$(value REPAIR_APPLIED "$COLLISION_HELPER_LOG")"; COLLISION_BACKUP_DIR="$(value BACKUP_DIR "$COLLISION_HELPER_LOG")"; [[ -n "$COLLISION_BACKUP_DIR" ]] || COLLISION_BACKUP_DIR=""
write_rollback
phase step_report_preparation
RESULT=PASS_R15B2_GENERATION_BUILDER_STAGED; STOP_REASON=none; write_docs
rm -rf "$SAFE_PUBLISH"; mkdir -p "$SAFE_PUBLISH"
for f in "$STEP_FILE" "$REPORT" "$FACTS" "$VERIFY" "$ROLLBACK" "$TRANSFER_VERIFY" "$PROGRESS_LOG" "$PHASES" "$COLLISION_PROOF" "$COLLISION_HELPER_LOG" "$VM101_LOG" "$BUNDLE_DIR/release-info.json"; do cp -a "$f" "$SAFE_PUBLISH/$(basename "$f")"; done
cp -a "$R05_STEP_DIR/report.txt" "$SAFE_PUBLISH/r05-report.txt"; cp -a "$R05_STEP_DIR/facts.json" "$SAFE_PUBLISH/r05-facts.json"; cp -a "$R05_STEP_DIR/verify.txt" "$SAFE_PUBLISH/r05-verify.txt"; cp -a "$R05_STEP_DIR/step-publish.log" "$SAFE_PUBLISH/r05-step-publish.log"
phase step_report_publication
set +e
bash "$BUNDLE_DIR/scripts/vm130/publish-step-report.sh" "$PUBLISHER" "$STEP_LABEL" "$SAFE_PUBLISH" "$STEP_PUBLISH_LOG" "$LATEST_LOCAL" "$EXPECTED_INSTALLER_SHA256" > "$PUBLISH_HELPER_LOG" 2>&1
HRC=$?
set -e
PUBLISHER_RC="$(value PUBLISHER_RC "$PUBLISH_HELPER_LOG")"; [[ -n "$PUBLISHER_RC" ]] || PUBLISHER_RC=unknown
[[ $HRC -eq 0 ]] || stop STOP_R15B2_R06_STEP_REPORT_PUBLICATION_FAILED "helper_rc=$HRC"
grep -qx RESULT=PASS_R15B2_R06_STEP_REPORT_PUBLISHED "$PUBLISH_HELPER_LOG"
PUBLICATION_RC_SALVAGED="$(value PUBLICATION_RC_SALVAGED "$PUBLISH_HELPER_LOG")"; STEP_PUBLISHED_DIR="$(value PUBLISHED_DIR "$PUBLISH_HELPER_LOG")"; STEP_REPORT_URL="$(value STEP_REPORT_URL "$PUBLISH_HELPER_LOG")"; PUBLIC_OBJECT_KIND="$(value PUBLIC_OBJECT_KIND "$PUBLISH_HELPER_LOG")"; PREVIOUS_MOVED_COUNT="$(value PREVIOUS_MOVED_COUNT "$PUBLISH_HELPER_LOG")"; [[ -d "$STEP_PUBLISHED_DIR" ]]
FACTS_URL="${STEP_REPORT_URL}facts.json"; VERIFY_URL="${STEP_REPORT_URL}verify.txt"; ROLLBACK_URL="${STEP_REPORT_URL}rollback.sh"; STEP_REPORT_PUBLICATION_COMPLETE=true
phase external_http_verification
check_url STEP "$STEP_REPORT_URL" "$STEP_DIR/http-step.html"; check_url STEP_CODE "${STEP_REPORT_URL}step-code.sh" "$STEP_DIR/http-step-code.sh" "$EXPECTED_INSTALLER_SHA256"; check_url SOURCE "$VM101_PUBLIC_URL" "$STEP_DIR/http-source.html"; check_url MODEL "$VM101_MODEL_URL" "$STEP_DIR/http-model.html"; check_url METHODS "$VM101_METHODS_URL" "$STEP_DIR/http-methods.html"; check_url PLAN "$LOCAL_M07_PLAN_URL" "$STEP_DIR/http-plan.html"; HTTP_VERIFY_PASS=true
phase complete
RESULT=PASS_R15B2_GENERATION_BUILDER_STAGED; write_rollback; write_docs
cp -a "$REPORT" "$FACTS" "$VERIFY" "$ROLLBACK" "$HTTP_LOG" "$PUBLISH_HELPER_LOG" "$STEP_PUBLISH_LOG" "$STEP_PUBLISHED_DIR/"; chmod 644 "$STEP_PUBLISHED_DIR"/* 2>/dev/null || true
check_url FINAL_REPORT "$STEP_REPORT_URL" "$STEP_DIR/http-final-report.txt" "$(sha256sum "$REPORT"|awk '{print $1}')"; check_url FINAL_FACTS "$FACTS_URL" "$STEP_DIR/http-final-facts.json" "$(sha256sum "$FACTS"|awk '{print $1}')"; check_url FINAL_VERIFY "$VERIFY_URL" "$STEP_DIR/http-final-verify.txt" "$(sha256sum "$VERIFY"|awk '{print $1}')"
print_final
