Files
rust-package-builder/scripts/generate-index.sh
T
2026-10-19 22:39:09 +02:00

107 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
source /opt/rust-package-builder/scripts/lib.sh
OUT=${1:?output file required}
PACKAGE=${2:?package name required}
URL=$(trim_trailing_slash "$REPOSITORY_URL")
export OUT PACKAGE URL OPNSENSE_REPOSITORY_URL REPO_DISTRIBUTION REPO_COMPONENT
python3 <<'PY_END'
import html, os
out=os.environ['OUT']
package=os.environ['PACKAGE']
url=os.environ['URL']
dist=os.environ['REPO_DISTRIBUTION']
component=os.environ['REPO_COMPONENT']
opn_url=os.environ['OPNSENSE_REPOSITORY_URL'].rstrip('/')
h=html.escape
content=f'''<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="referrer" content="no-referrer">
<title>{h(package)} — package repository</title>
<style>
:root{{color-scheme:light dark;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}}
body{{max-width:920px;margin:0 auto;padding:42px 20px 70px;line-height:1.55}}
h1{{margin-bottom:.25rem}} .lead{{opacity:.78;margin-top:0}}
.card{{border:1px solid #8885;border-radius:12px;padding:18px;margin:18px 0}}
pre{{overflow:auto;padding:16px;border-radius:9px;background:#111;color:#eee;line-height:1.45}}
code{{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}}
a{{color:inherit}} .meta{{display:flex;gap:16px;flex-wrap:wrap;opacity:.82;font-size:.94rem}}
.ok{{font-weight:700}} ul{{padding-left:1.25rem}}
</style>
</head>
<body>
<h1>{h(package)} — package repository</h1>
<p class="lead">Signed DEB and RPM packages for x86_64/amd64.</p>
<div class="meta"><span class="ok">Repository active</span><span>{h(url)}</span><span>APT + RPM/DNF</span></div>
<div class="card">
<h2>Debian / Ubuntu</h2>
<pre><code>curl -fsSL {h(url)}/repo-key.gpg \\
| sudo gpg --dearmor -o /usr/share/keyrings/{h(package)}.gpg
echo "deb [signed-by=/usr/share/keyrings/{h(package)}.gpg] {h(url)}/apt {h(dist)} {h(component)}" \\
| sudo tee /etc/apt/sources.list.d/{h(package)}.list
sudo apt update
sudo apt install {h(package)}</code></pre>
</div>
<div class="card">
<h2>RHEL / Rocky / Alma / Fedora</h2>
<pre><code>sudo rpm --import {h(url)}/repo-key.gpg
sudo tee /etc/yum.repos.d/{h(package)}.repo &lt;&lt;'REPO'
[{h(package)}]
name={h(package)} Repository
baseurl={h(url)}/rpm/$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey={h(url)}/repo-key.gpg
REPO
sudo dnf install {h(package)}</code></pre>
</div>
<div class="card">
<h2>Docker discovery agent — separate Linux package</h2>
<p>Install <code>rustproxy-docker-agent</code> on the Docker host (systemd, Docker Engine, amd64/x86_64). This is independent from the RustProxy server and has no FreeBSD pkg.</p>
<pre><code># Debian / Ubuntu (after adding the signed APT repo above)
sudo apt install rustproxy-docker-agent
# RHEL / Rocky / Alma / Fedora (after adding the DNF repo above)
sudo dnf install rustproxy-docker-agent
# Locally display the token and certificate fingerprint
sudo rustproxy-docker-agent info --show-token
sudo systemctl status rustproxy-docker-agent</code></pre>
<p>Packages create persistent credentials and a systemd service; tokens are never printed to unattended package logs. Restrict the agent's HTTPS port to the RustProxy host.</p>
</div>
<div class="card">
<h2>OPNsense / FreeBSD pkg</h2>
<p>The OPNsense plugin is published separately because it uses the FreeBSD pkg format.</p>
<p><a href="{h(opn_url)}/">{h(opn_url)}/</a></p>
<p>Native FreeBSD pkg (if enabled): <a href="{h(opn_url)}/freebsd/">{h(opn_url)}/freebsd/</a>.</p>
</div>
<div class="card">
<h2>Repository files</h2>
<ul>
<li><a href="{h(url)}/repo-key.gpg">Public GPG key</a></li>
<li><a href="{h(url)}/apt/dists/{h(dist)}/InRelease">APT InRelease</a></li>
<li><a href="{h(url)}/rpm/x86_64/repodata/repomd.xml">RPM repomd.xml</a></li>
</ul>
<p>Supported targets: Debian 12/13, Ubuntu 24.04/26.04, RHEL 9/10; architecture: amd64/x86_64.</p>
</div>
</body>
</html>
'''
with open(out, 'w', encoding='utf-8') as f:
f.write(content)
PY_END