FROM almalinux:10

# dnf-plugins-core   -> dnf download, repoquery, config-manager
# createrepo_c       -> Repo-Metadaten bauen
# rpm-sign, gnupg2   -> Pakete umsignieren
# git, openssh-clients -> packages.yaml vor jedem Sync aus einem Git-Repo ziehen
# python3-pyyaml, jq -> packages.yaml (YAML) nach JSON wandeln und auswerten
# cpio               -> Pakete fuer die AppStream-Erzeugung teilweise entpacken
# rsync              -> privaten Paketstand pflegen + alle Fremdrepos zu
#                       einem gemeinsamen Repo zusammenfuehren
# util-linux-core    -> stellt setpriv (root -> mirror-User droppen) sicher
RUN dnf -y install epel-release \
    && dnf -y install \
        dnf-plugins-core \
        createrepo_c \
        rpm-sign \
        gnupg2 \
        git \
        openssh-clients \
        python3-pyyaml \
        util-linux-core \
        findutils \
        cpio \
        rsync \
        procps-ng \
        jq \
    && dnf clean all

# AppStream-Metadaten fuer Discover/GNOME Software: das noetige Werkzeug
# unterscheidet sich je nach Alma-Version.
#   - AlmaLinux 9: appstream-glib (aus EPEL) liefert `appstream-builder`,
#     das direkt ein Verzeichnis voller .rpm-Dateien einliest.
#   - AlmaLinux 10: appstream-glib ist (Stand jetzt) weder in AlmaLinux 10
#     selbst noch in EPEL 10 paketiert. Stattdessen wird `appstreamcli`
#     genutzt - dessen "compose"-Kommando ist aber NICHT im Basispaket
#     `appstream` enthalten, sondern im separaten Subpaket
#     `appstream-compose` (liegt im selben AlmaLinux-10-AppStream-Repo).
#     Ohne dieses Subpaket bricht `appstreamcli compose` zur Laufzeit mit
#     "AppStream Compose binary ... was not found" ab.
# sync.sh erkennt zur Laufzeit, welches der beiden Werkzeuge vorhanden ist.
# Ist keins von beiden installierbar, bricht der Build NICHT ab - die
# Discover-Katalogerzeugung wird dann zur Laufzeit einfach uebersprungen
# (Pakete bleiben trotzdem ganz normal per dnf/pkcon installierbar).
RUN (dnf -y install appstream-glib || dnf -y install appstream appstream-compose || dnf -y install appstream || \
        echo "WARNUNG (Build): weder appstream-glib noch appstream verfuegbar - AppStream/Discover-Metadaten werden zur Laufzeit uebersprungen.") \
    && dnf clean all

RUN useradd -r -m -d /var/lib/mirror-gpg mirror

COPY entrypoint.sh /usr/local/bin/entrypoint.sh
COPY run-as-mirror.sh /usr/local/bin/run-as-mirror.sh
COPY sync.sh /usr/local/bin/sync.sh
RUN chmod +x /usr/local/bin/entrypoint.sh /usr/local/bin/run-as-mirror.sh /usr/local/bin/sync.sh

RUN mkdir -p /srv/dnf /var/cache/mirror /var/lib/mirror-gpg \
    && chown -R mirror:mirror /srv/dnf /var/cache/mirror /var/lib/mirror-gpg

ENV HOME=/var/lib/mirror-gpg
ENV GNUPGHOME=/var/lib/mirror-gpg/.gnupg

# Bleibt root: entrypoint.sh chownt den bind-gemounteten ./gpg-Ordner (der dem
# Host gehoert, nicht dem Image) und wechselt danach per setpriv fest zu
# "mirror". Alles Weitere (Sync-Loop, git, dnf download, gpg) laeuft
# unprivilegiert.
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
