From 2b83d21e64e5a619277fbaed93e9fb13b026009b 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: Wed, 28 Oct 2026 00:36:26 +0300 Subject: [PATCH] README: add architecture diagrams (EN/RU) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both READMEs gain a capture-and-analysis diagram right under the screenshot: simtrace2-pysniff and sigrok_iso7816_stream feed the GSMTAP UDP :4729 listener, SIMtrace2 hardware can be read directly over USB, PCAP/COMPRION traces come from files, and simtrace-analyser-server decodes/stores into SQLite and serves the web UI. The SVGs carry title/desc and role=img, use only inline presentation attributes (no scripts, no external refs) and render without clipped text; the RU text matches the EN layout. The runtime zip includes both diagrams so the embedded READMEs keep working, and a new drift guard checks that every image a README references is present in the archive. RU wording: "устанавливаемое PWA" (neuter agreement). 558 Python + 80 Node tests. --- README.md | 2 ++ README_RUS.md | 2 ++ architecture_en.svg | 54 ++++++++++++++++++++++++++++++++++++ architecture_ru.svg | 54 ++++++++++++++++++++++++++++++++++++ scripts/build_release_zip.py | 2 ++ tests/test_release_zip.py | 15 ++++++++++ 6 files changed, 129 insertions(+) create mode 100644 architecture_en.svg create mode 100644 architecture_ru.svg diff --git a/README.md b/README.md index 9930d48..3ea2a16 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ GSMTAP into this analyser. ![SIMtrace Analyser UI](frontend.png) +![Capture and analysis: simtrace2-pysniff (SIMtrace2 hardware) and sigrok_iso7816_stream (FX2) stream GSMTAP-SIM to the UDP :4729 listener; alternatively the server reads SIMtrace2 hardware directly over USB, and PCAP/COMPRION traces are imported from files; simtrace-analyser-server decodes and stores the traffic in SQLite and serves the web UI](architecture_en.svg) + ## Prerequisites **Required** diff --git a/README_RUS.md b/README_RUS.md index 9eb4082..b326965 100644 --- a/README_RUS.md +++ b/README_RUS.md @@ -13,6 +13,8 @@ SIM/UICC из UDP-потока GSMTAP (или импортирует файлы ![Интерфейс SIMtrace Analyser](frontend.png) +![Захват и анализ: simtrace2-pysniff (оборудование SIMtrace2) и sigrok_iso7816_stream (FX2) передают GSMTAP-SIM слушателю UDP :4729; альтернативно сервер читает оборудование SIMtrace2 напрямую по USB, а PCAP/трассы COMPRION импортируются из файлов; simtrace-analyser-server декодирует и сохраняет трафик в SQLite и раздаёт веб-интерфейс](architecture_ru.svg) + ## Требования **Обязательно** diff --git a/architecture_en.svg b/architecture_en.svg new file mode 100644 index 0000000..4668e10 --- /dev/null +++ b/architecture_en.svg @@ -0,0 +1,54 @@ + + + SIMtrace Analyser: capture and analysis + simtrace2-pysniff (SIMtrace2 hardware) and sigrok_iso7816_stream (FX2 logic analyzer) stream GSMTAP-SIM to the listener on UDP :4729; alternatively the server reads SIMtrace2 hardware directly over USB, and PCAP/COMPRION traces are imported from files. simtrace-analyser-server decodes and stores the traffic in SQLite and serves the web UI. + + + + + + + capture → analyse + + + simtrace2-pysniff + SIMtrace2 hardware + + + sigrok_iso7816_stream + FX2 logic analyzer + + + + + + SIMtrace2 hardware + direct USB + + + GSMTAP UDP :4729 + listener + + + PCAP / COMPRION import + files + + + + + + + simtrace-analyser-server + decodes · stores + + + + + + SQLite + sessions.db + + + Browser (web UI) + installable PWA + diff --git a/architecture_ru.svg b/architecture_ru.svg new file mode 100644 index 0000000..a2aa4bf --- /dev/null +++ b/architecture_ru.svg @@ -0,0 +1,54 @@ + + + SIMtrace Analyser: захват и анализ + simtrace2-pysniff (оборудование SIMtrace2) и sigrok_iso7816_stream (логический анализатор FX2) передают GSMTAP-SIM слушателю UDP :4729; альтернативно сервер читает оборудование SIMtrace2 напрямую по USB, а PCAP/трассы COMPRION импортируются из файлов. simtrace-analyser-server декодирует и сохраняет трафик в SQLite и раздаёт веб-интерфейс. + + + + + + + захват → анализ + + + simtrace2-pysniff + оборудование SIMtrace2 + + + sigrok_iso7816_stream + логический анализатор FX2 + + + + + + Оборудование SIMtrace2 + прямой USB + + + GSMTAP UDP :4729 + слушатель + + + Импорт PCAP / COMPRION + файлы + + + + + + + simtrace-analyser-server + декодирует · сохраняет + + + + + + SQLite + sessions.db + + + Браузер (веб-интерфейс) + устанавливаемое PWA + diff --git a/scripts/build_release_zip.py b/scripts/build_release_zip.py index c69b40c..9fff673 100644 --- a/scripts/build_release_zip.py +++ b/scripts/build_release_zip.py @@ -40,6 +40,8 @@ ROOT_FILES = ( 'README.md', 'README_RUS.md', 'frontend.png', + 'architecture_en.svg', + 'architecture_ru.svg', 'LICENSE', ) diff --git a/tests/test_release_zip.py b/tests/test_release_zip.py index c617e08..9e70a6b 100644 --- a/tests/test_release_zip.py +++ b/tests/test_release_zip.py @@ -81,6 +81,21 @@ class TestReleaseZip(unittest.TestCase): self.assertIn('%s/frontend/%s' % (top, asset), self.names, 'precached %s is missing from the zip' % asset) + def test_readme_images_are_in_the_zip(self): + # Drift guard: the runtime tree's READMEs embed the screenshot and the + # architecture diagrams by relative path, so every referenced image + # must travel with the archive. + top = 'simtrace-analyser-%s' % __version__ + for readme in ('README.md', 'README_RUS.md'): + text = (REPO / readme).read_text() + images = re.findall(r'!\[[^\]]*\]\(([^)\s]+)\)', text) + self.assertTrue(images, 'no images referenced by %s' % readme) + for image in images: + self.assertNotIn('://', image, image) + self.assertIn('%s/%s' % (top, image), self.names, + '%s references %s, which is missing from the zip' + % (readme, image)) + def test_batch_files_use_crlf(self): with zipfile.ZipFile(self.archive) as zf: bats = [n for n in self.names if n.endswith('.bat')]