mirror of
https://github.com/MarekWo/mc-webui.git
synced 2026-03-28 17:42:45 +01:00
feat(v2): Add pkt_payload to DMs, update watchdog for single container
- Add pkt_payload column to direct_messages table for stable packet hash generation and Analyzer URL linking - Update insert_direct_message() and DeviceManager to store pkt_payload - Add test for DM pkt_payload storage (43 tests pass) - Update watchdog to monitor only mc-webui (meshcore-bridge removed) - USB reset trigger now fires for mc-webui container failures Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -248,14 +248,15 @@ class Database:
|
||||
cursor = conn.execute(
|
||||
"""INSERT INTO direct_messages
|
||||
(contact_pubkey, direction, content, timestamp, sender_timestamp,
|
||||
txt_type, snr, path_len, expected_ack, signature, raw_json)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
||||
txt_type, snr, path_len, expected_ack, pkt_payload, signature, raw_json)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
||||
(contact_pubkey, direction, content, timestamp,
|
||||
kwargs.get('sender_timestamp'),
|
||||
kwargs.get('txt_type', 0),
|
||||
kwargs.get('snr'),
|
||||
kwargs.get('path_len'),
|
||||
kwargs.get('expected_ack'),
|
||||
kwargs.get('pkt_payload'),
|
||||
kwargs.get('signature'),
|
||||
kwargs.get('raw_json'))
|
||||
)
|
||||
|
||||
@@ -262,6 +262,7 @@ class DeviceManager:
|
||||
sender_timestamp=data.get('sender_timestamp'),
|
||||
snr=data.get('snr'),
|
||||
path_len=data.get('path_len'),
|
||||
pkt_payload=data.get('pkt_payload'),
|
||||
raw_json=json.dumps(data, default=str),
|
||||
)
|
||||
|
||||
@@ -454,6 +455,7 @@ class DeviceManager:
|
||||
content=text,
|
||||
timestamp=ts,
|
||||
expected_ack=event_data.get('expected_ack'),
|
||||
pkt_payload=event_data.get('pkt_payload'),
|
||||
)
|
||||
|
||||
return {
|
||||
|
||||
@@ -72,6 +72,7 @@ CREATE TABLE IF NOT EXISTS direct_messages (
|
||||
snr REAL,
|
||||
path_len INTEGER,
|
||||
expected_ack TEXT, -- ACK code for delivery tracking
|
||||
pkt_payload TEXT, -- raw packet payload for hash/analyzer
|
||||
signature TEXT, -- dedup signature
|
||||
raw_json TEXT,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
|
||||
@@ -38,8 +38,8 @@ LOG_FILE = os.environ.get('LOG_FILE', '/var/log/mc-webui-watchdog.log')
|
||||
HTTP_PORT = int(os.environ.get('HTTP_PORT', '5051'))
|
||||
AUTO_START = os.environ.get('AUTO_START', 'true').lower() != 'false'
|
||||
|
||||
# Containers to monitor
|
||||
CONTAINERS = ['meshcore-bridge', 'mc-webui']
|
||||
# Containers to monitor (v2: single container, no meshcore-bridge)
|
||||
CONTAINERS = ['mc-webui']
|
||||
|
||||
# Global state
|
||||
last_check_time = None
|
||||
@@ -318,8 +318,8 @@ def handle_unhealthy_container(container_name: str, status: dict):
|
||||
except Exception as e:
|
||||
log(f"Failed to save diagnostic info: {e}", 'ERROR')
|
||||
|
||||
# Check if we should do a USB reset for meshcore-bridge
|
||||
if container_name == 'meshcore-bridge':
|
||||
# v2: mc-webui owns the device connection directly — USB reset if repeated failures
|
||||
if container_name == 'mc-webui':
|
||||
recent_restarts = count_recent_restarts(container_name, minutes=8)
|
||||
if recent_restarts >= 3:
|
||||
log(f"{container_name} has been restarted {recent_restarts} times in the last 8 minutes. Attempting hardware USB reset.", "WARN")
|
||||
|
||||
@@ -250,6 +250,16 @@ class TestDirectMessages:
|
||||
assert ack is not None
|
||||
assert ack['snr'] == -3.0
|
||||
|
||||
def test_dm_with_pkt_payload(self, db):
|
||||
db.upsert_contact('cc', name='Charlie')
|
||||
ts = int(time.time())
|
||||
dm_id = db.insert_direct_message(
|
||||
'cc', 'in', 'Hello', ts, pkt_payload='deadbeef01020304'
|
||||
)
|
||||
messages = db.get_dm_messages('cc')
|
||||
assert len(messages) == 1
|
||||
assert messages[0]['pkt_payload'] == 'deadbeef01020304'
|
||||
|
||||
|
||||
# ================================================================
|
||||
# Echoes
|
||||
|
||||
Reference in New Issue
Block a user