From 55d4beb9d4ab42e934dcbfe7e66f3eb6329ea63f Mon Sep 17 00:00:00 2001 From: c4ch3c4d3 Date: Sat, 22 Aug 2026 18:59:57 -0600 Subject: [PATCH] fix(reliability): probe section existence via uci show, not an option key --- payload/user/remote_access/pager-webui/mk8_guard.py | 7 ++++--- payload/user/remote_access/pager-webui/server.py | 10 +++++++--- tests/test_mk8_guard.py | 3 +-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/payload/user/remote_access/pager-webui/mk8_guard.py b/payload/user/remote_access/pager-webui/mk8_guard.py index 9a564b7..d2eeef4 100644 --- a/payload/user/remote_access/pager-webui/mk8_guard.py +++ b/payload/user/remote_access/pager-webui/mk8_guard.py @@ -34,9 +34,10 @@ def _pool_size(): def _ensure_pineapd_section(): """Stock daemon rewrites and profile restores can drop the whole `config pineapd` section; every @pineapd[0] option write fails with - 'Invalid argument' until it exists again.""" - rc, out, err = device_run(['uci', '-q', 'get', - 'pineapd.@pineapd[0].logrecon']) + 'Invalid argument' until it exists again. Probes SECTION existence + (`uci -q show @pineapd[0]`) — never an option, which may legitimately + be absent from a rewritten section.""" + rc, out, err = device_run(['uci', '-q', 'show', 'pineapd.@pineapd[0]']) if rc == 0: return False device_run(['uci', 'add', 'pineapd', 'pineapd']) diff --git a/payload/user/remote_access/pager-webui/server.py b/payload/user/remote_access/pager-webui/server.py index 0caefa2..ebce502 100644 --- a/payload/user/remote_access/pager-webui/server.py +++ b/payload/user/remote_access/pager-webui/server.py @@ -4643,13 +4643,17 @@ PINEAPD_RUNTIME_UCI.add('pineapd.@ssidpool[0].disable') def _apply_uci_wanted(wanted): - """Idempotently apply a wanted UCI key/value set. Returns changed keys.""" + """Idempotently apply a wanted UCI key/value set. Returns changed keys. + A failed `uci set` (e.g. missing anchor section) is NOT reported as + applied.""" actions = [] for key, value in wanted.items(): rc, out, err = device_run(['uci', 'get', key]) if rc != 0 or out.strip() != value: - device_run(['uci', 'set', '%s=%s' % (key, value)]) - actions.append(key) + src_rc, s_out, s_err = device_run( + ['uci', 'set', '%s=%s' % (key, value)]) + if src_rc == 0: + actions.append(key) return actions diff --git a/tests/test_mk8_guard.py b/tests/test_mk8_guard.py index 55d254f..4de553b 100644 --- a/tests/test_mk8_guard.py +++ b/tests/test_mk8_guard.py @@ -109,8 +109,7 @@ class SectionRecreateTest(unittest.TestCase): def fake_run(args, timeout=20, input_data=None): a = list(args) self.calls.append(a) - if a[:4] == ['uci', '-q', 'get', - 'pineapd.@pineapd[0].logrecon']: + if a[:3] == ['uci', '-q', 'show']: return (1, '', '') # section missing if a[:2] == ['uci', 'get']: got = self.uci.get(a[2])