Skip to content

v2.7.3 Release Changes - #1175

Merged
tvancott42 merged 20 commits into
mainfrom
dev
Aug 25, 2026
Merged

v2.7.3 Release Changes#1175
tvancott42 merged 20 commits into
mainfrom
dev

Conversation

@tvancott42

@tvancott42 tvancott42 commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • GL.iNet cellular: reach PCIe/MHI modems and fix empty-bus discovery (GL.iNet cellular: PCIe/MHI modem support and empty-bus fix #1172)
  • Dashboard: add [+] card to enter edit mode, scroll to bottom on click, hover-only tooltip
  • Firmware Rollout: add Mem column to Rollout Report device table, check console cycling window for active rollout suppression
  • Device Stats: fix collapsed event tooltip redundancy, show readings with degree symbol and shared constants
  • AlertReading: fix regex for % formatting (\b fails after % since it's non-word)
  • WAN monitoring: warn when a non-primary WAN vantage has no probe binding (Warn when a non-primary WAN vantage has no probe binding #1174)
  • WAN outage evaluator: restore comments, add OS cycling integration tests
  • Firmware Rollout autopilot: stamp site timezone on plan documents
  • Pipeline: push :preview tag on every tag, not just prereleases
  • Security: bump System.Security.Cryptography.Xml to 10.0.11 in test projects
  • PWA: fix resume getting stuck on reconnect spinner forever on iOS/Android; retry server probe with backoff
  • Reboot tracking: skip SSH probe on Flex and Ultra switches (no SSH daemon) (preview / infrequent ssh connection issues when polling Unifi devices #1178)

tvancott42 and others added 17 commits August 24, 2026 21:48
…1172)

The X3000/XE3000 with an RM520N-GL have the modem on PCIe, not USB.
gl_modem can't reach it; AT commands go to /dev/mhi_DUN directly.

- Detect /dev/mhi_DUN in discovery when ubus returns no bus
- Add MHI execution path: echo/read AT commands to the device node
- Fix empty-bus bug: ubus returning bus="" was treated as a valid bus,
  pinning Sub=1 and skipping the auto-detect fallback
- Break the MHI read loop on +CME ERROR / +CMS ERROR (Quectel default)
The manual path copied inputs.Context.TimeZoneId onto the plan document
but autopilot never did, so the 12-hour reminder and plan page showed
only server time for remote sites.
Dashed-border placeholder card at the end of the grid (site-admin
only) that enters layout edit mode on click.
The [+] placeholder scrolls the edit-bottom anchor into view so the
user stays at the bottom as the edit toolbars inflate the content
above. Duplicates Done and Cancel at the grid bottom for convenience.
The PDF report already included per-device memory (before/after), but the
web UI table only showed CPU. Add a matching Mem column, hidden on mobile.
The folded tooltip repeated the device name in both the title and
subtitle lines. Shorten monitoring.target_offline/recovered titles to
"Device offline" / "Device back online" so the subtitle (device name)
adds information. Send a firmware field on reboot events so the
collapsed view can show it alongside the device name.
Folded tooltip showed the device name in both the title and subtitle.
Shorten monitoring.target_offline/recovered to "Device offline" /
"Device back online" so the subtitle adds information. Send firmware
version (short) on reboot events and extract metric readings (temp,
CPU, mem) from health alerts so the collapsed subtitle shows them
alongside the device name.
Use negative lookahead (?!\w) instead, which correctly prevents
matching C inside "CPU" while allowing % followed by a space.
Use (?!\w) instead of \b so % (non-word char) matches correctly.
Drop the space before % in the output (70.4% not 70.4 %).
Extract health alert event type strings as constants on
DeviceHealthAlertEvaluator so both sides reference the same values.
Add architecture tests that fail if a new health alert type is added
without a corresponding AlertReading extractor or AlertLabel entry.

Use °C in temperature alert messages going forward (device, SFP, ONT).
The regex matches both old (C) and new (°C) formats, always outputting
°C in the tooltip.
* Warn when a non-primary WAN vantage has no probe binding

A vantage with neither a gateway agent nor a source-IP binding probes
its targets via the server's default route, so the readings reflect
the primary WAN's path. Show an alert-warning banner in three places:

- ISP Health panel, above the report (scores are based on wrong data)
- ISP Health panel, above status banners when no report yet
- Network Performance chart card, above the latency charts

The advisory fires only when: a single non-primary WAN is selected,
a WanContext exists for it, and every context for that WAN has both
AgentId and ProbeSourceIp null. It does not fire for: the primary WAN,
agent-bound vantages, source-IP vantages, no-vantage-at-all (handled
by NeedsContextFirst), single-WAN sites, or LAN/All/comparison scope.

Refs #936

* Capitalize Vantage and Gateway Agent in banner copy

UI feature names are proper nouns in user-facing text.

* Revise Vantage binding advisory copy

User-approved verbiage: concise, accurate for both failover and
load-balance topologies, proper-noun Agent.

* Normalize all WAN keys through WanInterfaceKeyFromKey in ISP Health panel

The Fable review caught that _wansWithProbeBinding used normalized keys
while _wansWithContext and option keys used raw ToLowerInvariant. A
legacy "wan1" row would be in one set as "wan1" and the other as "wan",
causing a false positive. Normalize all three consistently.
iOS/Android suspend setInterval while a tab is backgrounded, so the
stuck-spinner timer that probes /api/health never fires after resume.
The resume handler deferred entirely to that timer when the reconnect
modal was showing, leaving the page frozen behind the spinner with no
recovery path.

Now the resume handler probes the server itself when the modal is up.
If the server answers, the circuit is wedged and a reload is the right
call. Same fix inside the probe loop: if Blazor surfaces the modal
mid-probe, check the server instead of blindly deferring. And the
final fallback (no circuit, no modal after 12s) now probes before
reloading so we don't strand on a blank page during a real outage.
A single 2s health probe is unreliable at mobile resume - the network
stack takes a few seconds to re-attach after Wi-Fi rejoin or cellular
radio wake. A miss recreated the stuck-forever state. Give the modal
branch the same 12s retry loop the no-modal path already has.
Flex (except Flex XG) and Ultra switches have no SSH daemon, so the
reboot-reason probe fails on every attempt and retries hourly forever.
Pass the device model through to the tracker and skip the probe when
UniFiProductDatabase.HasSsh returns false.
@tvancott42
tvancott42 merged commit 506538a into main Aug 25, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant