- 31 new managed skills (anubis/arr/authentik/hermes/freetoken/podman/llm-swap runbooks etc.) now tracked. - Removed superseded skills: omp_harness_config, peon_ping_integration (replaced by user-authored peon-ping-* managed skills), rocmfp4-strix-benchmark-orchestration. - New memory-root skills: niri_compositor_ops, omp_git_workflow, omp_model_config, quadlet-media-migration, homelab-service-triage, hermes-dankclaw-ops, frank-default-large-ops, caddy-auth-dns-playbook.
3.7 KiB
name, description
| name | description |
|---|---|
| frankbook-qbittorrent-e2e-verify | Verify the FrankBook-Pro gluetun→qBittorrent grab pipeline end-to-end (egress gate inside gluetun, generic SID login, legal test torrent, category path check, data-safe cleanup) after any tunnel/qB/category change |
FrankBook-Pro qBittorrent E2E verification
Use after any change to the FrankBook-Pro torrent pipeline — WireGuard credential rotation, qB version change, gluetun reconfig, category re-seeding. Proves the full grab path (tunnel egress → qB download → category save path → clean removal). All commands run from Dankware via ssh frankbook-pro; inside the Mac shell export PATH="/usr/local/bin:/opt/homebrew/bin:$PATH" for podman machine ssh.
1. Egress gate — MUST run inside gluetun
podman machine ssh 'podman exec gluetun wget -qO- https://ipinfo.io/json'
- Require
org= AS9009 (M247 — ProtonVPN Panama PA-12 config). Judge by org, never country alone. - NEVER run this one ssh-context out (e.g. bare
wgeton the Mac host): it silently returns the residential Comcast IP and reads as a hard-gate leak that does not exist. If a check shows a residential IP, first re-run inside the container before diagnosing.
2. Login — generic cookie parse
The QPW fetch is flaky (~1 in N returns empty); assert length before use. An empty-password run once produced a Forbidden loop that cost hours.
QPW=$(podman machine ssh 'cat /home/core/Containers/qbittorrent/env' | grep QBIT_WEBUI_PASSWORD | cut -d= -f2)
[ ${#QPW} -eq 20 ] || exit 1
SID=$(curl -si --data-urlencode "username=admin" --data-urlencode "password=$QPW" \
http://127.0.0.1:8080/api/v2/auth/login \
| grep -oE '[A-Za-z_]*SID[A-Za-z0-9_]*=[^;[:space:]]*' | head -1)
curl -b "$SID" ... # pass the WHOLE match
- qB 4.x cookie name is plain
SID; qB 5.x usesQBT_SID_<port>. Hard-coding either name breaks the other version's parse (sidlen=0 → 403 cascades). - Parse-bug 403s never reach qB as failed logins — no ban accrues. Check server-side truth in the log:
/Volumes/COMPLETE/qbittorrent-data/qBittorrent/config/qBittorrent/logs/qbittorrent.log(WebAPI login success/failure+ source IP). Repeated REAL failures accrue toward qB's 5-failures/3600s IP ban.
3. Add a legal test torrent
Blender open-movie torrents (~300 MB, e.g. Big Buck Bunny) via POST /torrents/add with the raw .torrent file (-F "file=@...") and category=Finished Torrents. Never leave a real-looking grab behind.
4. Poll and verify
Poll GET /torrents/info (~20 s): state downloading → moving (INCOMPLETE→COMPLETE move) → stalledUP/uploading at progress=1. save_path must be /Volumes/COMPLETE/Finished Torrents (qB 4.x auto-creates unknown categories at DefaultSavePath; 5.x did NOT inherit category paths — one more reason for the 4.6.7 pin). Confirm on disk: ls "/Volumes/COMPLETE/Finished Torrents/". Throughput ~17 MB/s is normal for the tunnel.
5. Cleanup — delete only your artifact
curl -s -o /dev/null -w "%{http_code}" -b "$SID" \
--data-urlencode "hashes=<literal-hash>" \
--data-urlencode "deleteFiles=true" \
http://127.0.0.1:8080/api/v2/torrents/delete # expect 200
- Target the known hash literally — the user's real grabs share the directory and MUST be untouched. Verify: hash absent from
/torrents/info, your dir gone, all other entries intact.
Version-coupling constraints
- qB is pinned to 4.6.7 (readarr's EOL client rejects qB ≥ 5's
204login at runtime). Do not unpin while readarr exists. - After ANY qB version flip, regenerate the
WebUI\Password_PBKDF2line fresh (same password, 100k iterations) — a 5.x-written hash line makes 4.6.7 reject every login. Rewrite while qB is stopped.