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.
Besten Dank für den Beitrag! Endlich klappt das Update. Muss bei gzclose auch in gzclose64 geändert werden?
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.
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);
}
}