BenBE's humble thoughts Thoughts the world doesn't need yet …

05.02.2010

Automatisches Bind9-Build mit MySQL-Support

Filed under: Server — Schlagwörter: , , , , — BenBE @ 20:02:56

Bereits seit längerer Zeit habe ich auf meinem Server einen Bind9 am Start. Und sei es, da man der Namensauflösung von Zensurprovidern nicht drauen kann. Nun passiert es relativ regelmäßig, dass für Bind neue Upstream-Pakete veröffentlicht werden. Diese enthalten jedoch standardmäßig zwei von mir benötigte Funktionen nicht: Gute Optimierung und – ganz wichtig – Zonen-Support via Datenbank-Annbindung. Da mir das manuelle Anpassen der nötigen Dateien irgendwie zu blöd ist, gibt’s nun hier ein Update dazu, wie man das ganze automatisieren kann. Für Ungeduldige: Ein fertiges Shellscript gibt’s am Ende.

Aber nun immer der Reihe nach. Um sich die Arbeit etwas zu vereinfachen, soll einem eigentlich das Tool apt-src eine Reihe von Aufgaben abnehmen. Nur leider hat dieses bei mir bisher noch nie vollständig funktioniert: Bestehende Änderungen wurden bei einem Paket-Upgrad des Source-Packages nicht übernommen. Daher hier ein kleiner Workaround zu diesem Problem.

Ein erster Schritt zu einer automatisierung ist hierbei das Anfertigen einer kleinen Verzeichnisstruktur und das Auslesen der benötigten Informationen. Da unter Debian für das Ablegen von Source-Paketen /usr/src vorgesehen ist, wird auch mein kleines Script dies tun. Ferner ist zu beachten, dass die genannten Daten zwar von verschiedenen Stellen abgefragt werden können, ich an dieser Stelle jedoch auf eine vereinfachte Methode zurückgreife, die ohne große Umstände in Bash-Skripten verwendet werden kann. Da unser Paketname mit „bind9“ feststeht, können wir diesen in unser Skript am Anfang in die Initialisierung aufnehmen:

#!/bin/bash
#Some Package specific configuration
SRC_ROOT=/usr/src
SRC_PKG=bind9

#Maintainer specific configuration
export NAME="Anonymous Coward"
export EMAIL="anonymous@coward.tld"

#Ensure our own location
cd ${$SRC_ROOT}

#Upgrade our existing source package with apt-src
apt-src update
apt-src upgrade ${SRC_PKG}

#Get currently installed Package version:
SRC_DIR=`echo ${SRC_PKG}-*/`
SRC_VER=""
for a in ${SRC_DIR}; do
    if [ "" != "${SRC_VER}" ]; then.
        echo "Version detection returned ambigious result!"
        exit 1
    fi

    SRC_VER=${a:${#SRC_PKG}}
    SRC_VER=${SRC_VER:1}
    SRC_VER=${SRC_VER%/}
done

#Fix the location for the Source Tree
SRC_DIR=${SRC_ROOT}/${SRC_DIR}

#Output some general information
echo Package: ${SRC_PKG}
echo Version: ${SRC_VER}
echo PkgRoot: ${SRC_ROOT}
echo Sources: ${SRC_DIR}

Damit dieser Teil funktioniert, muss das Source-Paket bereits vorher einmal mit apt-src geholt und entpackt worden sein. Dies geht am Einfachsten mit:

apt-src install bind9

Das obige Skript sollte dann etwa folgende Ausgabe liefern:

Package: bind9
Version: 9.6.1.dfsg.P3
PkgRoot: /usr/src
Sources: /usr/src/bind9-9.6.1.dfsg.P3/

Nun geht es darum, unsere Änderungen in den Paket-Source einfließen zu lassen. Hierfür gibt es eine Reihe von Möglichkeiten:

  • Dynamisches Ändern mit Search&Replace
  • Nutzen eines Patchfiles
  • Ein VCS zum Anwenden von Patches missbrauchen

Die letzten beiden Varianten stellen hierbei die zu bevorzugenden Möglichkeiten bei vielen, bzw. umfangreichen Änderungen dar, erfordern jedoch auch eine gewisse Vorbereitung der einzuspielenden Patches, da durch ungünstige Patches ansonsten eine automatische Anwendung der Änderungen verhindert werden kann. Daher werd ich im Folgenden die erste Variante nehmen und mit etwas sed-Magik mein Ziel erreichen.

Am Einfachsten geht dies mit dem Stream-Editor sed, wenn man die Aufrufe wie folgt umsetzt:

#Updating the rules file to configure some stuff
if sed s,--with-dlz-mysql=no,--with-dlz-mysql=yes, ${SRC_DIR}/debian/rules > ${SRC_DIR}/debian/rules~ ; then
    mv ${SRC_DIR}/debian/rules~ ${SRC_DIR}/debian/rules
else
    rm ${SRC_DIR}/debian/rules~
    echo "Error applying Enable MySQL Patch (1/2)"
    exit 1
fi

if sed s,--enable-threads,--disable-threads, ${SRC_DIR}/debian/rules > ${SRC_DIR}/debian/rules~ ; then
    mv ${SRC_DIR}/debian/rules~ ${SRC_DIR}/debian/rules
else
    rm ${SRC_DIR}/debian/rules~
    echo "Error applying Enable MySQL Patch (2/2)"
    exit 1
fi

if sed s,--with-dlz-ldap=yes,--with-dlz-ldap=no, ${SRC_DIR}/debian/rules > ${SRC_DIR}/debian/rules~ ; then
    mv ${SRC_DIR}/debian/rules~ ${SRC_DIR}/debian/rules
else
    rm ${SRC_DIR}/debian/rules~
    echo "Error applying Disable LDAP Patch"
    exit 1
fi

if sed s,--with-dlz-bdb=yes,--with-dlz-bdb=no, ${SRC_DIR}/debian/rules > ${SRC_DIR}/debian/rules~ ; then
    mv ${SRC_DIR}/debian/rules~ ${SRC_DIR}/debian/rules
else
    rm ${SRC_DIR}/debian/rules~
    echo "Error applying Disable BDB Patch"
    exit 1
fi

Mit diesen Zeilen wird nicht nur eine Konfiguration der Optionen vorgenommen, sondern im Fehlerfalle zusätzlich auch ausgegeben, was fehlgeschlagen ist. Wenn wir aber bereits an dieser Stelle angelangt sind, kann man auch gleich etwas Optimieren:

#Turn on better optimization when compiling
if sed 's,OPT = -O2,OPT = -O9,' ${SRC_DIR}/debian/rules > ${SRC_DIR}/debian/rules~ ; then
    mv ${SRC_DIR}/debian/rules~ ${SRC_DIR}/debian/rules
else
    rm ${SRC_DIR}/debian/rules~
    echo "Error applying Optimization Patch"
    exit 1
fi

Nach dem wir nun die benötigten Optionen konfiguriert haben, sollte nun noch der Changelog aktualisiert werden. Hierfür gibt es das Tool dch, bzw. debchange. Da wir ein Lokales Build haben möchten, muss für den ersten Changelog-Eintrag das Flag -l gesetzt werden. Alle anderen Einträge werden mit -a einfach angehangen. Für den im Changelog verwendeten Namen werden die Variablen NAME und EMAIL verwendet, die wir am Anfang des Scriptes bereits exportiert haben. Das Aktualisieren des Changelogs läuft somit durch folgende Zeilen:

#Update the Changelog
cd ${SRC_DIR}
dch -l benbe "Increased Optimization Level when compiling"
dch -a "Activated MySQL DLZ support"
dch -a "Deactivated LDAP DLZ support"
dch -a "Deactivated BDB DLZ support"

Um nun unser automatisch aktualisiertes Paket nutzen zu können, müssen wir dieses noch compilieren und in Debian-Pakete verpacken lassen. Auch hier helfen uns die vorhandenen Scripte recht gut:

#Compile and build the package
cd ${SRC_ROOT}
rm *_${SRC_VER}*benbe*.deb
apt-src build ${SRC_PKG}

Wenn auch dieser Schritt erfolgreich ist, so können die neu erzeugten Pakete installiert werden.

#Install the package
cd ${SRC_ROOT}
dpkg -i *_${SRC_VER}*benbe*.deb

Setzt man diese Teile zusammen, so erhält man ein einfaches Script, mit dem man mit einem Befehl auch relativ umfangreiche Source-Pakete, an denen mehrere Änderungen vorzunehmen sind, recht einfach in angepassten Versionen installieren kann. Was bei diesem Skript jedoch noch außen vor gelassen wurde, ist die Frage, ob die Patches bereits eingespielt wurden. Daher wird man bei Mehrfach-Ausführung in Bezug auf die Versionszählung wahrscheinlich unerwartet Ergebnisse erhalten. Da zudem die Anwendung der Patches ohne Kontextuale Prüfung erfolgt, sollte man auch hier Vorsicht walten lassen.

Flattr this!

Ein Kommentar »

  1. […] muss. Wie man sich diese Aufgabe etwas vereinfachen kann, habe ich in abgewandelter Form bereits an anderer Stelle für den Bind9 […]

    Pingback by Klarer Wine für mein Sparbuch « BenBE's humble thoughts — 26.02.2010 @ 02:44:59

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress