From 337ac99b3e36eaa6a280aefd268deaefbfbeacb0 Mon Sep 17 00:00:00 2001 From: Alex Southwell Date: Sat, 24 Oct 2026 12:30:08 +0000 Subject: [PATCH] Add a read-only Linux Wireless Adapter doctor (#165) * Add read-only Linux PC Wireless Adapter doctor * Cross-reference coordinated SteamOS compatibility notes --------- Co-authored-by: SAPHID --- .github/workflows/checks.yml | 4 + CHANGELOG.md | 7 + README.md | 3 + docs/img/linux-wireless-doctor.png | Bin 0 -> 82161 bytes docs/linux-wireless-adapter-doctor.md | 118 +++++++++++ tests/page/wireless_doctor.mjs | 70 +++++++ tests/test_wireless_doctor.py | 287 ++++++++++++++++++++++++++ ui/frame_wireless_doctor.py | 269 ++++++++++++++++++++++++ ui/index.html | 8 +- ui/server.py | 8 + ui/wireless-doctor.html | 85 ++++++++ 11 files changed, 858 insertions(+), 1 deletion(-) create mode 100644 docs/img/linux-wireless-doctor.png create mode 100644 docs/linux-wireless-adapter-doctor.md create mode 100644 tests/page/wireless_doctor.mjs create mode 100644 tests/test_wireless_doctor.py create mode 100644 ui/frame_wireless_doctor.py create mode 100644 ui/wireless-doctor.html diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 539b850..794639d 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -41,6 +41,10 @@ jobs: python -m py_compile $(find frame/devkit-utils -type f ! -name '*.*' ! -name LICENSE) frame/devkit-utils/devkit_utils/*.py - name: Server tests run: python -m unittest discover -s tests -v + - name: Linux Wireless Adapter doctor (read-only PC smoke) + run: | + python ui/frame_wireless_doctor.py --json > "$RUNNER_TEMP/linux-wireless-doctor.json" + python -c 'import json, os; from pathlib import Path; d=json.loads((Path(os.environ["RUNNER_TEMP"]) / "linux-wireless-doctor.json").read_text()); assert d["supported"] and d["selected"] is None and d["schema"] == 1' - name: App syntax run: node --check app/main.js && node --check app/build/make-icon.js && node --check app/build/fetch-deps.js && node --check app/preload.js && node --check app/install-link.js && node --check app/updater.js - name: App tests diff --git a/CHANGELOG.md b/CHANGELOG.md index 91ffdd8..cd1cffd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ ## Unreleased +- Add a Linux PC Wireless Adapter doctor in Settings and Devices, with a source + CLI and local JSON report. Select observed hardware without assuming Valve + IDs; inspect USB/interface presence, driver/module binding, udev/permissions, + rfkill, channel/band and network manager evidence. Missing evidence stays + unknown; all checks are read-only and never contact the Frame. + [Usage and verification limits](docs/linux-wireless-adapter-doctor.md). + - Add Linux Tools → Steam desktop sharing: request `steam -pipewire` only after checking Steam is not running, or open KDE Application Permissions with instructions to revoke a verified Steam screen-sharing session manually. No diff --git a/README.md b/README.md index 8ed1a59..ec575b1 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,9 @@ Live video of what the lenses show, or of the app panel in use, flat and still h **🔋 Battery and status**
Charge, charging watts and time left, storage, memory, temperature, Wi-Fi, and what's running. +For PC-side USB, driver, radio and network manager evidence, use the +[Linux Wireless Adapter doctor](docs/linux-wireless-adapter-doctor.md). + For repeatable read-only battery, power-rail, temperature and fan measurements, use the [power and heat sampler](docs/power-and-heat.md). diff --git a/docs/img/linux-wireless-doctor.png b/docs/img/linux-wireless-doctor.png new file mode 100644 index 0000000000000000000000000000000000000000..af5ea9f852732297dbb88ef6fe63083178fa9114 GIT binary patch literal 82161 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 literal 0 HcmV?d00001 diff --git a/docs/linux-wireless-adapter-doctor.md b/docs/linux-wireless-adapter-doctor.md new file mode 100644 index 0000000..0db807b --- /dev/null +++ b/docs/linux-wireless-adapter-doctor.md @@ -0,0 +1,118 @@ +# Linux Wireless Adapter doctor + +![Linux PC doctor before any checks run, with explicit hardware selection and read-only limits](img/linux-wireless-doctor.png) + +On the **Linux PC**, open **Settings → Linux Wireless Adapter doctor**, or +**Devices & connection → Linux Wireless Adapter doctor**. It works without a +connected headset. Choose **Read PC device inventory**, select the intended +USB device or wireless interface, then **Check selected device**. Nothing runs +until requested. Re-read the inventory after reconnecting a device. + +From a source checkout, the same collector is available without starting the +app or its headset connection workers: + +```sh +python3 ui/frame_wireless_doctor.py +python3 ui/frame_wireless_doctor.py --device net:wlan0 +python3 ui/frame_wireless_doctor.py --device usb:1-2 --json > adapter-report.json +``` + +Use a selector actually listed on your PC. No device is selected automatically. +All USB devices are included, including hubs and devices without a network +interface. A product label, observed VID/PID, or a single available interface +**does not identify Valve's adapter**. There is no trusted adapter ID table in +this feature. Compare inventory before and after reconnecting the intended +adapter when safe. For a USB device exposing multiple wireless interfaces, +select the specific interface for radio/manager evidence. + +## Evidence and limits + +- **Presence and binding:** `/sys/bus/usb/devices` and `/sys/class/net` correlate + USB ancestry, wireless interfaces, driver links and module links. An absent + interface does not establish which driver should be installed. A missing + module link may mean a built-in driver. A bound driver does not prove Steam + streaming support. +- **Permissions and udev:** `udevadm info --query=property` supplies a small + allowlist of driver, ID and tag fields. If available, the report includes USB + node mode, owner/group IDs and the current user's read/write access. Direct + USB access is not necessarily required by kernel networking; a restrictive + node alone is not diagnosed as the cause. No udev rules are installed or run. +- **Radio blocks:** read-only WLAN rfkill sysfs entries are matched to the + selected interface's PHY name. An unrelated block cannot establish that + this adapter is blocked. Unavailable or unmatched entries remain unknown. +- **Channel/band:** `iw dev IFACE info` provides the current channel and + frequency where reported; `iw phy PHY info` supplies enabled frequencies. + An idle interface may have no current channel. These observations do not + establish the channel used by a Steam streaming session, supported regions, + or the correct regulatory setting. +- **Network managers:** visible `/proc/*/comm` process names show + NetworkManager, iwd and wpa_supplicant. `nmcli` reads only the selected + interface's general state, managed flag and driver. NetworkManager can use + iwd or wpa_supplicant as its backend, so coexistence is not itself a conflict. + If both backends are visible, the report suggests checking who owns this + exact interface. It does not claim a confirmed conflict or stop services. + Restricted process visibility and unverified backend ownership are explicit. + +Every command uses fixed read-only arguments, no shell, closed stdin and a +three-second timeout. Optional tools are not installed automatically. Missing +tools, denied reads, disappearing devices, and restricted VM/container hardware +visibility remain unknown. A successful report is a snapshot, not a hardware +health certificate. CLI exit 0 means collection is supported, not that the +adapter works; unsupported platforms/headset-local mode return 2, as does an +invalid/stale selector. JSON has schema version 1. + +The doctor never uses SSH, scans nearby Wi-Fi networks, opens a connection to +the Frame, escalates privileges, loads drivers, changes security settings, +changes channels, unblocks radios, changes network settings, or restarts +services. Run it as your ordinary user, never with sudo. The app hides the +entry on macOS, Windows and phone sessions; its API refuses collection in +headset-local (`FRAME_LOCAL=1`) mode. The source CLI is intended only for the PC. + +Reports stay local unless you explicitly save, copy or share them. Exported +fields include observed USB IDs/product labels, interface names, driver names +and permission metadata. USB serials, Wi-Fi names, MAC/IP address fields, +credentials, process arguments and raw command output are not exported. Review +the report before posting it: hardware labels and local paths can identify +parts of your setup. + +## Motivation and shipped comparison + +[The 23 October 2026 complaint](https://x.com/ExpressGinga81/status/2113457683143741720) +says the Wi-Fi dongle does not work on Ubuntu/Kubuntu 26.04 while SteamVR works +under Wayland. It supplies **no adapter VID/PID, driver, logs or established +cause**. This feature helps gather that missing evidence; it does not claim to +fix that complaint or certify Ubuntu/Kubuntu 26.04 support. + +Shipped **v0.4.18** has local network/gateway discovery in `frame_network.py` +and headset connection management, but no local USB/driver/rfkill adapter +report or adapter diagnostic UI. The existing `frame-doctor.sh` diagnoses the +headset through SSH and is a different tool. This doctor never calls it. +General SteamOS 3.9.5 / Frame OS 0.5.6 compatibility and OS backend transition +notes are covered separately in +[`docs/steamos-2026-10-compat.md`](https://github.com/saphid/frame-control/blob/9c7110c1f48d160b0fb3c3b9f658d4937bd2032d/docs/steamos-2026-10-compat.md) +([PR #164](https://github.com/saphid/frame-control/pull/164)). Existing PC +route/SSID diagnostics use NetworkManager's `nmcli` with an `iwgetid` SSID +fallback, independently of whether NetworkManager uses wpa_supplicant (SteamOS +3.9.5 new installs) or iwd (upgrades). This doctor reads actual PC evidence and +does not infer a conflict, hardware identity or fix from those OS defaults. +There is no adapter-specific device observation in that compatibility work. + +## Verification + +```sh +python3 -m unittest discover -s tests -p test_wireless_doctor.py -v +python3 -m unittest discover -s tests +``` + +Tests use an explicitly synthetic USB `1234:5678`, sysfs trees, command replies +and loopback HTTP. They cover an unbound USB device, module binding, multiple +interfaces, PHY-matched and unrelated rfkill entries, channel parsing, manager +coexistence, missing/denied commands, stale/injected selectors, export field +filtering, authentication and refusal to probe in headset-local mode. The +HTTP tests instantiate the handler without starting headset workers. + +Linux host collection was exercised on kernel `6.8.0-139-generic`: an existing +PC interface was visible with its `iwlwifi` binding and unblocked PHY; `iw` and +`nmcli` were absent and reported as unavailable. This is **not a physical Steam +Frame Wireless Adapter test**, an Ubuntu/Kubuntu 26.04 test, or a headset test. +No Frame access is part of this work. diff --git a/tests/page/wireless_doctor.mjs b/tests/page/wireless_doctor.mjs new file mode 100644 index 0000000..607bdf5 --- /dev/null +++ b/tests/page/wireless_doctor.mjs @@ -0,0 +1,70 @@ +// Run the real doctor page script with a minimal DOM; no browser or hardware I/O. +import assert from 'node:assert/strict'; +import {readFileSync} from 'node:fs'; +import vm from 'node:vm'; +class Element { + constructor(tag) { this.tagName = tag.toUpperCase(); this.children = []; this.value = ''; this.hidden = false; this.disabled = false; this.textContent = ''; } + append(...nodes) { this.children.push(...nodes); } + prepend(...nodes) { this.children.unshift(...nodes); } + replaceChildren(...nodes) { this.children = nodes; } + get firstChild() { return this.children[0]; } + get options() { return this.children; } +} +const ids = ['back','inventory','diagnose','device','message','results','json','reportSection','selection','download','copy']; +const elements = Object.fromEntries(ids.map(id => [id,new Element(id === 'device' ? 'select' : 'div')])); +const requests = []; +let pending; +const context = vm.createContext({ + document:{getElementById:id=>elements[id],createElement:tag=>new Element(tag)}, + URLSearchParams,location:{search:'?key=test-key'}, + fetch:(path,options)=>{ requests.push({path,options}); return new Promise(resolve=>{pending=resolve;}); }, + navigator:{clipboard:{writeText:async()=>{throw Error('clipboard denied');}}}, +}); +const source = readFileSync(new URL('../../ui/wireless-doctor.html',import.meta.url),'utf8'); +vm.runInContext(source.match(/