diff --git a/nwtests.c b/nwtests.c index bcb7605..49c7387 100644 --- a/nwtests.c +++ b/nwtests.c @@ -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); diff --git a/test/deploy.sh b/test/deploy.sh index 84c0304..ac57fa1 100644 --- a/test/deploy.sh +++ b/test/deploy.sh @@ -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" diff --git a/test/quota/DQTC.BAT b/test/quota/DQTC.BAT index ea0ab79..265c155 100644 --- a/test/quota/DQTC.BAT +++ b/test/quota/DQTC.BAT @@ -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 diff --git a/test/quota/DQTSTA.BAT b/test/quota/DQTSTA.BAT index b46994a..b55570b 100644 --- a/test/quota/DQTSTA.BAT +++ b/test/quota/DQTSTA.BAT @@ -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 diff --git a/test/quota/README.md b/test/quota/README.md index 2fe9809..269de66 100644 --- a/test/quota/README.md +++ b/test/quota/README.md @@ -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.