Homelab: systemd paden

Geschreven op en voor het laatst bijgewerkt op

Voor mijn homelab heb ik een eigen RPM repo server opgezet voor het hosten van mijn zelfgemaakte (zeer simpele) RPM pakket.

Als ik een nieuwe versie van mijn RPM pakket heb gebouwd komt hier een nieuw RPM bestand uit als resultaat. Dit verplaats ik dan naar de map (/var/www/html/rpms/) die gebruikt word door de RPM repo server.

Het updaten van de metadata hiervan is iets wat daarna moet om ervoor te zorgen dat de nieuwe RPM opgepikt word en beschikbaar word als client systemen om update(s) vragen.

Dit is iets wat ik in het begin altijd handmatig deed, tot ik me herinnerde dat systemd de mogelijkheid heeft om een service te draaien als er een map (of bestand) gewijzigd word.

Systemd path unit(s)

Wat dit regelt in systemd is de zogenaamde path unit. Dit is vergelijkbaar met een normale systemd unit, met een paar handigheidjes en eigenaardigheden:

  1. De bestandsnaam van de unit is een variant op de mapnaam die je in de gaten wilt houden, escaped met systemd-escape -p
  2. De unit roept, wanneer geactiveerd, een systemd service met dezelfde bestandsnaam aan

Hoe ziet zo’n path unit er dan uit? De map die ik in de gaten wil houden is /var/www/html/rpms/, dus de naam van de unit is var-www-html-rpms.path, en de naam van de service die automatisch word aangeroepen is var-www-html-rpms.service.

var-www-html-rpms.path

De path unit bevat het volgende:

[Unit]
Description=Monitor the rpms webserver directory

[Path]
PathChanged=/var/www/html/rpms/

[Install]
WantedBy=multi-user.target

var-www-html-rpms.service

En dan de service die daarbij hoort

[Unit]
Description=Rebuild the rpm repo (meta)data
ConditionPathIsDirectory=/var/www/html/rpms/

[Service]
Type=oneshot
ExecStart=/usr/bin/createrepo_c /var/www/html/rpms/

De service heeft geen Install sectie. Dit is geen fout, dit is expres gedaan zodat ik de service niet kan activeren of starten buiten de path unit om. Dat is namelijk niet de bedoeling.

Om dit hele verhaal te activeren is het alleen nodig om de var-www-html-rpms.path unit te starten, systemd doet de rest.