Standalone script that drops and re-establishes the router's PPPoE session
without a full reboot. Mirrors router_ui.py's RouterSession pattern: a
context manager that always logs out on exit, the CSRFToken header required
for writes since ABSB.5, and tolerant handling of the Disconnect/Connect
calls timing out with a Connect retry if the link doesn't come back up.
Confirmed working live: WAN IP and public IP (checked via api.ipify.org)
both changed after a run.
- Full-width CSS grid layout with Ping/Line/Connection cards at equal height
- Show public IP (via api.ipify.org) alongside WAN IP, with a "Get new public IP"
button that drops and re-establishes the PPPoE session
- Replace the wrong oid=zlog log endpoint with the real one the stock UI uses,
and add a logging on/off toggle (router logging was off by default)
- Poll the router in background threads with cached responses, since a live
/api/overview request took ~16s and made the page hang on "Connecting..."
- Fix: writes (DNS, logging toggle, reboot, WAN disconnect/connect) started
returning 403 after the ABSB.5 firmware upgrade; it now requires the session
key repeated in a CSRFToken header on every POST/PUT/DELETE, not just the
?sessionkey= query param GETs still accept
- Fix: Router is now a context manager that always logs out in __exit__, and
SIGTERM (what pkill sends) now triggers that cleanup too -- previously every
restart during dev leaked a session until the router hit its concurrent
login limit and locked out all further logins
- Fix: WAN Disconnect/Connect often don't return an HTTP response before the
link they're answering over drops; treat that timeout as "sent, unknown
outcome" and verify by polling instead of crashing, and retry Connect if
the router's own auto-reconnect doesn't kick in (it can get stuck at N/A)
Lets you click Undo under a user message to drop it and everything
after it, refilling the prompt with that message's text/images so it
can be edited and resent.