Konfigurationspakete mit equivs

Diesen Beitrag schrieb ich 12 Jahre und 2 Monate zuvor; die nachfolgenden Ausführungen müssen heute weder genau so nach wie vor funktionieren, noch meiner heutigen Meinung entsprechen. Behalte das beim Lesen (und vor allem: beim Nachmachen!) bitte stets im Hinterkopf.

Geschätzte Lesezeit: 3 Minuten

Mein Anspruch war nicht so arg hoch: ich wollte mir Debian-Pakete bauen, die zu einem Dienst – beispielsweise LDAP – die benötigten Konfigurationsdateien in ein System installieren; und zwar installieren, nicht modifizieren.

Gar nicht so einfach, denn ich fand wenig Information dazu! Deshalb notiere ich mir nachfolgend auf, wie ich es letztendlich gelöst habe – in ein paar Monaten weiß ich das aus dem Stehgreif ganz sicher nicht mehr ;-) Die Vorgehensweise soll hierbei sein:

  • Eventuelle Abhängigkeiten werden angegeben und mitinstalliert.
  • Die Konfiguration wird nach /etc/localwurst geschrieben.
  • Die originale Konfiguration wird mittels dpkg-divert gesichert.
  • Die localwurst-Konfiguration wird eingebunden, indem Symlinks gesetzt werden.
  • Falls benötigt wird der entsprechende Dienst neu gestartet.

Abhängigkeiten installieren

Es wird das Paket equivs benötigt.

$ apt-get install equivs

Das Template anpassen

Nun ist absehbar, dass ich mehr als ein Paket bauen möchte; also ist es sinnvoll, manche Default-Werte direkt anzupassen, das erspart mir viel Tipperei. Ich sichere mir also das ursprüngliche Template und bearbeite eine Kopie:

$ echo 5 > /usr/share/equivs/template/debian/compat
$ cp /usr/share/equivs/template.ctl /usr/share/equivs/template.ctl-ORIG
$ vim /usr/share/equivs/template.ctl
### Commented entries have reasonable defaults.
### Uncomment to edit them.
Section: misc
Priority: optional
Homepage: https://www.unixe.de/
Standards-Version: 3.6.2
 
Package: localwurst-...
Version: 0.1
Maintainer: Local Wurst # Pre-Depends: Depends: paket1, paket2
# Recommends: # Suggests: # Provides: # Replaces: Architecture: all
# Copyright: Changelog: /root/build/changelog/localwurst-...
# Readme: # Files: #  Extra-Files: /root/build/config/localwurst-.../localwurst-....tar.gz
Description: localwurst default configuration for ...
This package extends the system with the default localwurst ... configuration. 
 . 

Die drei Punkte bei localwurst-... sind Platzhalter; sie sollen verdeutlichen, dass sich der Name der Pakete immer aus localwurst- und einem sprechenden Anhang zusammensetzt – auch, um Überschneidungen zu vermeiden.

Arbeitsverzeichnis erstellen

Ich möchte im Verzeichnis /root/build arbeiten, also muss ich das zuerst noch erstellen:

$ mkdir /root/build

Das Paket anlegen am Beispiel localwurst-ldap

Im Arbeitsverzeichnis wird nun das Paket angelegt:

$ cd /root/build
$ equivs-control localwurst-ldap

Dann wird das Archiv mit den Konfigurationsdateien erstellt. Das Paket wird Konfigurationsdateien ins System einspielen; diese Dateien müssen dem Paket in Form eines Archivs mitgegeben werden. Zuerst also wird das Verzeichnis erstellt, in dem die Konfigurationsdateien liegen:

$ mkdir -p /root/build/config/localwurst-ldap/etc/localwurst/ldap

Nun werden die Konfigurationsdateien an Ort und Stelle kopiert.

$ cp /etc/nsswitch.conf /root/build/config/localwurst-ldap/etc/localwurst/
$ cp /etc/ldap.conf /root/build/config/localwurst-ldap/etc/localwurst/
$ mkdir /root/build/config/localwurst-ldap/etc/localwurst/ssl
$ cp /etc/ssl/dfn.crt /root/build/config/localwurst-ldap/etc/localwurst/ssl
$ cp /etc/ldap/ldap.conf /root/build/config/localwurst-ldap/etc/localwurst/ldap

Wie man an diesem Beispiel erkennt gibt es einen Unterschied:

  • einige der Dateien (Bsp. nsswitch.conf) liegen in /etc und
  • einige Dateien (Bsp. ldap.conf) liegen in /etc/ldap bzw. /etc/ssl (das Zertifikat)

Nun muss aus den Dateien noch das Archiv erstellt werden – das Archiv, das im Konfig-File Archiv unter dem Punkt Extra-Files: eingebunden wird!

$ cd /root/build/config/localwurst-ldap
$ tar cvfz localwurst-ldap.tar.gz etc/

Installationsroutine erstellen

Hierzu ist die Datei /root/build/localwurst-ldap zu bearbeiten.

Section: misc
Priority: optional
Homepage: https://www.unixe.de/
Standards-Version: 3.6.2
 
Package: localwurst-ldap
Version: 0.1
Maintainer: Local Wurst <pelle@localwurst.de>
Depends: libnss-ldap,
 nscd,
 ldap-auth-client,
 ldap-auth-config,
 ldap-utils,
 libpam-ldap,
 finger
Architecture: all
Changelog: /root/build/changelog/localwurst-ldap
Extra-Files: /root/build/config/localwurst-ldap/localwurst-ldap.tar.gz
File: postinst
 # Die Routine prüft ab, welche Konfigurationsdateien im Archiv vorhanden sind und
 # führt die Schritte für jedes einzelne davon aus. Das Paket installiert die Dateien
 # nach /etc/localwurst, bearbeitet die Originale mit dpkg-divert und setzt Symlinks.
 # Im Anschluss daran wird der nscd restartet - spezifisch eine LDAP-Sache.
 #!/bin/sh -e
 .
 set -e
 .
 PKG="localwurst-ldap"
 .
     if [ "$1" = configure ] ; then
 .
     tar xzfo /usr/share/doc/"$PKG"/"$PKG".tar.gz -C / 2>&1 > /dev/null
     tar tzf /usr/share/doc/"$PKG"/"$PKG".tar.gz -C / > .tmp
 .
     while IFS= read -r i 
     do
        if [ ! -d /$i ] ; then
          FILE=`basename $i` 
          CONFFILE="/`echo $i | sed -e 's/localwurst\///'`"
          dpkg-divert --add --package "$PKG" --divert $CONFFILE-orig --rename $CONFFILE
          [ ! -e $CONFFILE -o -L $CONFFILE ] && ln -sf /$i $CONFFILE
	fi
     done<".tmp"
 .
     fi 
 .
 #DEBHELPER#
 .
     /etc/init.d/nscd restart
     exit 0
File: prerm
 #!/bin/sh -e
 .
 set -e
 .
 PKG="localwurst-ldap"
 BASE="/etc/localwurst/ldap"
 .
  if [ "$1" = remove -o "$1" = purge ] ; then
 .
    tar tzfo /usr/share/doc/"$PKG"/"$PKG".tar.gz > .tmp
 .
   while IFS= read -r i     
    do
      if [ ! -d /$i ] ; then
        FILE=`basename $i`
        CONFFILE="/`echo $i | sed -e 's/localwurst\///'`"
        [ -L $CONFFILE ] && rm $CONFFILE
        dpkg-divert --remove --package "$PKG" --rename --divert $CONFFILE-orig $CONFFILE
      fi
     done<".tmp"
 .
 fi
 .
 rm -rf $BASE
 .
    #DEBHELPER#
 .
    exit 0
 Description: localwurst default LDAP configuration
  This package extends the system with the default localwurst LDAP configuration. 
  .
  <pelle@localwurst.de>

Changelog bauen

Das Changelog-File muss da liegen, wo man es im Konfig-File definiert hat; in diesem Fall ist das /root/build/changelog/localwurst-ldap:

localwurst-ldap (0.1) lucid; urgency=low
 
  * First version of package 
  * Added nsswitch.conf, dfn.crt, ldap.conf
 
 -- Local Wurst <pelle@localwurst.de>  Fri, 08 Jun 2012 18:34:21 -0200

Wichtig ist das Format des Changelog-Files: das muss immer streng eingehalten werden.

Das Paket bauen

Um das Paket final zu bauen, muss lediglich equivs-build gefolgt vom Paketnamen aufgerufen werden; der Rest passiert automatisch:

$ cd /root/build
$ equivs-build localwurst-ldap
dh_testdir
dh_testroot
dh_clean -k
dh_testdir
dh_testroot
dh_install
dh_installdocs
dh_installchangelogs
dh_compress
dh_fixperms
dh_installdeb
dh_gencontrol
dh_md5sums
dh_builddeb
dpkg-deb: building package `localwurst-ldap' in `../localwurst-ldap_0.1_all.deb'.
 
The package has been created.
Attention, the package has been created in the current directory,
not in ".." as indicated by the message above!

Der Vorgang ergibt also das File /root/build/localwurst-ldap_0.1_all.deb – die Nummer ist natürlich von der Versionsnummer abhängig. Und hat man einen Webserver entsprechend konfiguriert, kann man das Paket nun auf diesen Server werfen und in den Index aufnehmen:

$ cd /path/to/debpackages
$ apt-ftparchive packages . > Packages
$ gzip -9 Packages
$ apt-ftparchive release . > Release

Das lässt sich ganz prima scripten, cron-jobben oder was auch immer. (Sinnvollerweise signiert man seinen Kram dann auch noch, darauf gehe ich hier mal aber nicht näher ein.) Auf den Hosts muss dann der Server in /etc/apt/sources.list eingetragen werden, beispielsweise in der Form:

deb https://yourpackages.example.com/debpackages ./

Und dann kann auf einem beliebigen Host das Paket installiert auch schon werden:

$ apt-get update
$ apt-cache search ldap
$ localwurst-ldap - localwurst default configutation for ldap
$ apt-get install localwurst-ldap
$ dpkg --list|grep ldap
...
ii  localwurst-ldap             0.1              localwurst default LDAP configuration

Und das war’s auch schon – hat doch fast gar nicht weh getan, oder?

Ein Wort zum Schluss

Wie sicherlich ersichtlich wurde: eine allgemeingültige Anleitung zum Bauen der Konfigurationspakete kann und wird es nicht geben – zu unterschiedlich sind denn doch die Anforderungen. Während ein Dienst seine Konfiguration in /etc ablegt, packt ein anderer sie in einen Unterordner (Bsp. /etc/nullmailer), und wieder andere tun sowohl das eine als auch das andere (Bsp. LDAP mit /etc/ldap.conf und /etc/ldap/ldap.conf) – da bleibt nichts anderes, als die Pakete entsprechend zuzuschneiden und vor dem Einsatz sorgfältig zu testen.

Und dieser Weg ist natürlich nicht der Weisheit letzter Schluss. Es gibt sicherlich elegantere Methoden, insbesondere das mit dem .tmp-File gewinnt sicher keine Preise – aber für den Moment funktioniert es und tut exakt das, was es soll. Die große Feile kann immer noch angesetzt werden – das ist ja das Schöne!

Alle Bilder dieser Seite: © Marianne Spiller – Alle Rechte vorbehalten
Hintergrundbild: 2448x 2448px, Bild genauer anschauen – © Marianne Spiller – Alle Rechte vorbehalten

Eure Gedanken zu „Konfigurationspakete mit equivs“

Ich freue mich über jeden Kommentar, es sei denn, er ist blöd. Deshalb behalte ich mir auch vor, die richtig blöden kurzerhand wieder zu löschen. Die Kommentarfunktion ist über GitHub realisiert, weshalb ihr euch zunächst dort einloggen und „utterances“ bestätigen müsst. Die Kommentare selbst werden im Issue-Tracker und mit dem Label „✨💬✨ comment“ erfasst – jeder Blogartikel ist ein eigenes Issue. Über GitHub könnt ihr eure Kommentare somit jederzeit bearbeiten oder löschen.