Überschreiben von fremder Datei schlägt trotz Diversion fehl

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Überschreiben von fremder Datei schlägt trotz Diversion fehl

Beitrag von gxyz » 04.11.2012 16:00:44

... ich hab' wirklich versucht, einen kurzen aber prägnanten Titel zu finden (leider auch fehlgeschlagen ;-)

Worum's geht:

Für eine ziemlich komplexe Systemänderung, die ich noch häufiger brauchen werde habe ich ein Paket gebaut. Dieses beinhaltet u.a. angepasste Versionen von Binaries aus anderen Paketen (um nicht für jedes betroffene Paket eine eigene Version bauen zu müssen).

Eigentlich ein ziemlich klassischer Fall aus dem Handbuch (http://www.debian.org/doc/debian-policy ... sions.html). Wie dort beschrieben habe ich also ein "preinst"-script, dass zunächst die Originalversion mit "dpkg-divert" beiseite schafft:

Code: Alles auswählen

dpkg-divert --package $our_package --add --rename \
    --divert ${dest_name}.org ${dest_name}
Wie beabsichtigt wird vor der eigentlichen Installation die Ursprungsversion umbenannt.
Nichtsdestotrotz beschwert sich anschließend "dpkg" über einen Konflikt und bricht ab.
Das Ganze spielt auf "wheezy".

Für's erste habe ich das Problem umgangen, indem ich meine Versionen der Dateien umbenannt habe und per "postinst" symlinks auf die beabsichtigen Namen erzeuge, was auch problemlos funktioniert. Trotzdem würde mich interessieren, warum's auf direkterem Wege nicht klappt. (Leider konnte ich auch keine Beispiel-Pakete finden; postfix/postfix-tls war offensichtlich 'mal so gemacht, gibt's aber so nicht mehr)

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Überschreiben von fremder Datei schlägt trotz Diversion

Beitrag von rendegast » 05.11.2012 07:18:51

mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: Überschreiben von fremder Datei schlägt trotz Diversion

Beitrag von gxyz » 05.11.2012 10:19:12

... Danke für den Tip!
Allerdings sind das Meta-Pakete, die selbst keine Dateien ersetzen (und offensichtlich vorwiegend auf update-alternatives aufsetzen). Grundsätzlich wäre es in meinem Fall natürlich auch eine Möglichkeit, die Trigger-Scripte in ein separates Paket auszulagern und das eigentliche Paket davon abhängen zu lassen.
Soweit ich die Dokumentation verstehe, sollte es aber auch möglich sein, dass ein Paket eine Datei eines anderen Pakets überschreibt, indem es im eigenen "preinst"-Script eine Diversion dafür erzeugt. In dem zitierten Beispiel aus dem Policy Manual ist das Ganze zwar nicht so ausführlich und explizit, aber soweit ich verstehe, ist das Szenarium, auf das sich das Ganze bezieht:
  • Ziel: Die Funktionalität des alt-ehrwürdigen "smail"-Pakets (das als Client-Schnittstelle das Programm "/usr/bin/smail" mit bekannten Kommandozeilenparametern beinhaltet ) soll ergänzt werden
  • Dies soll durch ein Paket namens "smailwrapper" geschehen, das seinerseits ebenfalls eine Datei namens "/usb/bin/smail" beinhaltet. Da es die Funktion von smail nicht ersetzen, sondern nur ergänzen soll, hängt "smailwrapper" von "smail" ab
  • um einen Konflikt zu vermeiden, beinhaltet das Paket smailwrapper in seinem "preinst"-Trigger eine Diversion, um vor der Installation der eigenen Dateien "/usr/sbin/smail" nach "/usr/sbin/smail.real" umzubenennen
Inzwischen ist der übliche Weg in solchen Fällen eher "update-alternatives", was allerdings erfordert, das alle beteiligten Pakete mitspielen. So ziemlich jeder MTA stellt z.B. heute noch "/usb/sbin/sendmail" zur Verfügung (wie einst auch das zitierte "smail"), beinhaltet dazu aber selbst keine Datei dieses Namens.

In meinem Fall geht's um ein Paket, dass ausschließlich für den Eigenbedarf gedacht ist, deshalb möchte ich möglichst wenig Aufwand treiben (aber trotzem nicht einfach an der Paketverwaltung vorbei irgendwelche Dateien überschreiben), weshalb ich gerne alles in einem einzigen Paket unterbringen will, ohne dass die modifizierten/ergänzten Pakete selbst angefasst werden müssen - im Prinzip wie in dem "smailwrapper"-Beispiel.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Überschreiben von fremder Datei schlägt trotz Diversion

Beitrag von rendegast » 05.11.2012 13:19:42

Allerdings sind das Meta-Pakete, die selbst keine Dateien ersetzen
Meta-Pakete sind nach meiner Vorstellung Pakete, die nur aus ihrer control bestehen,
und damit Abhängigkeiten befriedigen und/oder aufstellen.
Bei den Beispielen steckt aber ein funktionaler Bestandteil im preinst/postinst.

Code: Alles auswählen

dpkg-deb -x Paket.deb zielverz
<->
dpkg-deb -e Paket.deb zielverz
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: Überschreiben von fremder Datei schlägt trotz Diversion

Beitrag von gxyz » 05.11.2012 13:37:11

rendegast hat geschrieben:Meta-Pakete sind nach meiner Vorstellung Pakete, die nur aus ihrer control bestehen
... sind zwar Haarspaltereien, aber den Begriff kann man durchaus weniger eng sehen (wie z.B. die Macher der angesprochenen Pakete: ".. this metapackage allows one to switch back to MESA.." "...this metapackage allows one to switch to the non-free FGLRX..." ;-)

Für meine Zwecke wichtiger: es sind keine Pakete, die Dateien aus anderen Paketen überschreiben ...

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: Überschreiben von fremder Datei schlägt trotz Diversion

Beitrag von gxyz » 22.11.2012 08:51:33

.. inzwischen ist es mir geglückt, die Ursache des Problems zu ergründen; damit der Thread Suchende, die zufällig darüber stolpern nicht weiter verunsichert, hier das Ergebnis:

In einem Paket Dateien eines anderen Pakets zu überschreiben funktioniert nach wie vor so, wie im Policy-Manual empfohlen, indem man in preinst Diversions für die betroffenen Dateien anlegt und in postinst wieder beseitigt, wie auch in meinem ursprünglichen Posting beschrieben. Dass es in meinem Fall nicht geklappt hatte, lag an einem dämlichen und gut versteckten Tippfehler (Im Namen meines Pakets kam ein BIndestrich vor; bei der Zuweisung an die Variable "our_package" war allerdings stattdessen ein Unterstrich 'reingeraten, was dann dazu führte, dass bei der Installation auch mein Paket von den erzeugten "Umleitungen" betroffen war ...)

Beispiele für diesen Mechanismus in "offiziellen" Debian-Paketen, gibt's zwar weniger als früher, aber immer noch viele; statt über Google zu suchen, hätte eine Suche auf dem eigenen Rechner auch problemlos einige zutage gefördert ;-)

Code: Alles auswählen

LANG=C dpkg-divert --list | sed -n '/^div/ s/^.* //p' | sort -u

Antworten