[horde] VFS SSH2 download problem

Jan Schneider jan at horde.org
Mon Oct 14 13:55:15 UTC 2013


Zitat von Steffen <skhorde at smail.inf.fh-bonn-rhein-sieg.de>:

> 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

Which version did you run earlier?
-- 
Jan Schneider
The Horde Project
http://www.horde.org/



More information about the horde mailing list