fix: harden UI actions and daemon calls for reliable control (v1.3.2)

Retry and serialize pineapd/hak5 calls, queue virtual-pager keys, and grey out buttons until the pager finishes. Deploy now installs python3-light after factory firmware. Bump version to 1.3.2.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-20 15:49:10 -05:00
co-authored by Cursor
parent cd26553d21
commit 7d48b7ad06
25 changed files with 3625 additions and 782 deletions
+27
View File
@@ -144,6 +144,7 @@ class PineapProxyTest(unittest.TestCase):
self.assertEqual(payload['enterprise']['enabled'], False)
self.assertEqual(payload['enterprise']['ssid'], '')
self.assertEqual(payload['pool']['collecting'], True)
self.assertTrue(payload['pool']['broadcast_blocked'])
self.assertEqual(payload['radios']['radio0']['band'], '2.4')
self.assertEqual(payload['radios']['radio1']['channel'], 'auto')
self.assertEqual(payload['pineape']['enabled'], True)
@@ -261,6 +262,32 @@ class PineapFilterTest(unittest.TestCase):
[server.HAK5CMD, 'PINEAPPLE_NETWORK_FILTER_CLEAR', 'deny'],
[server.HAK5CMD, 'PINEAPPLE_NETWORK_FILTER_MODE', 'deny']])
def test_filter_get_falls_back_to_hak5cmd_when_daemon_is_down(self):
server.daemon_sock_call = lambda method, path, body=None, timeout=10: (0, None)
def fake(args, timeout=20, input_data=None):
cmd = args[1] if len(args) > 1 else ''
if cmd.endswith('_MODE'):
return (0, 'deny\n', '')
if cmd.endswith('_LIST'):
return (0, 'AA:BB:CC:DD:EE:FF\n', '')
return (0, '', '')
server.device_run = fake
status, payload = server.h_filter_get(ctx(), 'client')
self.assertEqual(status, 200)
self.assertEqual(payload['mode'], 'deny')
self.assertEqual(payload['entries'], ['AA:BB:CC:DD:EE:FF'])
self.assertEqual(payload['source'], 'hak5cmd')
def test_filter_get_returns_empty_list_when_everything_is_down(self):
server.daemon_sock_call = lambda method, path, body=None, timeout=10: (0, None)
server.device_run = lambda args, timeout=20, input_data=None: (1, '', 'refused')
status, payload = server.h_filter_get(ctx(), 'ssid')
self.assertEqual(status, 200)
self.assertEqual(payload['entries'], [])
self.assertIn('error', payload)
if __name__ == '__main__':
unittest.main()