63 lines
2.2 KiB
Bash
63 lines
2.2 KiB
Bash
#!/bin/bash
|
|
# Laeuft als unprivilegierter User "mirror" (siehe entrypoint.sh, der als
|
|
# root die Verzeichnisrechte setzt und dann per setpriv hierher wechselt).
|
|
set -euo pipefail
|
|
|
|
: "${GPG_NAME:?GPG_NAME muss gesetzt sein}"
|
|
: "${GPG_EMAIL:?GPG_EMAIL muss gesetzt sein}"
|
|
: "${SYNC_INTERVAL_SECONDS:=21600}"
|
|
|
|
mkdir -p "$GNUPGHOME"
|
|
chmod 700 "$GNUPGHOME"
|
|
echo "allow-loopback-pinentry" > "$GNUPGHOME/gpg-agent.conf"
|
|
echo "pinentry-mode loopback" > "$GNUPGHOME/gpg.conf"
|
|
|
|
PASSPHRASE_FILE=/run/secrets/gpg_passphrase
|
|
if [ -z "${GPG_PASSPHRASE:-}" ] && [ ! -f "$PASSPHRASE_FILE" ]; then
|
|
PASSPHRASE_FILE=""
|
|
fi
|
|
|
|
# GPG-Key nur beim allerersten Start erzeugen. Das gnupg-Home liegt im
|
|
# bind-gemounteten ./gpg-Ordner neben der docker-compose.yml - der Key (und
|
|
# damit der Public Key, den alle Clients einmalig vertrauen) bleibt ueber
|
|
# Container-Neustarts/-Updates hinweg gleich UND ist direkt auf dem Host
|
|
# sichtbar/sicherbar, statt in einem anonymen Docker-Volume zu stecken.
|
|
if ! gpg --batch --list-secret-keys "$GPG_NAME" >/dev/null 2>&1; then
|
|
echo "[entrypoint] Erzeuge neuen Signing-Key fuer '$GPG_NAME <$GPG_EMAIL>' ..."
|
|
KEYPARAMS=$(mktemp)
|
|
{
|
|
echo "%echo Generating mirror signing key"
|
|
echo "Key-Type: RSA"
|
|
echo "Key-Length: 4096"
|
|
echo "Name-Real: $GPG_NAME"
|
|
echo "Name-Email: $GPG_EMAIL"
|
|
echo "Expire-Date: 0"
|
|
if [ -n "$PASSPHRASE_FILE" ]; then
|
|
echo "Passphrase: $(cat "$PASSPHRASE_FILE")"
|
|
else
|
|
echo "%no-protection"
|
|
fi
|
|
echo "%commit"
|
|
} > "$KEYPARAMS"
|
|
gpg --batch --gen-key "$KEYPARAMS"
|
|
rm -f "$KEYPARAMS"
|
|
else
|
|
echo "[entrypoint] Signing-Key existiert bereits, wird wiederverwendet."
|
|
fi
|
|
|
|
mkdir -p /srv/dnf
|
|
gpg --batch --yes --armor --export "$GPG_NAME" > /srv/dnf/RPM-GPG-KEY-mirror
|
|
echo "[entrypoint] Public Key nach /srv/dnf/RPM-GPG-KEY-mirror exportiert."
|
|
|
|
term_handler() {
|
|
echo "[entrypoint] Beende nach aktuellem Sync-Lauf ..."
|
|
exit 0
|
|
}
|
|
trap term_handler SIGTERM SIGINT
|
|
|
|
while true; do
|
|
/usr/local/bin/sync.sh || echo "[entrypoint] sync.sh ist mit Fehler beendet, naechster Versuch in ${SYNC_INTERVAL_SECONDS}s"
|
|
sleep "$SYNC_INTERVAL_SECONDS" &
|
|
wait $!
|
|
done
|