dpkg-divert und Paket entfernen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
McAldo
Moderator
Beiträge: 2069
Registriert: 26.11.2003 11:43:36
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Terra / Sol-System / Milchstraße

dpkg-divert und Paket entfernen

Beitrag von McAldo » 13.09.2011 15:59:58

Hallo,

ich habe ein selbsterstelltes Paket 'own-package' welches eine Konfigurationsdatei eines anderen Paketes 'other-package' austauscht. Dazu nutze ich dpkg-divert, um die Originaldatei zu erhalten. 'other-package' ist dabei in Pre-Depends von 'own-package'. Nun gibt es ein Problem bei der Installation und eines beim Entfernen.

--- Installation ---
Installiere ich das Paket, so wird die diversion auf die Datei richtig ausgeführt und ich habe "file.orig" im Verzeichnis liegen. Im Verlauf der Installation von 'own-package' werde ich jedoch gefragt, ob ich von "file" die Version des Maintainers behalten, oder meine eigene Version installieren möchte. Zu dem Zeitpunkt sollte jedoch die Datei "file" nicht mehr vorhanden sein und "file.orig" heißen. Schaue ich in das entsprechende Verzeichnis mit ls -l ist dem auch so. Hier der dpkg-divert Aufruf im preinst-Script:

Code: Alles auswählen

if [ install = "$1" -o upgrade = "$1" ]; then
   dpkg-divert --package own-package --add --rename --divert /etc/file.orig /etc/file
fi
--- Deinstallation ---
Entferne ich das Paket wieder mit apt-get --purge, so gibt es verwirrendes Verhalten.
Folgender Code im postrm-Script sollte dafür sorgen, dass der Zustand von vor der Installation von 'own-package' wieder hergestellt wird:

Code: Alles auswählen

dpkg-divert --package own-package --remove --rename --divert /etc/file.orig /etc/iwatch/file
Dabei bekomme ich diese Fehlermeldung:

Code: Alles auswählen

Removing own-package ...
Removing `diversion of /etc/file to /etc/file.orig by own-package'
dpkg-divert: rename involves overwriting `/etc/file' with
  different file `/etc/file.orig', not allowed
dpkg: error processing own-package (--purge):
 subprocess post-removal script returned error exit status 2
Errors were encountered while processing:
 own-package
E: Sub-process /usr/bin/dpkg returned an error code (1)
Lösche ich manuell die Datei "/etc/file" und führe dann den dpkg-divert-Befehl aus funktioniert alles wie es soll, die diversion ist entfernt.

Wenn ich im postrm-Script eintrage, dass die Datei "/etc/file" entfernt werden soll (mit rm -f), bevor dpkg-divert angewendet wird, so ist anschließend auch die Originaldatei weg (wird durch --purge mit dem Paket 'own-package' entfernt).

Wo liegt hier mein Denk- und/oder Konfigurationsfehler? Welche Infos fehlen vielleicht noch zur Problemfindung und -lösung?

McAldo
Achte auf deine Gedanken, denn sie werden Worte.
Achte auf deine Worte, denn sie werden Handlungen.
Achte auf deine Handlungen, denn sie werden Gewohnheiten.
Achte auf deine Gewohnheiten, denn sie werden dein Charakter.
Achte auf deinen Charakter, denn er wird dein Schicksal.
(Talmud)

Benutzeravatar
McAldo
Moderator
Beiträge: 2069
Registriert: 26.11.2003 11:43:36
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Terra / Sol-System / Milchstraße

Re: dpkg-divert und Paket entfernen

Beitrag von McAldo » 13.09.2011 17:23:20

Ich habe das Problem bei der Deinstallation dahingehend umgangen, dass ich die Konfigurationsdatei bei Ausführung von preinst (also dem Installationsvorgang) nach /var/backups kopiere und bei der Deinstallation nach allen anderen Aktionen im postrm wieder zurück kopiere. Vor entfernen der Diversion wird noch das die Datei '/etc/file' entfernt, damit dpkg-divert --remove keinen Fehler mehr wirft.

Bleibt noch das Problem mit den Abfragen bei der Installation.

McAldo
Achte auf deine Gedanken, denn sie werden Worte.
Achte auf deine Worte, denn sie werden Handlungen.
Achte auf deine Handlungen, denn sie werden Gewohnheiten.
Achte auf deine Gewohnheiten, denn sie werden dein Charakter.
Achte auf deinen Charakter, denn er wird dein Schicksal.
(Talmud)

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: dpkg-divert und Paket entfernen

Beitrag von ThorstenS » 13.09.2011 20:01:31

sorry, eine perfekte Lösung habe ich nicht, aber ein wenig zum Lesen.
schau mal, ob dich dieser Post weiterbringt: http://raphaelhertzog.com/2010/09/21/de ... d-by-dpkg/
Die dpkg-Optionen kannst du auch persistent machen. Ich nutze auf meinen Systemen gerne
echo -e "force-confold" >> /etc/dpkg/dpkg.cfg - du müßtest das ggflls. anpassen

Aber evtl. reicht dir ja auch schon ein export DEBIAN_FRONTEND="noninteractive" bei der Paketinstallation.

Lass in jedem Fall von dir hören, wie du letztendlich zum Ziel gekommen bist. Deinen Ansatz finde ich nicht verkehrt.
Ich bearbeite immer die config-Dateien, anstelle sie komplett mit eigenen $(daemon-MeineConfig) Paketen zu ersetzen.

Benutzeravatar
McAldo
Moderator
Beiträge: 2069
Registriert: 26.11.2003 11:43:36
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Terra / Sol-System / Milchstraße

Re: dpkg-divert und Paket entfernen

Beitrag von McAldo » 04.10.2011 11:57:59

Ein anpassen der Konfigurationsdatei soll in dem Fall keine Option sein, da sonst an zu vielen Stellen dokumentiert werden muss.

Ich habe das nun so gelöst, dass die Originalkonfigurationsdateien nach /var/backups kopiere und dann ganz normal die Installation des eigenen Paketes mit dpkg-divert fortsetze.
Beim Deinstallieren werden die angepassten Dateien des fremden Paketes gelöscht, dann wird dpkg-divert rückgängig gemacht und anschließend kopiere ich die Originalkonfigurationsdateien aus /var/backups zurück an ihren Platz in /etc. Ist vielleicht nicht die optimale Lösung, aber es funktioniert. :)

McAldo
Achte auf deine Gedanken, denn sie werden Worte.
Achte auf deine Worte, denn sie werden Handlungen.
Achte auf deine Handlungen, denn sie werden Gewohnheiten.
Achte auf deine Gewohnheiten, denn sie werden dein Charakter.
Achte auf deinen Charakter, denn er wird dein Schicksal.
(Talmud)

Antworten