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')]