Releases: moxy-kit/QManager
v0.1.23-cm.2: Fix LuCI 403 (hotfix)
Hotfix for v0.1.23-cm.1 / v0.1.21-cm.4 / v0.1.21-cm.5.
Bug
LuCI returned 403 Forbidden on /cgi-bin/luci after any cm.4+ install.
Root cause
install_frontend() chmod'd everything in /www to 644, then only restored the exec bit on files matching *.sh inside cgi-bin. LuCI's main CGI entry is /www/cgi-bin/luci — a Lua script with no extension — so it stayed 644 and uhttpd refused to execute it.
Fix
Drop the *.sh filter. Every file under cgi-bin is intended to be CGI-executed; the chmod now applies to all of them.
Affected versions
- v0.1.21-cm.4
- v0.1.21-cm.5
- v0.1.23-cm.1
Recovery for already-installed sleds (no OTA possible — LuCI isn't the install path anyway)
Either:
- Apply this update via QManager UI → System Settings → Software Update, OR
- SSH in and run:
chmod 755 /www/cgi-bin/luci(instant fix, no reboot)
v0.1.23-cm.1: Upstream sync + CellMapper
Brings the cellmapper fork in sync with upstream dr-dolomite/QManager v0.1.23.
Upstream features now available
- Tower Lock Simple Mode (LTE + NR-SA) — pick from active carriers via dropdown instead of typing EARFCN/PCI
- Verizon Custom Profile support with MPDN routing + IP Passthrough lock
- Public overview card — glanceable modem status pre-login
- 2.5 Gbps Ethernet on supported hardware
- Tailscale migrated to tailscale-tiny — smaller, survives firmware upgrades
- Force Tailscale Fixes opt-in toggle for R02 firmware (firewall zone + mwan3 ipset workarounds)
- Persistent DPI nftables rules survive fw4 reload (Video Optimizer / Traffic Masquerade no longer go silent)
- Custom SIM Profile activation lock fix (start_failed)
- Cancel/Close buttons now respect active language
Cellmapper additions
Unchanged from v0.1.21-cm.5:
- Collector + uploader + NMEA UDP relay daemons
- 13 CGI endpoints, 21 React components, Leaflet live map
- Schema migration, normalize/errors modules
- Centralized router u-blox GPS fan-out
Conflicts resolved
package.json: version → v0.1.23-cm.1, kept leaflet/react-leaflet depsmonitoring.json: tailscale install command updated to community-tiny, cellmapper section preservedscripts/install.sh: socat + sqlite3-cli critical-deps integration alongside seed_uci_defaults + migrate_tailscale_* functions
Install
Software Update tab on any v0.1.21-cm.x sled, or manual:
opkg update && opkg install /tmp/qmanager.tar.gz
v0.1.21-cm.5: CellMapper polish
Backend reliability
- NMEA timeout wrapper —
timeout 10around socat calls prevents the relay from hanging forever on dead phone connections. - Relay sentinel infinite loop — fixed 24h death cycle where the watchdog's exit conditions could never be met.
- DB race condition — added
busy_timeout=5000to all SQLite connections; collector + uploader can now race on fresh start without "database is locked" failures. - Disable toggle clean exit — collector now exits cleanly when disabled via UI (was leaving zombie process).
- Smart restart — only structural settings changes (URL, intervals) trigger daemon restart; cosmetic changes apply live.
- Firewall rule — auto-creates UDP 29998 ACCEPT rule on enable so phone NMEA reaches the sled out of the box.
- Uploader latency on all paths —
last_latency_msin state file now reflects every attempt (success and failure), not just successes.
UI fixes
- Desktop dashboard rendering — fixed black screen at 1440px+ caused by container query width inheritance + Leaflet height collapse in 3-column grid.
- Sidebar nav — removed redundant "Dashboard" sub-item (parent link goes there); active state now highlights the correct sub-route.
- Upload card — removed stub "—" rows for unimplemented metrics and the sparkline placeholder. Cleaner 3-row layout.
- GPS error context — added "Errors are cleared on collector restart" hint when error count exceeds 50, so the historical pile doesn't look like an active fire.
- Buffer actions — Export button now disables when buffer is empty (Flush/Purge already did).
- Settings labels — shortened "Interval (moving)" → "Moving interval" and "Interval (stopped)" → "Stationary interval" to fix clipping in narrow card containers.
Feature
- Motion state badges — dashboard now shows live Moving/Stationary state from the collector, so you can see the speed-based interval kick in.
📥 Installation
Fresh Install
curl -fsSL -o /tmp/qmanager-installer.sh https://raw.githubusercontent.com/dr-dolomite/QManager/development-home/qmanager-installer.sh && sh /tmp/qmanager-installer.shUpgrading from v0.1.21-cm.4
System Settings → Software Update. No migration steps required.
SHA-256: 9d93fa072fe30b077af3dcd7050e906f9920191518b5adffaf35e5dbcff5acc7 qmanager.tar.gz
v0.1.21-cm.3 — Fix AT+QENG single-line format, revert forwarding
Bug fixes:
-
RM551 adapter fails to parse single-line AT+QENG response — T-Mobile and Verizon modems return the serving cell on one line (
+QENG: "servingcell","NOCONN","LTE",...), while AT&T returns it on two separate lines. The adapter only matched the two-line format (grep '+QENG: "LTE"'). Fixed: try two-line format first, then normalize single-line by extracting from"LTE"onward. Same fix applied to neighbourcell helper. -
Reverted peer forwarding feature — Phone already sends NMEA to all three sleds directly. Removed
nmea_forward_peersUCI option, settings CGI fields, and relay forwarding code.
What changed:
scripts/usr/lib/qmanager/cellmapper/adapters/rm551.sh— dual-format parsingscripts/usr/bin/qmanager_cm_nmea_relay— reverted to base relay (no forwarding)scripts/usr/lib/qmanager/cellmapper_uci.sh— removed forward_peers defaultscripts/www/cgi-bin/quecmanager/cellmapper/settings.sh— removed forward_peers fields
v0.1.21-cm.2 — Fix sqlite3, GPS fan-out, sidebar highlight
Bug fixes:
-
sqlite3-cli missing from install — Collector and uploader crash on fresh installs with
sqlite3: not found. Added to REQUIRED_PACKAGES. -
NMEA UDP relay — multi-sled GPS fan-out — Phone's gpsdRelay sends NMEA to one sled only. Added
nmea_forward_peersUCI option: primary sled forwards raw NMEA via persistent socat pipes to peer sleds over Tailscale. Fire-and-forget — peer unreachability doesn't affect local processing. -
Dashboard submenu always highlighted — Dashboard URL was same as parent CellMapper URL, causing
startsWithactive check to match all subpages. Fixed: exact match when sub-item URL equals parent URL.
Upgrade:
sled_upgrade http://YOUR_SLED_IP
After upgrade, configure forwarding on the primary sled (AT&T):
uci set quecmanager.cellmapper.nmea_forward_peers='100.127.10.72:29998 100.115.138.16:29998'
uci commit quecmanager
/etc/init.d/qmanager_cellmapper restart
v0.1.21-cm.4 — CellMapper bugfixes
Critical fixes
- Distance calculation bug —
cm_distance_mglob pattern*''*always matched, permanently locking device in MOVING state. Bypassed all dedup, polled at 5s instead of 60s. Fixed with explicit-zguards. - Error tracking subshell —
_cm_add_errorinside pipe subshell was silently dropped. Errors now routed through flag file to parent shell. - Re-auth pipeline —
status.shwas sanitizingneeds_reauthandbackoffuploader states toidle, making re-auth banner and error badges invisible to the UI.
Medium fixes
- AT+QENG grep:
head -1safety on all 4 fallback patterns - Uploader state JSON: safe
jq -nconstruction (replaces manual printf/sed) - Sign-out button: AlertDialog confirmation
- Info strip: reads actual upload target from settings
- Buffer table: PCI column added
Polish
- Map card: lazy-loaded with
next/dynamic(SSR disabled) - TypeScript types: extended
uploader_stateunion across all components - i18n: 7 new keys for new states and dialogs
SHA-256: f78a8226bed3f222fe01788b9653579d31f9aeb8484d19dfd061820e42c79608 qmanager.tar.gz
v0.1.21-cm.1 — Rebased on upstream v0.1.21
CellMapper integration rebased onto upstream QManager v0.1.21.
What's new from upstream v0.1.21:
- Poller: per-antenna signal promoted to Tier 1 (2s interval, was 10s)
- Wake-on-LAN control (new CGI + init script)
- Indonesian + Italian language packs
- Locale stripping in firmware builds
- Signal history chart now shows 2-minute window at 2s resolution
CellMapper integration (unchanged from cm.11):
- Full collect → queue → upload pipeline
- 12 CGI endpoints, SQLite queue DB
- Dashboard with status, buffer, log, settings, map
- WAL stdout leak fix, field name mismatches fixed
- Collector writes last_measurement to state file
Note on poller change: Upstream now polls the modem every 2s instead of 10s for per-antenna signal. This increases AT command traffic on the serial port. Our collector handles contention gracefully (retry on empty response), but you may see slightly more 'empty response' warnings in logs during heavy polling periods.
v0.1.20-cm.8 — CellMapper Pipeline Fix
🐛 6 Critical Bug Fixes — CellMapper Pipeline Now Fully Operational
Fixes
grep -cdouble-output crash — BusyBox ash arithmetic syntax error fromgrep -coutputting0on exit code 1, then|| echo 0appending a second0- Adapter cache never re-sourced adapter script — cache hit restored
CM_ADAPTER_ID/CM_ADAPTER_NAMEbut never sourcedrm551.sh, leavingcm_adapter_collect_servingundefined (silent exit 127) - install.sh skipped plugin subdirectories —
install_dir_flat()only copies top-level files; addedinstall_treeforcellmapper/adapters/andcellmapper/gps/ - Settings CGI doesn't trigger procd reload —
uci commitfrom CLI/CGI does NOT emit ubusconfig.changeevent; added explicit service restart after save - Frontend GPS field mismatch —
data.fix?.satellites→data.fix?.sats
Install
cd /tmp && wget https://github.com/moxy-kit/QManager/releases/download/v0.1.20-cm.8/qmanager.tar.gz && tar xzf qmanager.tar.gz && cd qmanager_install && sh install.shv0.1.20-cm.7: NMEA UDP Relay GPS Source
Features
- Phone relay (gpsdRelay) — new built-in GPS source that receives NMEA sentences over UDP directly from a phone. No gpsd daemon, socat bridge, or router needed.
- Lightweight relay daemon:
socat(preferred) ornc(fallback) → awk NMEA parser → atomic JSON state file - Auto-managed procd instance — only runs when
nmea_udpis selected as GPS source - Configurable UDP port (default 29998, range 1024-65535)
- GPS test endpoint validates relay status and data freshness
Bug Fixes
- GPS dispatcher:
gpsd_localandgpsd_remoteUCI values are now properly handled. Previously onlygpsdwas matched, so UI-configured gpsd sources were silently broken. - i18n interpolation: 6 broken placeholder calls fixed across the UI
Upgrade
opkg install /tmp/qmanager_cm_*.ipk
# Or via QManager OTA updateSet GPS source to Phone relay (gpsdRelay), configure gpsdRelay on your Android phone to send NMEA to your sled's IP on port 29998.
v0.1.20-cm.9 — CellMapper E2E Fix
Fixes (7 bugs)
Critical
- Relay crash-loop: BusyBox nc can't do persistent UDP listen — FIFO bridge with sentinel writer pattern (nc reconnects freely, awk parser persists with GPS state). socat still preferred when available.
- Status CGI field mismatches: collector writes .state but CGI read .collector_state → always showed Stopped. Same for GPS fix (.last_gps_fix vs .gps.fix). Fixed all jq paths.
- Adapter detection: USB sysfs/lsusb fails on PCIe/SMD modems. Falls back to reading adapter info from collector state file.
- Uploader state: Now reads from uploader's own state file.
Secondary
- GPS test: Frontend read fix.sats but backend sends fix.satellites. Fixed.
- Collector: Tracks fix_type and hdop in state file. Pause flag support.
- New control.sh: Pause/resume/restart endpoint. Frontend buttons wired with loading states and toasts.
- install.sh: socat added to optional packages.