aspera-cli 4.1.0 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +455 -229
  3. data/docs/Makefile +4 -4
  4. data/docs/README.erb.md +457 -126
  5. data/docs/test_env.conf +19 -2
  6. data/examples/aoc.rb +14 -3
  7. data/examples/faspex4.rb +89 -0
  8. data/lib/aspera/aoc.rb +38 -40
  9. data/lib/aspera/cli/main.rb +65 -33
  10. data/lib/aspera/cli/plugins/aoc.rb +54 -65
  11. data/lib/aspera/cli/plugins/ats.rb +2 -2
  12. data/lib/aspera/cli/plugins/config.rb +158 -137
  13. data/lib/aspera/cli/plugins/faspex.rb +111 -64
  14. data/lib/aspera/cli/plugins/faspex5.rb +35 -48
  15. data/lib/aspera/cli/plugins/node.rb +3 -2
  16. data/lib/aspera/cli/plugins/preview.rb +88 -55
  17. data/lib/aspera/cli/transfer_agent.rb +98 -62
  18. data/lib/aspera/cli/version.rb +1 -1
  19. data/lib/aspera/command_line_builder.rb +48 -31
  20. data/lib/aspera/cos_node.rb +34 -28
  21. data/lib/aspera/environment.rb +2 -2
  22. data/lib/aspera/fasp/aoc.rb +1 -1
  23. data/lib/aspera/fasp/installation.rb +68 -45
  24. data/lib/aspera/fasp/local.rb +89 -45
  25. data/lib/aspera/fasp/manager.rb +3 -0
  26. data/lib/aspera/fasp/node.rb +23 -1
  27. data/lib/aspera/fasp/parameters.rb +57 -86
  28. data/lib/aspera/fasp/parameters.yaml +531 -0
  29. data/lib/aspera/fasp/resume_policy.rb +13 -12
  30. data/lib/aspera/fasp/uri.rb +1 -1
  31. data/lib/aspera/id_generator.rb +22 -0
  32. data/lib/aspera/node.rb +14 -3
  33. data/lib/aspera/oauth.rb +135 -129
  34. data/lib/aspera/persistency_action_once.rb +11 -7
  35. data/lib/aspera/persistency_folder.rb +6 -26
  36. data/lib/aspera/rest.rb +3 -12
  37. data/lib/aspera/secrets.rb +20 -0
  38. data/lib/aspera/sync.rb +40 -35
  39. data/lib/aspera/timer_limiter.rb +22 -0
  40. data/lib/aspera/web_auth.rb +105 -0
  41. metadata +22 -3
  42. data/docs/transfer_spec.html +0 -99
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  [comment1]: # (Do not edit this README.md, edit docs/README.erb.md, for details, read docs/README.md)
2
- # `ascli` : Command Line Interface for IBM Aspera products
2
+ <font size="+12"><center>`ascli` : Command Line Interface for IBM Aspera products</center></font>
3
3
 
4
- Version : 4.1.0
4
+ Version : 4.3.0
5
5
 
6
6
  _Laurent/2016-2021_
7
7
 
@@ -13,7 +13,7 @@ Ruby Gem: [https://rubygems.org/gems/aspera-cli](https://rubygems.org/gems/asper
13
13
 
14
14
  Ruby Doc: [https://www.rubydoc.info/gems/aspera-cli](https://www.rubydoc.info/gems/aspera-cli)
15
15
 
16
- Ruby version must be >= > 2.4
16
+ Required Ruby version: > 2.4
17
17
 
18
18
  # <a name="when_to_use"></a>When to use and when not to use
19
19
 
@@ -29,7 +29,8 @@ So it is designed for:
29
29
 
30
30
  `ascli` can be seen as a command line tool integrating:
31
31
 
32
- * a configuration file (config.yaml) and advanced command line options
32
+ * a configuration file (config.yaml)
33
+ * advanced command line options
33
34
  * cURL (for REST calls)
34
35
  * Aspera transfer (ascp)
35
36
 
@@ -81,7 +82,7 @@ Once the gem is installed, `ascli` shall be accessible:
81
82
 
82
83
  ```
83
84
  $ ascli --version
84
- 4.1.0
85
+ 4.3.0
85
86
  ```
86
87
 
87
88
  ## First use
@@ -90,9 +91,10 @@ Once installation is completed, you can proceed to the first use with a demo ser
90
91
 
91
92
  If you want to test with Aspera on Cloud, jump to section: [Wizard](#aocwizard)
92
93
 
93
- If you want to test with Aspera demo transfer server, a default configuration is created on first use:
94
+ To test with Aspera demo transfer server, setup the environment and then test:
94
95
 
95
96
  ```
97
+ $ ascli config initdemo
96
98
  $ ascli server browse /
97
99
  :............:...........:......:........:...........................:.......................:
98
100
  : zmode : zuid : zgid : size : mtime : name :
@@ -112,7 +114,7 @@ If you want to use `ascli` with another server, and in order to make further cal
112
114
  * download a file
113
115
 
114
116
  ```
115
- $ ascli config id myserver update --url=ssh://demo.asperasoft.com:33001 --username=asperaweb --password=demoaspera
117
+ $ ascli config id myserver update --url=ssh://demo.asperasoft.com:33001 --username=asperaweb --password=_demo_pass_
116
118
  updated: myserver
117
119
  $ ascli config id default set server myserver
118
120
  updated: default&rarr;server to myserver
@@ -146,18 +148,22 @@ Then, follow the section relative to the product you want to interact with ( Asp
146
148
 
147
149
  # <a name="installation"></a>Installation
148
150
 
149
- It is possible to install *either* as a docker container or step by step on the native host:
151
+ It is possible to install *either* directly on the host operating system (Linux, Windows, Macos) or as a docker container.
150
152
 
151
- * [Ruby](#ruby) version >= > 2.4
153
+ The direct installation is recommended and consists in installing:
154
+
155
+ * [Ruby](#ruby) version > 2.4
152
156
  * [aspera-cli](#the_gem)
153
157
  * [Aspera SDK (ascp)](#fasp_prot)
154
158
 
155
- The following sections provide information on the installation.
159
+ The following sections provide information on the various installation methods.
156
160
 
157
161
  An internet connection is required for the installation. If you dont have internet for the installation, refer to section [Installation without internet access](#offline_install).
158
162
 
159
163
  ## Docker container
160
164
 
165
+ Use this method only if you know what you do, else use the standard recommended method as described here above.
166
+
161
167
  This method installs a docker image that contains: Ruby, ascli and the FASP sdk.
162
168
 
163
169
  Ensure that you have Docker installed.
@@ -181,11 +187,12 @@ $ ./ascli install
181
187
 
182
188
  Start using it !
183
189
 
184
- Note that the tool is run in the container.
190
+ Note that the tool is run in the container, so transfers are also executed in the container, not calling host.
185
191
 
186
- The wrapping script maps the container folder `/usr/src/app/config` to configuration folder `$HOME/.aspera/ascli`.
192
+ The wrapping script maps the container folder `/usr/src/app/config` to configuration folder `$HOME/.aspera/ascli` on host.
187
193
 
188
194
  To transfer to/from the native host, you will need to map a volume in docker or use the config folder (already mapped).
195
+ To add local storage as a volume edit the script: ascli and add a `--volume` stanza.
189
196
 
190
197
  ## <a name="ruby"></a>Ruby
191
198
 
@@ -193,15 +200,15 @@ Use this method to install on the native host.
193
200
 
194
201
  A ruby interpreter is required to run the tool or to use the gem and tool.
195
202
 
196
- Ruby minimum version: > 2.4. Ruby version 3 is also supported.
203
+ Required Ruby version: > 2.4. Ruby version 3 is also supported.
197
204
 
198
- *Any type of Ruby installation can be used* : rpm, yum, dnf, rvm, brew, windows installer, ... .
205
+ *Ruby can be installed using any method* : rpm, yum, dnf, rvm, brew, windows installer, ... .
199
206
 
200
207
  Refer to the following sections for a proposed method for specific operating systems.
201
208
 
202
209
  The recommended installation method is `rvm` for systems with "bash-like" shell (Linux, Macos, Windows with cygwin, etc...).
203
210
  If the generic install is not suitable (e.g. Windows, no cygwin), you can use one of OS-specific install method.
204
- If you have a simpler better way to install Ruby version >= > 2.4 : use it !
211
+ If you have a simpler better way to install Ruby version > 2.4 : use it !
205
212
 
206
213
  ### Generic: RVM: single user installation (not root)
207
214
 
@@ -773,7 +780,7 @@ $ ascli config id <option preset> set|delete|show|initialize|update
773
780
  The command `update` allows the easy creation of [option preset](#lprt) by simply providing the options in their command line format, e.g. :
774
781
 
775
782
  ```
776
- $ ascli config id demo_server update --url=ssh://demo.asperasoft.com:33001 --username=asperaweb --password=demoaspera --ts=@json:'{"precalculate_job_size":true}'
783
+ $ ascli config id demo_server update --url=ssh://demo.asperasoft.com:33001 --username=asperaweb --password=_demo_pass_ --ts=@json:'{"precalculate_job_size":true}'
777
784
  ```
778
785
 
779
786
  * This creates a [option preset](#lprt) `demo_server` with all provided options.
@@ -781,13 +788,13 @@ $ ascli config id demo_server update --url=ssh://demo.asperasoft.com:33001 --use
781
788
  The command `set` allows setting individual options in a [option preset](#lprt).
782
789
 
783
790
  ```
784
- $ ascli config id demo_server set password demoaspera
791
+ $ ascli config id demo_server set password _demo_pass_
785
792
  ```
786
793
 
787
794
  The command `initialize`, like `update` allows to set several parameters at once, but it deletes an existing configuration instead of updating it, and expects a _[Structured Value](#native)_.
788
795
 
789
796
  ```
790
- $ ascli config id demo_server initialize @json:'{"url":"ssh://demo.asperasoft.com:33001","username":"asperaweb","password":"demoaspera","ts":{"precalculate_job_size":true}}'
797
+ $ ascli config id demo_server initialize @json:'{"url":"ssh://demo.asperasoft.com:33001","username":"asperaweb","password":"_demo_pass_","ts":{"precalculate_job_size":true}}'
791
798
  ```
792
799
 
793
800
  A good practice is to not manually edit the configuration file and use modification commands instead.
@@ -824,11 +831,19 @@ Note that special plugin name: `config` can be associated with a preset that is
824
831
  Operations on this preset are done using regular `config` operations:
825
832
 
826
833
  ```
827
- $ ascli config id default set _plugin_name_ _defauklt_preset_for_plugin_
834
+ $ ascli config id default set _plugin_name_ _default_preset_for_plugin_
828
835
  $ ascli config id default get _plugin_name_
829
- "_defauklt_preset_for_plugin_"
836
+ "_default_preset_for_plugin_"
830
837
  ```
831
838
 
839
+ ### <a name="lprtdef"></a>Special Plugin: config
840
+
841
+ Plugin `config` (not to be confused with Option preset config) is used to configure `ascli` but it also contains global options.
842
+
843
+ When `ascli` starts, it lookjs for the `default` Option preset and if there is a value for `config`, if so, it loads the option values for any plugin used.
844
+
845
+ If no global default is set by the user, the tool will use `global_common_defaults` when setting global parameters (e.g. `conf ascp use`)
846
+
832
847
  ### Format of file
833
848
 
834
849
  The configuration file is a hash in a YAML file. Example:
@@ -844,7 +859,7 @@ cli_default:
844
859
  demo_server:
845
860
  url: ssh://demo.asperasoft.com:33001
846
861
  username: asperaweb
847
- password: demoaspera
862
+ password: _demo_pass_
848
863
  ```
849
864
 
850
865
  We can see here:
@@ -913,7 +928,6 @@ A [option preset](#lprt) value can be removed with `unset`:
913
928
  $ ascli config id cli_default unset interactive
914
929
  ```
915
930
 
916
-
917
931
  ### Examples
918
932
 
919
933
  For Faspex, Shares, Node (including ATS, Aspera Transfer Service), Console,
@@ -1033,21 +1047,42 @@ The `config` plugin also allows specification for the use of a local FASP client
1033
1047
 
1034
1048
  ```
1035
1049
  $ ascli config ascp show
1036
- /Users/laurent/Applications/Aspera Connect.app/Contents/Resources/ascp
1050
+ /Users/laurent/.aspera/ascli/sdk/ascp
1051
+ $ ascli config ascp info
1052
+ +--------------------+-----------------------------------------------------------+
1053
+ | key | value |
1054
+ +--------------------+-----------------------------------------------------------+
1055
+ | ascp | /Users/laurent/.aspera/ascli/sdk/ascp |
1056
+ ...
1037
1057
  ```
1038
1058
 
1039
1059
  ### Selection of local `ascp`
1040
1060
 
1061
+ By default, `ascli` uses any found local product with ascp, including SDK.
1062
+
1041
1063
  To temporarily use an alternate ascp path use option `ascp_path` (`--ascp-path=`)
1042
1064
 
1043
- To permanently use another ascp:
1065
+ For a permanent change, the command `config ascp use` sets the same parameter for the global default.
1066
+
1067
+ Using a POSIX shell:
1044
1068
 
1045
1069
  ```
1046
1070
  $ ascli config ascp use '/Users/laurent/Applications/Aspera CLI/bin/ascp'
1047
- saved to default global preset /Users/laurent/Applications/Aspera CLI/bin/ascp
1071
+ ascp version: 4.0.0.182279
1072
+ Updated: global_common_defaults: ascp_path <- /Users/laurent/Applications/Aspera CLI/bin/ascp
1073
+ Saved to default global preset global_common_defaults
1048
1074
  ```
1049
1075
 
1050
- This sets up a global default.
1076
+ Windows:
1077
+
1078
+ ```
1079
+ $ ascli config ascp use C:\Users\admin\.aspera\ascli\sdk\ascp.exe
1080
+ ascp version: 4.0.0.182279
1081
+ Updated: global_common_defaults: ascp_path <- C:\Users\admin\.aspera\ascli\sdk\ascp.exe
1082
+ Saved to default global preset global_common_defaults
1083
+ ```
1084
+
1085
+ If the path has spaces, read section: [Shell and Command line parsing](#parsing).
1051
1086
 
1052
1087
  ### List locally installed Aspera Transfer products
1053
1088
 
@@ -1134,7 +1169,7 @@ will effectively push files to the related server from the agent node.
1134
1169
 
1135
1170
  ### <a name="direct"></a>Direct (local ascp using FASPManager API)
1136
1171
 
1137
- By default the CLI will use a local FASP protocol, equivalent to specifying `--transfer=direct`.
1172
+ By default `ascli` uses a local ascp, equivalent to specifying `--transfer=direct`.
1138
1173
  `ascli` will detect locally installed Aspera products.
1139
1174
  Refer to section [FASP](#client).
1140
1175
 
@@ -1144,17 +1179,41 @@ To specify a FASP proxy (only supported with the `direct` agent), set the approp
1144
1179
  * `EX_http_proxy_url` (proxy for legacy http fallback)
1145
1180
  * `EX_ascp_args`
1146
1181
 
1147
- The `transfer-info` optionally provides the following auto resume parameters:
1182
+ The `transfer-info` accepts the following optional parameters:
1148
1183
 
1149
1184
  <table>
1150
- <tr><th>Name</th><th>Default</th><th>Feature</th><th>Description</th></tr>
1151
- <tr><td>iter_max</td>. <td>7</td><td>Resume</td><td>Max number of retry on error</td></tr>
1152
- <tr><td>sleep_initial</td><td>2</td><td>Resume</td><td>First Sleep before retry</td></tr>
1153
- <tr><td>sleep_factor</td> <td>2</td><td>Resume</td><td>Multiplier of Sleep</td></tr>
1154
- <tr><td>sleep_max</td>. <td>60</td><td>Resume</td><td>Maximum sleep</td></tr>
1155
- <tr><td>wss</td> <td>false</td><td>Web Socket Session</td><td>Enable use of web socket session in case it is available</td></tr>
1185
+ <tr><th>Name</th><th>Type</th><th>Default</th><th>Feature</th><th>Description</th></tr>
1186
+ <tr><td>spawn_timeout_sec</td><td>Float</td><td>3</td><td>Multi session</td><td>Verification time that ascp is running</td></tr>
1187
+ <tr><td>spawn_delay_sec</td><td>Float</td><td>2</td><td>Multi session</td><td>Delay between startup of sessions</td></tr>
1188
+ <tr><td>wss</td><td>Bool</td><td>false</td><td>Web Socket Session</td><td>Enable use of web socket session in case it is available</td></tr>
1189
+ <tr><td>multi_incr_udp</td><td>Bool</td><td>true</td><td>Multi Session</td><td>Increment UDP port on multi-session<br/>If true, each session will have a different UDP port starting at `fasp_port` (or default 33001)<br/>Else, each session will use `fasp_port` (or `ascp` default)</td></tr>
1190
+ <tr><td>resume</td><td>Hash</td><td>nil</td><td>Resumer parameters</td><td>See below</td></tr>
1156
1191
  </table>
1157
1192
 
1193
+ Resume parameters:
1194
+
1195
+ In case of transfer interruption, the agent will resume a transfer up to `iter_max` time.
1196
+ Sleep between iteration is:
1197
+
1198
+ ```
1199
+ max( sleep_max , sleep_initial * sleep_factor ^ (iter_index-1) )
1200
+ ```
1201
+
1202
+ <table>
1203
+ <tr><th>Name</th><th>Type</th><th>Default</th><th>Feature</th><th>Description</th></tr>
1204
+ <tr><td>iter_max</td><td>int</td><td>7</td><td>Resume</td><td>Max number of retry on error</td></tr>
1205
+ <tr><td>sleep_initial</td><td>int</td><td>2</td><td>Resume</td><td>First Sleep before retry</td></tr>
1206
+ <tr><td>sleep_factor</td><td>int</td><td>2</td><td>Resume</td><td>Multiplier of Sleep</td></tr>
1207
+ <tr><td>sleep_max</td><td>int</td><td>60</td><td>Resume</td><td>Maximum sleep</td></tr>
1208
+ </table>
1209
+
1210
+ Examples:
1211
+
1212
+ ```
1213
+ $ ascli ... --transfer-info=@json:'{"wss":true,"resume":{"iter_max":10}}'
1214
+ $ ascli ... --transfer-info=@json:'{"spawn_delay_sec":2.5,"multi_incr_udp":false}'
1215
+ ```
1216
+
1158
1217
  ### IBM Aspera Connect Client GUI
1159
1218
 
1160
1219
  By specifying option: `--transfer=connect`, `ascli` will start transfers
@@ -1204,7 +1263,7 @@ is described in a _transfer-spec_ (Transfer Specification), such as:
1204
1263
 
1205
1264
  `ascli` builds a default _transfer-spec_ internally, so it is not necessary to provide additional parameters on the command line for this transfer.
1206
1265
 
1207
- If needed, it is possible to modify or add any of the supported _transfer-spec_ parameter using the `ts` option. The `ts` option accepts a [Structured Value](#native) containing one or several _transfer-spec_ parameters.
1266
+ If needed, it is possible to modify or add any of the supported _transfer-spec_ parameter using the `ts` option. The `ts` option accepts a [Structured Value](#native) containing one or several _transfer-spec_ parameters. Multiple `ts` options on command line are cummulative.
1208
1267
 
1209
1268
  It is possible to specify ascp options when the `transfer` option is set to `direct` using the special [_transfer-spec_](#transferspec) parameter: `EX_ascp_args`. Example: `--ts=@json:'{"EX_ascp_args":["-l","100m"]}'`. This is espacially useful for ascp command line parameters not supported yet in the transfer spec.
1210
1269
 
@@ -1217,97 +1276,31 @@ A [_transfer-spec_](#transferspec) is a Hash table, so it is described on the co
1217
1276
 
1218
1277
  ## <a name="transferparams"></a>Transfer Parameters
1219
1278
 
1220
- All standard _transfer-spec_ parameters can be overloaded. To display parameters,
1221
- run in debug mode (--log-level=debug). [_transfer-spec_](#transferspec) can
1222
- also be saved/overridden in the config file.
1279
+ All standard _transfer-spec_ parameters can be speficied.
1280
+ [_transfer-spec_](#transferspec) can also be saved/overridden in the config file.
1281
+
1282
+ References:
1283
+
1284
+ * [Aspera Node API Documentation](https://developer.ibm.com/apis/catalog?search=%22aspera%20node%20api%22)&rarr;/opt/transfers
1285
+ * [Aspera Transfer SDK Documentation](https://developer.ibm.com/apis/catalog?search=%22aspera%20transfer%20sdk%22)&rarr;Guides&rarr;API Ref&rarr;Transfer Spec V1
1286
+
1287
+ Parameters can be displayed with commands:
1223
1288
 
1289
+ ```
1290
+ $ ascli config ascp spec
1291
+ $ ascli config ascp spec --select=@json:'{"f":"Y"}' --fields=-f,n,c
1292
+ ```
1224
1293
 
1225
- <p>
1226
1294
  Columns:
1227
- <ul>
1228
- <li>F=Fasp Manager(local FASP execution)</li>
1229
- <li>N=remote node(node API)</li>
1230
- <li>C=Connect Client(web plugin)</li>
1231
- </ul>
1232
- </p>
1233
- <p>
1234
- Req/Def : Required or default value (- means emty)
1235
- </p>
1236
- <p>
1237
- Fields with EX_ prefix are specific extensions to local mode.
1238
- </p>
1239
- <p>
1240
- arg: related ascp argument or env var suffix (PASS for ASPERA_SCP_PASS)
1241
- </p>
1242
- <p>
1243
- UNDER CONSTRUCTION<br/>
1244
- <a href="https://developer.ibm.com/apis/catalog/?search=aspera">Aspera API Documentation</a>&rarr;Node API&rarr;/opt/transfers<br/>
1245
- </p>
1246
1295
 
1247
- <table>
1248
- <tr><th>Field</th><th>Req/Def</th><th>Type</th><th>F</th><th>N</th><th>C</th><th>arg</th><th>Description</th></tr>
1249
- <tr><td>direction</td><td>Required</td><td>string</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>--mode</td><td>Direction: "send" or "receive"</td></tr>
1250
- <tr><td>remote_host</td><td>Required</td><td>string</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>--host</td><td>IP or fully qualified domain name of the remote server</td></tr>
1251
- <tr><td>remote_user</td><td>Required</td><td>string</td></td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>--user</td><td>Remote user. Default value is "xfer" on node or connect.</td></tr>
1252
- <tr><td>destination_root</td><td>Required</td><td>string</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>last arg</td><td>Destination root directory.</td></tr>
1253
- <tr><td>title</td><td>-</td><td>string</td><td class="no">N</td><td class="yes">Y</td><td class="yes">Y</td><td>-</td><td>Title of the transfer</td></tr>
1254
- <tr><td>tags</td><td>-</td><td>hash</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>--tags<br>--tags64</td><td>Metadata for transfer</td></tr>
1255
- <tr><td>token</td><td>-</td><td>string</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>TOKEN<br/>-W</td><td>Authorization token: Bearer, Basic or ATM</td></tr>
1256
- <tr><td>cookie</td><td>-</td><td>string</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>COOKIE</td><td>Metadata for transfer (older,string)</td></tr>
1257
- <tr><td>remote_access_key</td><td>TODO</td><td>string</td><td></td><td></td><td></td><td>?</td><td>Node only?</td></tr>
1258
- <tr><td>source_root</td><td>-</td><td>string</td><td></td><td></td><td></td><td>--source-prefix<br/>--source-prefix64</td><td>Source root directory.(TODO: verify option)</td></tr>
1259
- <tr><td>fasp_port</td><td>33001</td><td>integer</td></td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>-O</td><td>Specifies fasp (UDP) port.</td></tr>
1260
- <tr><td>ssh_port</td><td>22 or 33001</td><td>integer</td></td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>-P</td><td>Specifies ssh (TCP) port.</td></tr>
1261
- <tr><td>rate_policy</td><td>server config</td><td>string</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>--policy</td><td>Valid literals include "low","fair","high" and "fixed".</td></tr>
1262
- <tr><td>symlink_policy</td><td>follow</td><td>string</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>--symbolic-links</td><td>copy, follow, copy+force, skip. Default is follow. Handle source side symbolic links by following the link (follow), copying the link itself (copy), skipping (skip), or forcibly copying the link itself (copy+force).</td></tr>
1263
- <tr><td>target_rate_kbps</td><td>-</td><td>integer</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>-l</td><td>Specifies desired speed for the transfer.</td></tr>
1264
- <tr><td>min_rate_kbps</td><td>0</td><td>integer</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>-m</td><td>Set the minimum transfer rate in kilobits per second.</td></tr>
1265
- <tr><td>cipher</td><td>none</td><td>string</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>-c</td><td>in transit encryption type.<br/>none, aes-128, aes-256</td></tr>
1266
- <tr><td>content_protection</td><td>encrypt<br/>decrypt</td><td>string</td><td></td><td></td><td></td><td>--file-crypt=</td><td>encryption at rest</td></tr>
1267
- <tr><td>content_protection_password</td><td>-</td><td>string</td><td></td><td></td><td></td><td>PASS</td><td>Specifies a string password.</td></tr>
1268
- <tr><td>overwrite</td><td>diff</td><td>string</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>--overwrite</td><td>Overwrite destination files with the source files of the same name.<br/>never, always, diff, older, or diff+older</td></tr>
1269
- <tr><td>retry_duration</td><td></td><td>string</td><td></td><td></td><td></td><td>TODO</td><td>Specifies how long to wait before retrying transfer. (e.g. "5min")</td></tr>
1270
- <tr><td>http_fallback</td><td></td><td>bool (node), integer</td><td></td><td></td><td></td><td>-y<br/>TODO</td><td>When true(1), attempts to perform an HTTP transfer if a fasp transfer cannot be performed.</td></tr>
1271
- <tr><td>create_dir</td><td></td><td>boolean</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>-d</td><td>Specifies whether to create new directories.</td></tr>
1272
- <tr><td>precalculate_job_size</td><td>srv. def.</td><td>boolean</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>--precalculate-job-size</td><td>Specifies whether to precalculate the job size.</td></tr>
1273
- <tr><td>delete_source</td><td></td><td>boolean</td><td></td><td class="yes">Y</td><td></td><td>?</td><td>?</td></tr>
1274
- <tr><td>remove_after_transfer</td><td></td><td>boolean</td><td></td><td class="yes">Y</td><td></td><td>?</td><td>Specifies whether to remove file after transfer.</td></tr>
1275
- <tr><td>remove_empty_directories</td><td></td><td>boolean</td><td></td><td class="yes">Y</td><td></td><td>?</td><td>Specifies whether to remove empty directories.</td></tr>
1276
- <tr><td>multi_session</td><td>1</td><td>integer</td><td class="no">N</td><td class="yes">Y</td><td class="no">N</td><td>-C</td><td>Specifies how many parts the transfer is in.</td></tr>
1277
- <tr><td>multi_session_threshold</td><td>null</td><td>integer</td><td class="no">N</td><td class="yes">Y</td><td class="no">N</td><td>-</td><td>in bytes</td></tr>
1278
- <tr><td>exclude_newer_than</td><td></td><td>integer</td><td class="yes">Y</td><td></td><td></td><td>--exclude-newer-than</td><td>-</td></tr>
1279
- <tr><td>exclude_older_than</td><td></td><td>integer</td><td class="yes">Y</td><td></td><td></td><td>--exclude-older-than</td><td>-</td></tr>
1280
- <tr><td>preserve_acls</td><td></td><td>string</td><td class="yes">Y</td><td></td><td></td><td>--preserve-acls</td><td>-</td></tr>
1281
- <tr><td>dgram_size</td><td></td><td>integer</td><td class="yes">Y</td><td></td><td></td><td>-Z</td><td>in bytes</td></tr>
1282
- <tr><td>compression</td><td></td><td>integer</td><td></td><td></td><td></td><td></td><td>ascp4 only, 0 / 1?</td></tr>
1283
- <tr><td>read_threads</td><td></td><td>integer</td><td></td><td></td><td></td><td>-</td><td>ascp4 only</td></tr>
1284
- <tr><td>write_threads</td><td></td><td>integer</td><td></td><td></td><td></td><td>-</td><td>ascp4 only</td></tr>
1285
- <tr><td>use_ascp4</td><td>false</td><td>boolean</td><td></td><td class="yes">Y</td><td></td><td>-</td><td>specify version of protocol</td></tr>
1286
- <tr><td>paths</td><td>source files (dest)</td><td>array</td><td></td><td></td><td></td><td>positional<br/>--file-list<br/>--file-pair-list</td><td>Contains a path to the source (required) and a path to the destination.</td></tr>
1287
- <tr><td>http_fallback_port</td><td></td><td>integer</td><td class="yes">Y</td><td></td><td></td><td>-t</td><td>Specifies http port.</td></tr>
1288
- <tr><td>https_fallback_port</td><td></td><td>integer</td><td></td><td></td><td></td><td>todo</td><td>Specifies https port.</td></tr>
1289
- <tr><td>cipher_allowed</td><td></td><td>string</td><td></td><td></td><td></td><td>-</td><td>returned by node API. Valid literals include "aes-128" and "none".</td></tr>
1290
- <tr><td>target_rate_cap_kbps</td><td></td><td></td><td class="no">N</td><td class="no">?</td><td class="yes">?</td><td>-</td><td>Returned by upload/download_setup node api.</td></tr>
1291
- <tr><td>rate_policy_allowed</td><td></td><td></td><td></td><td></td><td></td><td>-</td><td>returned by node API. Specifies most aggressive rate policy that is allowed. Valid literals include "low", "fair","high" and "fixed".</td></tr>
1292
- <tr><td>ssh_private_key</td><td>-</td><td>string</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>KEY</td><td>Private key used for SSH authentication, Shall look like: `-----BEGIN RSA PRIVATE KEY-----\nMII`<br/>Note the JSON encoding `\` + `n` for newlines.</td></tr>
1293
- <tr><td>remote_password</td><td>-</td><td>string</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>PASS</td><td>SSH session password</td></tr>
1294
- <tr><td>resume_policy</td><td>faspmgr:<br/>none<br/>other:<br/>sparse_csum</td><td>string</td><td class="yes">Y</td><td class="yes">Y</td><td class="yes">Y</td><td>-k</td><td>none,attrs,sparse_csum,full_csum</td></tr>
1295
- <tr><td>authentication</td><td>-</td><td class="no">N</td><td class="no">N</td><td class="yes">Y</td><td>-</td><td>token: Aspera web keys are provided to allow transparent web based session initiation. on connect: password is not asked. Else, password is asked, and keys are not provided.</td></tr>
1296
- <tr><td>EX_ssh_key_paths</td><td>-</td><td>array</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>-i</td><td>Use public key authentication and specify the private key file</td></tr>
1297
- <tr><td>EX_at_rest_password</td><td>-</td><td>string</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>FILEPASS</td><td>Passphrase used for at rest encryption or decryption</td></tr>
1298
- <tr><td>EX_proxy_password</td><td>-</td><td>string</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>PROXY_PASS</td><td>TODO</td></tr>
1299
- <tr><td>EX_fasp_proxy_url</td><td>-</td><td>string</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>--proxy</td><td>Specify the address of the Aspera high-speed proxy server</td></tr>
1300
- <tr><td>EX_http_proxy_url</td><td>-</td><td>string</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>-x</td><td>Specify the proxy server address used by HTTP Fallback</td></tr>
1301
- <tr><td>EX_ascp_args</td><td>-</td><td>array</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>same</td><td>Add command line arguments to ascp</td></tr>
1302
- <tr><td>EX_http_transfer_jpeg</td><td>0</td><td>integer</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>-j</td><td>HTTP transfers as JPEG file</td></tr>
1303
- <tr><td>EX_license_text</td><td>-</td><td>string</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>LICENSE</td><td>license file text</td></tr>
1304
- <tr><td>EX_file_list</td><td>-</td><td>string</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>--file-list</td><td>source file list</td></tr>
1305
- <tr><td>EX_file_pair_list</td><td>-</td><td>string</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>--file-pair-list</td><td>source file pair list</td></tr>
1306
- <tr><td>EX_multi_session_part</td><td>-</td><td>string</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>-C</td><td>part for multisession</td></tr>
1307
- <tr><td>EX_no_read</td><td>-</td><td>-</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>--no-read</td><td>no read source</td></tr>
1308
- <tr><td>EX_no_write</td><td>-</td><td>-</td><td class="yes">Y</td><td class="no">N</td><td class="no">N</td><td>--no-write</td><td>no write estination</td></tr>
1309
- </table>
1296
+ * D=Direct (local `ascp` execution)
1297
+ * N=Node API
1298
+ * C=Connect Client
1299
+ * arg=`ascp` argument or environment variable
1300
+
1301
+ Fields with EX_ prefix are extensions to transfer agent `direct`. (only in `ascli`).
1310
1302
 
1303
+ <table><tr><th>Field</th><th>Type</th><th>D</th><th>N</th><th>C</th><th>Description</th></tr><tr><td>cipher</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>In transit encryption type.<br/>none, aes-128, aes-256<br/>Allowed values: aes128, aes192, aes256, aes128cfb, aes192cfb, aes256cfb, aes128gcm, aes192gcm, aes256gcm<br/>(-c)</td></tr><tr><td>content_protection</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Enable client-side content protection. (encryption at rest)<br/>Allowed values: encrypt, decrypt</td></tr><tr><td>content_protection_password</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Specifies CSEAR password.</td></tr><tr><td>cookie</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Metadata for transfer (older,string)<br/>(env:ASPERA_SCP_COOKIE)</td></tr><tr><td>create_dir</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>Specifies whether to create new directories.<br/>(-d)</td></tr><tr><td>delete_before_transfer</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>(--delete-before-transfer)</td></tr><tr><td>delete_source</td><td>bool</td><td>&nbsp;</td><td>Y</td><td>&nbsp;</td><td>Remove SRC files after transfer success</td></tr><tr><td>direction</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Direction of transfer (on client side)<br/>Allowed values: send, receive<br/>(--mode)</td></tr><tr><td>exclude_newer_than</td><td>int</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>skip src files with mtime > arg<br/>(--exclude-newer-than)</td></tr><tr><td>exclude_older_than</td><td>int</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>skip src files with mtime < arg<br/>(--exclude-older-than)</td></tr><tr><td>fasp_port</td><td>int</td><td>Y</td><td>Y</td><td>Y</td><td>Specifies fasp (UDP) port.<br/>(-O)</td></tr><tr><td>http_fallback</td><td>string<br/>bool</td><td>Y</td><td>Y</td><td>Y</td><td>When true(1), attempts to perform an HTTP transfer if a fasp transfer cannot be performed.<br/>(-y)</td></tr><tr><td>http_fallback_port</td><td>int</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>Specifies http port.<br/>(-t)</td></tr><tr><td>https_fallback_port</td><td>int</td><td>Y</td><td>Y</td><td>Y</td><td>Specifies https port.</td></tr><tr><td>move_after_transfer</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>(--move-after-transfer)</td></tr><tr><td>multi_session</td><td>int</td><td>Y</td><td>Y</td><td>Y</td><td>Use multi-session transfer. max 128.<br/> Each participant on one host needs an independent UDP (-O) port.<br/> Large files are split between sessions only when transferring with resume_policy=none.</td></tr><tr><td>multi_session_threshold</td><td>int</td><td>Y</td><td>Y</td><td>&nbsp;</td><td>in bytes<br/>(--multi-session-threshold)</td></tr><tr><td>overwrite</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Overwrite destination files with the source files of the same name.<br/>Allowed values: never, always, diff, older, diff+older<br/>(--overwrite)</td></tr><tr><td>paths</td><td>array</td><td>Y</td><td>Y</td><td>Y</td><td>Required. Contains a path to the source (required) and a path to the destination.</td></tr><tr><td>precalculate_job_size</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>Specifies whether to precalculate the job size.<br/>(--precalculate-job-size)</td></tr><tr><td>preserve_access_time</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>(--preserve-access-time)</td></tr><tr><td>preserve_creation_time</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>(--preserve-creation-time)</td></tr><tr><td>preserve_modification_time</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>(--preserve-modification-time)</td></tr><tr><td>preserve_times</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>(--preserve-times)</td></tr><tr><td>rate_policy</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>The transfer rate policy to use when sharing bandwidth.<br/>Allowed values: low, fair, high, fixed<br/>(--policy)</td></tr><tr><td>remote_access_key</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Node only?</td></tr><tr><td>remote_host</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>IP or fully qualified domain name of the remote server<br/>(--host)</td></tr><tr><td>remote_user</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Remote user. Default value is "xfer" on node or connect.<br/>(--user)</td></tr><tr><td>remote_password</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>SSH session password<br/>(env:ASPERA_SCP_PASS)</td></tr><tr><td>remove_after_transfer</td><td>bool</td><td>Y</td><td>Y</td><td>&nbsp;</td><td>Remove SRC files after transfer success<br/>(--remove-after-transfer)</td></tr><tr><td>remove_empty_directories</td><td>bool</td><td>Y</td><td>Y</td><td>&nbsp;</td><td>Specifies whether to remove empty directories.<br/>(--remove-empty-directories)</td></tr><tr><td>proxy</td><td>string</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>Specify the address of the Aspera high-speed proxy server.<br/> dnat(s)://[user[:password]@]server:port<br/> Default ports for DNAT and DNATS protocols are 9091 and 9092.<br/> Password, if specified here, overrides the value of environment variable ASPERA_PROXY_PASS.<br/>(--proxy)</td></tr><tr><td>resume_policy</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>If a transfer is interrupted or fails to finish, resume without re-transferring the whole files.<br/>Allowed values: none, attrs, sparse_csum, full_csum<br/>(-k)</td></tr><tr><td>retry_duration</td><td>string<br/>int</td><td>&nbsp;</td><td>Y</td><td>Y</td><td>Specifies how long to wait before retrying transfer. (e.g. "5min")</td></tr><tr><td>ssh_port</td><td>int</td><td>Y</td><td>Y</td><td>Y</td><td>Specifies ssh (TCP) port. Default: local:22, other:33001<br/>(-P)</td></tr><tr><td>ssh_private_key</td><td>string</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>Private key used for SSH authentication.<br/> Shall look like: -----BEGIN RSA PRIVATE KEY-----\nMII...<br/> Note the JSON encoding: \n for newlines.<br/>(env:ASPERA_SCP_KEY)</td></tr><tr><td>symlink_policy</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Handle source side symbolic links by:<br/> following the link (follow),<br/> copying the link itself (copy),<br/> skipping (skip),<br/> or forcibly copying the link itself (copy+force).<br/> Default: follow<br/>Allowed values: follow, copy, copy+force, skip<br/>(--symbolic-links)</td></tr><tr><td>tags</td><td>hash</td><td>Y</td><td>Y</td><td>Y</td><td>Metadata for transfer<br/>(--tags64)</td></tr><tr><td>target_rate_cap_kbps</td><td>int</td><td>&nbsp;</td><td>&nbsp;</td><td>Y</td><td>Returned by upload/download_setup node api.</td></tr><tr><td>target_rate_kbps</td><td>int</td><td>Y</td><td>Y</td><td>Y</td><td>Specifies desired speed for the transfer.<br/>(-l)</td></tr><tr><td>title</td><td>string</td><td>&nbsp;</td><td>Y</td><td>Y</td><td>Title of the transfer</td></tr><tr><td>token</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Authorization token: Bearer, Basic or ATM (Also arg -W)<br/>(env:ASPERA_SCP_TOKEN)</td></tr><tr><td>use_ascp4</td><td>bool</td><td>Y</td><td>Y</td><td>&nbsp;</td><td>specify version of protocol</td></tr><tr><td>destination_root</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Destination root directory.</td></tr><tr><td>source_root</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Path to be prepended to each source path.<br/> This is either a conventional path or it can be a URI but only if there is no root defined.<br/>(--source-prefix64)</td></tr><tr><td>min_rate_cap_kbps</td><td>int</td><td>Y</td><td>Y</td><td>Y</td><td>&nbsp;</td></tr><tr><td>lock_rate_policy</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>&nbsp;</td></tr><tr><td>lock_target_rate_kbps</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>&nbsp;</td></tr><tr><td>lock_min_rate_kbps</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>&nbsp;</td></tr><tr><td>apply_local_docroot</td><td>bool</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>(--apply-local-docroot)</td></tr><tr><td>preserve_acls</td><td>string</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>Preserve access control lists.<br/>Allowable values: none, native, metafile<br/>(--preserve-acls)</td></tr><tr><td>remove_empty_source_directory</td><td>bool</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>TODO: check node, sdk<br/>(--remove-empty-source-directory)</td></tr><tr><td>EX_at_rest_password</td><td>string</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>Passphrase used for at rest encryption or decryption<br/>(env:ASPERA_SCP_FILEPASS)</td></tr><tr><td>EX_proxy_password</td><td>string</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>Password used for Aspera proxy server authentication.<br/> May be overridden by password in URL EX_fasp_proxy_url.<br/>(env:ASPERA_PROXY_PASS)</td></tr><tr><td>EX_license_text</td><td>string</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>License file text override.<br/>By default ascp looks for license file near executable.<br/>(env:ASPERA_SCP_LICENSE)</td></tr><tr><td>dgram_size</td><td>int</td><td>Y</td><td>Y</td><td>Y</td><td>in bytes<br/>(-Z)</td></tr><tr><td>min_rate_kbps</td><td>int</td><td>Y</td><td>Y</td><td>Y</td><td>Set the minimum transfer rate in kilobits per second.<br/>(-m)</td></tr><tr><td>sshfp</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Check it against server SSH host key fingerprint<br/>(--check-sshfp)</td></tr><tr><td>EX_http_proxy_url</td><td>string</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>Specify the proxy server address used by HTTP Fallback<br/>(-x)</td></tr><tr><td>EX_ssh_key_paths</td><td>array</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>Use public key authentication for SSH and specify the private key file paths<br/>(-i)</td></tr><tr><td>EX_http_transfer_jpeg</td><td>int</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>HTTP transfers as JPEG file<br/>(-j)</td></tr><tr><td>EX_no_read</td><td>bool</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>no read source<br/>(--no-read)</td></tr><tr><td>EX_no_write</td><td>bool</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>no write on destination<br/>(--no-write)</td></tr><tr><td>target_rate_percentage</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>&nbsp;</td></tr><tr><td>rate_policy_allowed</td><td>string</td><td>&nbsp;</td><td>&nbsp;</td><td>Y</td><td>Specifies most aggressive rate policy that is allowed.<br/> Returned by node API.<br/>Allowed values: low, fair, high, fixed</td></tr><tr><td>lock_min_rate</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>&nbsp;</td></tr><tr><td>lock_target_rate</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>&nbsp;</td></tr><tr><td>authentication</td><td>string</td><td>&nbsp;</td><td>&nbsp;</td><td>Y</td><td>value=token for SSH bypass keys, else password asked if not provided.</td></tr><tr><td>cipher_allowed</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>returned by node API. Valid literals include "aes-128" and "none".</td></tr><tr><td>EX_file_list</td><td>string</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>source file list</td></tr><tr><td>EX_file_pair_list</td><td>string</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>source file pair list</td></tr><tr><td>EX_ascp_args</td><td>array</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>Add command line arguments to ascp</td></tr><tr><td>wss_enabled</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>&nbsp;</td></tr><tr><td>wss_port</td><td>int</td><td>Y</td><td>Y</td><td>Y</td><td>&nbsp;</td></tr></table>
1311
1304
 
1312
1305
  ### Destination folder for transfers
1313
1306
 
@@ -1389,7 +1382,7 @@ Source files are located on "Aspera on cloud", when :
1389
1382
 
1390
1383
  ### <a name="multisession"></a>Support of multi-session
1391
1384
 
1392
- Multi session, i.e. starting a transfer of a file set using multiple sessions is supported on "direct" and "node" agents, not yet on connect.
1385
+ Multi session, i.e. starting a transfer of a file set using multiple sessions (one ascp process per session) is supported on "direct" and "node" agents, not yet on connect.
1393
1386
 
1394
1387
  * when agent=node :
1395
1388
 
@@ -1410,6 +1403,7 @@ shall be preferred.
1410
1403
 
1411
1404
  Multi-session spawn is done by `ascli`.
1412
1405
 
1406
+ When multi-session is used, one separate UDP port is used per session (refer to `ascp` manual page).
1413
1407
 
1414
1408
  ### Examples
1415
1409
 
@@ -1456,7 +1450,9 @@ A non complete list of commands used in unit tests:
1456
1450
  ```
1457
1451
  ascli
1458
1452
  ascli -h
1459
- ascli aoc admin analytics transfers --query=@json:'{"status":"completed","direction":"receive"}'
1453
+ ascli aoc -N remind --username=my_aoc_user_email
1454
+ ascli aoc -N servers
1455
+ ascli aoc admin analytics transfers --query=@json:'{"status":"completed","direction":"receive"}' --notif-to=my_recipient_email --notif-template=@ruby:'%Q{From: <%=from_name%> <<%=from_email%>>\nTo: <<%=to%>>\nSubject: <%=ev["files_completed"]%> files received\n\n<%=ev.to_yaml%>}'
1460
1456
  ascli aoc admin ats access_key --id=akibmcloud --secret=somesecret node browse /
1461
1457
  ascli aoc admin ats access_key --id=akibmcloud delete
1462
1458
  ascli aoc admin ats access_key create --cloud=aws --region=my_aws_bucket_region --params=@json:'{"id":"ak_aws","name":"my test key AWS","storage":{"type":"aws_s3","bucket":"my_aws_bucket_name","credentials":{"access_key_id":"my_aws_bucket_key","secret_access_key":"my_aws_bucket_secret"},"path":"/"}}'
@@ -1494,7 +1490,6 @@ ascli aoc admin resource node --name=AOC_NODE1_NAME --secret=AOC_NODE1_SECRET v4
1494
1490
  ascli aoc admin resource node --name=AOC_NODE1_NAME --secret=AOC_NODE1_SECRET v4 mkdir /folder1
1495
1491
  ascli aoc admin resource workspace list
1496
1492
  ascli aoc admin resource workspace_membership list --fields=ALL --query=@json:'{"page":1,"per_page":50,"embed":"member","inherited":false,"workspace_id":11363,"sort":"name"}'
1497
- ascli aoc apiinfo
1498
1493
  ascli aoc automation workflow --id="my_wf_id" action create --value=@json:'{"name":"toto"}' | tee action.info
1499
1494
  ascli aoc automation workflow create --value=@json:'{"name":"test_workflow"}'
1500
1495
  ascli aoc automation workflow delete --id="my_wf_id"
@@ -1504,6 +1499,7 @@ ascli aoc automation workflow list --value=@json:'{"show_org_workflows":"true"}'
1504
1499
  ascli aoc bearer_token --display=data --scope=user:all
1505
1500
  ascli aoc faspex
1506
1501
  ascli aoc files bearer /
1502
+ ascli aoc files bearer_token_node /
1507
1503
  ascli aoc files browse /
1508
1504
  ascli aoc files browse / -N --link=my_aoc_publink_folder
1509
1505
  ascli aoc files delete /testsrc
@@ -1519,6 +1515,7 @@ ascli aoc files short_link list --value=@json:'{"purpose":"shared_folder_auth_li
1519
1515
  ascli aoc files transfer --from-folder=/testsrc --to-folder=/testdst testfile.bin
1520
1516
  ascli aoc files upload --to-folder=/testsrc testfile.bin
1521
1517
  ascli aoc files upload -N --to-folder=/ testfile.bin --link=my_aoc_publink_folder
1518
+ ascli aoc files upload Test.pdf --transfer=node --transfer-info=@json:@stdin:
1522
1519
  ascli aoc files v3 info
1523
1520
  ascli aoc org -N --link=my_aoc_publink_recv_from_aocuser
1524
1521
  ascli aoc organization
@@ -1531,7 +1528,6 @@ ascli aoc packages send --value=@json:'{"name":"Important files delivery","recip
1531
1528
  ascli aoc packages send --workspace="my_aoc_shbx_ws" --value=@json:'{"name":"Important files delivery","recipients":["my_aoc_shbx_name"]}' testfile.bin
1532
1529
  ascli aoc packages send -N --value=@json:'{"name":"Important files delivery"}' testfile.bin --link=my_aoc_publink_send_aoc_user --password=my_aoc_publink_send_use_pass
1533
1530
  ascli aoc packages send -N --value=@json:'{"name":"Important files delivery"}' testfile.bin --link=my_aoc_publink_send_shd_inbox
1534
- ascli aoc servers
1535
1531
  ascli aoc user info modify @json:'{"name":"dummy change"}'
1536
1532
  ascli aoc user info show
1537
1533
  ascli aoc workspace
@@ -1550,8 +1546,8 @@ ascli ats cluster list
1550
1546
  ascli ats cluster show --cloud=aws --region=eu-west-1
1551
1547
  ascli ats cluster show --id=1f412ae7-869a-445c-9c05-02ad16813be2
1552
1548
  ascli conf flush_tokens
1553
- ascli conf wiz --url=https://my_aoc_org.ibmaspera.com --config-file=SAMPLE_CONFIG_FILE --pkeypath='' --username=my_aoc_user --test-mode=yes
1554
- ascli conf wiz --url=https://my_aoc_org.ibmaspera.com --config-file=SAMPLE_CONFIG_FILE --pkeypath='' --username=my_aoc_user --test-mode=yes --use-generic-client=yes
1549
+ ascli conf wiz --url=https://my_aoc_org.ibmaspera.com --config-file=SAMPLE_CONFIG_FILE --pkeypath='' --username=my_aoc_user_email --test-mode=yes
1550
+ ascli conf wiz --url=https://my_aoc_org.ibmaspera.com --config-file=SAMPLE_CONFIG_FILE --pkeypath='' --username=my_aoc_user_email --test-mode=yes --use-generic-client=yes
1555
1551
  ascli config ascp connect id 'Aspera Connect for Windows' info
1556
1552
  ascli config ascp connect id 'Aspera Connect for Windows' links id 'Windows Installer' download --to-folder=.
1557
1553
  ascli config ascp connect id 'Aspera Connect for Windows' links list
@@ -1563,14 +1559,14 @@ ascli config ascp show
1563
1559
  ascli config check_update
1564
1560
  ascli config doc
1565
1561
  ascli config doc transfer-parameters
1566
- ascli config email_test aspera.user1@gmail.com
1562
+ ascli config email_test --notif-to=my_recipient_email
1567
1563
  ascli config export
1568
1564
  ascli config genkey mykey
1569
1565
  ascli config plugins
1570
1566
  ascli config proxy_check --fpac=file:///examples/proxy.pac https://eudemo.asperademo.com
1571
1567
  ascli console transfer current list
1572
1568
  ascli console transfer smart list
1573
- ascli console transfer smart sub 112 @json:'{"source":{"paths":["10MB.1"]},"source_type":"user_selected"}'
1569
+ ascli console transfer smart sub my_job_id @json:'{"source":{"paths":["my_file_name"]},"source_type":"user_selected"}'
1574
1570
  ascli cos -N --bucket=my_icos_bucket_name --endpoint=my_icos_bucket_endpoint --apikey=my_icos_bucket_apikey --crn=my_icos_resource_instance_id node info
1575
1571
  ascli cos -N --bucket=my_icos_bucket_name --region=my_icos_bucket_region --service-credentials=@json:@file:service_creds.json node info
1576
1572
  ascli cos node access_key --id=self show
@@ -1592,7 +1588,7 @@ ascli faspex source name "Server Files" node br /
1592
1588
  ascli faspex5 node list --value=@json:'{"type":"received","subtype":"mypackages"}'
1593
1589
  ascli faspex5 package list --value=@json:'{"mailbox":"inbox","state":["released"]}'
1594
1590
  ascli faspex5 package receive --id="my_package_id" --to-folder=.
1595
- ascli faspex5 package send --value=@json:'{"title":"test title","recipients":["${f5_user}"]}' testfile.bin
1591
+ ascli faspex5 package send --value=@json:'{"title":"test title","recipients":[{"name":"${f5_user}"}]}' testfile.bin
1596
1592
  ascli node -N -Ptst_node_preview access_key create --value=@json:'{"id":"aoc_1","storage":{"type":"local","path":"/"}}'
1597
1593
  ascli node -N -Ptst_node_preview access_key delete --id=aoc_1
1598
1594
  ascli node async --id=1 bandwidth
@@ -1648,7 +1644,7 @@ ascli server delete NEW_SERVER_FOLDER
1648
1644
  ascli server delete folder_1/target_hot
1649
1645
  ascli server delete folder_1/to.delete
1650
1646
  ascli server df
1651
- ascli server download NEW_SERVER_FOLDER/testfile.bin --to-folder=.
1647
+ ascli server download NEW_SERVER_FOLDER/testfile.bin --to-folder=. --transfer-info=@json:'{"wss":false,"resume":{"iter_max":1}}'
1652
1648
  ascli server download NEW_SERVER_FOLDER/testfile.bin --to-folder=folder_1 --transfer=node
1653
1649
  ascli server du /
1654
1650
  ascli server health transfer --to-folder=folder_1 --format=nagios
@@ -1659,9 +1655,9 @@ ascli server mkdir folder_1/target_hot
1659
1655
  ascli server mv folder_1/200KB.2 folder_1/to.delete
1660
1656
  ascli server upload --sources=@ts --ts=@json:'{"paths":[{"source":"testfile.bin","destination":"NEW_SERVER_FOLDER/othername"}]}'
1661
1657
  ascli server upload --src-type=pair --sources=@json:'["testfile.bin","NEW_SERVER_FOLDER/othername"]'
1662
- ascli server upload --src-type=pair testfile.bin NEW_SERVER_FOLDER/othername
1658
+ ascli server upload --src-type=pair testfile.bin NEW_SERVER_FOLDER/othername --notif-to=my_recipient_email
1663
1659
  ascli server upload --to-folder=folder_1/target_hot --lock-port=12345 --ts=@json:'{"EX_ascp_args":["--remove-after-transfer","--remove-empty-directories","--exclude-newer-than=-8","--src-base","source_hot"]}' source_hot
1664
- ascli server upload testfile.bin --to-folder=NEW_SERVER_FOLDER
1660
+ ascli server upload testfile.bin --to-folder=NEW_SERVER_FOLDER --ts=@json:'{"multi_session":3,"multi_session_threshold":1,"resume_policy":"none","target_rate_kbps":1500}' --transfer-info=@json:'{"spawn_delay_sec":2.5}' --progress=multi
1665
1661
  ascli shares admin share list
1666
1662
  ascli shares repository browse /
1667
1663
  ascli shares repository delete /SHARES_UPLOAD/testfile.bin
@@ -1684,7 +1680,7 @@ ascli sync start --parameters=@json:'{"sessions":[{"name":"test","reset":true,"r
1684
1680
  ```
1685
1681
  $ ascli -h
1686
1682
  NAME
1687
- ascli -- a command line tool for Aspera Applications (v4.1.0)
1683
+ ascli -- a command line tool for Aspera Applications (v4.3.0)
1688
1684
 
1689
1685
  SYNOPSIS
1690
1686
  ascli COMMANDS [OPTIONS] [ARGS]
@@ -1735,7 +1731,7 @@ OPTIONS: global
1735
1731
  --once-only=ENUM process only new items (some commands): yes, no
1736
1732
 
1737
1733
  COMMAND: config
1738
- SUBCOMMANDS: gem_path genkey plugins flush_tokens list overview open echo id documentation wizard export_to_cli detect coffee ascp email_test smtp_settings proxy_check folder file check_update
1734
+ SUBCOMMANDS: gem_path genkey plugins flush_tokens list overview open echo id documentation wizard export_to_cli detect coffee ascp email_test smtp_settings proxy_check folder file check_update initdemo
1739
1735
  OPTIONS:
1740
1736
  --value=VALUE extended value for create, update, list filter
1741
1737
  --property=VALUE name of property to set
@@ -1751,10 +1747,12 @@ OPTIONS:
1751
1747
  --fpac=VALUE proxy auto configuration URL
1752
1748
  -P, --presetVALUE load the named option preset from current config file
1753
1749
  --default=VALUE set as default configuration for specified plugin
1754
- --secret=VALUE access key secret for node
1755
- --secrets=VALUE access key secret for node
1750
+ --secret=VALUE default secret
1751
+ --secrets=VALUE secret repository (Hash)
1756
1752
  --sdk-url=VALUE URL to get SDK
1757
1753
  --sdk-folder=VALUE SDK folder location
1754
+ --notif-to=VALUE email recipient for notification of transfers
1755
+ --notif-template=VALUE email ERB template for notification of transfers
1758
1756
  --test-mode=ENUM skip user validation in wizard mode: yes, no
1759
1757
  --version-check-days=VALUE period to check neew version in days (zero to disable)
1760
1758
  --ts=VALUE override transfer spec values (Hash, use @json: prefix), current={"create_dir"=>true}
@@ -1829,7 +1827,7 @@ OPTIONS:
1829
1827
 
1830
1828
 
1831
1829
  COMMAND: faspex5
1832
- SUBCOMMANDS: node package auth_client
1830
+ SUBCOMMANDS: node package auth_client jobs
1833
1831
  OPTIONS:
1834
1832
  --url=VALUE URL of application, e.g. https://org.asperafiles.com
1835
1833
  --username=VALUE username to log in
@@ -1862,7 +1860,8 @@ OPTIONS:
1862
1860
  --delivery-info=VALUE package delivery information (extended value)
1863
1861
  --source-name=VALUE create package from remote source (by name)
1864
1862
  --storage=VALUE Faspex local storage definition
1865
- --box=ENUM package box: inbox, sent, archive
1863
+ --recipient=VALUE use if recipient is a dropbox (with *)
1864
+ --box=ENUM package box: inbox, archive, sent
1866
1865
 
1867
1866
 
1868
1867
  COMMAND: shares2
@@ -1918,25 +1917,24 @@ OPTIONS:
1918
1917
 
1919
1918
 
1920
1919
  COMMAND: aoc
1921
- SUBCOMMANDS: apiinfo bearer_token organization tier_restrictions user workspace packages files gateway admin automation servers
1920
+ SUBCOMMANDS: reminder bearer_token organization tier_restrictions user workspace packages files gateway admin automation servers
1922
1921
  OPTIONS:
1923
1922
  --url=VALUE URL of application, e.g. https://org.asperafiles.com
1924
1923
  --username=VALUE username to log in
1925
1924
  --password=VALUE user's password
1926
- --auth=ENUM type of Oauth authentication: body_userpass, header_userpass, web, jwt, url_token, ibm_apikey
1925
+ --auth=ENUM OAuth type of authentication: body_userpass, header_userpass, web, jwt, url_token, ibm_apikey
1927
1926
  --operation=ENUM client operation for transfers: push, pull
1928
- --client-id=VALUE API client identifier in application
1929
- --client-secret=VALUE API client passcode
1930
- --redirect-uri=VALUE API client redirect URI
1931
- --private-key=VALUE RSA private key PEM value for JWT (prefix file path with @val:@file:)
1927
+ --client-id=VALUE OAuth API client identifier in application
1928
+ --client-secret=VALUE OAuth API client passcode
1929
+ --redirect-uri=VALUE OAuth API client redirect URI
1930
+ --private-key=VALUE OAuth JWT RSA private key PEM value (prefix file path with @val:@file:)
1932
1931
  --workspace=VALUE name of workspace
1933
1932
  --name=VALUE resource name
1934
1933
  --path=VALUE file or folder path
1935
1934
  --link=VALUE public link to shared resource
1936
1935
  --new-user-option=VALUE new user creation option
1937
1936
  --from-folder=VALUE share to share source folder
1938
- --scope=VALUE scope for AoC API calls
1939
- --notify=VALUE notify users that file was received
1937
+ --scope=VALUE OAuth scope for AoC API calls
1940
1938
  --bulk=ENUM bulk operation: yes, no
1941
1939
  --default-ports=ENUM use standard FASP ports or get from node api: yes, no
1942
1940
 
@@ -2017,7 +2015,7 @@ For this, specify the option: `--use-generic-client=no`.
2017
2015
 
2018
2016
  This will guide you through the steps to create.
2019
2017
 
2020
- ## <a name="aocwizard"></a>Configuration: using manual setup
2018
+ ## <a name="aocmanual"></a>Configuration: using manual setup
2021
2019
 
2022
2020
  If you used the wizard (recommended): skip this section.
2023
2021
 
@@ -2183,7 +2181,7 @@ To activate default use of JWT authentication for `ascli` using the [option pres
2183
2181
 
2184
2182
  * change auth method to JWT
2185
2183
  * provide location of private key
2186
- * provide username to login as (OAuthg "subject")
2184
+ * provide username to login as (OAuth "subject")
2187
2185
 
2188
2186
  Execute:
2189
2187
 
@@ -2281,10 +2279,10 @@ $ ascli aoc admin res user list --query='@json:{"q":"dummyuser"}' --fields=id,em
2281
2279
  : 98398 : dummyuser1@example.com :
2282
2280
  : 98399 : dummyuser2@example.com :
2283
2281
  :.......:........................:
2284
- $ thelist=$(echo $(ascli aoc admin res user list --query='@json:{"q":"dummyuser"}' --fields=id,email --field=id --format=csv)|tr ' ' ,)
2282
+ $ thelist=$(ascli aoc admin res user list --query='@json:{"q":"dummyuser"}' --fields=id --format=json --display=data|jq -cr 'map(.id)')
2285
2283
  $ echo $thelist
2286
- 98398,98399
2287
- $ ascli aoc admin res user --bulk=yes --id=@json:[$thelist] delete
2284
+ ["113501","354061"]
2285
+ $ ascli aoc admin res user --bulk=yes --id=@json:"$thelist" delete
2288
2286
  :.......:.........:
2289
2287
  : id : status :
2290
2288
  :.......:.........:
@@ -2293,6 +2291,14 @@ $ ascli aoc admin res user --bulk=yes --id=@json:[$thelist] delete
2293
2291
  :.......:.........:
2294
2292
  ```
2295
2293
 
2294
+ * <a name="deactuser"></a>Find deactivated users since more than 2 years
2295
+
2296
+ ```
2297
+ ascli aoc admin res user list --query=@ruby:'{"deactivated"=>true,"q"=>"last_login_at:<#{(DateTime.now.to_time.utc-2*365*86400).iso8601}"}'
2298
+ ```
2299
+
2300
+ To delete them use the same method as before
2301
+
2296
2302
  * Display current user's workspaces
2297
2303
 
2298
2304
  ```
@@ -2534,10 +2540,10 @@ $ ascli aoc packages recv --id=ALL --once-only=yes --lock-port=12345
2534
2540
  * `--once-only=yes` keeps memory of any downloaded package in persistency files located in the configuration folder.
2535
2541
  * `--lock-port=12345` ensures that only one instance is started at the same time, to avoid collisions
2536
2542
 
2537
- Typically, one would regularly execute this command on a regular basis, using the method oif your choice:
2543
+ Typically, one would regularly execute this command on a regular basis, using the method of your choice:
2538
2544
 
2539
- * Windows scheduler
2540
- * cron
2545
+ * Windows: [Task Scheduler](https://docs.microsoft.com/en-us/windows/win32/taskschd/task-scheduler-start-page)
2546
+ * Linux/Unix: [cron](https://www.man7.org/linux/man-pages/man5/crontab.5.html)
2541
2547
  * etc...
2542
2548
 
2543
2549
  ## Download Files
@@ -2594,19 +2600,40 @@ The activity app can be queried with:
2594
2600
  $ ascli aoc admin analytics transfers
2595
2601
  ```
2596
2602
 
2597
- It can also support filters and send notification email with a template:
2603
+ It can also support filters and send notification using option `notif_to`. a template is defined using option `notif_template` :
2604
+
2605
+ `mytemplate.erb`:
2598
2606
 
2599
2607
  ```
2600
- $ ascli aoc admin analytics transfers --once-only=yes --lock-port=123455 \
2608
+ From: <%=from_name%> <<%=from_email%>>
2609
+ To: <<%=ev['user_email']%>>
2610
+ Subject: <%=ev['files_completed']%> files received
2611
+
2612
+ Dear <%=ev[:user_email.to_s]%>,
2613
+ We received <%=ev['files_completed']%> files for a total of <%=ev['transferred_bytes']%> bytes, starting with file:
2614
+ <%=ev['content']%>
2615
+
2616
+ Thank you.
2617
+ ```
2618
+ The environment provided contains the following additional variable:
2619
+
2620
+ * ev : all details on the transfer event
2621
+
2622
+ Example:
2623
+
2624
+ ```
2625
+ $ ascli aoc admin analytics transfers --once-only=yes --lock-port=12345 \
2601
2626
  --query=@json:'{"status":"completed","direction":"receive"}' \
2602
- --notify=@json:'{"to":"<''%=transfer[:user_email.to_s]%>","subject":"<''%=transfer[:files_completed.to_s]%> files received","body":"Dear <''%=transfer[:user_email.to_s]%>\nWe received <''%=transfer[:files_completed.to_s]%> files for a total of <''%=transfer[:transferred_bytes.to_s]%> bytes, starting with file:\n<''%=transfer[:content.to_s]%>\n\nThank you."}'
2627
+ --notif-to=active --notif-template=@file:mytemplate.erb
2603
2628
  ```
2604
2629
 
2630
+ Options:
2631
+
2605
2632
  * `once_only` keep track of last date it was called, so next call will get only new events
2606
2633
  * `query` filter (on API call)
2607
2634
  * `notify` send an email as specified by template, this could be places in a file with the `@file` modifier.
2608
2635
 
2609
- Note this must not be executed in less than 5 minutes because the analytics interface accepts only a period of time between 5 minutes and 6 months. here the period is [date of previous execution]..[now].
2636
+ Note this must not be executed in less than 5 minutes because the analytics interface accepts only a period of time between 5 minutes and 6 months. The period is [date of previous execution]..[now].
2610
2637
 
2611
2638
  ## Using specific transfer ports
2612
2639
 
@@ -2667,7 +2694,37 @@ $ ascli ats api_key create
2667
2694
  +--------+----------------------------------------------+
2668
2695
  $ ascli config id my_ibm_ats update --ats-key=ats_XXXXXXXXXXXXXXXXXXXXXXXX --ats-secret=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
2669
2696
  ```
2697
+ ## Cross Organization transfers
2698
+
2699
+ It is possible to transfer files directly between organizations without having to first download locally and then upload...
2700
+
2701
+ Although optional, the creation of [option preset](#lprt) is recommended to avoid placing all parameters in the command line.
2702
+
2703
+ Procedure to send a file from org1 to org2:
2704
+
2705
+ * Get access to Organization 1 and create a [option preset](#lprt): e.g. `org1`, for instance, use the [Wizard](#aocwizard)
2706
+ * Check that access works and locate the source file e.g. `mysourcefile`, e.g. using command `files browse`
2707
+ * Get access to Organization 2 and create a [option preset](#lprt): e.g. `org2`
2708
+ * Check that access works and locate the destination folder `mydestfolder`
2709
+ * execute the following:
2710
+
2711
+ ```
2712
+ $ ascli -Porg1 aoc files node_info /mydestfolder --format=json --display=data | ascli -Porg2 aoc files upload mysourcefile --transfer=node --transfer-info=@json:@stdin:
2713
+ ```
2714
+
2715
+ Explanation:
2670
2716
 
2717
+ * `-Porg1 aoc` use Aspera on Cloud plugin and load credentials for `org1`
2718
+ * `files node_info /mydestfolder` generate transfer information including node api credential and root id, suitable for the next command
2719
+ * `--format=json` format the output in JSON (instead of default text table)
2720
+ * `--display=data` display only the result, and remove other information, such as workspace name
2721
+ * `|` the standard output of the first command is fed into the second one
2722
+ * `-Porg2 aoc` use Aspera on Cloud plugin and load credentials for `org2`
2723
+ * `files upload mysourcefile` upload the file named `mysourcefile` (located in `org1`)
2724
+ * `--transfer=node` use transfer agent type `node` instead of default `direct`
2725
+ * `--transfer-info=@json:@stdin:` provide `node` transfer agent information, i.e. node API credentials, those are expected in JSON format and read from standard input
2726
+
2727
+ Note that when using a POSIX shell, another possibility to write `cmd1 | cmd2 --transfer-info=@json:stdin:` is `cmd2 --transfer-info=@json:$(cmd1)` instead of ``
2671
2728
  ## Examples
2672
2729
 
2673
2730
  Example: create access key on softlayer:
@@ -2757,7 +2814,7 @@ This can also be set as default using a preset
2757
2814
  One can test the "server" application using the well known demo server:
2758
2815
 
2759
2816
  ```
2760
- $ ascli config id aspera_demo_server update --url=ssh://demo.asperasoft.com:33001 --username=asperaweb --password=demoaspera
2817
+ $ ascli config id aspera_demo_server update --url=ssh://demo.asperasoft.com:33001 --username=asperaweb --password=_demo_pass_
2761
2818
  $ ascli config id default set server aspera_demo_server
2762
2819
  $ ascli server browse /aspera-test-dir-large
2763
2820
  $ ascli server download /aspera-test-dir-large/200MB
@@ -2853,16 +2910,19 @@ to download files.
2853
2910
  $ ascli node access_key create --value=@json:'{"id":"eudemo-sedemo","secret":"mystrongsecret","storage":{"type":"local","path":"/data/asperafiles"}}'
2854
2911
  ```
2855
2912
 
2856
- # Plugin: IBM Aspera Faspex
2913
+ # Plugin: IBM Aspera Faspex5
2857
2914
 
2858
- Notes:
2915
+ 3 authentication methods are supported:
2916
+
2917
+ * jwt
2918
+ * web
2919
+ * boot
2859
2920
 
2860
- * the command "v4" requires the use of APIv4, refer to the Faspex Admin manual on how to activate.
2861
- * for full details on Faspex API, refer to: [Reference on Developer Site](https://www.ibm.com/products/aspera/developer)
2921
+ For JWT, create an API client in Faspex with jwt support, and use: `--auth=jwt`.
2862
2922
 
2863
- ## Faspex 5 Beta1
2923
+ For web method, create an API client in Faspex, and use: --auth=web
2864
2924
 
2865
- As the web UI does not yet allow adding API client yet, the way to use CLI is:
2925
+ For boot method: (will be removed in future)
2866
2926
 
2867
2927
  * open a browser
2868
2928
  * start developer mode
@@ -2875,30 +2935,74 @@ Use it as password and use `--auth=boot`.
2875
2935
  $ ascli conf id f5boot update --url=https://localhost/aspera/faspex --auth=boot --password=ABC.DEF.GHI...
2876
2936
  ```
2877
2937
 
2878
- An JWT client can then be created with a private key:
2938
+ Ready to use Faspex5 with CLI.
2939
+
2940
+ # Plugin: IBM Aspera Faspex (4.x)
2941
+
2942
+ Notes:
2943
+
2944
+ * The command "v4" requires the use of APIv4, refer to the Faspex Admin manual on how to activate.
2945
+ * For full details on Faspex API, refer to: [Reference on Developer Site](https://developer.ibm.com/apis/catalog/?search=faspex)
2946
+
2947
+ ## Listing Packages
2948
+
2949
+ Command: `faspex package list`
2950
+
2951
+ ### Option `box`
2952
+
2953
+ By default it looks in box `inbox`, but the following boxes are also supported: `archive` and `sent`, selected with option `box`.
2954
+
2955
+ ### Option `recipient`
2956
+
2957
+ A user can receive a package because the recipient is:
2958
+
2959
+ * the user himself (default)
2960
+ * the user is part of a dropbox or a workgroup (select with option `recipient` with value `*<name of WG or DB>`
2961
+
2962
+ ### Option `query`
2963
+
2964
+ As inboxes may be large, it is possible to use the following query parameters:
2965
+
2966
+ * `count` : (native) number items in one API call (default=0, equivalent to 10)
2967
+ * `page` : (native) id of page in call (default=0)
2968
+ * `startIndex` : (native) index of item to start, default=0, oldest index=0
2969
+ * `max` : maximum number of items
2970
+ * `pmax` : maximum number of pages
2971
+
2972
+ (SQL query is `LIMIT <startIndex>, <count>`)
2973
+
2974
+ The API is listed in [Faspex 4 API Reference](https://developer.ibm.com/apis/catalog/?search=faspex) under "Services (API v.3)".
2975
+
2976
+ If no parameter `max` or `pmax` is provided, then all packages will be listed in the inbox, which result in paged API calls (using parameter: `count` and `page`). By default page is `0` (`10`), it can be increased to have less calls.
2977
+
2978
+ ### Example
2879
2979
 
2880
2980
  ```
2881
- $ jsonk=$(openssl rsa -in ~/.aspera/ascli/aspera_on_cloud_key -pubout 2> /dev/null | sed -e :a -e N -e '$!ba' -e 's/\n/\\n/g')
2882
- $ ascli faspex5 -Pf5boot auth_client create --value=@json:'{"name":"hello","client_type":"public","redirect_uris":["https://localhost:12345"],"allow_jwt_grant":true,"public_key":"'$jsonk'"}'
2981
+ $ ascli faspex package list --box=inbox --recipient='*my_dropbox' --query=@json:'{"max":20,"pmax":2,"count":20}'
2883
2982
  ```
2884
2983
 
2885
- or deleted by name:
2984
+ List a maximum of 20 items grouped by pages of 20, with maximum 2 pages in received box (inbox) when received in dropbox `*my_dropbox`.
2985
+
2986
+ ## Receiving a Package
2987
+
2988
+ The command is `package recv`, possible methods are:
2989
+
2990
+ * provide a package id with option `id`
2991
+ * provide a public link with option `link`
2992
+ * provide a `faspe:` URI with option `link`
2886
2993
 
2887
2994
  ```
2888
- $ id=$(ascli faspex5 auth_client list --select=@json:'{"name":"hello"}' --fields=client_id --format=csv)
2889
- $ ascli faspex5 auth_client delete --id=$id
2995
+ $ ascli faspex package recv --id=12345
2996
+ $ ascli faspex package recv --link=faspe://...
2890
2997
  ```
2891
2998
 
2892
- Once the API client is created with a client_id and secret (result of create command), create a configuration:
2999
+ If the package is in a specific dropbox, add option `recipient` for both the `list` and `recv` commands.
2893
3000
 
2894
3001
  ```
2895
- $ ascli conf id f5 update --url=https://localhost/aspera/faspex --auth=jwt --client-id=abcd --client-secret=def --username=pierre@example.com --private-key=@val:@file:~/.aspera/ascli/aspera_on_cloud_key
2896
- $ ascli conf id default set faspex5 f5
2897
- ```
2898
-
2899
- Ready to use Faspex5 with CLI.
3002
+ $ ascli faspex package list --recipient='*thedropboxname'
3003
+ ```
2900
3004
 
2901
- Once the graphical registration form exist, ther bootstrap method can be removed.
3005
+ if `id` is set to `ALL`, then all packages are downloaded, and if option `once_only`is used, then a persistency file is created to keep track of already downloaded packages.
2902
3006
 
2903
3007
  ## Sending a Package
2904
3008
 
@@ -2917,7 +3021,19 @@ Additional optional parameters in `delivery_info`:
2917
3021
  * Package Note: : `"note":"note this and that"`
2918
3022
  * Package Metadata: `"metadata":{"Meta1":"Val1","Meta2":"Val2"}`
2919
3023
 
2920
- ## operation on dropboxes
3024
+ ## Email notification on transfer
3025
+
3026
+ Like for any transfer, a notification can be sent by email using parameters: `notif_to` and `notif_template` .
3027
+
3028
+ Example:
3029
+
3030
+ ```
3031
+ $ ascli faspex package send --delivery-info=@json:'{"title":"test pkg 1","recipients":["aspera.user1@gmail.com"]}' ~/Documents/Samples/200KB.1 --notif-to=aspera.user1@gmail.com --notif-template=@ruby:'%Q{From: <%=from_name%> <<%=from_email%>>\nTo: <<%=to%>>\nSubject: Package sent: <%=ts["tags"]["aspera"]["faspex"]["metadata"]["_pkg_name"]%> files received\n\nTo user: <%=ts["tags"]["aspera"]["faspex"]["recipients"].first["email"]%>}'
3032
+ ```
3033
+
3034
+ In this example the notification template is directly provided on command line. Package information placed in the message are directly taken from the tags in transfer spec. The template can be placed in a file using modifier: `@file:`
3035
+
3036
+ ## Operation on dropboxes
2921
3037
 
2922
3038
  Example:
2923
3039
 
@@ -2927,7 +3043,7 @@ $ ascli faspex v4 dropbox list
2927
3043
  $ ascli faspex v4 dropbox delete --id=36
2928
3044
  ```
2929
3045
 
2930
- ## remote sources
3046
+ ## Remote sources
2931
3047
 
2932
3048
  Faspex lacks an API to list the contents of a remote source (available in web UI). To workaround this,
2933
3049
  the node API is used, for this it is required to add a section ":storage" that links
@@ -2978,29 +3094,38 @@ $ for p in 1 2 3;do ascli shares2 admin users list --value=@json:'{"page":'$p'}'
2978
3094
  # Plugin: IBM Cloud Object Storage
2979
3095
 
2980
3096
  The IBM Cloud Object Storage provides the possibility to execute transfers using FASP.
2981
- It uses the same transfer service as Aspera on Cloud.
2982
- see [https://status.aspera.io](https://status.aspera.io)
3097
+ It uses the same transfer service as Aspera on Cloud, called Aspera Transfer Service (ATS).
3098
+ Available ATS regions: [https://status.aspera.io](https://status.aspera.io)
2983
3099
 
2984
- Required options are either:
3100
+ There are two possibilities to provide credentials. If you already have the endpoint, apikey and CRN, use the forst method. If you dont have credentials but have access to the IBM Cloud console, then use the second method.
3101
+
3102
+ ## Using endpoint, apikey and Ressource Instance ID (CRN)
3103
+
3104
+ If you have those parameters already, then following options shall be provided:
2985
3105
 
2986
3106
  * `bucket` bucket name
2987
3107
  * `endpoint` storage endpoint url, e.g. https://s3.hkg02.cloud-object-storage.appdomain.cloud
2988
3108
  * `apikey` API Key
2989
3109
  * `crn` resource instance id
2990
3110
 
2991
- or:
3111
+ For example, let us create a default configuration:
2992
3112
 
2993
- * `bucket` bucket name
2994
- * `region` bucket region, e.g. eu-de
2995
- * `service_credentials` see below
3113
+ ```
3114
+ $ ascli conf id mycos update --bucket=mybucket --endpoint=https://s3.us-east.cloud-object-storage.appdomain.cloud --apikey=abcdefgh --crn=crn:v1:bluemix:public:iam-identity::a/xxxxxxx
3115
+ $ ascli conf id default set cos mycos
3116
+ ```
3117
+
3118
+ Then, jump to the transfer example.
2996
3119
 
2997
- Service credentials are directly created using the IBM cloud web ui. Navigate to:
3120
+ ## Using service credential file
3121
+
3122
+ If you are the COS administrator and dont have yet the credential: Service credentials are directly created using the IBM cloud web ui. Navigate to:
2998
3123
 
2999
3124
  Navigation Menu &rarr; Resource List &rarr; Storage &rarr; Cloud Object Storage &rarr; Service Credentials &rarr; &lt;select or create credentials&gt; &rarr; view credentials &rarr; copy
3000
3125
 
3001
3126
  Then save the copied value to a file, e.g. : `$HOME/cos_service_creds.json`
3002
3127
 
3003
- or using the CLI:
3128
+ or using the IBM Cloud CLI:
3004
3129
 
3005
3130
  ```
3006
3131
  $ ibmcloud resource service-keys
@@ -3031,37 +3156,42 @@ The field `resource_instance_id` is for option `crn`
3031
3156
 
3032
3157
  The field `apikey` is for option `apikey`
3033
3158
 
3034
- Endpoints for regions can be found by querying the `endpoints` URL.
3159
+ (If needed: endpoints for regions can be found by querying the `endpoints` URL.)
3160
+
3161
+ The required options for this method are:
3162
+
3163
+ * `bucket` bucket name
3164
+ * `region` bucket region, e.g. eu-de
3165
+ * `service_credentials` see below
3035
3166
 
3036
- For convenience, let us create a default configuration, for example:
3167
+ For example, let us create a default configuration:
3037
3168
 
3038
3169
  ```
3039
3170
  $ ascli conf id mycos update --bucket=laurent --service-credentials=@val:@json:@file:~/service_creds.json --region=us-south
3040
3171
  $ ascli conf id default set cos mycos
3041
3172
  ```
3042
3173
 
3043
- or using direct parameters:
3174
+ ## Operations, transfers
3044
3175
 
3045
- ```
3046
- $ ascli conf id mycos update --bucket=mybucket --endpoint=https://s3.us-east.cloud-object-storage.appdomain.cloud --apikey=abcdefgh --crn=crn:v1:bluemix:public:iam-identity::a/xxxxxxx
3047
- $ ascli conf id default set cos mycos
3048
- ```
3176
+ Let's assume you created a default configuration from once of the two previous steps (else specify the access options on command lines).
3049
3177
 
3050
- Now, Ready to do operations, a subset of "node" plugin operations are supported, basically node API:
3178
+ A subset of `node` plugin operations are supported, basically node API:
3051
3179
 
3052
3180
  ```
3053
- $ ascli cos node browse /
3054
- $ ascli cos node upload myfile.txt
3181
+ $ ascli cos node info
3182
+ $ ascli cos node upload 'faux:///sample1G?1g'
3055
3183
  ```
3056
3184
 
3185
+ Note: we generate a dummy file `sample1G` if size 2GB using the `faux` PVCL (man ascp), but you can of course send a real file by specifying a real file instead.
3186
+
3057
3187
  # Plugin: IBM Aspera Sync
3058
3188
 
3059
- A basic plugin to start an "async" using `ascli`. The main advantage is the possibility
3060
- to start from ma configuration file, using `ascli` standard options.
3189
+ A basic plugin to start an "async" using `ascli`.
3190
+ The main advantage is the possibility to start from ma configuration file, using `ascli` standard options.
3061
3191
 
3062
3192
  # Plugin: Preview
3063
3193
 
3064
- The `preview` generates "previews" of graphical files, i.e. thumbnails (office, images, video) and video previews on an Aspera HSTS for use primarily in the Aspera on Cloud application.
3194
+ The `preview` generates "previews" of graphical files, i.e. thumbnails (office, images, video) and video previews on storage for use primarily in the Aspera on Cloud application.
3065
3195
  This is based on the "node API" of Aspera HSTS when using Access Keys only inside it's "storage root".
3066
3196
  Several parameters can be used to tune several aspects:
3067
3197
 
@@ -3190,9 +3320,10 @@ $ ascli config id previewconf update --url=https://localhost:9092 --username=my_
3190
3320
  $ ascli config id default set preview previewconf
3191
3321
  ```
3192
3322
 
3193
- Here we assume that Office file generation is disabled, else remove the option. `lock_port` prevents concurrent execution of generation when using a scheduler.
3323
+ Here we assume that Office file generation is disabled, else remove this option.
3324
+ `lock_port` prevents concurrent execution of generation when using a scheduler.
3194
3325
 
3195
- Once can check if the access key is well configured using:
3326
+ One can check if the access key is well configured using:
3196
3327
 
3197
3328
  ```
3198
3329
  $ ascli -Ppreviewconf node browse /
@@ -3278,6 +3409,14 @@ $ ascli preview scan --skip-folders=@json:'["/not_here"]'
3278
3409
 
3279
3410
  The option `folder_reset_cache` forces the node service to refresh folder contents using various methods.
3280
3411
 
3412
+ When scanning the option `value` has the same behaviour as for the `node find` command.
3413
+
3414
+ For instance to filter out files beginning with `._` do:
3415
+
3416
+ ```
3417
+ ... --value='exec:!f["name"].start_with?("._") or f["name"].eql?(".DS_Store")'
3418
+ ```
3419
+
3281
3420
  ## Preview File types
3282
3421
 
3283
3422
  Two types of preview can be generated:
@@ -3326,14 +3465,14 @@ Aspera CLI can send email, for that setup SMTP configuration. This is done with
3326
3465
  The `smtp` option is a hash table (extended value) with the following fields:
3327
3466
  <table>
3328
3467
  <tr><th>field</th><th>default</th><th>example</th><th>description</th></tr>
3329
- <tr><td>server</td><td>-</td><td>smtp.gmail.com</td><td>SMTP server address</td></tr>
3330
- <tr><td>tls</td><td>true</td><td>false</td><td>use of TLS</td></tr>
3331
- <tr><td>port</td><td>587 for tls<br/>25 else</td><td>587</td><td>port for service</td></tr>
3332
- <tr><td>domain</td><td>domain of server</td><td>gmail.com</td><td>email domain of user</td></tr>
3333
- <tr><td>username</td><td>-</td><td>john@example.com</td><td>user to authenticate on SMTP server, leave empty for open auth.</td></tr>
3334
- <tr><td>password</td><td>-</td><td>MyP@ssword</td><td>password for above username</td></tr>
3335
- <tr><td>from\_email</td><td>username if defined</td><td>laurent.martin.l@gmail.com</td><td>address used if received replies</td></tr>
3336
- <tr><td>from\_name</td><td>same as email</td><td>John Wayne</td><td>display name of sender</td></tr>
3468
+ <tr><td>`server`</td><td>-</td><td>smtp.gmail.com</td><td>SMTP server address</td></tr>
3469
+ <tr><td>`tls`</td><td>true</td><td>false</td><td>use of TLS</td></tr>
3470
+ <tr><td>`port`</td><td>587 for tls<br/>25 else</td><td>587</td><td>port for service</td></tr>
3471
+ <tr><td>`domain`</td><td>domain of server</td><td>gmail.com</td><td>email domain of user</td></tr>
3472
+ <tr><td>`username`</td><td>-</td><td>john@example.com</td><td>user to authenticate on SMTP server, leave empty for open auth.</td></tr>
3473
+ <tr><td>`password`</td><td>-</td><td>MyP@ssword</td><td>password for above username</td></tr>
3474
+ <tr><td>`from_email`</td><td>username if defined</td><td>laurent.martin.l@gmail.com</td><td>address used if received replies</td></tr>
3475
+ <tr><td>`from_name`</td><td>same as email</td><td>John Wayne</td><td>display name of sender</td></tr>
3337
3476
  </table>
3338
3477
 
3339
3478
  ## Example of configuration:
@@ -3363,13 +3502,52 @@ $ ascli config id cli_default set smtp @val:@preset:smtp_google
3363
3502
  $ ascli config id default set config cli_default
3364
3503
  ```
3365
3504
 
3505
+ ## Email templates
3506
+
3507
+ Sent emails are built using a template that uses the [ERB](https://www.tutorialspoint.com/ruby/eruby.htm) syntax.
3508
+
3509
+ The template is the full SMTP message, including headers.
3510
+
3511
+ The following variables are defined by default:
3512
+
3513
+ * from_name
3514
+ * from_email
3515
+ * to
3516
+
3517
+ Other variables are defined depending on context.
3518
+
3366
3519
  ## Test
3367
3520
 
3368
3521
  Check settings with `smtp_settings` command. Send test email with `email_test`.
3369
3522
 
3370
3523
  ```
3371
3524
  $ ascli config --smtp=@preset:smtp_google smtp
3372
- $ ascli config --smtp=@preset:smtp_google email sample.dest@example.com
3525
+ $ ascli config --smtp=@preset:smtp_google email --notif-to=sample.dest@example.com
3526
+ ```
3527
+
3528
+ ## Notifications for transfer status
3529
+
3530
+ An e-mail notification can be sent upon transfer success and failure (one email per transfer job, one job being possibly multi session, and possibly after retry).
3531
+
3532
+ To activate, use option `notif_to`.
3533
+
3534
+ A default e-mail template is used, but it can be overriden with option `notif_template`.
3535
+
3536
+ The environment provided contains the following additional variables:
3537
+
3538
+ * subject
3539
+ * body
3540
+ * global_transfer_status
3541
+ * ts
3542
+
3543
+ Example of template:
3544
+
3545
+ ```
3546
+ From: <%=from_name%> <<%=from_email%>>
3547
+ To: <<%=to%>>
3548
+ Subject: <%=subject%>
3549
+
3550
+ Transfer is: <%=global_transfer_status%>
3373
3551
  ```
3374
3552
 
3375
3553
  # Tool: `asession`
@@ -3415,7 +3593,7 @@ Note that in addition, many "EX_" [_transfer-spec_](#transferspec) parameters ar
3415
3593
  ## Simple session
3416
3594
 
3417
3595
  ```
3418
- MY_TSPEC='{"remote_host":"demo.asperasoft.com","remote_user":"asperaweb","ssh_port":33001,"remote_password":"demoaspera","direction":"receive","destination_root":"./test.dir","paths":[{"source":"/aspera-test-dir-tiny/200KB.1"}],"resume_level":"none"}'
3596
+ MY_TSPEC='{"remote_host":"demo.asperasoft.com","remote_user":"asperaweb","ssh_port":33001,"remote_password":"_demo_pass_","direction":"receive","destination_root":"./test.dir","paths":[{"source":"/aspera-test-dir-tiny/200KB.1"}],"resume_level":"none"}'
3419
3597
 
3420
3598
  echo "${MY_TSPEC}"|asession
3421
3599
  ```
@@ -3428,7 +3606,7 @@ This is particularly useful for a persistent session ( with the [_transfer-spec_
3428
3606
 
3429
3607
  ```
3430
3608
  $ asession
3431
- {"remote_host":"demo.asperasoft.com","ssh_port":33001,"remote_user":"asperaweb","remote_password":"demoaspera","direction":"receive","destination_root":".","keepalive":true,"resume_level":"none"}
3609
+ {"remote_host":"demo.asperasoft.com","ssh_port":33001,"remote_user":"asperaweb","remote_password":"_demo_pass_","direction":"receive","destination_root":".","keepalive":true,"resume_level":"none"}
3432
3610
  {"type":"START","source":"/aspera-test-dir-tiny/200KB.2"}
3433
3611
  {"type":"DONE"}
3434
3612
  ```
@@ -3500,7 +3678,7 @@ Interesting ascp features are found in its arguments: (see ascp manual):
3500
3678
  Note that:
3501
3679
 
3502
3680
  * `ascli` takes transfer parameters exclusively as a transfer_spec, with `--ts` parameter.
3503
- * not all native ascp arguments are available as standard transfer_spec parameters
3681
+ * most, but not all native ascp arguments are available as standard transfer_spec parameters
3504
3682
  * native ascp arguments can be provided with the [_transfer-spec_](#transferspec) parameter: EX_ascp_args (array), only for the "local" transfer agent (not connect or node)
3505
3683
 
3506
3684
  ### server side and configuration
@@ -3597,7 +3775,42 @@ So, it evolved into `ascli`:
3597
3775
 
3598
3776
  # Changes (Release notes)
3599
3777
 
3600
- * 4.x
3778
+ * 4.3.0
3779
+
3780
+ * new: parameter `multi_incr_udp` for option `transfer_info`: control if UDP port is incremented when multi-session is used on `direct` transfer agent.
3781
+ * new: command `aoc files node_info` to get node information for a given folder in the Files application of AoC. Allows cross-org or cross-workspace transfers.
3782
+
3783
+ * 4.2.2
3784
+
3785
+ * new: `faspex package list` retrieves the whole list, not just first page
3786
+ * new: support web based auth to aoc and faspex 5 using HTTPS, new dependency on gem `webrick`
3787
+ * new: the error "Remote host is not who we expected" displays a special remediation message
3788
+ * new: `conf ascp spec` displays supported transfer spec
3789
+ * new: options `notif_to` and `notif_template` to send email notifications on transfer (and other events)
3790
+ * fix: space character in `faspe:` url are precent encoded if needed
3791
+ * fix: `preview scan`: if file_id is unknown, ignore and continue scan
3792
+ * change: for commands that potentially execute several transfers (`package recv --id=ALL`), if one transfer fails then `ascli` exits with code 1 (instead of zero=success)
3793
+ * change: (break) option `notify` or `aoc` replaced with `notif_to` and `notif_template`
3794
+
3795
+ * 4.2.1
3796
+
3797
+ * new: command `faspex package recv` supports link of type: `faspe:`
3798
+ * new: command `faspex package recv` supports option `recipient` to specify dropbox with leading `*`
3799
+
3800
+ * 4.2.0
3801
+
3802
+ * new: command `aoc remind` to receive organization membership by email
3803
+ * new: in `preview` option `value` to filter out on file name
3804
+ * new: `initdemo` to initialize for demo server
3805
+ * new: `direct` transfer agent options: `spawn_timeout_sec` and `spawn_delay_sec`
3806
+ * fix: on Windows `conf ascp use` expects ascp.exe
3807
+ * fix: (break) multi_session_threshold is Integer, not String
3808
+ * fix: `conf ascp install` renames sdk folder if it already exists (leftover shared lib may make fail)
3809
+ * fix: removed replace_illegal_chars from default aspera.conf causing "Error creating illegal char conversion table"
3810
+ * change: (break) `aoc apiinfo` is removed, use `aoc servers` to provide the list of cloud systems
3811
+ * change: (break) parameters for resume in `transfer-info` for `direct` are now in sub-key `"resume"`
3812
+
3813
+ * 4.1.0
3601
3814
 
3602
3815
  * fix: remove keys from transfer spec and command line when not needed
3603
3816
  * fix: default to create_dir:true so that sending single file to a folder does not rename file if folder does not exist
@@ -3968,11 +4181,15 @@ Breaking change:
3968
4181
 
3969
4182
  * Breaking change: "files" application renamed to "aspera" (for "Aspera on Cloud"). "repository" renamed to "files". Default is automatically reset, e.g. in config files and change key "files" to "aspera" in [option preset](#lprt) "default".
3970
4183
 
3971
- # BUGS
4184
+ # BUGS, FEATURES, CONTRIBUTION
4185
+
4186
+ For issues or feature requests use the Github repository and issues.
4187
+
4188
+ You can also contribute to this open source project.
3972
4189
 
3973
- * This is best effort code without official support, dont expect full capabilities. This code is not supported by IBM/Aspera. You can contact the author for bugs or features.
4190
+ One can also create one's own command nplugin.
3974
4191
 
3975
- ## only one value for any option
4192
+ ## Only one value for any option
3976
4193
 
3977
4194
  Some commands and sub commands may ask for the same option name.
3978
4195
  Currently, since option definition is position independant (last one wins), it is not possible
@@ -3986,7 +4203,8 @@ This happens typically for the `node` sub command, e.g. identify the node by nam
3986
4203
 
3987
4204
  ## ED255519 key not supported
3988
4205
 
3989
- ED255519 keys are deactivated since version 0.9.24 so this type of key will just be ignored.
4206
+ ED25519 keys are deactivated since version 0.9.24 so this type of key will just be ignored.
4207
+
3990
4208
  Without this deactivation, if such key was present the following error was generated:
3991
4209
 
3992
4210
  ```
@@ -3996,7 +4214,21 @@ OpenSSH keys only supported if ED25519 is available
3996
4214
  Which meant that you do not have ruby support for ED25519 SSH keys.
3997
4215
  You may either install the suggested Gems, or remove your ed25519 key from your `.ssh` folder to solve the issue.
3998
4216
 
3999
- # TODO
4217
+ ## Error "Remote host is not who we expected"
4218
+
4219
+ Cause: `ascp` >= 4.x checks fingerprint of highest server host key, including ECDSA. `ascp` < 4.0 (3.9.6 and earlier) support only to RSA level (and ignore ECDSA presented by server). `aspera.conf` supports a single fingerprint.
4220
+
4221
+ Workaround on client side: To ignore the certificate (SSH fingerprint) add option on client side (this option can also be added permanently to the config file):
4222
+
4223
+ ```
4224
+ --ts=@json:'{"sshfp":null}'
4225
+ ```
4226
+
4227
+ Workaround on server side: Either remove the fingerprint from `aspera.conf`, or keep only RSA host keys in `sshd_config`.
4228
+
4229
+ References: ES-1944 in release notes of 4.1 and to [HSTS admin manual section "Configuring Transfer Server Authentication With a Host-Key Fingerprint"](https://www.ibm.com/docs/en/ahts/4.2?topic=upgrades-configuring-ssh-server).
4230
+
4231
+ ## Miscelaneous
4000
4232
 
4001
4233
  * remove rest and oauth classes and use ruby standard gems:
4002
4234
 
@@ -4012,9 +4244,3 @@ You may either install the suggested Gems, or remove your ed25519 key from your
4012
4244
  * Going through proxy: use env var http_proxy and https_proxy, no_proxy
4013
4245
 
4014
4246
  * easier use with https://github.com/pmq20/ruby-packer
4015
-
4016
- # Contribution
4017
-
4018
- Send comments !
4019
-
4020
- Create your own plugin !