Völlig unerwartet (haha...) kam es heute zu Problemen beim Upgrade von Debian, das Plesk 11.5 erdulden darf.

Ein Kunden-Server (extern gehosted...) hat heute das lange fällige Upgrade von Debian Squeeze auf Debian Wheezy erhalten.

Zuvor schon habe ich Plesk auf die aktuelle Version 11.5.30 aktualisiert, das passte schon alles.

Debian selbst war beim Update komplett pflegeleicht, wie immer.

Das Update von Plesk (bzw. “plesk-core“) wurde jedoch mit einem unerwarteten Fehler abgebrochen:

subprocess new pre-installation script returned error exit status 1

Auch nach mehreren Versuchen bliebt das ganze leider so.

Habe mir daraufhin das Skript in “/var/lib/dpkg/info/plesk-core.preinst” angeschaut, konnte jedoch keine Fehler entdecken. Ändern dieser Datei bringt natürlich auch nichts, da das “preinst“-Skript des neuen Paketes das Problem verursacht. Das Plesk-Installations-Log in “/tmp/plesk_11.5.30_installation.log” war hingegen aussagekräftiger:

Unable to determine version or build number of psa installed. It is impossible
to upgrade psa to version 11.5.30.
To try to install a new version without saving data remove '/opt/psa' directory
manually. Please backup all data before removing it if necessary.

Eine Neuinstallation stand natürlich außer Frage.

Auf StackExchange war die Lösung dann ersichtlich:

  • Temporäres Verzeichnis anlegen und dorthinein wechseln:
    mkdir /root/tmp; cd /root/tmp
  • Die tatsächlichen Daten aus dem Debian-Paket auspacken:
    dpkg -x /var/cache/apt/archives/plesk-core_11.5.30-debian7.0.build115130819.13_amd64.deb build/
  • Nun die Debian-Steuer-Daten in das gleiche Build-Verzeichnis entpacken:
    dpkg -e /var/cache/apt/archives/plesk-core_11.5.30-debian7.0.build115130819.13_amd64.deb build/DEBIAN
  • Die Datei “build/DEBIAN/preinst” lässt sich nun modifizieren.

Durch Debugging (“set -x“) im Skript konnte der Fehler lokalisiert werden: In der Funktion “get_prev_version()” übergibt in Zeile 2278 Debian zwar die bisherige “${prev_version}“, in ca. Zeile 2303 wird jedoch zusätzlich noch “${prev_build}” abgefragt. Diese Variable wird aber niemals gesetzt, da der vorherige Code übersprungen wird. Als Basis-Ordner wurde bei uns “/opt/psa” übergeben, womit die Versions-Datei “/opt/psa/core.version” abgefragt wird.

Wir beheben uns temporär durch das Einfügen einer Prüfung vor diesem If-Check:

<pre class="wp-code-highlight prettyprint linenums:1">        if [ "X${prev_build}" = "X" ]; then
                 prev_build=`cat $1/core.version | awk '{ print $4 }'`
        fi

        prev_short_version=`form_undotted_version ${prev_version}`
        if [ "X${prev_version}" = "X" -o "X${prev_build}" = "X" -o -z "$prev_short_version" ]; then

(die letzten beiden Zeilen sind unverändert!)

Bitte natürlich prüfen, dass die o.g. Versions-Datei wirklich existiert! Falls nicht, sollte logischerweise die entsprechende Datei angegeben werden, um die Build-Version abzufragen, wie weiter oben in der Funktion schon angegeben 🙂

Das veränderte Build-Verzeichnis wird nun wieder zu einem Debian-Paket gepackt und dieses installiert:

dpkg-deb -b build/ some-deb2.deb
dpkg -i some-deb2.deb

Da die Build-Version nun vorhanden ist, sollte die Installation durchlaufen.

Zukünftige Versionen von Plesk dürften den Fehler nicht mehr haben, da ja Plesk an sich aktualisiert wird, und nicht mehr das darunterliegende Debian.

Falls der Plesk-Support hier mitliest: hat unser Server hier eine Fehlkonfiguration oder ist euer preinst-Skript tatsächlich fehlerhaft?

Next Post Previous Post