[horde] VFS SSH2 download problem
Steffen
skhorde at smail.inf.fh-bonn-rhein-sieg.de
Mon Oct 14 12:51:51 UTC 2013
On Wed, 9 Oct 2013, Jan Schneider wrote:
> Zitat von Steffen <skhorde at smail.inf.fh-bonn-rhein-sieg.de>:
>
>> Hi,
>>
>> I've configured Gollem to use the SSH2 backend, with
>>
>> $backends['ssh2']['disabled'] = false;
>> $backends['ssh2']['name'] = <host>;
>> $backends['ssh2']['hordeauth'] = 'full';
>> $backends['ssh2']['params']['hostspec'] = <host>;
>> $backends['ssh2']['params']['timeout'] = 20;
>>
>> $backends['ssh2']['home'] = '/';
>> $backends['ssh2']['params']['vfsroot'] =
>> '/home/'.$GLOBALS['registry']->getAuth();
>>
>> All operations seems to work, except "download", "edit" and the like.
>> If I leave the parameters home and vfsroot unconfigured, the problem
>> remains.
>>
>> When I try to download a file, Horde Vfs Ssh2 readStream() is called, the
>> generated URL looks OK: ssh2.sftp://<user>:<pwd>@<host>:22/<path>//<file>
>>
>> but the Apache process surfing my request allocates 100% CPU and endlessly
>> calls recvfrom/sendto syscalls with data actually. The file descriptor of
>> the syscalls is the SSH connection.
>>
>> If I assemble a test PHP script like this:
>>
>> $fp = fopen('ssh2.sftp://URL', 'r'); // The URL is a Copy'n'Paste from
>> // the log generated by:
>> // Horde::log("Vfs::Ssh2::fopen(".$this->_wrap($this->_getPath($path,
>> $name)).")", 'ERR');
>>
>> while ($line = fgets($fp, 100)) {
>> echo $line."<br />";
>> }
>> fclose($fp);
>>
>> I get the file successfully.
>>
>> If I comment out readStream() in /usr/share/php/Horde/Vfs/Ssh2.php to force
>> the use of readFile(), I can download files successfully.
>>
>> Can I do something to debug this issue further?
>
> You can track this further down in Gollem_Application::download().
The problem is in /var/www/horde/services/download/index.php, the loop to
read the file:
if (is_resource($res['data'])) {
rewind($res['data']);
while (!feof($res['data'])) {
echo fread($res['data'], 8192);
}
fclose($res['data']);
seems to hit this bug (or something similiar)
https://bugs.php.net/bug.php?id=59138, I use Debian Squeeze with packaged
libssh2-php 0.11.0-2.1. feof() never returns true.
fgets() works, as shown in my sample script, e.g.:
while ($line = fgets($fp, 100)) {
echo $line."<br />";
}
if(feof($fp)) {
echo "EOF\n";
} else {
echo "NO EOF!!!\n";
}
triggers "no eof", but stops eventually.
I upgraded the ssh2 extension with
pecl install -a "channel://pecl.php.net/ssh2-0.12"
, because there is no newer package for Squeeze. Now the
while(feof($res['data'])) loop terminates.
Maybe you add a check & warning about the version number of the ssh2
extension to test.php or something?
Kind regards,
--
Steffen
More information about the horde
mailing list