dpkg-maintscript-helper(1)

NAME
dpkg-maintscript-helper - Bekannte Einschränkungen in Dpkg in Betreuerskripten umgehen

ÜBERSICHT
dpkg-maintscript-helper Befehl [Parameter ?] -- Betr-Skript-Parameter ?

BEFEHLE UND PARAMETER

rm_conffile Conffile [vorhergehende_Version [Paket]]

mv_conffile alte_Conffile neue_Conffile [vorhergehende_Version [Paket]]

symlink_to_dir Pfadname altes_Ziel [vorhergehende_Version [Paket]]

dir_to_symlink Pfadname neues_Ziel [vorhergehende_Version [Paket]]

BESCHREIBUNG

Dieses Programm wurde so entworfen, dass es in Betreuerskripten ausgeführt werden kann, um einige Aufgaben zu erledigen, die dpkg (noch) nicht selbst erledigen kann, entweder aufgrund von Design-Entscheidungen oder aufgrund aktueller Einschränkungen.

Viele dieser Aufgaben benötigen koordinierte Aktionen aus mehreren Betreuerskripten (preinst, postinst, prerm, postrm). Um Fehler zu vermeiden, wird der gleiche Aufruf einfach in alle Skripte eingefügt und das Programm wird sein Verhalten automatisch abhängig von der Variable DPKG_MAINTSCRIPT_NAME und den Argumenten im Betreuerskript, die Sie nach einem doppelten Bindestrich übergeben müssen, anpassen.

GEMEINSAME PARAMETER

vorhergehende_Version
    Definiert die letzte Version des Pakets, dessen Upgrade die Operation auslösen soll. Es ist wichtig, vorhergehende_Version korrekt zu berechnen, so dass die Operationen korrekt ausgeführt werden, selbst falls der Benutzer das Paket mit einer lokalen Version neugebaut hat. Falls vorhergehende_Version leer ist oder weggelassen wurde wird die Operation bei jedem Upgrade versucht (Hinweis: Es ist sicherer, die Version anzugeben und damit die Operation nur einmal versuchen zu lassen). Wird beispielsweise eine Conffile in Version 2.0-1 eines Pakets entfernt, sollte vorhergehende_Version auf 2.0-1~ gesetzt werden. Dies führt dazu, dass das Conffile entfernt wird, selbst falls der Benutzer die vorhergehende Version 1.0-1 als 1.0-1local1 neu gebaut hat. Falls das Conffile in mehreren Versionen nicht ausgeliefert wurde und Sie jetzt die Betreuerskripte anpassen, um die überflüssige Datei zu entfernen, sollte vorhergehende_Version auf die Version des Pakets gesetzt werden, die Sie jetzt zusammenstellen, nicht auf die erste Version des Pakets, bei dem das Conffile fehlte.

Paket
    Der Paketname. Wenn das Pakete »Multi-Arch: same« ist, muss dieser Parameter den Architektur-Kennzeichner enthalten. Falls leer oder nicht angegeben wird die (von dpkg gesetzte) Umgebungsvariable DPKG_MAINTSCRIPT_PACKAGE verwandt.

--  Alle Parameter der Betreuerskripte müssen nach -- an das Programm weitergeleitet werden.

CONFFILE-BEZOGENE AUFGABEN

Beim Upgrade eines Pakets wird dpkg ein Conffile (eine Konfigurationsdatei, bei der dpkg die Änderungen des Benutzers erhalten soll) nicht automatischen entfernen, falls sie nicht in der neueren Version enthalten ist. Es gibt zwei Hauptgründe dafür; der erste ist, dass die Conffile versehentlich entfallen sein und die nächste Version sie wieder herstellen könnte und die Benutzer die Änderung nicht weggeworfen sehen wollen. Der zweite besteht darin, dass Paketen erlaubt werden soll, von einer Dpkg-betreuten Conffile auf eine Datei, die von den Betreuerskripten des Pakets, normalerweise mit einem Werkzeug wie Debconf oder Ucf, verwaltet wird, umzustellen.

Das bedeutet, falls ein Paket eine Conffile umbenennen oder entfernen soll, muss es dies explizit durchführen und dpkg-maintscript-helper kann dazu verwandt werden, eine sanfte Löschung und Verschiebung von Conffiles innerhalb von Betreuerskripten durchzuführen.

  Eine Conffile entfernen

Falls eine Conffile komplett entfernt wird, sollte sie von der Platte entfernt werden, falls der Benutzer sie nicht verändert hat. Falls es lokale Anpassungen gibt, sollten diese erhalten werden. Falls das Upgrade des Pakets abgebrochen wird, sollte die neuerdings veraltete Conffile nicht verschwinden.

All dies wird durch Einsetzen der folgenden Shell-Schnipsel in die Betreuerskripte preinst, postinst und postrm implementiert:

    dpkg-maintscript-helper rm_conffile \
        Conffile vorhergehende_Version Paket -- "$@"

Conffile ist der Dateiname der zu entfernenden Conffile.

Aktuelle Implementierung: im preinst wird geprüft, ob die Conffile geändert wurde. Dann wird sie entweder in Conffile.dpkg-remove (falls sie nicht geändert wurde) oder in Conffile.dpkg-backup (falls sie geändert wurde) umbenannt. Im postinst wird letztere in Conffile.dpkg-bak umbenannt und als Referenz behalten, da sie Benutzeränderungen enthält, während erstere entfernt wird. Falls das Upgrade des Pakets abgebrochen wird, reinstalliert postrm die ursprüngliche Conffile. Während des vollständigen Löschens wird postrm auch die bisher behaltene Datei .dpkg-bak entfernen.

  Eine Conffile umbenennen

Falls eine Conffile von einem Ort zu einem anderen verschoben wird, müssen Sie sicherstellen, dass Sie auch alle Änderungen des Benutzers mit übernehmen. Anfänglich erscheint dies als einfache Änderung am Skript preinst, allerdings wird dies dazu führen, dass der Benutzer von dpkg aufgefordert wird, die Bearbeitung der Conffile zu bestätigen, obwohl sie für diese gar nicht verantwortlich sind.

Sanfte Umbenennung kann durch Einsetzen der folgenden Shell-Schnipsel in die Betreuerskripte preinst, postinst und postrm implementiert werden:

    dpkg-maintscript-helper mv_conffile \
        alte_Conffile neue_Conffile vorhergehende_Version Paket -- "$@"

alte_Conffile und neue_Conffile sind der alte und der neue Name der umzubenennenden Conffile.

Aktuelle Implementierung: das preinst überprüft, ob die Conffile verändert wurde, falls ja, verbleibt sie am Platz, andernfalls wird sie in alte_Conffile.dpkg-remove umbenannt. Bei der Konfiguration entfernt das postinst alte_Conffile.dpkg-remove und bennent alte_Conffile in neue_Conffile um, falls alte_Conffile noch existiert. Falls abort-upgrade/abort-install eintritt, benennt das postrm wieder alte_Conffile.dpkg-remove in alte_Conffile zurück, falls notwendig.

SYMLINK- UND VERZEICHNISUMWANDLUNGEN
Beim Upgrade eines Pakets wird dpkg einen Symlink nicht automatisch in ein Verzeichnis und umgekehrt umwandeln.

  Einen Symlink in ein Verzeichnis umwandeln
Falls ein Symlink in ein echtes Verzeichnis umgewandelt wird, müssen Sie vor dem Entpacken sicherstellen, dass der Symlink entfernt wird. Anfänglich erscheint dies als einfache Änderung am Skript preinst, allerdings wird dies zu einigen Problemen führen, falls der Administrator lokale Anpassungen des Symlinks durchgeführt hat oder falls ein Downgrade des Pakets auf eine alte Version durchgeführt wird.

Sanfte Umbenennung kann durch Einsetzen der folgenden Shell-Schnipsel in die Betreuerskripte preinst, postinst und postrm implementiert werden:

    dpkg-maintscript-helper symlink_to_dir \
        Pfadname altes_Ziel vorhergehende_Version Paket -- "$@"

Pfadname ist der Name des alten Symlinks (der Pfad wird am Ende der Installation ein Verzeichnis sein) und altes_Ziel das Ziel des bisherigen Symlinks unter Pfadname.

Aktuelle Implementierung: das preinst überprüft, ob der Symlink existiert und auf altes_Ziel zeigt. Falls dies nicht der Fall ist, bleibt der Symlink existent, andernfalls wird er in Pfadname.dpkg-backup umbenannt. Bei der Konfiguration entfernt das postinst Pfadname.dpkg-backup, falls Pfadname.dpkg-backup noch ein Symlink ist. Falls abort-upgrade/abort-install eintritt, benennt das postrm wieder Pfadname.dpkg-backup in Pfadname zurück, falls notwendig.

  Ein Verzeichnis in einen Symlink umwandeln
Falls ein echtes Verzeichnis in einen Symlink umgewandelt wird, müssen Sie vor dem Entpacken sicherstellen, dass das Verzeichnis entfernt wird. Anfänglich erscheint dies als einfache Änderung am Skript preinst, allerdings wird dies zu einigen Problemen führen, falls das Verzeichnis Conffiles, Pfadnamen anderer Pakete oder lokal erstellte Pfadnamen enthält oder wenn ein Downgrade des Pakets durchgeführt wird.

Sanfte Umwandlung kann durch Einsetzen der folgenden Shell-Schnipsel in die Betreuerskripte preinst, postinst und postrm implementiert werden:

    dpkg-maintscript-helper dir_to_symlink \
        Pfadname neues_Ziel vorhergehende_Version Paket -- "$@"

Pfadname ist der Name des alten Verzeichnisses (der Pfad wird am Ende der Installation ein Symlink sein) und neues_Ziel ist das Ziel des neuen Symlinks unter Pfadname.

Current implementation: the preinst checks if the directory exists, does not contain conffiles, pathnames owned by other packages, or locally created pathnames, if not then it's left in place, otherwise it's renamed to pathname.dpkg-backup, and an empty staging directory named pathname is created, marked with a file so that dpkg can track it. On configuration, the postinst finishes the switch if pathname.dpkg-backup is still a directory and pathname is the staging directory; it removes the staging directory mark file, moves the newly created files inside the staging directory to the symlink target new-target/, replaces the now empty staging directory pathname with a symlink to new-target, and removes pathname.dpkg-backup. On abort-upgrade/abort-install, the postrm renames pathname.dpkg-backup back to pathname if required.

INTEGRATION IN PAKETE

Given that dpkg-maintscript-helper is used in the preinst, using it unconditionally requires a pre-dependency to ensure that the required version of dpkg has been unpacked before. The required version depends on the command used, for rm_conffile and mv_conffile it is 1.15.7.2, for symlink_to_dir and dir_to_symlink it is 1.17.5:

    Pre-Depends: dpkg (>= 1.17.5)

In vielen Fällen sind aber die Ausführungen des Programms für das Paket nicht kritisch und statt einer pre-Abhängigkeit soll das Programm nur aufgerufen werden, falls bekannt ist, dass der benötigte Befehl vom derzeit installierten dpkg unterstützt wird:

    if dpkg-maintscript-helper supports command; then
        dpkg-maintscript-helper command ?
    fi

ÜBERSETZUNG
Die deutsche Übersetzung wurde 2004, 2006-2013 von Helge Kreutzmann <debian@helgefjell.de>, 2007 von Florian Rehnisch <eixman@gmx.de> und 2008 von Sven Joachim <svenjoac@gmx.de> angefertigt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 2 oder neuer für die Kopierbedingungen. Es gibt KEINE HAFTUNG.