{"id":515,"date":"2010-02-05T20:02:56","date_gmt":"2010-02-05T19:02:56","guid":{"rendered":"http:\/\/blog.benny-baumann.de\/?p=515"},"modified":"2010-02-05T20:08:04","modified_gmt":"2010-02-05T19:08:04","slug":"automatisches-bind9-build-mit-mysql-support","status":"publish","type":"post","link":"https:\/\/blog.benny-baumann.de\/?p=515","title":{"rendered":"Automatisches Bind9-Build mit MySQL-Support"},"content":{"rendered":"<p>Bereits seit l\u00e4ngerer Zeit habe ich auf meinem Server einen Bind9 am Start. Und sei es, da man der Namensaufl\u00f6sung von Zensurprovidern nicht drauen kann. Nun passiert es relativ regelm\u00e4\u00dfig, dass f\u00fcr Bind neue Upstream-Pakete ver\u00f6ffentlicht werden. Diese enthalten jedoch standardm\u00e4\u00dfig zwei von mir ben\u00f6tigte Funktionen nicht: Gute Optimierung und &#8211; ganz wichtig &#8211; Zonen-Support via Datenbank-Annbindung. Da mir das manuelle Anpassen der n\u00f6tigen Dateien irgendwie zu bl\u00f6d ist, gibt&#8217;s nun hier ein Update dazu, wie man das ganze automatisieren kann.<!--more--> F\u00fcr Ungeduldige: Ein fertiges Shellscript gibt&#8217;s am Ende.<\/p>\n<p>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\u00e4ndig funktioniert: Bestehende \u00c4nderungen wurden bei einem Paket-Upgrad des Source-Packages nicht \u00fcbernommen. Daher hier ein kleiner Workaround zu diesem Problem.<\/p>\n<p>Ein erster Schritt zu einer automatisierung ist hierbei das Anfertigen einer kleinen Verzeichnisstruktur und das Auslesen der ben\u00f6tigten Informationen. Da unter Debian f\u00fcr 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\u00f6nnen, ich an dieser Stelle jedoch auf eine vereinfachte Methode zur\u00fcckgreife, die ohne gro\u00dfe Umst\u00e4nde in Bash-Skripten verwendet werden kann. Da unser Paketname mit &#8222;bind9&#8220; feststeht, k\u00f6nnen wir diesen in unser Skript am Anfang in die Initialisierung aufnehmen:<\/p>\n<pre lang=\"bash\">#!\/bin\/bash\r\n#Some Package specific configuration\r\nSRC_ROOT=\/usr\/src\r\nSRC_PKG=bind9\r\n\r\n#Maintainer specific configuration\r\nexport NAME=\"Anonymous Coward\"\r\nexport EMAIL=\"anonymous@coward.tld\"\r\n\r\n#Ensure our own location\r\ncd ${$SRC_ROOT}\r\n\r\n#Upgrade our existing source package with apt-src\r\napt-src update\r\napt-src upgrade ${SRC_PKG}\r\n\r\n#Get currently installed Package version:\r\nSRC_DIR=`echo ${SRC_PKG}-*\/`\r\nSRC_VER=\"\"\r\nfor a in ${SRC_DIR}; do\r\n    if [ \"\" != \"${SRC_VER}\" ]; then.\r\n        echo \"Version detection returned ambigious result!\"\r\n        exit 1\r\n    fi\r\n\r\n    SRC_VER=${a:${#SRC_PKG}}\r\n    SRC_VER=${SRC_VER:1}\r\n    SRC_VER=${SRC_VER%\/}\r\ndone\r\n\r\n#Fix the location for the Source Tree\r\nSRC_DIR=${SRC_ROOT}\/${SRC_DIR}\r\n\r\n#Output some general information\r\necho Package: ${SRC_PKG}\r\necho Version: ${SRC_VER}\r\necho PkgRoot: ${SRC_ROOT}\r\necho Sources: ${SRC_DIR}\r\n<\/pre>\n<p>Damit dieser Teil funktioniert, muss das Source-Paket bereits vorher einmal mit apt-src geholt und entpackt worden sein. Dies geht am Einfachsten mit:<\/p>\n<pre lang=\"bash\">apt-src install bind9<\/pre>\n<p>Das obige Skript sollte dann etwa folgende Ausgabe liefern:<\/p>\n<pre lang=\"text\">Package: bind9\r\nVersion: 9.6.1.dfsg.P3\r\nPkgRoot: \/usr\/src\r\nSources: \/usr\/src\/bind9-9.6.1.dfsg.P3\/<\/pre>\n<p>Nun geht es darum, unsere \u00c4nderungen in den Paket-Source einflie\u00dfen zu lassen. Hierf\u00fcr gibt es eine Reihe von M\u00f6glichkeiten:<\/p>\n<ul>\n<li>Dynamisches \u00c4ndern mit Search&#038;Replace<\/li>\n<li>Nutzen eines Patchfiles<\/li>\n<li>Ein VCS zum Anwenden von Patches missbrauchen<\/li>\n<\/ul>\n<p>Die letzten beiden Varianten stellen hierbei die zu bevorzugenden M\u00f6glichkeiten bei vielen, bzw. umfangreichen \u00c4nderungen dar, erfordern jedoch auch eine gewisse Vorbereitung der einzuspielenden Patches, da durch ung\u00fcnstige Patches ansonsten eine automatische Anwendung der \u00c4nderungen verhindert werden kann. Daher werd ich im Folgenden die erste Variante nehmen und mit etwas sed-Magik mein Ziel erreichen.<\/p>\n<p>Am Einfachsten geht dies mit dem Stream-Editor sed, wenn man die Aufrufe wie folgt umsetzt:<\/p>\n<pre lang=\"bash\">#Updating the rules file to configure some stuff\r\nif sed s,--with-dlz-mysql=no,--with-dlz-mysql=yes, ${SRC_DIR}\/debian\/rules > ${SRC_DIR}\/debian\/rules~ ; then\r\n    mv ${SRC_DIR}\/debian\/rules~ ${SRC_DIR}\/debian\/rules\r\nelse\r\n    rm ${SRC_DIR}\/debian\/rules~\r\n    echo \"Error applying Enable MySQL Patch (1\/2)\"\r\n    exit 1\r\nfi\r\n\r\nif sed s,--enable-threads,--disable-threads, ${SRC_DIR}\/debian\/rules > ${SRC_DIR}\/debian\/rules~ ; then\r\n    mv ${SRC_DIR}\/debian\/rules~ ${SRC_DIR}\/debian\/rules\r\nelse\r\n    rm ${SRC_DIR}\/debian\/rules~\r\n    echo \"Error applying Enable MySQL Patch (2\/2)\"\r\n    exit 1\r\nfi\r\n\r\nif sed s,--with-dlz-ldap=yes,--with-dlz-ldap=no, ${SRC_DIR}\/debian\/rules > ${SRC_DIR}\/debian\/rules~ ; then\r\n    mv ${SRC_DIR}\/debian\/rules~ ${SRC_DIR}\/debian\/rules\r\nelse\r\n    rm ${SRC_DIR}\/debian\/rules~\r\n    echo \"Error applying Disable LDAP Patch\"\r\n    exit 1\r\nfi\r\n\r\nif sed s,--with-dlz-bdb=yes,--with-dlz-bdb=no, ${SRC_DIR}\/debian\/rules > ${SRC_DIR}\/debian\/rules~ ; then\r\n    mv ${SRC_DIR}\/debian\/rules~ ${SRC_DIR}\/debian\/rules\r\nelse\r\n    rm ${SRC_DIR}\/debian\/rules~\r\n    echo \"Error applying Disable BDB Patch\"\r\n    exit 1\r\nfi<\/pre>\n<p>Mit diesen Zeilen wird nicht nur eine Konfiguration der Optionen vorgenommen, sondern im Fehlerfalle zus\u00e4tzlich auch ausgegeben, was fehlgeschlagen ist. Wenn wir aber bereits an dieser Stelle angelangt sind, kann man auch gleich etwas Optimieren:<\/p>\n<pre lang=\"bash\">#Turn on better optimization when compiling\r\nif sed 's,OPT = -O2,OPT = -O9,' ${SRC_DIR}\/debian\/rules > ${SRC_DIR}\/debian\/rules~ ; then\r\n    mv ${SRC_DIR}\/debian\/rules~ ${SRC_DIR}\/debian\/rules\r\nelse\r\n    rm ${SRC_DIR}\/debian\/rules~\r\n    echo \"Error applying Optimization Patch\"\r\n    exit 1\r\nfi<\/pre>\n<p>Nach dem wir nun die ben\u00f6tigten Optionen konfiguriert haben, sollte nun noch der Changelog aktualisiert werden. Hierf\u00fcr gibt es das Tool dch, bzw. debchange. Da wir ein Lokales Build haben m\u00f6chten, muss f\u00fcr den ersten Changelog-Eintrag das Flag -l gesetzt werden. Alle anderen Eintr\u00e4ge werden mit -a einfach angehangen. F\u00fcr 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\u00e4uft somit durch folgende Zeilen:<\/p>\n<pre lang=\"bash\">#Update the Changelog\r\ncd ${SRC_DIR}\r\ndch -l benbe \"Increased Optimization Level when compiling\"\r\ndch -a \"Activated MySQL DLZ support\"\r\ndch -a \"Deactivated LDAP DLZ support\"\r\ndch -a \"Deactivated BDB DLZ support\"<\/pre>\n<p>Um nun unser automatisch aktualisiertes Paket nutzen zu k\u00f6nnen, m\u00fcssen wir dieses noch compilieren und in Debian-Pakete verpacken lassen. Auch hier helfen uns die vorhandenen Scripte recht gut:<\/p>\n<pre lang=\"bash\">#Compile and build the package\r\ncd ${SRC_ROOT}\r\nrm *_${SRC_VER}*benbe*.deb\r\napt-src build ${SRC_PKG}<\/pre>\n<p>Wenn auch dieser Schritt erfolgreich ist, so k\u00f6nnen die neu erzeugten Pakete installiert werden.<\/p>\n<pre lang=\"bash\">#Install the package\r\ncd ${SRC_ROOT}\r\ndpkg -i *_${SRC_VER}*benbe*.deb<\/pre>\n<p>Setzt man diese Teile zusammen, so erh\u00e4lt man ein einfaches Script, mit dem man mit einem Befehl auch relativ umfangreiche Source-Pakete, an denen mehrere \u00c4nderungen vorzunehmen sind, recht einfach in angepassten Versionen installieren kann. Was bei diesem Skript jedoch noch au\u00dfen vor gelassen wurde, ist die Frage, ob die Patches bereits eingespielt wurden. Daher wird man bei Mehrfach-Ausf\u00fchrung in Bezug auf die Versionsz\u00e4hlung wahrscheinlich unerwartet Ergebnisse erhalten. Da zudem die Anwendung der Patches ohne Kontextuale Pr\u00fcfung erfolgt, sollte man auch hier Vorsicht walten lassen.<\/p>\n<p class=\"wp-flattr-button\"><a href=\"https:\/\/blog.benny-baumann.de\/?flattrss_redirect&amp;id=515&amp;md5=b1e92c664575c9d8eda04688aa26003a\" title=\"Flattr\" target=\"_blank\"><img src=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" srcset=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" alt=\"Flattr this!\"\/><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Bereits seit l\u00e4ngerer Zeit habe ich auf meinem Server einen Bind9 am Start. Und sei es, da man der Namensaufl\u00f6sung von Zensurprovidern nicht drauen kann. Nun passiert es relativ regelm\u00e4\u00dfig, dass f\u00fcr Bind neue Upstream-Pakete ver\u00f6ffentlicht werden. Diese enthalten jedoch standardm\u00e4\u00dfig zwei von mir ben\u00f6tigte Funktionen nicht: Gute Optimierung und &#8211; ganz wichtig &#8211; Zonen-Support [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[4],"tags":[258,259,10,48,246],"class_list":["post-515","post","type-post","status-publish","format-standard","hentry","category-server","tag-bind","tag-debhelper","tag-debian","tag-dns","tag-mysql"],"_links":{"self":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/515","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=515"}],"version-history":[{"count":2,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/515\/revisions"}],"predecessor-version":[{"id":517,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/515\/revisions\/517"}],"wp:attachment":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}