From f9e399183c1dcce10df2ec6d271936f9dc88a71e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD=20=D0=A2=D1=80=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Sun, 6 Sep 2026 13:01:46 +0300 Subject: [PATCH] Fix imported PCAP session duration for relative timestamps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SIGROK-derived PCAPs have relative timestamps (0, 1.37, 15.02) rather than epoch time. The _REAL_TS_MIN check failed, so close_session() set ended to wall-clock (same as started → duration 0s). Now close_session accepts an optional duration_secs param; the import handler passes last_ts - first_ts so the session gets the correct capture duration. --- simtrace2_pysniff/server/database.py | 11 +++++++++-- simtrace2_pysniff/server/server.py | 3 ++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/simtrace2_pysniff/server/database.py b/simtrace2_pysniff/server/database.py index 486705c..38a3059 100644 --- a/simtrace2_pysniff/server/database.py +++ b/simtrace2_pysniff/server/database.py @@ -4,6 +4,7 @@ import os import sqlite3 import time from contextlib import contextmanager +from datetime import datetime, timedelta DEFAULT_DB_DIR = os.path.expanduser('~/.simtrace-analyser') DEFAULT_DB_PATH = os.path.join(DEFAULT_DB_DIR, 'sessions.db') @@ -68,10 +69,16 @@ class Database: self._conn.commit() return cur.lastrowid - def close_session(self, session_id): + def close_session(self, session_id, duration_secs=None): + if duration_secs is not None and duration_secs > 0: + started = self._conn.execute( + 'SELECT started FROM sessions WHERE id=?', (session_id,)).fetchone()[0] + ended = (datetime.fromisoformat(started) + timedelta(seconds=duration_secs)).isoformat() + else: + ended = _iso_now() self._conn.execute( 'UPDATE sessions SET ended=? WHERE id=? AND ended IS NULL', - (_iso_now(), session_id)) + (ended, session_id)) self._conn.commit() def set_session_times_from_ts(self, session_id, first_ts, last_ts): diff --git a/simtrace2_pysniff/server/server.py b/simtrace2_pysniff/server/server.py index 9c42547..22d85ec 100644 --- a/simtrace2_pysniff/server/server.py +++ b/simtrace2_pysniff/server/server.py @@ -346,7 +346,8 @@ class RequestHandler(BaseHTTPRequestHandler): if first_ts is not None and first_ts > _REAL_TS_MIN: self.db.set_session_times_from_ts(session_id, first_ts, last_ts) else: - self.db.close_session(session_id) + duration = (last_ts - first_ts) if last_ts is not None and first_ts is not None else 0 + self.db.close_session(session_id, duration) _log(f'Session imported: session={session_id} ' f'name={name or "(untitled)"} messages={len(packets)} '