From ff53f88f355d77333f119495a62ec22f20373e50 Mon Sep 17 00:00:00 2001 From: pan Date: Sun, 5 Jul 2026 22:38:59 +0200 Subject: [PATCH] =?UTF-8?q?Create=20Th=C3=BCringen=20branding=20edition=20?= =?UTF-8?q?on=20shared=20core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 +++ .gitmodules | 3 + LICENSE | 19 +++++++ README.md | 44 +++++++++++++++ pyproject.toml | 29 ++++++++++ scripts/build_block_art.py | 37 +++++++++++++ scripts/build_native.py | 52 ++++++++++++++++++ scripts/build_packages.py | 34 ++++++++++++ scripts/publish_packages.py | 26 +++++++++ scripts/standalone_entry.py | 6 ++ synadm_tui_thueringen/__init__.py | 3 + synadm_tui_thueringen/__main__.py | 4 ++ .../assets/thueringen-wappen.png | Bin 0 -> 50460 bytes .../assets/thuringia.block.json | 1 + synadm_tui_thueringen/cli.py | 11 ++++ synadm_tui_thueringen/theme.py | 52 ++++++++++++++++++ tests/__init__.py | 1 + tests/test_edition.py | 28 ++++++++++ vendor/synadm-tui | 1 + 19 files changed, 359 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 LICENSE create mode 100644 README.md create mode 100644 pyproject.toml create mode 100644 scripts/build_block_art.py create mode 100644 scripts/build_native.py create mode 100644 scripts/build_packages.py create mode 100644 scripts/publish_packages.py create mode 100644 scripts/standalone_entry.py create mode 100644 synadm_tui_thueringen/__init__.py create mode 100644 synadm_tui_thueringen/__main__.py create mode 100644 synadm_tui_thueringen/assets/thueringen-wappen.png create mode 100644 synadm_tui_thueringen/assets/thuringia.block.json create mode 100644 synadm_tui_thueringen/cli.py create mode 100644 synadm_tui_thueringen/theme.py create mode 100644 tests/__init__.py create mode 100644 tests/test_edition.py create mode 160000 vendor/synadm-tui diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..488d65b --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +*.py[cod] +*.egg-info/ +.pytest_cache/ +.venv/ +build/ +dist/ +.env diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..eba137c --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "vendor/synadm-tui"] + path = vendor/synadm-tui + url = https://git.blackwall.ipv64.de/pan/synadm-tui.git diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8b3bf1e --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + +Copyright (C) 2026 synadm-tui contributors + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program. The complete license text is available at: +https://www.gnu.org/licenses/gpl-3.0.txt + +SPDX-License-Identifier: GPL-3.0-or-later diff --git a/README.md b/README.md new file mode 100644 index 0000000..63f3f98 --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +# synadm TUI – Thüringen Edition + +Die Thüringen Edition ergänzt den unveränderten Anwendungskern von [`synadm-tui`](https://git.blackwall.ipv64.de/pan/synadm-tui) um das Thüringen-Thema, das Wappen und getrennte Release-Pakete. + +Programmlogik, Navigation, Assistenten und Sicherheitsfunktionen werden nicht kopiert. Das Repository bindet einen geprüften `synadm-tui`-Stand als Git-Submodul ein; dadurch bleiben beide Editionen funktional identisch. + +## Quellcode testen + +```bash +git clone --recurse-submodules https://git.blackwall.ipv64.de/pan/synadm-tui-thueringen.git +cd synadm-tui-thueringen +PYTHONPATH=vendor/synadm-tui python3 -m unittest discover -v +PYTHONPATH=vendor/synadm-tui python3 -m synadm_tui_thueringen --version +``` + +## Native Datei und Pakete bauen + +```bash +python3 -m pip install pyinstaller +python3 scripts/build_native.py +python3 scripts/build_packages.py +cd dist/packages && sha256sum --check SHA256SUMS +``` + +## Pakete ohne Runner veröffentlichen + +```bash +python3 scripts/publish_packages.py --tea-login Building --dry-run +python3 scripts/publish_packages.py --tea-login Building +``` + +DEB-Pakete werden in die Distribution `thueringen`, RPM-Pakete in die Gruppe `thueringen` veröffentlicht. Dadurch bleiben auch die Paketquellen von der Standard Edition getrennt. + +## Voraussetzungen + +- Linux x86-64 oder ARM64 +- Python 3.10+ für den Quellstart +- PyInstaller für native Builds +- `dpkg-deb` und `rpmbuild` für Systempakete +- separat installiertes `synadm`, wahlweise über den integrierten Installationsassistenten + +## Lizenz + +GPL-3.0-or-later, siehe `LICENSE`. diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b731b30 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,29 @@ +[build-system] +requires = ["setuptools>=68"] +build-backend = "setuptools.build_meta" + +[project] +name = "synadm-tui-thueringen" +version = "0.15" +description = "Thüringen-Edition der Terminal-Oberfläche für synadm" +readme = "README.md" +requires-python = ">=3.10" +license = { text = "GPL-3.0-or-later" } +authors = [{ name = "synadm-tui contributors" }] +dependencies = ["synadm-tui==0.15"] +classifiers = [ + "Environment :: Console :: Curses", + "Programming Language :: Python :: 3", +] + +[project.scripts] +synadm-tui-thueringen = "synadm_tui_thueringen.cli:main" + +[tool.setuptools.packages.find] +include = ["synadm_tui_thueringen*"] + +[tool.setuptools.package-data] +synadm_tui_thueringen = ["assets/*.png", "assets/*.block.json"] + +[tool.unittest] +start-directory = "tests" diff --git a/scripts/build_block_art.py b/scripts/build_block_art.py new file mode 100644 index 0000000..ef58dd5 --- /dev/null +++ b/scripts/build_block_art.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 +"""Regenerate the portable 256-color crest data.""" + +from __future__ import annotations + +import json +import re +import subprocess +from pathlib import Path + + +ROOT = Path(__file__).resolve().parent.parent +ASSETS = ROOT / "synadm_tui_thueringen" / "assets" +PIXEL = re.compile(r"#([0-9A-Fa-f]{8})\s") + + +def main() -> int: + process = subprocess.run( + ["convert", str(ASSETS / "thueringen-wappen.png"), "-filter", "Lanczos", "-resize", "18x20!", "txt:-"], + check=True, + text=True, + stdout=subprocess.PIPE, + ) + pixels = [match.group(1).lower() for line in process.stdout.splitlines() if (match := PIXEL.search(line))] + if len(pixels) != 18 * 20: + raise RuntimeError(f"360 Pixel erwartet, {len(pixels)} erhalten") + target = ASSETS / "thuringia.block.json" + target.write_text( + json.dumps({"width": 18, "height": 20, "pixels": pixels}, separators=(",", ":")) + "\n", + encoding="utf-8", + ) + print(target) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/build_native.py b/scripts/build_native.py new file mode 100644 index 0000000..4d77db7 --- /dev/null +++ b/scripts/build_native.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +"""Build the Thüringen binary against the pinned synadm-tui core.""" + +from __future__ import annotations + +import hashlib +import os +from pathlib import Path + +import PyInstaller.__main__ + + +ROOT = Path(__file__).resolve().parent.parent +CORE = Path(os.environ.get("SYNADM_TUI_CORE", ROOT / "vendor" / "synadm-tui")).resolve() + + +def main() -> int: + if not (CORE / "synadm_tui" / "app.py").is_file(): + raise SystemExit("synadm-tui-Core fehlt; git submodule update --init ausführen.") + arguments = [ + str(ROOT / "scripts" / "standalone_entry.py"), + "--name=synadm-tui-thueringen", + "--onefile", + "--clean", + f"--paths={ROOT}", + f"--paths={CORE}", + f"--distpath={ROOT / 'dist'}", + f"--workpath={ROOT / 'build' / 'pyinstaller'}", + f"--specpath={ROOT / 'build'}", + ] + for asset in ( + "retro-cyberspace.png", + "hacker-terminal.png", + "cyberspace.block.json", + "hacker.block.json", + ): + arguments.append(f"--add-data={CORE / 'synadm_tui' / 'assets' / asset}:synadm_tui/assets") + for asset in ("thueringen-wappen.png", "thuringia.block.json"): + arguments.append( + f"--add-data={ROOT / 'synadm_tui_thueringen' / 'assets' / asset}:synadm_tui_thueringen/assets" + ) + PyInstaller.__main__.run(arguments) + artifact = ROOT / "dist" / "synadm-tui-thueringen" + checksum = hashlib.sha256(artifact.read_bytes()).hexdigest() + (ROOT / "dist" / "SHA256SUMS").write_text( + f"{checksum} synadm-tui-thueringen\n", encoding="utf-8" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/build_packages.py b/scripts/build_packages.py new file mode 100644 index 0000000..32f5c3e --- /dev/null +++ b/scripts/build_packages.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +"""Build DEB and RPM packages by reusing the pinned core's packaging code.""" + +from __future__ import annotations + +import importlib.util +import os +import sys +from pathlib import Path + + +ROOT = Path(__file__).resolve().parent.parent +CORE = Path(os.environ.get("SYNADM_TUI_CORE", ROOT / "vendor" / "synadm-tui")).resolve() +SPEC = importlib.util.spec_from_file_location("synadm_core_build_packages", CORE / "scripts" / "build_packages.py") +if not SPEC or not SPEC.loader: + raise SystemExit("Paketierungsmodul des synadm-tui-Core fehlt.") +module = importlib.util.module_from_spec(SPEC) +sys.modules[SPEC.name] = module +SPEC.loader.exec_module(module) +module.ROOT = ROOT +module.DIST = ROOT / "dist" +module.OUTPUT = module.DIST / "packages" +module.HOMEPAGE = "https://git.blackwall.ipv64.de/pan/synadm-tui-thueringen" +module.EDITIONS = ( + module.Edition( + "synadm-tui-thueringen", + "synadm-tui-thueringen", + "Thüringen-Edition der synadm Terminal-Oberfläche", + "Regionales Branding auf dem unveränderten Anwendungskern von synadm-tui.", + ), +) + + +raise SystemExit(module.main()) diff --git a/scripts/publish_packages.py b/scripts/publish_packages.py new file mode 100644 index 0000000..3463614 --- /dev/null +++ b/scripts/publish_packages.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +"""Publish Thüringen packages via the pinned core's secure uploader.""" + +from __future__ import annotations + +import importlib.util +import os +import sys +from pathlib import Path + + +ROOT = Path(__file__).resolve().parent.parent +CORE = Path(os.environ.get("SYNADM_TUI_CORE", ROOT / "vendor" / "synadm-tui")).resolve() +SPEC = importlib.util.spec_from_file_location("synadm_core_publish_packages", CORE / "scripts" / "publish_packages.py") +if not SPEC or not SPEC.loader: + raise SystemExit("Uploadmodul des synadm-tui-Core fehlt.") +module = importlib.util.module_from_spec(SPEC) +sys.modules[SPEC.name] = module +SPEC.loader.exec_module(module) +module.ROOT = ROOT +module.PACKAGE_DIR = ROOT / "dist" / "packages" +module.DEFAULT_DISTRIBUTION = "thueringen" +module.DEFAULT_RPM_GROUP = "thueringen" + + +raise SystemExit(module.main()) diff --git a/scripts/standalone_entry.py b/scripts/standalone_entry.py new file mode 100644 index 0000000..2fb411c --- /dev/null +++ b/scripts/standalone_entry.py @@ -0,0 +1,6 @@ +"""PyInstaller entry point for the Thüringen edition.""" + +from synadm_tui_thueringen.cli import main + + +raise SystemExit(main()) diff --git a/synadm_tui_thueringen/__init__.py b/synadm_tui_thueringen/__init__.py new file mode 100644 index 0000000..1fe327d --- /dev/null +++ b/synadm_tui_thueringen/__init__.py @@ -0,0 +1,3 @@ +"""Branding extension for the Thüringen edition of synadm TUI.""" + +__version__ = "0.15" diff --git a/synadm_tui_thueringen/__main__.py b/synadm_tui_thueringen/__main__.py new file mode 100644 index 0000000..faaa63b --- /dev/null +++ b/synadm_tui_thueringen/__main__.py @@ -0,0 +1,4 @@ +from .cli import main + + +raise SystemExit(main()) diff --git a/synadm_tui_thueringen/assets/thueringen-wappen.png b/synadm_tui_thueringen/assets/thueringen-wappen.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac1afa560f416f0b4a043f13c0d08abad4e7d42 GIT binary patch literal 50460 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 literal 0 HcmV?d00001 diff --git a/synadm_tui_thueringen/assets/thuringia.block.json b/synadm_tui_thueringen/assets/thuringia.block.json new file mode 100644 index 0000000..5a50c0f --- /dev/null +++ b/synadm_tui_thueringen/assets/thuringia.block.json @@ -0,0 +1 @@ +{"width":18,"height":20,"pixels":["15678fff","1875a4ff","18729fff","1774a2ff","076899ff","106f9fff","1874a4ff","206c8bff","1b6e96ff","296e80ff","1f6f91ff","277087ff","1072a4ff","076796ff","1472a1ff","1775a4ff","1678a8ff","166891ff","1878a7ff","1c89c0ff","1c87beff","1e81b3ff","86a9bbff","4b90b2ff","1081c0ff","318893ff","66853eff","97a32bff","6c873bff","33858aff","3187b9ff","96b1bdff","3186b1ff","1e7bacff","217fb0ff","177bacff","1a739fff","1d85b4ff","0f80b0ff","267aa0ff","d4ceceff","759bafff","0083c1ff","566075ff","d03c06ff","dd470cff","ce3a05ff","5d4958ff","3f8cb0ff","dad2ceff","2290bfff","7c4546ff","cb3010ff","10719fff","1276a4ff","505c5cff","8d341cff","206887ff","0d7bb3ff","1d7babff","37607dff","902f1eff","9d1200ff","d92607ff","f32000ff","78494aff","0687c4ff","136995ff","64505bff","bc311bff","665a68ff","1178a9ff","176f93ff","5f7473ff","c69f9aff","8facbdff","3187b2ff","1281b8ff","275f84ff","4f6779ff","8a959bff","d5bdb8ff","e7c4baff","7c94a4ff","127cb0ff","a4abb1ff","636777ff","286e94ff","1386bcff","1877a7ff","1774a3ff","257993ff","5a8691ff","f7eeecff","d5d5d4ff","6f95a7ff","5fa2c1ff","4891b2ff","a2bdc9ff","f0f8f9ff","f4fbfbff","6c9cb2ff","91a4afff","94bacbff","0076b4ff","cdccccff","a1b3beff","096a9aff","1976a5ff","0b80bbff","186691ff","a34635ff","b93f25ff","ca4527ff","ea512eff","de4b2aff","d6482aff","d2482bff","e24422ff","795051ff","3281a8ff","a73f2cff","30698dff","549cbdff","5091b2ff","1272a2ff","106c9aff","83a6b8ff","74a3baff","145d86ff","a52006ff","e12300ff","e42500ff","e42500ff","e62500ff","e52800ff","f52100ff","744749ff","0086c8ff","375876ff","b0331bff","2a5d7fff","0e81b9ff","1976a4ff","0e6a99ff","9fb9c9ff","95b0bdff","006ea6ff","868d97ff","c6a39bff","c6aca7ff","ceaba2ff","ceb0aaff","bda39eff","cfa79dff","53829dff","4a8bacff","87b4c7ff","2e698bff","afa1a1ff","b4c1c7ff","3f7895ff","19749dff","257a9aff","1c78a3ff","89acbeff","eff3f3ff","e7e9e9ff","dadadaff","a4c8d7ff","ccdadeff","e0ebeeff","ebefeeff","4f91afff","5398b9ff","d0d1d0ff","097db2ff","93b7c7ff","4f8cabff","1d719aff","147093ff","7a4d37ff","d43b1fff","b6523cff","b6462fff","ae4f3eff","426b84ff","435f7aff","795554ff","c54a30ff","d75033ff","ce472bff","525769ff","1e6f9aff","605766ff","864943ff","0f86bfff","1777a7ff","1d728fff","5e5247ff","78412fff","37565eff","235e81ff","235171ff","9b2e1eff","ee2300ff","ef2900ff","ce1f00ff","d11c00ff","eb2200ff","e92600ff","a03a2bff","834441ff","346c8eff","1c84b7ff","1976a4ff","1e739dfd","1285bbff","107499ff","097eb7ff","4391b6ff","cdbbb7ff","e8b4a7ff","d4b4aeff","7f7b83ff","988b8dff","ddbdb6ff","dabab3ff","b19b9aff","1679abff","0e81b7ff","d4d4d3ff","8caabaff","0a6b9cfe","1974a1e3","2a80abff","cbc9ccfe","5d93aeff","1278acff","659fbbff","ecfcffff","bfd9e2ff","007bb9ff","579cbdff","fff5f0ff","fcfcfbff","b8d5dfff","107cafff","117bafff","6694acfe","458eb2ff","176f9ae6","1d688da4","237fadff","a1b4bdfc","4c8eb2ff","048acbff","236e97ff","cb462aff","da4a2bff","8b3f37ff","326281ff","845957ff","9a564dff","dc4f30ff","bf3d22ff","8d392eff","0a74a9fc","1382b9ff","23698ca7","304e5e37","1a79a9fe","097ab4fc","227490fe","34647dff","7a3e3fff","fc2300ff","dd2600ff","685059ff","1682b7ff","1181baff","156d9cff","ca1e00ff","fd2500ff","82423dfe","1785bafc","1e7ba9ff","2b4c5d3a","1286b400","24627f93","1683beff","4a7569f9","cc9579fe","e6b1a3ff","95817eff","266082ff","0b7bafff","1880b5ff","1d82b2ff","4289acff","d5b8b6ff","9e8170fe","1173a4f9","1a86bbff","22618297","0b8dbe00","12749e03","5d000006","1c678fb5","237895ff","64928dff","6799a4fc","298298fd","197fb5ff","d6ccc7ff","6e9ebbff","1b6a7cff","c9b596fd","e7e4dbfc","4d8d92ff","147eb0ff","22678bb9","41000007","12739d03","2b4a5b01","00ffff00","8d000003","1c5e8483","116e9df0","0e79b0ff","1883bbff","1e80b0ff","85a9bbff","4d92b6ff","147bacff","487e85ff","337686ff","1472aaf1","235d7a85","6f000004","00ffff00","2a4a5c01","244e6400","363e4101","00ffff00","0b85c900","39383926","265f7c84","1f6c92ca","1c74a1f0","0a6a99fe","1170a0fe","1e75a0f1","116999cb","145e8985","38362d27","1483b800","ff000000","2f404a01","244f6600"]} diff --git a/synadm_tui_thueringen/cli.py b/synadm_tui_thueringen/cli.py new file mode 100644 index 0000000..5310392 --- /dev/null +++ b/synadm_tui_thueringen/cli.py @@ -0,0 +1,11 @@ +"""Entry point for the Thüringen edition.""" + +from __future__ import annotations + +from synadm_tui.cli import main as core_main + +from .theme import THURINGIA_EDITION, THURINGIA_THEME + + +def main(argv: list[str] | None = None) -> int: + return core_main(argv, edition=THURINGIA_EDITION, extra_themes=(THURINGIA_THEME,)) diff --git a/synadm_tui_thueringen/theme.py b/synadm_tui_thueringen/theme.py new file mode 100644 index 0000000..88ac106 --- /dev/null +++ b/synadm_tui_thueringen/theme.py @@ -0,0 +1,52 @@ +"""Thüringen profile and visual assets; application behavior comes from synadm-tui.""" + +from __future__ import annotations + +import curses +from pathlib import Path + +from synadm_tui.app import Theme +from synadm_tui.edition import Edition + + +ASSETS = Path(__file__).resolve().parent / "assets" + +THURINGIA_CREST = ( + " .-============-.", + " / * * * * \\", + " | /\\_/\\ |", + " | ___/ o o \\___ |", + " | / |==^==| \\ |", + " | /|===|\\ |", + " \\ * * * * /", + " '============'", +) + +THURINGIA_THEME = Theme( + "thuringia", + "Freistaat Thüringen", + "THÜRINGEN", + ( + (curses.COLOR_RED, -1), + (curses.COLOR_WHITE, curses.COLOR_RED), + (curses.COLOR_CYAN, -1), + (curses.COLOR_RED, -1), + (curses.COLOR_YELLOW, -1), + (curses.COLOR_WHITE, -1), + (curses.COLOR_BLUE, -1), + (curses.COLOR_WHITE, curses.COLOR_BLUE), + (curses.COLOR_RED, curses.COLOR_WHITE), + ), + THURINGIA_CREST, + "FREISTAAT THÜRINGEN // SYSTEM BEREIT", + image_path=ASSETS / "thueringen-wappen.png", + block_path=ASSETS / "thuringia.block.json", +) + +THURINGIA_EDITION = Edition( + key="thuringia", + name="Thüringen Edition", + binary_name="synadm-tui-thueringen", + default_theme="thuringia", + theme_keys=("thuringia", "cyberspace", "matrix", "hacker", "high-contrast", "monochrome"), +) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e68eb40 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +"""Tests for the Thüringen branding overlay.""" diff --git a/tests/test_edition.py b/tests/test_edition.py new file mode 100644 index 0000000..4ce7797 --- /dev/null +++ b/tests/test_edition.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +import unittest + +import synadm_tui +from synadm_tui.app import App +from synadm_tui.runner import SynadmRunner +from synadm_tui_thueringen import __version__ +from synadm_tui_thueringen.theme import THURINGIA_EDITION, THURINGIA_THEME + + +class EditionTests(unittest.TestCase): + def test_core_and_overlay_versions_match(self) -> None: + self.assertEqual(__version__, synadm_tui.__version__) + + def test_theme_assets_are_external_and_complete(self) -> None: + self.assertTrue(THURINGIA_THEME.image_path.is_file()) + self.assertTrue(THURINGIA_THEME.block_path.is_file()) + self.assertEqual(len(THURINGIA_THEME.palette), 9) + + def test_core_accepts_external_edition(self) -> None: + app = App(SynadmRunner("not-installed"), THURINGIA_EDITION, (THURINGIA_THEME,)) + self.assertEqual(app.theme.key, "thuringia") + self.assertEqual(app.edition.binary_name, "synadm-tui-thueringen") + + +if __name__ == "__main__": + unittest.main() diff --git a/vendor/synadm-tui b/vendor/synadm-tui new file mode 160000 index 0000000..c1483aa --- /dev/null +++ b/vendor/synadm-tui @@ -0,0 +1 @@ +Subproject commit c1483aae71e41588f4b2c5f731f77eb3735cc46b