tests: automate DOS quota smoke handoff with current scripts

This commit is contained in:
OpenAI
2026-06-12 09:10:49 +00:00
committed by Mario Fetka
parent 94198aaf39
commit 5ea50603fe
5 changed files with 258 additions and 90 deletions

View File

@@ -65,6 +65,7 @@ static void tests_usage(void)
fprintf(stdout, " TESTS NCP2225MODID file [id] (modifier-id xattr metadata)\n");
fprintf(stdout, " TESTS NCP2225MAXSPACE dir [blocks] (directory maximum-space/quota)\n");
fprintf(stdout, " TESTS WRITE4K file [count] (write count 4K blocks; default 1)\n");
fprintf(stdout, " TESTS WAITJY (wait until J/j/Y/y is pressed)\n");
fprintf(stdout, " TESTS NCP221EINFO dir (dump NCP22/1E directory info layout)\n");
fprintf(stdout, " TESTS NCP22S4 path RF|42|0x42|ALL|NONE\n");
fprintf(stdout, " TESTS NCP22REN oldpath newpath (NCP22/2E Rename Or Move old)\n");
@@ -1263,6 +1264,29 @@ static int tests_parse_int_arg(char *s, int *value_out)
return(0);
}
static int tests_waitjy(void)
{
int ch;
fprintf(stdout, "Press J/j/Y/y after the Linux quota setup is complete...\n");
fflush(stdout);
for (;;) {
ch = getch();
if (ch == 'J' || ch == 'j' || ch == 'Y' || ch == 'y') {
fprintf(stdout, "\nContinuing after confirmation.\n");
return(0);
}
if (ch == 3 || ch == 27) {
fprintf(stdout, "\nAborted by key 0x%02x.\n", ch & 0xff);
return(1);
}
fprintf(stdout, "\nIgnoring key 0x%02x; press J/j/Y/y to continue.\n", ch & 0xff);
fflush(stdout);
}
}
static int tests_write4k(char *path, char *count_arg)
{
char buf[4096];
@@ -2741,6 +2765,10 @@ int func_tests(int argc, char *argv[], int mode)
return tests_ncp2225adate(argv[2], argv[3]);
}
if (tool_strsame(argv[1], "WAITJY")) {
return tests_waitjy();
}
if (tool_strsame(argv[1], "WRITE4K")) {
if (argc < 3)
return tests_write4k(NULL, NULL);

View File

@@ -33,5 +33,10 @@ install -m 0644 "$SRC" "$SYS/public/ndir.exe"
install -m 0644 "$SRC" "$SYS/public/tests.exe"
DLY="/home/mario/mars/mars-nwe-build/dosutils/dlystrt.exe"
if [ -f "$DLY" ]; then
install -m 0644 "$DLY" "$SYS/public/dlystrt.exe"
fi
echo "deployed selected Open Source DOS utils from: $SRC"

View File

@@ -1,61 +1,129 @@
@ECHO OFF
REM DQTC.BAT
REM Run as NOPASSUSER after Linux-side quota setup.
REM Started by DQTSTA via DLYSTRT. Runs from C:\DQTTMP.
REM It waits for the Linux quota setup, then logs in as NOPASSUSER and proves
REM that the 13th 4K write is denied.
C:
CD \DQTTMP
IF EXIST PASS.TAG DEL PASS.TAG
IF EXIST FAIL.TAG DEL FAIL.TAG
IF EXIST WRITE.LOG DEL WRITE.LOG
IF EXIST HELPER.TXT DEL HELPER.TXT
ECHO DQTC helper started from C:\DQTTMP. > C:\DQTTMP\HELPER.TXT
ECHO Waiting for Linux quota setup before logout/login. >> C:\DQTTMP\HELPER.TXT
ECHO. >> C:\DQTTMP\HELPER.TXT
ECHO DQTC wartet jetzt auf den Linux-Teil.
ECHO Linux: quota fuer NOPASSUSER auf 12x4K setzen.
ECHO Danach hier J, j, Y oder y druecken.
C:\DQTTMP\TESTS WAITJY > C:\DQTTMP\WAIT.OUT
IF ERRORLEVEL 1 GOTO ABORT
ECHO === LOGOUT from supervisor session === >> C:\DQTTMP\HELPER.TXT
C:\DQTTMP\LOGOUT > C:\DQTTMP\D01_LOGOUT.OUT
ECHO === LOGIN NOPASSUSER === >> C:\DQTTMP\HELPER.TXT
C:\DQTTMP\LOGIN NOPASSUSER > C:\DQTTMP\D02_LOGIN_USER.OUT
F:
CD \
IF EXIST DQTTEST\NCPQFILL\NUL GOTO HAVEDIR
ECHO FAIL: F:\DQTTEST\NCPQFILL missing after NOPASSUSER login. >> C:\DQTTMP\WRITE.LOG
ECHO FAIL > C:\DQTTMP\FAIL.TAG
GOTO RELSUP
:HAVEDIR
IF NOT EXIST DQTCMP\NUL MD DQTCMP
IF NOT EXIST DQTCMP\DOS\NUL MD DQTCMP\DOS
IF NOT EXIST DQTTEST\NCPQFILL\NUL MD DQTTEST\NCPQFILL
IF EXIST F:\DQTCMP\PASS.TAG DEL F:\DQTCMP\PASS.TAG
IF EXIST F:\DQTCMP\FAIL.TAG DEL F:\DQTCMP\FAIL.TAG
IF EXIST F:\DQTCMP\DOS\WRITE.LOG DEL F:\DQTCMP\DOS\WRITE.LOG
ECHO DQTC DOS quota write test as current user > F:\DQTCMP\DOS\WRITE.LOG
ECHO Writing 12 allowed 4K files. >> F:\DQTCMP\DOS\WRITE.LOG
ECHO DQTC DOS quota write test as NOPASSUSER > C:\DQTTMP\WRITE.LOG
ECHO Writing 12 allowed 4K files. >> C:\DQTTMP\WRITE.LOG
PUBLIC\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00001.BIN 1 >> F:\DQTCMP\DOS\WRITE.LOG
C:\DQTTMP\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00001.BIN 1 >> C:\DQTTMP\WRITE.LOG
IF ERRORLEVEL 1 GOTO FAILGOOD
PUBLIC\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00002.BIN 1 >> F:\DQTCMP\DOS\WRITE.LOG
C:\DQTTMP\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00002.BIN 1 >> C:\DQTTMP\WRITE.LOG
IF ERRORLEVEL 1 GOTO FAILGOOD
PUBLIC\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00003.BIN 1 >> F:\DQTCMP\DOS\WRITE.LOG
C:\DQTTMP\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00003.BIN 1 >> C:\DQTTMP\WRITE.LOG
IF ERRORLEVEL 1 GOTO FAILGOOD
PUBLIC\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00004.BIN 1 >> F:\DQTCMP\DOS\WRITE.LOG
C:\DQTTMP\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00004.BIN 1 >> C:\DQTTMP\WRITE.LOG
IF ERRORLEVEL 1 GOTO FAILGOOD
PUBLIC\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00005.BIN 1 >> F:\DQTCMP\DOS\WRITE.LOG
C:\DQTTMP\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00005.BIN 1 >> C:\DQTTMP\WRITE.LOG
IF ERRORLEVEL 1 GOTO FAILGOOD
PUBLIC\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00006.BIN 1 >> F:\DQTCMP\DOS\WRITE.LOG
C:\DQTTMP\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00006.BIN 1 >> C:\DQTTMP\WRITE.LOG
IF ERRORLEVEL 1 GOTO FAILGOOD
PUBLIC\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00007.BIN 1 >> F:\DQTCMP\DOS\WRITE.LOG
C:\DQTTMP\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00007.BIN 1 >> C:\DQTTMP\WRITE.LOG
IF ERRORLEVEL 1 GOTO FAILGOOD
PUBLIC\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00008.BIN 1 >> F:\DQTCMP\DOS\WRITE.LOG
C:\DQTTMP\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00008.BIN 1 >> C:\DQTTMP\WRITE.LOG
IF ERRORLEVEL 1 GOTO FAILGOOD
PUBLIC\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00009.BIN 1 >> F:\DQTCMP\DOS\WRITE.LOG
C:\DQTTMP\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00009.BIN 1 >> C:\DQTTMP\WRITE.LOG
IF ERRORLEVEL 1 GOTO FAILGOOD
PUBLIC\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00010.BIN 1 >> F:\DQTCMP\DOS\WRITE.LOG
C:\DQTTMP\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00010.BIN 1 >> C:\DQTTMP\WRITE.LOG
IF ERRORLEVEL 1 GOTO FAILGOOD
PUBLIC\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00011.BIN 1 >> F:\DQTCMP\DOS\WRITE.LOG
C:\DQTTMP\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00011.BIN 1 >> C:\DQTTMP\WRITE.LOG
IF ERRORLEVEL 1 GOTO FAILGOOD
PUBLIC\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00012.BIN 1 >> F:\DQTCMP\DOS\WRITE.LOG
C:\DQTTMP\TESTS WRITE4K F:\DQTTEST\NCPQFILL\Q00012.BIN 1 >> C:\DQTTMP\WRITE.LOG
IF ERRORLEVEL 1 GOTO FAILGOOD
ECHO Attempting expected failing 13th 4K file. >> F:\DQTCMP\DOS\WRITE.LOG
PUBLIC\TESTS WRITE4K F:\DQTTEST\NCPQFILL\QFAIL.BIN 1 >> F:\DQTCMP\DOS\WRITE.LOG
ECHO Attempting expected failing 13th 4K file. >> C:\DQTTMP\WRITE.LOG
C:\DQTTMP\TESTS WRITE4K F:\DQTTEST\NCPQFILL\QFAIL.BIN 1 >> C:\DQTTMP\WRITE.LOG
IF ERRORLEVEL 1 GOTO PASS
ECHO FAIL: expected QFAIL.BIN to be denied, but it succeeded. >> F:\DQTCMP\DOS\WRITE.LOG
ECHO FAIL > F:\DQTCMP\FAIL.TAG
GOTO END
ECHO FAIL: expected QFAIL.BIN to be denied, but it succeeded. >> C:\DQTTMP\WRITE.LOG
ECHO FAIL > C:\DQTTMP\FAIL.TAG
IF EXIST F:\DQTCMP\NUL ECHO FAIL > F:\DQTCMP\FAIL.TAG
GOTO RELSUP
:FAILGOOD
ECHO FAIL: an allowed 4K write failed before the quota boundary. >> F:\DQTCMP\DOS\WRITE.LOG
ECHO FAIL > F:\DQTCMP\FAIL.TAG
GOTO END
ECHO FAIL: an allowed 4K write failed before the quota boundary. >> C:\DQTTMP\WRITE.LOG
ECHO FAIL > C:\DQTTMP\FAIL.TAG
IF EXIST F:\DQTCMP\NUL ECHO FAIL > F:\DQTCMP\FAIL.TAG
GOTO RELSUP
:PASS
ECHO PASS: 13th 4K file was denied. >> F:\DQTCMP\DOS\WRITE.LOG
ECHO PASS > F:\DQTCMP\PASS.TAG
ECHO PASS: 13th 4K file was denied. >> C:\DQTTMP\WRITE.LOG
ECHO PASS > C:\DQTTMP\PASS.TAG
IF EXIST F:\DQTCMP\NUL ECHO PASS > F:\DQTCMP\PASS.TAG
GOTO RELSUP
:ABORT
ECHO FAIL: user aborted before Linux quota setup confirmation. > C:\DQTTMP\WRITE.LOG
ECHO FAIL > C:\DQTTMP\FAIL.TAG
GOTO END
:RELSUP
TYPE C:\DQTTMP\WRITE.LOG
IF "%LGNTPWD%"=="" GOTO MANUAL
ECHO === LOGOUT NOPASSUSER === >> C:\DQTTMP\HELPER.TXT
C:\DQTTMP\LOGOUT > C:\DQTTMP\D03_LOGOUT_USER.OUT
ECHO === LOGIN SUPERVISOR === >> C:\DQTTMP\HELPER.TXT
C:\DQTTMP\LOGIN SUPERVISOR /PWD:%LGNTPWD% > C:\DQTTMP\D04_LOGIN_SUP.OUT
F:
CD \
IF EXIST DQTSTA.BAT GOTO QUEUEP2
ECHO F:\DQTSTA.BAT missing after supervisor relogin. >> C:\DQTTMP\HELPER.TXT
ECHO Bitte manuell als SUPERVISOR einloggen und F:\DQTSTA PART2 starten.
GOTO END
:QUEUEP2
C:
CD \DQTTMP
DLYSTRT /T:2 F:\DQTSTA.BAT PART2 > C:\DQTTMP\D05_P2.OUT
ECHO DQTC queued F:\DQTSTA.BAT PART2. >> C:\DQTTMP\HELPER.TXT
ECHO DQTC fertig. PART2 wird per DLYSTRT gestartet.
GOTO END
:MANUAL
ECHO LGNTPWD not set; automatic SUPERVISOR relogin skipped. >> C:\DQTTMP\HELPER.TXT
ECHO Bitte manuell als SUPERVISOR einloggen und dann ausfuehren:
ECHO F:
ECHO DQTSTA PART2
GOTO END
:END
TYPE F:\DQTCMP\DOS\WRITE.LOG

View File

@@ -1,22 +1,25 @@
@ECHO OFF
REM DQTSTA.BAT
REM DOS-side quota write-deny smoke for MARS-NWE.
REM Automated DOS-side quota write-deny smoke for MARS-NWE.
REM
REM This is intentionally a mixed Linux/DOS test:
REM 1. Run DQTSTA PREP as SUPERVISOR from the target volume.
REM 2. On Linux set the volume userquota for NOPASSUSER.
REM 3. Login as NOPASSUSER and run DQTC.BAT from this directory.
REM 4. Login as SUPERVISOR and run DQTSTA PART2, then DQTZIP.
REM Run as SUPERVISOR from the target volume:
REM SET LGNTPWD=your-supervisor-password
REM F:
REM DQTSTA
REM
REM DQTSTA prepares F:\\DQTTEST/F:\\DQTCMP, copies DQTC.BAT plus the
REM maintainer helpers to C:\\DQTTMP, and uses DLYSTRT so the helper keeps
REM running after LOGOUT/LOGIN. DQTC waits for J/j/Y/y while the Linux side
REM sets the quota.
IF "%1"=="" GOTO PREP
IF "%1"=="PREP" GOTO PREP
IF "%1"=="prep" GOTO PREP
IF "%1"=="" GOTO PART1
IF "%1"=="PREP" GOTO PART1
IF "%1"=="prep" GOTO PART1
IF "%1"=="PART2" GOTO PART2
IF "%1"=="part2" GOTO PART2
ECHO Usage: DQTSTA [PREP^|PART2]
GOTO END
GOTO USAGE
:PREP
:PART1
F:
CD \
@@ -35,10 +38,14 @@ IF EXIST F:\DQTCMP\PASS.TAG DEL F:\DQTCMP\PASS.TAG
IF EXIST F:\DQTCMP\DQTSTA.ZIP DEL F:\DQTCMP\DQTSTA.ZIP
IF EXIST F:\DQTCMP\ZIP.LOG DEL F:\DQTCMP\ZIP.LOG
IF EXIST F:\DQTCMP\DOS\*.OUT DEL F:\DQTCMP\DOS\*.OUT
IF EXIST F:\DQTCMP\DOS\*.LOG DEL F:\DQTCMP\DOS\*.LOG
IF EXIST F:\DQTCMP\DOS\*.TXT DEL F:\DQTCMP\DOS\*.TXT
IF EXIST F:\DQTCMP\DOS\*.TAG DEL F:\DQTCMP\DOS\*.TAG
ECHO DQTSTA DOS quota write-deny smoke > F:\DQTCMP\RUN.LOG
ECHO Volume-side setup is done from DOS. Quota limit is set from Linux. >> F:\DQTCMP\RUN.LOG
ECHO Expected Linux setup: userquota for NOPASSUSER allows 12x4K, then DOS write 13th file fails. >> F:\DQTCMP\RUN.LOG
ECHO Part 1 started while logged in as SUPERVISOR. >> F:\DQTCMP\RUN.LOG
ECHO Linux must set NOPASSUSER quota while DQTC waits for J/j/Y/y. >> F:\DQTCMP\RUN.LOG
ECHO Expected: 12x4K writes succeed, 13th 4K write is denied. >> F:\DQTCMP\RUN.LOG
ECHO. >> F:\DQTCMP\RUN.LOG
REM Give the normal user enough rights to create files and write result logs.
@@ -54,29 +61,74 @@ NPUBLIC\GRANT R W C E M F A FOR F:\DQTCMP TO USER NOPASSUSER > F:\DQTCMP\SETUP\G
NPUBLIC\RIGHTS F:\DQTTEST\NCPQFILL > F:\DQTCMP\SETUP\RIGHTS.OUT
ECHO === NEXT LINUX STEP === > F:\DQTCMP\LINUX.TXT
ECHO Set volume userquota for NOPASSUSER to 12x4K on this volume. >> F:\DQTCMP\LINUX.TXT
ECHO Then login as NOPASSUSER and run: >> F:\DQTCMP\LINUX.TXT
ECHO F:\DQTC.BAT >> F:\DQTCMP\LINUX.TXT
ECHO Then login as SUPERVISOR and run: >> F:\DQTCMP\LINUX.TXT
ECHO F:\DQTSTA.BAT PART2 >> F:\DQTCMP\LINUX.TXT
ECHO When DQTC waits, set volume userquota for NOPASSUSER to 12x4K on this volume. >> F:\DQTCMP\LINUX.TXT
ECHO Then return to DOS and press J, j, Y, or y. >> F:\DQTCMP\LINUX.TXT
ECHO DQTSTA PREP finished. >> F:\DQTCMP\RUN.LOG
IF EXIST C:\DQTTMP\NUL DELTREE /Y C:\DQTTMP\*.*
IF NOT EXIST C:\DQTTMP\NUL MD C:\DQTTMP
ECHO Copying delayed helper and local tools to C:\DQTTMP. >> F:\DQTCMP\RUN.LOG
COPY F:\DQTC.BAT C:\DQTTMP > F:\DQTCMP\SETUP\CP_DQTC.OUT
COPY F:\PUBLIC\TESTS.EXE C:\DQTTMP > F:\DQTCMP\SETUP\CP_TESTS.OUT
COPY F:\PUBLIC\DLYSTRT.EXE C:\DQTTMP > F:\DQTCMP\SETUP\CP_DLY.OUT
COPY F:\NLOGIN\LOGIN.* C:\DQTTMP > F:\DQTCMP\SETUP\CP_LOGIN.OUT
COPY F:\NPUBLIC\LOGOUT.* C:\DQTTMP > F:\DQTCMP\SETUP\CP_LOGOUT.OUT
IF EXIST C:\DQTTMP\DQTC.BAT GOTO HVDQTC
ECHO ERROR: C:\DQTTMP\DQTC.BAT not copied. >> F:\DQTCMP\RUN.LOG
ECHO ERROR: C:\DQTTMP\DQTC.BAT not copied.
GOTO END
:HVDQTC
IF EXIST C:\DQTTMP\TESTS.EXE GOTO HVTESTS
ECHO ERROR: C:\DQTTMP\TESTS.EXE not copied. >> F:\DQTCMP\RUN.LOG
ECHO ERROR: C:\DQTTMP\TESTS.EXE not copied.
GOTO END
:HVTESTS
IF EXIST C:\DQTTMP\DLYSTRT.EXE GOTO HVDLY
ECHO ERROR: C:\DQTTMP\DLYSTRT.EXE not copied. >> F:\DQTCMP\RUN.LOG
ECHO ERROR: C:\DQTTMP\DLYSTRT.EXE not copied. Build/install dostools with MAINTAINER_BUILD=ON.
GOTO END
:HVDLY
IF EXIST C:\DQTTMP\LOGIN.EXE GOTO HVLOGIN
ECHO ERROR: C:\DQTTMP\LOGIN.EXE not copied. >> F:\DQTCMP\RUN.LOG
ECHO ERROR: C:\DQTTMP\LOGIN.EXE not copied.
GOTO END
:HVLOGIN
IF EXIST C:\DQTTMP\LOGOUT.EXE GOTO HVLOGOUT
ECHO ERROR: C:\DQTTMP\LOGOUT.EXE not copied. >> F:\DQTCMP\RUN.LOG
ECHO ERROR: C:\DQTTMP\LOGOUT.EXE not copied.
GOTO END
:HVLOGOUT
C:
CD \DQTTMP
DLYSTRT /T:2 DQTC.BAT >> F:\DQTCMP\RUN.LOG
ECHO DQTC queued via DLYSTRT from C:\DQTTMP. >> F:\DQTCMP\RUN.LOG
ECHO.
ECHO DQTSTA PREP fertig.
ECHO Jetzt Linux quota fuer NOPASSUSER setzen, dann als NOPASSUSER F:\DQTC.BAT starten.
ECHO DQTSTA Part 1 fertig.
ECHO DQTC startet gleich von C:\DQTTMP und wartet dann auf den Linux-Quota-Teil.
ECHO Wenn DQTC wartet: Linux quota setzen und dann im DOS J druecken.
GOTO END
:PART2
F:
CD \
IF NOT EXIST DQTCMP\NUL MD DQTCMP
IF NOT EXIST DQTCMP\DOS\NUL MD DQTCMP\DOS
ECHO DQTSTA PART2 collecting C:\DQTTMP files. >> F:\DQTCMP\RUN.LOG
IF EXIST C:\DQTTMP\*.OUT COPY C:\DQTTMP\*.OUT F:\DQTCMP\DOS >> F:\DQTCMP\RUN.LOG
IF EXIST C:\DQTTMP\*.LOG COPY C:\DQTTMP\*.LOG F:\DQTCMP\DOS >> F:\DQTCMP\RUN.LOG
IF EXIST C:\DQTTMP\*.TXT COPY C:\DQTTMP\*.TXT F:\DQTCMP\DOS >> F:\DQTCMP\RUN.LOG
IF EXIST C:\DQTTMP\*.TAG COPY C:\DQTTMP\*.TAG F:\DQTCMP\DOS >> F:\DQTCMP\RUN.LOG
ECHO DQTSTA PART2 summary > F:\DQTCMP\SUMMARY.TXT
IF EXIST F:\DQTCMP\PASS.TAG ECHO PASS: DOS quota deny observed. >> F:\DQTCMP\SUMMARY.TXT
IF EXIST F:\DQTCMP\FAIL.TAG ECHO FAIL: DOS quota deny was not observed. >> F:\DQTCMP\SUMMARY.TXT
IF NOT EXIST F:\DQTCMP\PASS.TAG IF NOT EXIST F:\DQTCMP\FAIL.TAG ECHO UNKNOWN: DQTC.BAT result tags missing. >> F:\DQTCMP\SUMMARY.TXT
IF EXIST C:\DQTTMP\PASS.TAG ECHO PASS: DOS quota deny observed. >> F:\DQTCMP\SUMMARY.TXT
IF EXIST C:\DQTTMP\FAIL.TAG ECHO FAIL: DOS quota deny was not observed. >> F:\DQTCMP\SUMMARY.TXT
IF NOT EXIST C:\DQTTMP\PASS.TAG IF NOT EXIST C:\DQTTMP\FAIL.TAG ECHO UNKNOWN: DQTC.BAT result tags missing. >> F:\DQTCMP\SUMMARY.TXT
ECHO. >> F:\DQTCMP\SUMMARY.TXT
ECHO DOS log files are in F:\DQTCMP\DOS. >> F:\DQTCMP\SUMMARY.TXT
ECHO DOS log files copied from C:\DQTTMP to F:\DQTCMP\DOS. >> F:\DQTCMP\SUMMARY.TXT
ECHO Linux/nw.log evidence should be collected with the matching mars-nwe smoke wrapper. >> F:\DQTCMP\SUMMARY.TXT
ECHO.
@@ -84,4 +136,10 @@ TYPE F:\DQTCMP\SUMMARY.TXT
ECHO Optional: run DQTZIP.
GOTO END
:USAGE
ECHO Usage: DQTSTA [PREP^|PART2]
ECHO Ohne Parameter startet DQTSTA Part 1 und queued C:\DQTTMP\DQTC.BAT via DLYSTRT.
ECHO DQTC wartet auf J/j/Y/y, damit der Linux-Quota-Schritt dazwischen laufen kann.
GOTO END
:END

View File

@@ -1,55 +1,64 @@
# DOS quota write-deny smoke
This test proves the last step of NetWare-style quota enforcement with DOS
board tools: Linux/NCPFS sets the user quota, then a real DOS client logs in as
`NOPASSUSER` and attempts the file writes.
This test proves the client-visible quota boundary with DOS board tools while
keeping the authority split explicit:
It is intentionally split because the authoritative quota setup remains on the
Linux/MARS-NWE side:
- Linux/MARS-NWE sets the quota on the host side.
- DOS writes as `NOPASSUSER` and proves that 12 4K blocks are allowed while the
13th 4K block is denied.
1. In DOS, login as `SUPERVISOR` on the target volume and run:
The flow uses the same `DLYSTRT` pattern as the rights/login tests, because
`LOGOUT` removes network mappings. `DQTSTA` copies `DQTC.BAT`, `DLYSTRT.EXE`,
`TESTS.EXE`, `LOGIN`, and `LOGOUT` to `C:\DQTTMP`, then queues the helper from
there. The helper waits for `J/j/Y/y` before it logs out and logs in as
`NOPASSUSER`, so the Linux quota setup can happen in between.
```bat
F:
DQTSTA PREP
```
## DOS part 1
This creates `F:\DQTTEST\NCPQFILL`, grants `NOPASSUSER` write/create rights,
and creates `F:\DQTCMP` for logs.
Login as `SUPERVISOR` on the target volume and run:
2. On Linux, set the user quota for `NOPASSUSER` to 12 4K blocks on the same
volume. With the mars-nwe ncpfs helper this is typically:
```bat
SET LGNTPWD=zefuqUVe
F:
DQTSTA
```
```sh
./nwfs_ncpfs_userquota -S MARS -U SUPERVISOR -P 'password' \
--volume QUOTA --object NOPASSUSER --type 1 --limit-4k 12
```
`DQTSTA` creates:
For SYS/NWQUOTA metadata-backend testing, use `--volume SYS` instead.
- `F:\DQTTEST\NCPQFILL` for the data files
- `F:\DQTCMP` for network-side logs
- `C:\DQTTMP` for the delayed helper and local logs
3. In DOS, login as `NOPASSUSER` and run:
## Linux handoff
```bat
F:\DQTC.BAT
```
When DOS prints that `DQTC` is waiting, set the quota on Linux, for example:
`DQTC` writes `Q00001.BIN` through `Q00012.BIN` as 4K files, then expects
`QFAIL.BIN` to be denied.
```sh
./nwfs_ncpfs_userquota -S MARS -U SUPERVISOR -P 'zefuqUVe' \
--volume QUOTA --object NOPASSUSER --type 1 --limit-4k 12
```
4. In DOS, login as `SUPERVISOR` and run:
Then return to DOS and press `J`, `j`, `Y`, or `y`.
```bat
F:\DQTSTA PART2
F:\DQTZIP
```
## DOS part 2
Expected result:
The helper logs in as `NOPASSUSER`, writes `Q00001.BIN` through `Q00012.BIN`,
and expects `QFAIL.BIN` to fail. If `LGNTPWD` is set, it logs back in as
`SUPERVISOR` and queues:
```bat
F:\DQTSTA.BAT PART2
```
Finally, optionally pack the logs:
```bat
F:
DQTZIP
```
Expected summary:
```text
PASS: DOS quota deny observed.
```
The test does not set quotas itself. That keeps the authority split explicit:
Linuxquota volumes are configured/enforced by the Linux backend, while NWQUOTA
metadata volumes use the MARS-NWE metadata backend. The DOS part proves the
client-visible write behavior.