---
title:  "Synchroniseer een bestaande RPM repo"
excerpt: "RPM repo's zorgen ervoor dat we software op RHEL gebasseerde systemen kunnen installeren. Uit veiligheidsredenen kan het interessant zijn om een volledige kopie van zo'n repo te hebben."
coverImage: "/SyncRPM/SyncRPM-cover.png"
date:   "2023-07-24T12:00:00.000Z"
author: Eli Winderickx
hero_image: /SyncRPM-cover.png
category: RPM,Repos,Expert Tip
---
## De basis
RPM-bestanden bevatten alle bestanden die geïnstalleerd moeten worden alsook de permissies, eigenaren en groepen die op alle bestanden toegepast worden. Daarnaast ook welke vereisten de software heeft maar ook welke conflicterende pakketten eventueel bestaan. Dit is jarenlang een heel eenvoudige manier geweest om pakketten te installeren. Een grote tekortkoming aan RPM is dat het niet automatisch vereisten en updates kan doen. Dat moet dan manueel door andere RPM-bestanden te downloaden en die dan eerst te installeren. Als die dan opnieuw vereisten hebben, voel je al aankomen dat dit niet praktisch is.

DNF (oftewel `DaNdiFied Yellowdog Updater Modified`) is een repo-gebasseerde packagemanager. Deze kan wel doen wat we ontbreken in RPM. Door middel van repo's gedefinieerd in `/etc/yum.repos.d/` weet DNF waar software beschikbaar is voor ons toestel en welke versie van die software geïnstalleerd moet worden. Zo'n repo bevat simpelweg een oplijsting met alle beschikbare RPM-bestanden en daarnaast de metadata van die pakketten. Als we zo'n repo willen gebruiken, kunnen we een repo-bestand aanmaken in `/etc/yum.repos.d`. Hieronder een bestaand voorbeeld:

```
[satellite-client-6-for-rhel-9-x86_64-eus-rpms]
name = Red Hat Satellite Client 6 for RHEL 9 x86_64 - Extended Update Support (RPMs)
baseurl = https://cdn.redhat.com/content/eus/rhel9/$releasever/x86_64/sat-client/6/os
enabled = 0
gpgcheck = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
sslverify = 1
sslcacert = /etc/rhsm/ca/redhat-uep.pem
sslclientkey = /etc/pki/entitlement/6563172807305005622-key.pem
sslclientcert = /etc/pki/entitlement/6563172807305005622.pem
sslverifystatus = 1
metadata_expire = 86400
enabled_metadata = 0
```

Hierin staat de naam, waar de software beschikbaar is, of we de repo willen gebruiken en verschillende manieren om de integriteit van het pakket te vrijwaren. Vooral de baseurl is hier interessant. We kunnen hier in principe alles opgeven wat we willen; een webadres, FTP-locatie of zelfs een simpele map op de server.

### Een repo aanmaken
Een volgende stap zou nu kunnen zijn dat we RPM-pakketten downloaden, in een map zetten en onze eigen repo opzetten. Dat gaat heel eenvoudig
```
sudo dnf install -y createrepo
mkdir -p /var/tmp/repos/<software>
curl https://link/to/software.rpm -o /var/tmp/repos/<software>/<software>.rpm
createrepo /var/tmp/repos/<software>
```

Vanaf nu kunnen we een extra repo bestand aanmaken waar de baseurl naar een map verwijst.
> Probeer ook steeds de GPG-key beschikbaar te stellen. Deze gaat meestal naast het RPM-bestand te downloaden zijn. Dit zal er voor zorgen dat de integriteit van het pakket correct blijft.

```
[local-slack-repo]
name=Local Slack Repository
baseurl=file:///var/tmp/repos/slack
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SLACK
```

Als we dan info opvragen van de software, zien we alle relevante informatie maar ook dat deze van onze lokale repo afkomstig is. Hier heb je zo'n voorbeeld van:
![Info over het Slack-softwarepakket](/SyncRPM-Slack.png)

Handig om te weten maar opnieuw niet handig als we honderden softwarepakketten hebben. Gelukkig kunnen we bestaande repo's ook volledig synchroniseren.

### Synchroniseren van bestaande repo's
Zorg er eerst voor dat je alleen de repo's activeert die je nodig hebt. Alle andere deactiveer je best. Ofwel door `enabled=0` te zetten in het repo bestand ofwel met `sudo subscription-manager repos --disable="*"` uit te voeren. Met `sudo dnf repolist` kan je dan controleren of je een juiste subset hebt.

Als `dnf-utils` op het toestel staat, kan je meteen verder anders even installeren:

```
sudo dnf install yum-utils
# Ofwel
sudo dnf install dnf-utils
```

Daarna kunnen we met `reposync` een kopie maken van alle beschikbare software pakketten. Met onderstaand commando downloaden we alleen de laatste versie. Daarnaast downloaden we de metadata. Doen we dat niet moeten we zelf een `createrepo` op de map uitvoeren. Tot slot slaan we de bestanden op in een logische map. In dit geval `/var/tmp/repos`.
```
reposync --newest-only --download-metadata --destdir /var/tmp/repos
```

Dit commando kan je gerust in een cronjob of Systemd timer zetten om regelmatig uit te voeren. Zo blijven jouw pakketten ook up to date en kan je telkens de laatste versie aanbieden.

Om nu deze pakketten beschikbaar te maken naar andere servers, kan je best een webserver opzetten. Dit gaat de eenvoudigste methode zijn en kan je verder ook eenvoudig beveiligen met een SSL verbinding. Dat is een handleiding op zichzelf maar de korte versie is:
- Installeer nginx (of httpd)
- Maak een entry aan voor de website in `/etc/nginx/conf.d/`
- Pas de document root aan naar `/var/tmp/repos` of de andere map die je gekozen hebt.
- Zorg dat de nginx user en groep ingesteld staat voor de repo-map
- Geef SELinux aan dat HTTP-verkeer ok is (`sudo chcon -R -t httpd_sys_content_t /var/www/html/local_repo`)
- Beveilig de 'site' met SSL

Veel succes!