[ 
https://issues.apache.org/jira/browse/MINIFICPP-542?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16828934#comment-16828934
 ] 

Daniel Bakai edited comment on MINIFICPP-542 at 4/29/19 7:47 AM:
-----------------------------------------------------------------

[~phrocker] 

I’ve looked at curl an other possible implementations (libssh, libssh2, 
OpenSSH). curl itself uses libssh2 internally. I’ve found that while we could 
probably provide most of the things we need using just curl, we wouldn’t have 
the control I would be comfortable with. curl works in a “one download or 
upload operation on a file or directory, and random commands before and after 
that” model: you specify one upload or download, and other commands to execute 
before that (CURLOPT_QUOTE) and after that (CURLOPT_POSTQUOTE). However, you 
don’t really have much control over these commands. You can either flag them as 
fatal, if failed, or non-fatal, if failed, but after executing the whole 
operation, you don’t know the result for each of these commands, and if one of 
them fails, you don’t know which one did. You also don’t have the range of 
parameterization available for commands which are available natively in the 
protocol and also provided by libssh2, and some of which I see would be useful 
in implementing the processors. Because we need to execute many of these 
commands aside from the main upload or download action, this is not too 
practical.

OpenSSH doesn’t have a convenient interface for in-memory SFTP, libssh is under 
LGPL.

libssh2 provides a stable and user-friendly interface, and curl’s 
implementation doesn’t really add any significant business logic to that, so I 
would prefer to use libssh2 only, if not for the need for proxy support: 
libssh2 can't itself connect to a proxy.

curl's proxy support is excellent, on the other hand, and fortunately we can 
use CURLOPT_CONNECTONLY and CURLOPT_ACTIVESOCKET to sort out all the proxy 
operations and give us a socket to use afterwards. We can then give that socket 
to libssh2, and implement our SFTP functionality with it.

I think this is our best option, so I’ve created a standalone tool for testing 
it, that can use curl to connect to a proxy, then download and upload files 
through SFTP using libssh2, and it works with both SOCKS and HTTP (CONNECT) 
proxies.

Today I plan to start the work of integrating this into a processor.


was (Author: bakaid):
[~phrocker] 

I’ve looked at curl an other possible implementations (libssh, libssh2, 
OpenSSH). curl itself uses libssh2 internally. I’ve found that while we could 
probably provide most of the things we need using just curl, we wouldn’t have 
the control I would be comfortable with. curl works in a “one download or 
upload operation on a file or directory, and random commands before and after 
that” model: you specify one upload or download, and other commands to execute 
before that (CURLOPT_QUOTE) and after that (CURLOPT_POSTQUOTE). However, you 
don’t really have much control over these commands. You can either flag them as 
fatal, if failed, or non-fatal, if failed, but after executing the whole 
operation, you don’t know the result for each of these commands, and if one of 
them fails, you don’t know which one did. You also don’t have the range of 
parameterization available for commands which are available natively in the 
protocol and also provided by libssh2, and some of which I see would be useful 
in implementing the processors. Because we need to execute many of these 
commands aside from the main upload or download action, this is not too 
practical.

OpenSSH doesn’t have a convenient interface for in-memory SFTP, libssh is under 
LGPL.

libssh2 provides a stable and user-friendly interface, and curl’s 
implementation doesn’t really add any significant business logic to that, so I 
would prefer to use libssh2 only, if not for the need for proxy support: 
libssh2 can't itself connect to a proxy.

curl's proxy support is excellent, on the other hand, and fortunately we can 
use CURLOPT_CONNECTONLY and CURLOPT_ACTIVESOCKET to sort out all the proxy 
operations and give us a socket to use afterwards. We can then give that socket 
to libssh2, and implement our SFTP functionality with it.

I think this is our best option, so I’ve created a standalone tool for testing 
it, that can use curl to connect to a proxy, then download and upload files 
using through SFTP using libssh2, and it works with both SOCKS and HTTP 
(CONNECT) proxies.

Today I plan to start the work of integrating this into a processor.

> Add PutSFTP Support
> -------------------
>
>                 Key: MINIFICPP-542
>                 URL: https://issues.apache.org/jira/browse/MINIFICPP-542
>             Project: Apache NiFi MiNiFi C++
>          Issue Type: Bug
>            Reporter: Mr TheSegfault
>            Assignee: Daniel Bakai
>            Priority: Major
>              Labels: easyfix, newbie
>             Fix For: 0.7.0
>
>
> SFTP is an easy operation to add through the use of libCURL
>  
> Processors the can be added:
> (priority) PutSFTP
> ListSFTP
> FetchSFTP
> GetSFTP



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to