Fix VLAN writes, recalibrate signal zones, and two UI reports
Five reports from @Orhideous, all filed today.
VLAN assignment (#151)
Two defects, both confirmed by reading the write path.
failure: can not change dynamic. RouterOS keeps static and dynamic rows in
/interface/bridge/vlan. Dynamic ones are the bridge's own bookkeeping -- most
often for whatever VLAN a PVID names when no static row exists, which is why
VLAN 1 hits it -- and they cannot be modified. setPortVlanConfig found a row
and set it with no regard for which kind it was. The fix is what RouterOS
expects: add a static row, which supersedes the dynamic one.
A quieter bug sat beside it. Where no row existed at all the code did
nothing and reported success, so assigning a port to a VLAN the bridge had
never heard of silently achieved nothing.
frame-types and ingress-filtering were never written. They appeared only in
a list of attributes preserved when a port is re-created, and in Config
Health reads. So changing a port between access and trunk moved the PVID and
left frame admission untouched: a trunk still admitted untagged frames, an
access port still admitted tagged ones. The port type was half decorative.
The mode is now sent explicitly rather than inferred, and is optional -- an
existing API caller that omits it gets the old behaviour.
That last part needed the lockout predictor to catch up, and it had a real
gap: no invariant read frame-types, they were only mentioned in prose. So
the most direct way to strand a device was invisible to prediction --
admit-only-vlan-tagged on the port carrying untagged management drops those
frames at ingress while every VLAN row still lists the port and every other
invariant stays satisfied. New invariant, plus a test that the same change
without a mode is still allowed.
Verified on an empty cage: a VLAN with no row got a static row added, and
frame-types moved from admit-all to admit-only-vlan-tagged. Reverted after.
His suggestion of checkboxes instead of a comma-separated VLAN field is a
fair one and is not in this change.
Signal thresholds (#154)
He is right, and the app already agreed with him somewhere else: RadiosTab
coloured signals at -55/-70/-85 while RSSI_ZONES said -60/-70/-80, so the
same client read differently on two pages. Zones are now -70/-55/-45 and
both call sites share them.
Noted in the comment: dedicated point-to-point radios run happily near -80
and will read Poor, which is the cost of one scale for two different jobs.
All sites selector (#153)
Choosing "All sites" also navigated to /sites, conflating "show me every
site's data" with "take me to the sites page" and moving people off whatever
page they were on. The redirect existed because /sites had no other route;
it has had a sidebar entry since #148. Removed.
Firmware table (#152)
Used its own header styling and hand-rolled zebra striping instead of the
shared table classes, so it looked subtly different from /devices. Now
shares both, and shows device tags as he asked.
Full preflight green.
Container image: ghcr.io/2gt-media-group-llc/mikrotik-manager:0.24.20-beta
Documentation: https://2gt-media-group-llc.github.io/mikrotik-manager/