From 875701fcdc00d42ab5bd4f274fc5b364650e4c21 Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Sun, 31 May 2026 12:55:58 +0000 Subject: [PATCH] tests: make salvage NCP report root-aware --- tests/salvage/salvage_ncp_delete_smoke.sh | 125 ++++++++++++++++++---- 1 file changed, 106 insertions(+), 19 deletions(-) diff --git a/tests/salvage/salvage_ncp_delete_smoke.sh b/tests/salvage/salvage_ncp_delete_smoke.sh index a83b29c..c354035 100755 --- a/tests/salvage/salvage_ncp_delete_smoke.sh +++ b/tests/salvage/salvage_ncp_delete_smoke.sh @@ -10,11 +10,13 @@ USER_NAME="SUPERVISOR" PASSWORD="" NETWARE_PATH="SYS:PUBLIC/SLVGCHK.TXT" UNIX_PATH="/var/mars_nwe/SYS/public/SLVGCHK.TXT" +VOLUME_ROOT="" RECYCLE_REPOSITORY=".recycle" SALVAGE_REPOSITORY=".salvage" DELETED_BY="" OUT_FILE="" KEEP_GOING=1 +CLEAN_ARTIFACTS=1 usage() { cat <&2; exit 2 ;; esac +if [ -n "$VOLUME_ROOT" ]; then + case "$VOLUME_ROOT" in + /*) ;; + *) echo "--volume-root must be absolute" >&2; exit 2 ;; + esac +fi REPORT_TMP=$(mktemp "${TMPDIR:-/tmp}/mars-salvage-ncp.XXXXXX") FAILURES=0 @@ -176,6 +190,81 @@ relative_to_volume_root() { esac } +relative_from_netware_path() { + local path=$1 + + path=${path#*:} + path=${path#/} + path=${path#\\} + path=${path//\\//} + printf '%s\n' "$path" +} + +resolve_case_path() { + local root=$1 + local rel=$2 + local current=$root + local old_ifs=$IFS + local part entry found + + rel=${rel#/} + IFS=/ + for part in $rel; do + [ -z "$part" ] && continue + found="" + if [ -d "$current" ]; then + for entry in "$current"/* "$current"/.[!.]* "$current"/..?*; do + [ -e "$entry" ] || continue + if [ "$(basename -- "$entry" | tr '[:upper:]' '[:lower:]')" = \ + "$(printf '%s' "$part" | tr '[:upper:]' '[:lower:]')" ]; then + found=$entry + break + fi + done + fi + if [ -n "$found" ]; then + current=$found + else + current=$current/$part + fi + done + IFS=$old_ifs + printf '%s\n' "$current" +} + + +prepare_expected_paths() { + if [ -z "$VOLUME_ROOT" ]; then + VOLUME_ROOT=$(compute_unix_volume_root) || return 1 + fi + if [ -z "$RELATIVE_PATH" ]; then + RELATIVE_PATH=$(relative_to_volume_root "$UNIX_PATH" "$VOLUME_ROOT") || \ + RELATIVE_PATH=$(relative_from_netware_path "$NETWARE_PATH") || return 1 + fi + RECYCLE_PATH=$(resolve_case_path "$VOLUME_ROOT" "$RECYCLE_REPOSITORY/$DELETED_BY/$RELATIVE_PATH") + METADATA_PATH=$(resolve_case_path "$VOLUME_ROOT" "$SALVAGE_REPOSITORY/$DELETED_BY/$RELATIVE_PATH.json") + return 0 +} + +clean_stale_artifacts() { + if [ "$CLEAN_ARTIFACTS" -eq 0 ]; then + return 0 + fi + section "pre-clean stale salvage artifacts" + if [ -n "$METADATA_PATH" ] && [ -e "$METADATA_PATH" ]; then + emit "rm '$METADATA_PATH'" + rm -f -- "$METADATA_PATH" || fail_check "could not remove stale metadata: $METADATA_PATH" + else + emit "metadata clean" + fi + if [ -n "$RECYCLE_PATH" ] && [ -e "$RECYCLE_PATH" ]; then + emit "rm '$RECYCLE_PATH'" + rm -f -- "$RECYCLE_PATH" || fail_check "could not remove stale recycle payload: $RECYCLE_PATH" + else + emit "recycle payload clean" + fi +} + check_file() { local label=$1 local path=$2 @@ -215,35 +304,33 @@ emit "server=$SERVER" emit "user=$USER_NAME" emit "path=$NETWARE_PATH" emit "unix_path=$UNIX_PATH" +if [ -n "$VOLUME_ROOT" ]; then + emit "volume_root_arg=$VOLUME_ROOT" +fi emit "deleted_by=$DELETED_BY" emit "recycle_repository=$RECYCLE_REPOSITORY" emit "salvage_repository=$SALVAGE_REPOSITORY" +emit "clean_artifacts=$CLEAN_ARTIFACTS" + +RELATIVE_PATH="" +RECYCLE_PATH="" +METADATA_PATH="" +if prepare_expected_paths; then + emit "volume_root=$VOLUME_ROOT" + emit "relative_path=$RELATIVE_PATH" + emit "recycle_path=$RECYCLE_PATH" + emit "metadata_path=$METADATA_PATH" + clean_stale_artifacts +else + fail_check "could not prepare expected paths before NCP delete" +fi run_cmd \ "NCP create/delete" \ "./ncp_delete_smoke -S '$SERVER' -U '$USER_NAME' -P ****** '$NETWARE_PATH'" \ "$SCRIPT_DIR/ncp_delete_smoke" -S "$SERVER" -U "$USER_NAME" -P "$PASSWORD" "$NETWARE_PATH" -VOLUME_ROOT=$(compute_unix_volume_root) || { - fail_check "could not compute Unix volume root from $NETWARE_PATH and $UNIX_PATH" - VOLUME_ROOT="" -} -RELATIVE_PATH="" -if [ -n "$VOLUME_ROOT" ]; then - RELATIVE_PATH=$(relative_to_volume_root "$UNIX_PATH" "$VOLUME_ROOT") || { - fail_check "could not derive relative path: unix_path=$UNIX_PATH volume_root=$VOLUME_ROOT" - RELATIVE_PATH="" - } -fi - if [ -n "$RELATIVE_PATH" ]; then - RECYCLE_PATH="$VOLUME_ROOT/$RECYCLE_REPOSITORY/$DELETED_BY/$RELATIVE_PATH" - METADATA_PATH="$VOLUME_ROOT/$SALVAGE_REPOSITORY/$DELETED_BY/$RELATIVE_PATH.json" - - emit "volume_root=$VOLUME_ROOT" - emit "relative_path=$RELATIVE_PATH" - emit "recycle_path=$RECYCLE_PATH" - emit "metadata_path=$METADATA_PATH" check_file "recycle payload" "$RECYCLE_PATH" check_file "salvage metadata sidecar" "$METADATA_PATH"