Wiedergänger

Direkt nach dem Umstieg von Ubuntu 12.04 auf 14.04 wollte sich die Horde-Installation meiner Schule nicht auf den neuesten Stand bringen lassen. Das übliche und sonst erfolgreiche

pear upgrade -a -B -c horde

brachte Fehlermeldungen nach dem folgenden Schema

downloading Horde_ActiveSync-2.25.0.tgz ...
Starting to download Horde_ActiveSync-2.25.0.tgz (345,324 bytes)
......................................................................done: 345,324 bytes
could not extract the package.xml file from "/build/buildd/php5-5.5.9+dfsg/pear-build-download/Horde_ActiveSync-2.25.0.tgz"
Download of "horde/horde_activesync" succeeded, but it is not a valid package archive
Error: cannot download "horde/Horde_ActiveSync"
downloading Horde_Compress-2.1.0.tgz ...
Starting to download Horde_Compress-2.1.0.tgz (2,187,446 bytes)
...done: 2,187,446 bytes
could not extract the package.xml file from "/build/buildd/php5-5.5.9+dfsg/pear-build-download/Horde_Compress-2.1.0.tgz"
Download of "horde/horde_compress" succeeded, but it is not a valid package archive
Error: cannot download "horde/Horde_Compress"
Download failed
upgrade failed

Damals half mir der folgende Bugreport bei launchpad weiter, der mich im Beitrag #9 auf die richtige Spur brachte. Der Fehler sitzt in der Datei

/usr/share/php/Archive/Tar.php

Hier muss gzopen durch gzopen64 ersetzt werden und gztell durch gztell64 und gzseek durch gzseek64.

Irgendwann im Laufe der letzten Woche muss ein Update gekommen sein, das die Tar.php ersetzte. Aktuell befinden sich die zu ändernden Zeilen samt angepasstem Inhalt in der Tar.php hier:

679:  if ($this->_compress_type == 'gz' && function_exists('gzopen64'))
680:  $this->_file = @gzopen64($this->_tarname, "wb9");
734:  if ($this->_compress_type == 'gz' && function_exists('gzopen64'))
735:  $this->_file = @gzopen64($v_filename, "rb");
759:  $this->_file = @gzopen64($this->_tarname, "r+b");
1782: $v_temp_tar = @gzopen64($this->_tarname.".tmp", "rb");
889:  @gzseek64($this->_file, gztell64($this->_file)+($p_len*512));

Dann läuft das Upgrade von Horde brav durch:

downloading Horde_ActiveSync-2.25.0.tgz ...
Starting to download Horde_ActiveSync-2.25.0.tgz (345,324 bytes)
......................................................................done: 345,324 bytes
downloading Horde_Compress-2.1.0.tgz ...
Starting to download Horde_Compress-2.1.0.tgz (2,187,446 bytes)
...done: 2,187,446 bytes
upgrade ok: channel://pear.horde.org/Horde_Compress-2.1.0
upgrade ok: channel://pear.horde.org/Horde_ActiveSync-2.25.0

Bis zum nächsten Mal.

3 Gedanken zu „Wiedergänger

  1. d.weller Beitragsautor

    Ich hab da lediglich die folgenden Einträge und trotzdem funktionierte das Update:

    788: @gzclose($this->_file);
    1818: @gzclose($v_temp_tar);

    Die da http://php.net/manual/en/function.gzclose.php sagen

    The gz-file pointer. It must be valid, and must point to a file successfully opened by gzopen().

    Ich kann nicht genug PHP für eine valide Einschätzung, aber es riecht danach, dass ein Versuch hier gzclose64 zu schreiben, zumindest a) nicht schadet oder b) die richtigere, sauberere Lösung wäre. Ich würde es schlicht erst einmal ohne ausprobieren und dann mit lsof nachsehen, ob noch vom Updateprozess betroffene Dateien geöffnet herumliegen. Wenn dem so ist, dann einmal mit gzclose64 probieren und wieder mit lsof nachsehen, was sich im Vergleich zu vorher verändert hat.

    Das Update selbst läuft jedoch auch ohne gzclose64 auf eine Art durch, dass danach Horde ohne Probleme funktioniert.

  2. flo

    Hallo,
    in der neuen Tar.php steht folgender Code, d.h. Umbenennung in gzclose64 sollte nicht gemacht werden:
    if (!function_exists(‚gzopen‘) && function_exists(‚gzopen64‘)) {
    function gzopen($filename, $mode, $use_include_path = 0)
    {
    return gzopen64($filename, $mode, $use_include_path);
    }
    }

    if (!function_exists(‚gztell‘) && function_exists(‚gztell64‘)) {
    function gztell($zp)
    {
    return gztell64($zp);
    }
    }

    if (!function_exists(‚gzseek‘) && function_exists(‚gzseek64‘)) {
    function gzseek($zp, $offset, $whence = SEEK_SET)
    {
    return gzseek64($zp, $offset, $whence);
    }
    }

Kommentare sind geschlossen.