Add --mount/--davmount WebDAV auto-mount via a managed, verified rclone
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+64
-1
@@ -9,7 +9,11 @@ ok() { pass=$((pass+1)); echo "ok $1"; }
|
||||
bad() { fail=$((fail+1)); echo "FAIL $1"; }
|
||||
check() { local d=$1; shift; if "$@" >/dev/null 2>&1; then ok "$d"; else bad "$d"; fi; }
|
||||
out() { "$DOOS" attach t -- sh -c "$1" 2>&1; }
|
||||
trap '"$DOOS" delete --yes t >/dev/null 2>&1; rm -rf "$DOOS_HOME"' EXIT
|
||||
trap '
|
||||
for id in $(ls "$DOOS_HOME/davmounts" 2>/dev/null); do "$DOOS" davmount umount --yes "$id" >/dev/null 2>&1; done
|
||||
"$DOOS" delete --yes t >/dev/null 2>&1
|
||||
rm -rf "$DOOS_HOME"
|
||||
' EXIT
|
||||
|
||||
check "list empty" "$DOOS" list
|
||||
check "docs cross-linked, links resolve" "$(dirname "$0")/../scripts/check-docs.sh"
|
||||
@@ -87,6 +91,65 @@ check "mount: missing source rejected" bash -c "'$DOOS' get_or_create --mount /n
|
||||
"$DOOS" delete --yes mbad >/dev/null 2>&1
|
||||
check "mount: too many rejected" bash -c "! '$DOOS' get_or_create $(for i in 1 2 3 4 5 6 7 8 9; do printf -- '--mount %s:/m%s ' "$mntd" "$i"; done) mtoomany"
|
||||
rm -rf "$mntd"
|
||||
|
||||
# --mount/--davmount with a dav(s):// or http(s):// source: auto-installs a managed rclone and
|
||||
# mounts a real WebDAV target. The target here is a disposable local server, run with its own
|
||||
# throwaway rclone copy (not doos's managed one) so the two downloads stay independent.
|
||||
echo "--- davmount (network)"
|
||||
davd=$(mktemp -d); echo webdav-data > "$davd/f.txt"
|
||||
davport=$(python3 -c "import socket;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.bind(('127.0.0.1',0));print(s.getsockname()[1]);s.close()" 2>/dev/null)
|
||||
davtmp=$(mktemp -d)
|
||||
davok=0
|
||||
if [ -n "$davport" ] && curl -fsSL --proto '=https' https://downloads.rclone.org/v1.75.2/rclone-v1.75.2-linux-amd64.zip -o "$davtmp/rclone.zip" 2>/dev/null \
|
||||
&& unzip -q -o "$davtmp/rclone.zip" -d "$davtmp/x" 2>/dev/null; then
|
||||
davrclone="$davtmp/x/rclone-v1.75.2-linux-amd64/rclone"
|
||||
chmod +x "$davrclone" 2>/dev/null
|
||||
[ -x "$davrclone" ] && davok=1
|
||||
fi
|
||||
if [ "$davok" = 1 ]; then
|
||||
"$davrclone" serve webdav "$davd" --addr "127.0.0.1:$davport" --user davuser --pass davpass123 --log-level=ERROR >/tmp/doos-davserve.$$ 2>&1 &
|
||||
davserve=$!
|
||||
sleep 1
|
||||
|
||||
davurl="http://davuser:davpass123@127.0.0.1:$davport/"
|
||||
"$DOOS" get_or_create --mount "$davurl" /data dav1 >/dev/null
|
||||
[ "$("$DOOS" attach dav1 -- cat /data/f.txt)" = "webdav-data" ] && ok "davmount: readable inside" || bad "davmount: readable inside"
|
||||
"$DOOS" attach dav1 -- sh -c 'echo from-dav-container > /data/g.txt'
|
||||
sleep 2
|
||||
[ "$(cat "$davd/g.txt" 2>/dev/null)" = "from-dav-container" ] && ok "davmount: writes reach the webdav backend" || bad "davmount: writes reach the webdav backend"
|
||||
"$DOOS" delete --yes dav1 >/dev/null
|
||||
|
||||
"$DOOS" get_or_create --mount "$davurl" /data dav2 >/dev/null
|
||||
t0=$(date +%s%N); "$DOOS" attach dav2 -- true; t1=$(date +%s%N)
|
||||
[ $(( (t1 - t0) / 1000000 )) -lt 3000 ] && ok "davmount: reused without remounting" || bad "davmount: reused without remounting"
|
||||
"$DOOS" delete --yes dav2 >/dev/null
|
||||
|
||||
"$DOOS" get_or_create --davmount "http://127.0.0.1:$davport/" /data --dav-user davuser --dav-pass davpass123 dav3 >/dev/null
|
||||
[ "$("$DOOS" attach dav3 -- cat /data/f.txt)" = "webdav-data" ] && ok "davmount: --davmount with --dav-user/--dav-pass" || bad "davmount: --davmount with --dav-user/--dav-pass"
|
||||
"$DOOS" delete --yes dav3 >/dev/null
|
||||
|
||||
"$DOOS" get_or_create --mount "$davurl" /data:ro davro >/dev/null
|
||||
"$DOOS" attach davro -- sh -c 'echo x > /data/should-fail' 2>/dev/null && bad "davmount: ro rejects writes" || ok "davmount: ro rejects writes"
|
||||
"$DOOS" delete --yes davro >/dev/null
|
||||
|
||||
check "davmount: wrong password rejected with a clear error" bash -c "
|
||||
'$DOOS' get_or_create --mount 'http://127.0.0.1:$davport/' /data --dav-user davuser --dav-pass wrongpass davbad >/dev/null
|
||||
'$DOOS' attach davbad -- true 2>&1 | grep -q 'authentication failed'
|
||||
"
|
||||
"$DOOS" delete --yes davbad >/dev/null 2>&1
|
||||
|
||||
check "davmount: unknown vendor rejected" bash -c "! '$DOOS' get_or_create --mount 'http://127.0.0.1:$davport/' /data --dav-vendor notavendor davvendor"
|
||||
|
||||
"$DOOS" davmount list | grep -q "$davport" && ok "davmount list: shows an active target" || bad "davmount list: shows an active target"
|
||||
david=$("$DOOS" davmount list | awk -v p="$davport" '$0 ~ p {print $1}' | head -1)
|
||||
"$DOOS" davmount umount "$david" | grep -q "dry run" && ok "davmount umount: dry-run by default" || bad "davmount umount: dry-run by default"
|
||||
"$DOOS" davmount umount --yes "$david" | grep -q unmounted && ok "davmount umount: --yes removes it" || bad "davmount umount: --yes removes it"
|
||||
|
||||
kill $davserve 2>/dev/null
|
||||
else
|
||||
echo "skip: davmount tests (no network or unzip for the test webdav server)"
|
||||
fi
|
||||
rm -rf "$davd" "$davtmp" /tmp/doos-davserve.$$ 2>/dev/null
|
||||
"$DOOS" attach s -- sh -c 'apt-get update >/dev/null 2>&1; apt-get install -y --no-install-recommends cowsay >/dev/null 2>&1; dpkg --audit && /usr/games/cowsay ok >/dev/null' && ok "host mode: apt install completes" || bad "host mode: apt install completes"
|
||||
[ ! -e /usr/games/cowsay ] && ok "host untouched by apt install" || bad "host untouched by apt install"
|
||||
"$DOOS" delete --yes s >/dev/null; "$DOOS" delete --yes s1 >/dev/null
|
||||
|
||||
Reference in New Issue
Block a user