From f86a62b8b1fd27c4b04d6c40f30f90c7a1b90247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Thu, 22 Oct 2026 16:10:02 +0200 Subject: [PATCH] suse --- README.md | 51 ++++++++---- SHA256SUMS | 36 ++++---- dashboard/app.py | 7 +- dashboard/web/app.js | 41 +++++++-- dashboard/web/index.html | 13 +-- dashboard/web/style.css | 6 +- packaging/suse-python3 | 10 +++ scripts/build-freebsd-release.sh | 6 +- scripts/build-linux-release.sh | 33 ++++++-- scripts/build-opnsense-release.sh | 6 +- scripts/check-and-build.sh | 4 + scripts/entrypoint.sh | 1 + scripts/generate-index.sh | 20 ++++- scripts/init-storage.sh | 4 +- scripts/lib.sh | 2 +- scripts/prepare-agent-package.sh | 30 ++++++- scripts/prepare-package.sh | 55 ++++++++++++ start.sh | 3 +- tests/test_suse.py | 134 ++++++++++++++++++++++++++++++ 19 files changed, 389 insertions(+), 73 deletions(-) create mode 100755 packaging/suse-python3 create mode 100644 tests/test_suse.py diff --git a/README.md b/README.md index d4fd11d..8fb2e9b 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # RustProxy unified package builder -Wydanie wdrożeniowe (odchudzone): zawiera panel, konfigurację Nginx oraz wszystkie skrypty budowania Linux, OPNsense i FreeBSD. Nie zawiera pustych szkieletów projektów ani testów developerskich. Istniejące katalogi `data/`, `gpg/` i plik `.env` pozostają nienaruszone podczas rozpakowywania. +Wydanie wdrożeniowe (odchudzone): zawiera panel, konfigurację Nginx oraz wszystkie skrypty budowania Linux, OPNsense i FreeBSD. Nie zawiera pustych szkieletów projektów; dołączono lekkie testy offline dla pakowania SUSE. Istniejące katalogi `data/`, `gpg/` i plik `.env` pozostają nienaruszone podczas rozpakowywania. Jeden kontener buildera buduje z jednego commita RustProxy: - Linux x86_64: DEB + podpisane repo APT (`rustproxy` **oraz osobny** `rustproxy-docker-agent`), - Linux x86_64: RPM + podpisane repo DNF/YUM (`rustproxy` **oraz osobny** `rustproxy-docker-agent`), +- **SUSE / openSUSE / openSUSE Leap x86_64**: oddzielne paczki RPM dostosowane do `zypper`, podpisane repo `suse/x86_64` (`rustproxy` i `rustproxy-docker-agent`), - FreeBSD x86_64: cross-build bez VM FreeBSD, - OPNsense: `os-rustproxy-_.pkg` + statyczne repo `pkg`, - **natywne FreeBSD** (domyślnie włączone): `rustproxy-_.pkg` + osobny katalog repo `pkg` pod `/freebsd/` (bez zależności OPNsense). @@ -14,21 +15,22 @@ Jeden kontener buildera buduje z jednego commita RustProxy: ## Panel repozytorium (RustProxy Package Registry) -The dashboard interface defaults to **English (`en-GB`)**, including its dates, navigation, notifications, and installation instructions. The **Docker discovery agent** installation card is shown only for **Linux (DEB/RPM)**, never for OPNsense or native FreeBSD. Package listings/API also omit any stray agent PKG files for the FreeBSD channels. +The dashboard interface defaults to **English (`en-GB`)**, including its dates, navigation, notifications, and installation instructions. The **Docker discovery agent** installation card is shown only for **Linux (DEB/RPM, including SUSE/Zypper)**, never for OPNsense or native FreeBSD. Package listings/API also omit any stray agent PKG files for the FreeBSD channels. -Strony startowe wszystkich trzech repozytoriów działają teraz jako **lekka aplikacja Python** (`dashboard/`) za istniejącym Nginx. Wygląd nawiązuje do panelu RustProxy 0.34.6 (ciemny, jasny i kremowy motyw). **APT, RPM i pkg są nadal obsługiwane bezpośrednio przez Nginx**, więc mechanizm aktualizacji paczek, ścieżki plików, podpisy GPG i atomowe przełączanie `current` nie zmieniają się. +Strony startowe repozytoriów (Linux DNF/APT, SUSE, OPNsense, FreeBSD) działają jako **lekka aplikacja Python** (`dashboard/`) za istniejącym Nginx. Wygląd nawiązuje do panelu RustProxy 0.34.6 (ciemny, jasny i kremowy motyw). **APT, RPM i pkg są nadal obsługiwane bezpośrednio przez Nginx**, więc mechanizm aktualizacji paczek, ścieżki plików, podpisy GPG i atomowe przełączanie `current` nie zmieniają się. Panel udostępnia: -- **Przegląd**: najnowsza wersja, czas buildu, commit, stan Linux / OPNsense / FreeBSD, statystyki i ostatnie paczki. +- **Przegląd**: najnowsza wersja, czas buildu, commit, stan Linux / SUSE / OPNsense / FreeBSD, statystyki i ostatnie paczki. - **Paczki i wersje**: pełny katalog z nazwą, wersją, architekturą, datą, rozmiarem i linkiem pobrania; wyszukiwanie, sortowanie oraz filtry formatów/kanałów. -- **Instalacja**: aktualne polecenia dla APT, DNF, OPNsense i natywnego FreeBSD oraz przyciski kopiowania. +- **Instalacja**: aktualne polecenia dla APT, DNF, Zypper, OPNsense i natywnego FreeBSD oraz przyciski kopiowania. - **Repozytoria**: linki do metadanych, katalogów i klucza GPG. Automatyczne odświeżanie co **60 sekund** oraz ręczne odświeżenie. Adresy paneli (bez zmian domen i portów): ```text -REPOSITORY_URL/ Linux DEB + RPM +REPOSITORY_URL/ Linux DEB + RPM (DNF) + SUSE RPM (Zypper) +REPOSITORY_URL/suse/x86_64/ podpisane RPM i metadane dla SUSE/openSUSE OPNSENSE_REPOSITORY_URL/ OPNsense pkg OPNSENSE_REPOSITORY_URL/freebsd/ Native FreeBSD pkg ``` @@ -74,7 +76,7 @@ Dla `http://` bez portu `start.sh` dopisze domyślny port. Dla `https://` zakła Domyślne lokalne porty: ```text -APT/RPM: 18765 -> nginx :8080 +APT/RPM/Zypper: 18765 -> nginx :8080 OPNsense: 18766 -> nginx :8081 ``` @@ -97,8 +99,8 @@ opn-rustproxy.linuxiarz.pl -> http://builder:18766 cargo test | cargo build +---+---+ go test/build agent | | - 2x DEB + 2x RPM | | - APT + DNF OPNsense FreeBSD native* + 2x DEB + 2x RPM + 2x SUSE RPM | | + APT + DNF + Zypper OPNsense FreeBSD native* | | | v v v publikacja Linux os-rustproxy rustproxy.pkg @@ -107,7 +109,7 @@ opn-rustproxy.linuxiarz.pl -> http://builder:18766 * FreeBSD native: enabled by default; FREEBSD_NATIVE_ENABLED=0 disables it ``` -`cargo test` i `go test ./...` (agenta) należą tylko do gałęzi Linux. Jeśli testy nie przejdą, DEB/RPM nie są publikowane, ale builder nadal uruchamia cross-build FreeBSD i może opublikować repo OPNsense. Stan jest śledzony osobno w `last_linux_commit`, `last_opnsense_commit` i (jeśli włączone) `last_freebsd_commit`; kolejny cykl ponawia tylko brakującą gałąź. +`cargo test` i `go test ./...` (agenta) należą tylko do gałęzi Linux. Jeśli testy nie przejdą, DEB/RPM/SUSE nie są publikowane, ale builder nadal uruchamia cross-build FreeBSD i może opublikować repo OPNsense. Stan jest śledzony osobno w `last_linux_commit`, `last_opnsense_commit` i (jeśli włączone) `last_freebsd_commit`; kolejny cykl ponawia tylko brakującą gałąź. ## Docker Agent: osobne pakiety Linux @@ -120,9 +122,11 @@ data/packages/deb/rustproxy_-_amd64.deb data/packages/deb/rustproxy-docker-agent_-_amd64.deb data/packages/rpm/x86_64/rustproxy--.x86_64.rpm data/packages/rpm/x86_64/rustproxy-docker-agent--.x86_64.rpm +data/packages/suse/x86_64/rustproxy--.x86_64.rpm +data/packages/suse/x86_64/rustproxy-docker-agent--.x86_64.rpm ``` -Obie paczki są podpisane istniejącym kluczem GPG repozytorium, a repo APT/DNF automatycznie zawiera oba produkty. Zmiana rewizji pakowania Linux (`PACKAGING_REVISION=5`) wymusza przebudowę także dla niezmienionego commita. +Wszystkie pakiety (DEB, DNF RPM i SUSE RPM) są podpisane istniejącym kluczem GPG repozytorium; metadane obu repozytoriów RPM również są podpisane. Każde repo zawiera `rustproxy` i `rustproxy-docker-agent`. Zmiana rewizji pakowania Linux (`PACKAGING_REVISION=6`) wymusza przebudowę także dla niezmienionego commita. Instalacja na hoście Docker (uruchom Docker Engine wcześniej): @@ -147,6 +151,25 @@ Konfiguracja i klucze pozostają po aktualizacji: `/etc/rustproxy/docker-agent.e W przypadku przechodzenia z instalacji ręcznej na paczkę: jednostka w `/etc/systemd/system/rustproxy-docker-agent.service` ma pierwszeństwo przed jednostką paczkowaną w `/usr/lib/systemd/system`. Należy zachować token/certyfikat, zatrzymać usługę, przenieść ręczną jednostkę poza katalog systemd i wykonać `systemctl daemon-reload` przed zainstalowaniem paczki. Głównego `rustproxy` i jego konfiguracji to nie dotyczy. +## SUSE / openSUSE / openSUSE Leap — RPM / Zypper + +Gałąź Linux buduje dodatkowo **dwie natywne paczki RPM dla SUSE** z tego samego commita: `rustproxy` i `rustproxy-docker-agent`. Mają inne zależności niż paczki dla RHEL (m.in. `shadow` zamiast `shadow-utils`) i oddzielne, podpisane repozytorium `suse/x86_64` z metadanymi `repomd.xml.asc` oraz informacją `SUSE-BUILD-INFO.txt`. DNF/YUM nie jest zmieniany. Paczki SUSE mają kompresję gzip dla zgodności ze starszymi klientami RPM. + +Dla systemów SUSE z Pythonem systemowym starszym niż 3.10 paczka serwera dopuszcza doinstalowanie wersjonowanego Pythona (z `pip`), np. `python311` i `python311-pip`. Lokalny wrapper `/usr/libexec/rustproxy/python3` jest dodawany wyłącznie do ścieżki `PATH` usługi RustProxy przez drop-in systemd. **Nie podmienia** systemowego `/usr/bin/python3`. Zalecane środowiska: **SLES 15 SP6/SP7 i nowsze**, **SLES 16**, **openSUSE Leap 15.6 i 16.x**, **openSUSE Tumbleweed** z architekturą x86_64 i `glibc >= 2.34`. Dla starszych wydań z glibc 2.31 (np. SLES 15 SP5) paczka nie jest kompatybilna bez osobnego builda na starszym toolchainie. Zależności dla konkretnej wersji sprawdź przez `zypper` przed wdrożeniem. + +Instalacja po pierwszej publikacji (zamień `REPOSITORY_URL` na adres serwera pakietów): + +```sh +sudo rpm --import REPOSITORY_URL/repo-key.gpg +sudo zypper addrepo --refresh --gpgcheck REPOSITORY_URL/suse/x86_64/ rustproxy-suse +sudo zypper refresh rustproxy-suse +sudo zypper install rustproxy +# Opcjonalnie, na hoście z Docker Engine: +sudo zypper install rustproxy-docker-agent +``` + +Aktualizacja: `sudo zypper update rustproxy rustproxy-docker-agent` (agent tylko gdy zainstalowany). Pakiety i repozytorium są publikowane atomowo wraz z APT/DNF jako część gałęzi Linux. Jeśli builder miał już wydanie z tą samą wersją, `PACKAGING_REVISION=6` wymusi jednorazową przebudowę; gałęzie OPNsense/FreeBSD zachowują dotychczasowy stan. **Paczki RPM nie znajdują się w samym archiwum projektu** — powstają po uruchomieniu buildera na źródłach RustProxy. + ## OPNsense repo Publiczny root `OPNSENSE_REPOSITORY_URL` zawiera m.in.: @@ -206,7 +229,7 @@ FREEBSD_RUST_TOOLCHAIN=1.88.0 APPLY_FREEBSD_PATCHES=1 ``` -`RUN_LINUX_TESTS=1` jest domyślne. Testy są bramką tylko dla DEB/RPM i nie wpływają na gałąź OPNsense. Ustaw `0`, jeśli chcesz całkowicie pominąć testy Linux. +`RUN_LINUX_TESTS=1` jest domyślne. Testy są bramką tylko dla DEB/RPM/SUSE i nie wpływają na gałąź OPNsense. Ustaw `0`, jeśli chcesz całkowicie pominąć testy Linux. `OPNSENSE_RETENTION=10` zachowuje ostatnie 10 wersji pakietu dla danej serii/architektury OPNsense. `0` wyłącza usuwanie starych wersji. @@ -292,7 +315,7 @@ configctl rustproxy start ``` Obsługa miękkiego przeładowania zwiększa `OPNSENSE_PACKAGING_REVISION` do `4`. -Pakowanie Linux ma `PACKAGING_REVISION=5`, a natywne FreeBSD `FREEBSD_NATIVE_PACKAGING_REVISION=2`. Każdy kanał otrzymuje osobną aktualizację przy zmianie swojej rewizji. +Pakowanie Linux ma `PACKAGING_REVISION=6`, a natywne FreeBSD `FREEBSD_NATIVE_PACKAGING_REVISION=2`. Każdy kanał otrzymuje osobną aktualizację przy zmianie swojej rewizji. ## DEB/RPM: dostęp do plików strony i zewnętrznych certyfikatów @@ -323,7 +346,7 @@ Test pakowania jest dostępny w pełnym repozytorium developerskim (nie jest do **Uwaga FreeBSD:** `newsyslog` działa przez zmianę nazwy pliku, nie ma `copytruncate`. Pliki JSONL i inne logi otwarte bezpośrednio przez aplikację muszą być przez nią ponownie otwierane po rotacji. W przeciwnym razie proces może pisać do poprzedniego (przeniesionego) pliku; zachowanie nie jest identyczne z Linux. Reguły są instalowane, ale na działającym OPNsense należy zweryfikować sposób otwierania plików przez RustProxy. -Bieżąca rewizja pakowania Linux wynosi `PACKAGING_REVISION=5` i `OPNSENSE_PACKAGING_REVISION=4`; nowy kanał używa `FREEBSD_NATIVE_PACKAGING_REVISION=2`. `check-and-build.sh` sprawdza osobno rewizje pakowania Linux, OPNsense i FreeBSD native; nowa wersja samej wtyczki przebudowuje **tylko OPNsense**, nawet przy niezmienionym SHA aplikacji. Rewizja pakietu PKG zwiększy się automatycznie. W przypadku zmiany rewizji Linux analogicznie odświeżane są DEB/RPM. Konfiguracja w `/etc/logrotate.d/rustproxy` jest oznaczona jako `noreplace`, więc lokalna wersja zmodyfikowana przez administratora może zostać zachowana (zależnie od menedżera pakietów). +Bieżąca rewizja pakowania Linux wynosi `PACKAGING_REVISION=6` i `OPNSENSE_PACKAGING_REVISION=4`; nowy kanał używa `FREEBSD_NATIVE_PACKAGING_REVISION=2`. `check-and-build.sh` sprawdza osobno rewizje pakowania Linux, OPNsense i FreeBSD native; nowa wersja samej wtyczki przebudowuje **tylko OPNsense**, nawet przy niezmienionym SHA aplikacji. Rewizja pakietu PKG zwiększy się automatycznie. W przypadku zmiany rewizji Linux analogicznie odświeżane są DEB/RPM. Konfiguracja w `/etc/logrotate.d/rustproxy` jest oznaczona jako `noreplace`, więc lokalna wersja zmodyfikowana przez administratora może zostać zachowana (zależnie od menedżera pakietów). Kontrola po zainstalowaniu: diff --git a/SHA256SUMS b/SHA256SUMS index 1725086..29bc7ae 100644 --- a/SHA256SUMS +++ b/SHA256SUMS @@ -1,13 +1,13 @@ -c92255b37b57e5356a10e88a8be14c856e9ef4372379c48423d69db7a1365625 .env.example +2bfb200c5ddfa603746de1d5cb70ad43ca9c041bbc5ed361a9ec244c764bd4cf .env.example 17298e7669ed82b4c98abfce803e1a3f0a265b0abdc2567bf1316aa15e98aad3 Dockerfile -16821f51ece84db491da19b64f1129710fb46288e9807abe31e1000fe33f72df README.md +bf55ac0d7435b5152c0f5af491d12977c795924a4fb0094569c66e49f7f961d3 README.md 862263fa1f46c20f0d1e4dac5ffcc75abd55c08211b2c3864c5f8764b9d87793 dashboard/.dockerignore ced0339cb93478c2faf7b7b74215fe03375086e11ca957bd8892b52802fbbd3a dashboard/Dockerfile -bd2ba3a11ee715ba41a94f3301bec4ce83d7177489190a755e165112df50f112 dashboard/app.py -6447c64295ac62dd88d03fc796344f8702d6af54586720bb3e1240eb4f16db42 dashboard/web/app.js +bc13583e4dc80d4914c7a82a06c1390b5118d4821c7d081f99d68a38e1156bac dashboard/app.py +3b03fe39336fdfb9cd4abc2fa9a47c335afd72fcc4a868375b6fd93ab4e98a71 dashboard/web/app.js f1ac0fb5c4da97db09ff328cb86f4bc763fbdd84d7310d6e8e713be1c8707bb9 dashboard/web/favicon.svg -df2483e63e8559f41da83712e94b5f216faff38f4786fd2c804eac4576645c23 dashboard/web/index.html -2b5a34085be972372401abc9af16e2c14cc4e682fac448afb7c6f364d61b8649 dashboard/web/style.css +05821c98841c783014496d88192639609408e7907c3ac15687e6aafd966c5687 dashboard/web/index.html +94010e2be028d8153d1ffe9142e0a5aeb6d484c1edf5cb7318d70c5e32b5c985 dashboard/web/style.css ebb5e6eefe375ca1357d96f6a7344424c43df0bc51bc01ee66a459e54ef4b3c7 docker-compose.yml 7da761300aef6cf22ce28c1c7a55414b692814023e4d540a3f3ec4111c62926c http/nginx.conf 77e898aebb54f8acf39d3eb1fb348e7f41532da1b0a9e1820a717fdcde406f71 opnsense/patches/0.20.0/0001-opnsense-build.patch @@ -40,24 +40,26 @@ d4fc4b261c8252afbc6f403f828656cb7a49174de8cd239a233f5475d4cfeacd opnsense/plugi c8dde46217c008bfc31420c19ecbd31e3db6d71ee48f99be856ad40ca3c7f490 packaging/freebsd/rustproxy.rc 79122afbd5964a87c0d933abe8b34745d4189e2a586d5918a82efbb9b2f50864 packaging/rustproxy-filesystem-access.md 0f7970888117b4bc810ad3f6abc6796f189d34e4863875b2501785e689471be6 packaging/rustproxy.logrotate +b5845f5510adcc3a63ccc710d8e893b33336051651917fa533e8b70df2e2991d packaging/suse-python3 eee3cb8959cb90cd1b5b320ec4674892e5d1a987049d1028dae39c3bdc9f3dc7 scripts/apply-freebsd-patches.sh -a869ece6aef358abd5901474c5c2201e74bfc56d24bfe9931ad5cc3837aea215 scripts/build-freebsd-release.sh -d197c25fd346a2cd2a516434a8d9fab304ae6fbf3b215e4f9ea35e6efbc4f417 scripts/build-linux-release.sh -01aaa5ecd63e15f3a5436ca394d26308f7616117233dcac8a74a6db73ab68142 scripts/build-opnsense-release.sh +d1f2ac24d6742afed8d46fe827373cd4b3febebfcccf15f7265bed0cf8ec4c9c scripts/build-freebsd-release.sh +345377ae905dd33e96ee1c7d92728fdd28bd7fab4b9ef448fbe2d105ec89771f scripts/build-linux-release.sh +43a51a2734b5f2629598c3d84ca656480a46c2d09bc5b0b858e92aa6c89151ed scripts/build-opnsense-release.sh 16bafbba1eb2000b42c754bae92fee43301e57e0859e2cef17be2550006ab111 scripts/build-opnsense.sh ed581639a606323d4e91e632bc40a9be7037570f91cdef4264e4db0ca130ee8e scripts/build-release.sh -62fc5506b3786a1c943299a3d8107224dadb1b5bdee068acbbd4f649e7edc13b scripts/check-and-build.sh +f5e2be2a0128e0d768c3ed4b151b21dfd39d35a688a4c3f6fc35877c3e2ee434 scripts/check-and-build.sh cba164bde8967045bfb76de7eff46d4407dfb7ed2bc861fbc600782551d1629e scripts/ensure-rust-toolchain.sh -6cc8f506dd72189af34ed22334467e9af022690860edcc902e80b2ae976384ea scripts/entrypoint.sh +a26a5ade31962030a63bad36479c153116a5a6c87e518fbe4cfad1746eb5f9cd scripts/entrypoint.sh c8402314cbcf87c30eb521a273a13628eccb78112acb85e0e85c9a7679550cca scripts/generate-freebsd-index.sh -4220710396d0670d5c9ebcc31c6c4d59073d2b1c192f08268a3ea49164d1dcbd scripts/generate-index.sh +d3193e4bbfe3d853db003610318815fdfc295fa501affffd3e18db4c7074a5a2 scripts/generate-index.sh 80f49932346268f2cd63cbfe4814c666cd665661e82c25f2e99883929ecae0c0 scripts/generate-opnsense-index.sh 094c603f30f6a41bddeedfefa9e2c260dc97f849f0a690475ebe128ce4b49475 scripts/generate-opnsense-repo.py -40186599540f6886188abda5dac72bc85d15b9b71ce20788061131bfcd519cb7 scripts/init-storage.sh -4fdb7f98e83a262e9ad22f08fd5dd776993009f7b22623dfa9b04f554e48ac3c scripts/lib.sh +5aae7f35cc09576c07f8c57ce59cb6153840be15f187e0cf538d6987780f670a scripts/init-storage.sh +13d66803d2125156ff64cb548cc5982210cd17161375eaebf5d0716a58a8ffcd scripts/lib.sh de4fbbb973d9cddb170ef1e9f4f6f7896018ed5e6184594c9636c0215adf5233 scripts/normalize-systemd-unit.py 0eca8ef60f15dce0c5651fc8a55de10e0d9a11f3816f04153608abcbe2e2e1d8 scripts/package-freebsd.sh b098fa629f9fcc1a54baab3d46b28721eb582c314e084b3210259bf157c124a6 scripts/package-opnsense.sh -4ad289bc2c0e400b39a8d1bcf86395d7576c88e71b678ba8b893ccb72ac35465 scripts/prepare-agent-package.sh -46908bfac309688340be72edded60efaecd765aa151f520a2491952619f53a43 scripts/prepare-package.sh -2b6d2dc393be6dd5ba5184e6ccd068a8faf193bcd280f349a4b1da890187a79f start.sh +37233bdc0e14cdf32a18095fffc5fb219795ec7e838a112eb38fa29195a5d25c scripts/prepare-agent-package.sh +fc8c6ae8e35fb68f4851344ddf014759b7bac4f2d07b6b8bb383b3289e3ca23b scripts/prepare-package.sh +4bd555061e9a50faa05e2f8c095da2a6581e19b8d4c7fe01d791e59f5dd2f597 start.sh +bc54e4b93202454c298d1e67aa68f126e25b8c2b20e62db46a89932fdacd2ba9 tests/test_suse.py diff --git a/dashboard/app.py b/dashboard/app.py index 2651721..9a6fb15 100644 --- a/dashboard/app.py +++ b/dashboard/app.py @@ -26,9 +26,10 @@ PORT = int(os.environ.get("DASHBOARD_PORT", "8000")) CACHE_SECONDS = max(1, int(os.environ.get("DASHBOARD_CACHE_SECONDS", "15"))) MAX_PACKAGES = 5000 -SITES = ("linux", "opnsense", "freebsd") +SITES = ("linux", "suse", "opnsense", "freebsd") META_PATHS = { "linux": Path("LINUX-BUILD-INFO.txt"), + "suse": Path("SUSE-BUILD-INFO.txt"), "opnsense": Path("opnsense/BUILD-INFO.txt"), "freebsd": Path("freebsd/BUILD-INFO.txt"), } @@ -37,6 +38,7 @@ REPO_URLS = { "opnsense": os.environ.get("OPNSENSE_REPOSITORY_URL", "http://localhost:18766").rstrip("/"), } REPO_URLS["freebsd"] = REPO_URLS["opnsense"] + "/freebsd" +REPO_URLS["suse"] = REPO_URLS["linux"] + "/suse" DEB_FILENAME = re.compile(r"^(?P.+?)_(?P[^_]+)_(?P[^_]+)\.deb$") RPM_FILENAME = re.compile( @@ -98,7 +100,7 @@ def publication_info(current: Path, channel: str) -> dict[str, object]: "built_at": None, "date_source": "unknown", } - if channel == "linux" and info["app_version"]: + if channel in ("linux", "suse") and info["app_version"]: info["package_version"] = f"{info['app_version']}-{info['package_release']}" if info["package_release"] else info["app_version"] stamp = raw.get("built_at", "") @@ -189,6 +191,7 @@ def generate_catalog(repository: Path = REPOSITORY) -> dict[str, object]: folders = ( ("linux", "deb", "linux", current / "apt" / "pool", "*.deb"), ("linux", "rpm", "linux", current / "rpm" / "x86_64", "*.rpm"), + ("suse", "rpm", "suse", current / "suse" / "x86_64", "*.rpm"), ("opnsense", "pkg", "opnsense", current / "opnsense", "*.pkg"), ("freebsd", "pkg", "freebsd", current / "freebsd", "*.pkg"), ) diff --git a/dashboard/web/app.js b/dashboard/web/app.js index 79baef4..b80d0cf 100644 --- a/dashboard/web/app.js +++ b/dashboard/web/app.js @@ -3,8 +3,8 @@ 'use strict'; const el = (id) => document.getElementById(id); - const CHANNEL_LABELS = {linux:'Linux',opnsense:'OPNsense',freebsd:'FreeBSD'}; - const INSTALL_NAMES = {deb:'Debian / Ubuntu',rpm:'RHEL / Rocky / Alma / Fedora',opnsense:'OPNsense',freebsd:'FreeBSD native'}; + const CHANNEL_LABELS = {linux:'Linux',suse:'SUSE / openSUSE',opnsense:'OPNsense',freebsd:'FreeBSD'}; + const INSTALL_NAMES = {deb:'Debian / Ubuntu',rpm:'RHEL / Rocky / Alma / Fedora',suse:'SUSE / openSUSE / Leap',opnsense:'OPNsense',freebsd:'FreeBSD native'}; const SECTION_LABELS = {overview:'Overview',packages:'Packages & versions',install:'Installation',repository:'Repositories'}; const esc = (value) => String(value ?? '').replace(/[&<>"']/g, (char) => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[char])); const collator = new Intl.Collator('en', {numeric:true,sensitivity:'base'}); @@ -78,11 +78,12 @@ function buildCard(build, channel) { const live = !!build?.published; const commit = build?.source_commit ? build.source_commit.slice(0,9) : '—'; - const subtitle = channel === 'linux' ? 'APT / DNF · amd64 + x86_64' : channel === 'opnsense' + const subtitle = channel === 'linux' ? 'APT / DNF · amd64 + x86_64' : channel === 'suse' + ? 'RPM / Zypper · x86_64' : channel === 'opnsense' ? `PKG · ${build?.opnsense_series || 'FreeBSD'}` : `PKG · ${build?.freebsd_abi || 'Native'}`; const version = build?.package_version || (live ? build?.app_version : '') || '—'; return `
-
${esc(CHANNEL_LABELS[channel].toUpperCase())} / ${channel === 'linux' ? 'SIGNED' : 'PKG'}${live ? 'PUBLISHED' : 'NOT BUILT'}
+
${esc(CHANNEL_LABELS[channel].toUpperCase())} / ${['linux','suse'].includes(channel) ? 'SIGNED' : 'PKG'}${live ? 'PUBLISHED' : 'NOT BUILT'}
${esc(version)}
${esc(subtitle)}
BUILD DATE${esc(formatDate(build?.built_at))}
COMMIT${esc(commit)}
`; @@ -109,7 +110,7 @@ setText('hero-commit', main?.source_commit ? main.source_commit.slice(0,12) : '—'); el('hero-date').title = dateLabel(main?.date_source); setText('stat-packages', formatNumber.format(data.summary?.packages_count || 0)); - setText('stat-channels', `${data.summary?.channels_published || 0} / 3`); + setText('stat-channels', `${data.summary?.channels_published || 0} / 4`); setText('stat-date', formatShortDate(data.summary?.latest_build_at)); setText('stat-version', heroVersion); setText('stat-release', main?.package_version ? `Package: ${main.package_version}` : 'No release published yet'); @@ -121,8 +122,8 @@ el('sidebar-status').classList.toggle('waiting', !ready); el('sidebar-status').querySelector('span').textContent = ready ? 'REPOSITORY ONLINE' : 'WAITING FOR DATA'; const side = el('side-channels'); - side.innerHTML = ['linux','opnsense','freebsd'].map((channel) => `${esc(CHANNEL_LABELS[channel])}${channel === 'linux' ? 'APT / DNF' : 'PKG'}`).join(''); - el('build-grid').innerHTML = ['linux','opnsense','freebsd'].map((channel) => buildCard(data.builds[channel],channel)).join(''); + side.innerHTML = ['linux','suse','opnsense','freebsd'].map((channel) => `${esc(CHANNEL_LABELS[channel])}${channel === 'linux' ? 'APT / DNF' : channel === 'suse' ? 'RPM / Zypper' : 'PKG'}`).join(''); + el('build-grid').innerHTML = ['linux','suse','opnsense','freebsd'].map((channel) => buildCard(data.builds[channel],channel)).join(''); const recent = data.packages.filter((pkg) => state.site === 'linux' || pkg.channel === state.site).slice(0,6); el('recent-rows').innerHTML = recent.length ? recent.map((pkg) => tableRow(pkg,true)).join('') : 'No packages published yet. The catalog will populate after the first build.'; } @@ -157,6 +158,7 @@ function instructions(kind, data) { const urls = data.repository_urls || {}; const linux = origin(urls.linux); + const suse = origin(urls.suse || `${linux}/suse`); const opnsense = origin(urls.opnsense); const freebsd = origin(urls.freebsd); const distribution = data.apt_distribution || 'stable'; @@ -204,6 +206,21 @@ ].join('\n'), }; } + if (kind === 'suse') { + return { + description:'Add the signed RPM repository with Zypper on SUSE Linux Enterprise, openSUSE Leap or Tumbleweed.', + signature:'GPG SIGNED', + note:'x86_64. Minimum glibc: 2.34; intended for SLES 15 SP6+, SLES 16+, Leap 15.6+, and Tumbleweed. Check Python >= 3.10 dependencies.', + reference:`${suse}/x86_64/repodata/repomd.xml`, + agent:'sudo zypper install rustproxy-docker-agent', + code:[ + `sudo rpm --import ${linux}/repo-key.gpg`, + `sudo zypper addrepo --refresh --gpgcheck ${suse}/x86_64/ rustproxy-suse`, + 'sudo zypper refresh rustproxy-suse', + 'sudo zypper install rustproxy', + ].join('\n'), + }; + } if (kind === 'opnsense') { return { description:'Fetch the pkg repository configuration and install the os-rustproxy plugin.', @@ -252,7 +269,7 @@ setText('install-command', instructionsData.code); setText('install-note', instructionsData.note); // Docker discovery agent is only built for Linux DEB/RPM. - const hasDockerAgent = (kind === 'deb' || kind === 'rpm') && !!instructionsData.agent; + const hasDockerAgent = (kind === 'deb' || kind === 'rpm' || kind === 'suse') && !!instructionsData.agent; el('agent-card').hidden = !hasDockerAgent; el('install-extra-grid').classList.toggle('single-card', !hasDockerAgent); setText('trust-index', hasDockerAgent ? '02' : '01'); @@ -279,6 +296,12 @@ {name:'RPM repomd.xml',url:`${url.linux}/rpm/x86_64/repodata/repomd.xml`}, {name:'Build info',url:`${url.linux}/LINUX-BUILD-INFO.txt`}, ],true), + endpointsCard('SUSE / openSUSE','GPG SIGNED',url.suse,[ + {name:'GPG public key',url:`${url.linux}/repo-key.gpg`}, + {name:'RPM repomd.xml',url:`${url.suse}/x86_64/repodata/repomd.xml`}, + {name:'Metadata signature',url:`${url.suse}/x86_64/repodata/repomd.xml.asc`}, + {name:'Build info',url:`${url.linux}/SUSE-BUILD-INFO.txt`}, + ],true), endpointsCard('OPNsense','UNSIGNED PKG',url.opnsense,[ {name:'RustProxy.conf',url:`${url.opnsense}/RustProxy.conf`}, {name:'meta.conf',url:`${url.opnsense}/meta.conf`}, @@ -292,7 +315,7 @@ {name:'Build info',url:`${url.freebsd}/BUILD-INFO.txt`}, ],false), ].join(''); - el('metadata-table').innerHTML = ['linux','opnsense','freebsd'].map((channel) => { + el('metadata-table').innerHTML = ['linux','suse','opnsense','freebsd'].map((channel) => { const b = data.builds[channel] || {}; const rows = [ ['APPLICATION VERSION',b.app_version || '—','latest-value'], diff --git a/dashboard/web/index.html b/dashboard/web/index.html index 6a8ef67..d04f16b 100644 --- a/dashboard/web/index.html +++ b/dashboard/web/index.html @@ -27,12 +27,13 @@
Linux APT / DNF + SUSE / openSUSE RPM / Zypper OPNsense PKG FreeBSD PKG
@@ -79,7 +80,7 @@
02Build / packageRust + Go + FreeBSDCI ↗
-
03Repository publishAPT / RPM / PKGLIVE ●
+
03Repository publishAPT / RPM / Zypper / PKGLIVE ●
@@ -87,7 +88,7 @@
01 / CATALOG PACKAGES—All published artifacts
-
02 / ACTIVE CHANNELS—Linux · OPNsense · FreeBSD
+
02 / ACTIVE CHANNELS—Linux · SUSE · OPNsense · FreeBSD
03 / LATEST BUILD—Latest publication time
04 / CURRENT VERSION—Application version
@@ -103,16 +104,16 @@