rexx-things/samples/oorexx/scp.rexx
2025-03-12 20:50:48 +00:00

122 lines
3.5 KiB
Rexx

/*
* Rexx/CURL sample program to behave similarly to scp; the SSH copy program
* but only copies to/from an ftp server
* First argument is source file
* Second argument is destination
*/
Parse Arg arg1 arg2
If arg1 = '' Then Call usage
outfile = ''
infile = ''
Select
When Countstr( '@', arg1 ) = 1 Then
Do
If Right( arg1, 1 ) = '/' Then
Do
Say 'Invalid parameter: remote parameter must refer to a file, not a directory'
Exit 1
End
upload = 0
Parse Value Parser( arg1, arg2 ) With url userpwd outfile
End
When Countstr( '@', arg2 ) = 1 Then
Do
upload = 1
Parse Value Parser( arg2, arg1 ) With url userpwd infile
If Stream( infile, 'C', 'QUERY EXISTS' ) = '' Then
Do
Say 'Invalid parameter: local file' arg1 'does not exist'
Exit 1
End
End
Otherwise
Do
Say 'You must specify one of the parameters as a remote location'
Exit 1
End
End
/*
say 'url:' url
say 'userpwd:' userpwd
say 'outfile:' outfile
say 'infile:' infile
say 'upload:' upload
*/
size.0 = 'SIZE_DOWNLOAD'
size.1 = 'SIZE_UPLOAD'
Call RxFuncAdd 'CurlLoadFuncs', 'rexxcurl', 'CurlLoadFuncs'
Call CurlLoadFuncs
curl = CurlInit()
If curl \= '' Then
Do
Call CurlSetopt curl, 'UPLOAD', upload
If curlerror.intcode \= 0 Then Call Abort 'Error setting UPLOAD option'
Call CurlSetopt curl, 'USERPWD', userpwd
If curlerror.intcode \= 0 Then Call Abort 'Error setting USERPWD option'
Call CurlSetopt curl, 'INFILE', infile
If curlerror.intcode \= 0 Then Call Abort 'Error setting INFILE option'
Call CurlSetopt curl, 'OUTFILE', outfile
If curlerror.intcode \= 0 Then Call Abort 'Error setting OUTFILE option'
Call CurlSetopt curl, 'URL', url
If curlerror.intcode \= 0 Then Call Abort 'Error setting URL option'
/*
* Do it
*/
Call CurlPerform curl
If curlerror.intcode \= 0 Then Call Abort 'Error performing transfer of' arg1 'to' arg2
/*
* Display some info...
*/
Say Format( CurlGetinfo( curl, size.upload ), , 0 ) 'bytes transfered in' CurlGetinfo( curl, 'TOTAL_TIME' ) 'seconds'
/*
* Cleanup the connection
*/
Call CurlCLeanup curl
End
Call CurlDropFuncs 'UNLOAD'
Return 0
Parser: Procedure
Parse Arg remote, local
Parse Var remote userpwd '@' server '/' remote_file
If Right( remote_file, 1 ) = '/' | remote_file = '' Then
Do
base_file_pos = Lastpos( '/', local )
If base_file_pos = 0 Then base_file = local
Else
Do
base_file = Substr( local, base_file_pos+1 )
End
remote_file = remote_file || base_file
End
If local = '' Then
Do
base_file_pos = Lastpos( '/', remote_file )
If base_file_pos = 0 Then base_file = remote_file
Else
Do
base_file = Substr( remote_file, base_file_pos+1 )
End
local = base_file
End
url = 'ftp://'server'/'remote_file
Return url userpwd local
Usage:
Say 'To copy from a remote site to a local...'
Say 'scp.rexx user[:password]@server/dir/remote_file [local_file]'
Say
Say 'To copy to a remote site from a local...'
Say 'local_file user[:password]@server/dir/[remote_file]'
Exit 0
Abort: Procedure Expose curlerror.
Parse Arg msg
Say msg
If curlerror.curlcode \= 0 Then Say 'cURL error:' curlerror.curlcode '-' curlerror.curlerrm
Else Say 'RexxCURL error:' curlerror.intcode '-' curlerror.interrm
Call CurlCleanup curl
Call CurlDropFuncs 'UNLOAD'
Exit 1