210 lines
7.7 KiB
Markdown
210 lines
7.7 KiB
Markdown
# Salvage smoke tests
|
|
|
|
Status: finished for the current NetWare salvage compatibility slice.
|
|
|
|
This directory contains the shared mars_nwe NetWare salvage/deleted-entry tests
|
|
and the single remaining salvage documentation file for this test group. The
|
|
previous backend-design notes have been folded into this README so the salvage
|
|
test directory has one Markdown entry point.
|
|
|
|
The backend is shared by the NetWare NCP salvage calls and AFP `0x13` `Get
|
|
Macintosh Info On Deleted Files`. AFP must remain a thin adapter over this
|
|
backend and must not grow a parallel deleted-file scanner.
|
|
|
|
## Configuration covered by the tests
|
|
|
|
The active salvage configuration block is intentionally in a low `nwserv.conf` /
|
|
`nw.ini` range:
|
|
|
|
```text
|
|
51 1
|
|
52 .recycle .salvage
|
|
53 kv
|
|
54 0700 0700
|
|
55 0 0
|
|
56 -
|
|
57 -
|
|
58 -
|
|
59 -
|
|
```
|
|
|
|
Section meanings:
|
|
|
|
- `51` enables or disables salvage.
|
|
- `52` names the recycle payload repository and the salvage metadata repository.
|
|
- `53` is a compact Samba `vfs_recycle`-style behaviour flag string:
|
|
- `k` = keeptree,
|
|
- `v` = versions,
|
|
- `t` = touch,
|
|
- `m` = touch_mtime.
|
|
- `54` reserves directory/subdirectory modes for generated repositories.
|
|
- `55` is `minsize maxsize`. Values may be raw bytes or case-insensitive
|
|
`kb`, `mb`, or `gb` units.
|
|
- `56` is the `exclude` pattern list. Matching files are deleted directly.
|
|
- `57` is the `exclude_dir` pattern list. Matching directories bypass salvage.
|
|
- `58` is the `noversions` pattern list. Matching files are recycled, but old
|
|
recycle names are replaced instead of getting `Copy #x of NAME` history.
|
|
- `59` is reserved for cleanup/history policy.
|
|
|
|
## Repository layout and metadata
|
|
|
|
With keeptree enabled, a deleted `SYS:PUBLIC/PMDFLTS.INI` owned by `SUPERVISOR`
|
|
is expected to produce:
|
|
|
|
```text
|
|
SYS/.recycle/SUPERVISOR/PUBLIC/PMDFLTS.INI
|
|
SYS/.salvage/SUPERVISOR/PUBLIC/PMDFLTS.INI.json
|
|
```
|
|
|
|
The `.recycle` tree contains deleted payload files. The `.salvage` tree
|
|
contains one JSON sidecar per deleted object. There is no large per-directory
|
|
index file.
|
|
|
|
The sidecar JSON preserves the mars_nwe server metadata needed for exact
|
|
recover, including NetWare archive/fileinfo xattrs, AFP metadata from nwatalk
|
|
when present, inherited rights, explicit trustee object/right pairs, and the
|
|
selected recycle/salvage relative paths. `finder_info_hex` is serialized as a
|
|
fixed 32-byte AFP FinderInfo block encoded as 64 hex characters. If mars_nwe
|
|
has no FinderInfo xattr for the deleted object, the JSON stores the all-zero
|
|
32-byte FinderInfo value.
|
|
|
|
## Samba-compatible version naming
|
|
|
|
With the `v` flag enabled, mars_nwe follows Samba `vfs_recycle` naming on
|
|
collision:
|
|
|
|
```text
|
|
SYS/.recycle/SUPERVISOR/PUBLIC/SLVGCHK.TXT
|
|
SYS/.recycle/SUPERVISOR/PUBLIC/Copy #1 of SLVGCHK.TXT
|
|
SYS/.recycle/SUPERVISOR/PUBLIC/Copy #2 of SLVGCHK.TXT
|
|
```
|
|
|
|
The `.salvage` sidecar uses the same selected payload name plus `.json`:
|
|
|
|
```text
|
|
SYS/.salvage/SUPERVISOR/PUBLIC/SLVGCHK.TXT.json
|
|
SYS/.salvage/SUPERVISOR/PUBLIC/Copy #1 of SLVGCHK.TXT.json
|
|
```
|
|
|
|
If versioning is disabled, or a file matches the `noversions` list, the previous
|
|
recycled payload/metadata is replaced instead of creating a `Copy #x of ...`
|
|
history entry. The `Copy #n of ...` prefix is intentionally not localized; it
|
|
follows Samba `vfs_recycle` literally and should be stable across server
|
|
locales.
|
|
|
|
## NCP endpoint scope
|
|
|
|
The current NetWare 3.x salvage slice is implemented and covered by the smoke
|
|
suite:
|
|
|
|
```text
|
|
NCP 0x2222 / 87 / 16 Scan Salvageable Files
|
|
NCP 0x2222 / 87 / 17 Recover Salvageable File
|
|
NCP 0x2222 / 87 / 18 Purge Salvageable File
|
|
NCP 0x2222 / 22 / 27 Scan Salvageable Files (old bridge)
|
|
NCP 0x2222 / 22 / 28 Recover Salvageable File (old bridge)
|
|
NCP 0x2222 / 22 / 29 Purge Salvageable File (old bridge)
|
|
```
|
|
|
|
The old `22/*` calls remain thin adapters over the same shared backend. Later
|
|
NetWare 4.11+ list variants and UTF-8 extensions remain outside this slice:
|
|
|
|
```text
|
|
NCP 0x2222 / 87 / 41 Scan Salvageable File List
|
|
NCP 0x2222 / 87 / 42 Purge Salvageable File List
|
|
NCP 0x2222 / 89 / 16 UTF-8 / extended Scan Salvageable Files
|
|
```
|
|
|
|
## Stale metadata cleanup
|
|
|
|
Samba or an administrator may delete files from `.recycle` while `.salvage`
|
|
metadata is still present. That is a real backend state, not a protocol error.
|
|
Runtime scans treat each `.salvage` JSON file as a sidecar for the matching
|
|
`.recycle` payload: if the payload is gone, `87/16` must not return the stale
|
|
entry and should remove the JSON. The server log should contain a greppable
|
|
line like:
|
|
|
|
```text
|
|
WARN SALVAGE 87/16 STALE ...
|
|
```
|
|
|
|
## NCP path visibility
|
|
|
|
`.recycle` and `.salvage` are backend repository directories. They are not
|
|
ordinary user-visible NetWare paths. The classic mars_nwe path resolver treats
|
|
leading-dot path components as special `.`/`..` syntax and rejects names such as
|
|
`.recycle` or `.salvage` with invalid path (`0x899c`). Dot files/directories
|
|
are also hidden by default in the NetWare attribute layer.
|
|
|
|
Smoke tests therefore must not validate backend payloads by opening
|
|
`SYS:.recycle/...` or `SYS:.salvage/...` through normal NCP file calls. The
|
|
correct NCP-level checks are:
|
|
|
|
- create/write/read the live file through NCP;
|
|
- delete the live file through NCP;
|
|
- use salvage scan `87/16` to confirm that a salvageable entry exists;
|
|
- use recover `87/17` or purge `87/18` on the scan sequence;
|
|
- read the restored live file through NCP to verify payload content.
|
|
|
|
Local filesystem layout tests may still inspect `.recycle` and `.salvage`
|
|
directly when they intentionally test backend layout and run with suitable Unix
|
|
permissions.
|
|
|
|
## Local layout smoke
|
|
|
|
`salvage_layout_smoke.sh` is a local filesystem-only contract test. It does not
|
|
require a running mars_nwe server and does not use NCP.
|
|
|
|
```sh
|
|
./tests/salvage/salvage_layout_smoke.sh
|
|
```
|
|
|
|
It verifies the basic `.recycle`/`.salvage` directory contract and stale JSON
|
|
detection.
|
|
|
|
## NCP smoke suite
|
|
|
|
`salvage_smoke_suite.sh` is the single integration entry point for the
|
|
server-side delete hook, Samba-compatible history behaviour, scan, recover,
|
|
purge, hidden repository behaviour, stale sidecar cleanup, and report-file
|
|
generation.
|
|
|
|
Example:
|
|
|
|
```sh
|
|
./tests/salvage/salvage_smoke_suite.sh \
|
|
-S MARS -U SUPERVISOR -P secret \
|
|
--path SYS:PUBLIC/SLVGCHK.TXT \
|
|
--unix-path /var/mars_nwe/SYS/public/SLVGCHK.TXT \
|
|
--volume-root /var/mars_nwe/SYS \
|
|
--out /tmp/mars-salvage-report.txt
|
|
```
|
|
|
|
The suite creates multiple versions of the same file through NCP, deletes them
|
|
through NCP, scans salvageable entries, verifies duplicate sequence entries for
|
|
the original deleted name, purges selected entries, recovers the oldest sequence,
|
|
and checks the restored payload through NCP read. Backend history paths remain
|
|
hidden behind the salvage endpoints.
|
|
|
|
The suite includes a manual stale-payload pause: it prints a `sudo rm -f`
|
|
command for the backend `.recycle` payload, then waits for Enter. Remove that
|
|
payload in a second shell and continue; the next scan should clean the stale
|
|
sidecar and the log grep should find `WARN SALVAGE 87/16 STALE`.
|
|
|
|
Best-effort pre-clean of stale test artifacts may warn when existing `.recycle`
|
|
or `.salvage` files are owned by the server user or root. Those warnings do not
|
|
fail the smoke by themselves. For cleanest results, use a fresh test filename
|
|
or run cleanup with the same Unix account that owns the mars_nwe volume files.
|
|
|
|
## Completion status
|
|
|
|
The salvage test group is complete for the current compatibility slice. The
|
|
combined suite now covers NCP write/read payloads, delete capture, versioned
|
|
history naming, `87/16` scan, `87/17` recover, `87/18` purge, old `22/27` to
|
|
`22/29` bridges, hidden backend repository behaviour, stale sidecar cleanup, and
|
|
report-file generation.
|
|
|
|
Future salvage checks should be appended to `salvage_smoke_suite.sh` rather than
|
|
creating unrelated top-level smoke scripts. New helper binaries are acceptable
|
|
when the suite starts them directly.
|