aspera-cli 4.8.0 → 4.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +445 -160
  4. data/docs/test_env.conf +1 -5
  5. data/examples/dascli +1 -4
  6. data/examples/{transfer.rb → node.rb} +17 -46
  7. data/examples/server.rb +93 -0
  8. data/lib/aspera/aoc.rb +4 -2
  9. data/lib/aspera/ats_api.rb +3 -1
  10. data/lib/aspera/cli/extended_value.rb +1 -0
  11. data/lib/aspera/cli/formater.rb +3 -1
  12. data/lib/aspera/cli/info.rb +1 -1
  13. data/lib/aspera/cli/main.rb +14 -11
  14. data/lib/aspera/cli/manager.rb +4 -4
  15. data/lib/aspera/cli/plugin.rb +50 -9
  16. data/lib/aspera/cli/plugins/aoc.rb +88 -52
  17. data/lib/aspera/cli/plugins/config.rb +5 -0
  18. data/lib/aspera/cli/plugins/faspex.rb +5 -4
  19. data/lib/aspera/cli/plugins/node.rb +3 -2
  20. data/lib/aspera/cli/plugins/server.rb +7 -108
  21. data/lib/aspera/cli/plugins/shares.rb +21 -1
  22. data/lib/aspera/cli/transfer_agent.rb +21 -14
  23. data/lib/aspera/cli/version.rb +1 -1
  24. data/lib/aspera/environment.rb +15 -2
  25. data/lib/aspera/fasp/agent_base.rb +9 -7
  26. data/lib/aspera/fasp/installation.rb +15 -19
  27. data/lib/aspera/fasp/parameters.rb +38 -30
  28. data/lib/aspera/fasp/parameters.yaml +69 -17
  29. data/lib/aspera/hash_ext.rb +14 -2
  30. data/lib/aspera/id_generator.rb +12 -10
  31. data/lib/aspera/keychain/encrypted_hash.rb +3 -3
  32. data/lib/aspera/log.rb +1 -1
  33. data/lib/aspera/nagios.rb +26 -19
  34. data/lib/aspera/oauth.rb +4 -4
  35. data/lib/aspera/open_application.rb +21 -19
  36. data/lib/aspera/persistency_folder.rb +3 -0
  37. data/lib/aspera/preview/image_error.png +0 -0
  38. data/lib/aspera/preview/video_error.png +0 -0
  39. data/lib/aspera/proxy_auto_config.rb +6 -4
  40. data/lib/aspera/rest_error_analyzer.rb +15 -13
  41. data/lib/aspera/rest_errors_aspera.rb +42 -40
  42. data/lib/aspera/secret_hider.rb +11 -5
  43. data/lib/aspera/ssh.rb +1 -0
  44. data/lib/aspera/uri_reader.rb +15 -13
  45. data.tar.gz.sig +0 -0
  46. metadata +4 -3
  47. metadata.gz.sig +0 -0
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [comment1]: # (Do not edit this README.md, edit docs/README.erb.md, for details, read docs/README.md)
4
4
 
5
- Version : 4.8.0
5
+ Version : 4.9.0
6
6
 
7
7
  Laurent/2016-2022
8
8
 
@@ -58,33 +58,12 @@ Using APIs (application REST API and transfer SDK) will prove to be easier to de
58
58
 
59
59
  For scripting and ad'hoc command line operations, `ascli` is perfect.
60
60
 
61
- ## <a id="parsing"></a>Notations, Shell and Command line parsing
61
+ ## Notations, Shell, Examples
62
62
 
63
63
  In examples, command line operations are shown using a shell such: `bash` or `zsh`.
64
64
 
65
65
  Command line parameters in examples beginning with `my_`, like `my_param_value` are user-provided value and not fixed value commands.
66
66
 
67
- `ascli` is typically executed in a shell, either interactively or in a script. `ascli` receives its arguments from this shell.
68
-
69
- On Linux and Unix environments, this is typically a POSIX shell (bash, zsh, ksh, sh). In this environment shell command line parsing applies before `ascli` (Ruby) is executed, e.g. [bash shell operation](https://www.gnu.org/software/bash/manual/bash.html#Shell-Operation). Ruby receives a list parameters and gives it to `ascli`. So special character handling (quotes, spaces, env vars, ...) is done in the shell.
70
-
71
- On Windows, `cmd.exe` is typically used. Windows process creation does not receive the list of arguments but just the whole line. It's up to the program to parse arguments. Ruby follows the Microsoft C/C++ parameter parsing rules.
72
-
73
- * [Windows: How Command Line Parameters Are Parsed](https://daviddeley.com/autohotkey/parameters/parameters.htm#RUBY)
74
- * [Understand Quoting and Escaping of Windows Command Line Arguments](http://www.windowsinspired.com/understanding-the-command-line-string-and-arguments-received-by-a-windows-program/)
75
-
76
- In case of doubt of argument values after parsing test like this:
77
-
78
- ```bash
79
- ascli conf echo "Hello World" arg2 3
80
- ```
81
-
82
- ```bash
83
- "Hello World"
84
- ERROR: Argument: unprocessed values: ["arg2", "3"]
85
- ```
86
-
87
- `echo` displays the value of the first argument using ruby syntax (strings get double quotes) after command line parsing (shell) and extended value parsing (`ascli`), next command line arguments are shown in the error message.
88
67
 
89
68
  ## Quick Start
90
69
 
@@ -99,7 +78,7 @@ ascli --version
99
78
  ```
100
79
 
101
80
  ```bash
102
- 4.8.0
81
+ 4.9.0
103
82
  ```
104
83
 
105
84
  ### First use
@@ -574,6 +553,191 @@ Using `ascli` with plugin `server` for command line gives advantages over ascp:
574
553
 
575
554
  Moreover all `ascp` options are supported either through transfer spec parameters and with the possibility to provide `ascp` arguments directly when the `direct` agent is used (`EX_ascp_args`).
576
555
 
556
+ ### <a id="parsing"></a>Command line parsing, Special Characters
557
+
558
+ `ascli` is typically executed in a shell, either interactively or in a script.
559
+ `ascli` receives its arguments from this shell (through Operating System).
560
+
561
+ #### Shell parsing for Linux, Unix, Macos
562
+
563
+ On Linux and Unix environments, this is typically a POSIX shell (bash, zsh, ksh, sh).
564
+ In this environment the shell parses the command line, possibly replacing variables, etc...
565
+ see [bash shell operation](https://www.gnu.org/software/bash/manual/bash.html#Shell-Operation).
566
+ Then it builds a list of arguments and then `ascli` (Ruby) is executed.
567
+ Ruby receives a list parameters from shell and gives it to `ascli`.
568
+ So special character handling (quotes, spaces, env vars, ...) is first done in the shell.
569
+
570
+ #### Shell parsing for Windows
571
+
572
+ On Windows, `cmd.exe` is typically used.
573
+ Windows process creation does not receive the list of arguments but just the whole line.
574
+ It's up to the program to parse arguments. Ruby follows the Microsoft C/C++ parameter parsing rules.
575
+
576
+ * [Windows: How Command Line Parameters Are Parsed](https://daviddeley.com/autohotkey/parameters/parameters.htm#RUBY)
577
+ * [Understand Quoting and Escaping of Windows Command Line Arguments](http://www.windowsinspired.com/understanding-the-command-line-string-and-arguments-received-by-a-windows-program/)
578
+
579
+ #### Extended Values (JSON, Ruby, ...)
580
+
581
+ Some of the CLI parameters are expected to be [Extended Values](#extended), i.e. not a simple strings, but a complex structure (Hash, Array).
582
+ Typically, the `@json:` modifier is used, it expects a JSON string. JSON itself has some special syntax: for example `"` is used to denote strings.
583
+
584
+ #### Testing Extended Values
585
+
586
+ In case of doubt of argument values after parsing, one can test using command `config echo`. `config echo` takes exactly **one** argument which can use the [Extended Value](#extended) syntax. Unprocessed command line arguments are shown in the error message.
587
+
588
+ Example: The shell parses three arguments (as strings: `1`, `2` and `3`), so the additional two arguments are not processed by the `echo` command.
589
+
590
+ ```bash
591
+ ascli conf echo 1 2 3
592
+ ```
593
+
594
+ ```bash
595
+ "1"
596
+ ERROR: Argument: unprocessed values: ["2", "3"]
597
+ ```
598
+
599
+ `config echo` displays the value of the first argument using Ruby syntax: it surrounds a string with `"` and add `\` before special characters.
600
+ Note that it gets its value after shell command line parsing and `ascli` extended value parsing.
601
+
602
+ In the following examples (using a POSIX shell, such as `bash`), several sample commands are provided when equivalent.
603
+ For all example, most of special character handling is not specific to `ascli`: It depoends on the underlying syntax: shell , JSON, etc...
604
+ Depending on the case, a different `format` is used to display the actual value.
605
+
606
+ For example, in the simple string `Hello World`, the space character is special for the shell, so it must be escaped so that a single value is represented.
607
+
608
+ Double quotes are processed by the shell to create a single string argument.
609
+ For POSIX shells, single quotes can also be used in this case, or protext the special character ` ` (space) with a backslash.
610
+
611
+ ```bash
612
+ ascli conf echo "Hello World" --format=text
613
+ ascli conf echo 'Hello World' --format=text
614
+ ascli conf echo Hello\ World --format=text
615
+ ```
616
+
617
+ ```output
618
+ Hello World
619
+ ```
620
+
621
+ #### Using a shell variable, parsed by shell, in an extended value
622
+
623
+ To be evaluated by shell, the shell variable must not be in single quotes.
624
+ Note we use a simple variable here: the variable is not necessarily an environment variable.
625
+ Even if the variable contains spaces it makes only one argument to `ascli` because word parsing is made before variable expansion by shell.
626
+
627
+ ```bash
628
+ MYVAR="Hello World"
629
+ ascli conf echo @json:'{"title":"'$MYVAR'"}' --format=json
630
+ ascli conf echo @json:{\"title\":\"$MYVAR\"} --format=json
631
+ ```
632
+
633
+ ```json
634
+ {"title":"Hello World"}
635
+ ```
636
+
637
+ #### Double quote in strings in command line
638
+
639
+ Double quote is a shell special character.
640
+ Like any shell special character, it can be protected either by preceding with a backslash or by enclosing in a single quote.
641
+
642
+ ```bash
643
+ ascli conf echo \"
644
+ ascli conf echo '"'
645
+ ```
646
+
647
+ ```output
648
+ "
649
+ ```
650
+
651
+ Double quote in JSON is a little tricky because `"` is special both for the shell and JSON. Both shell and JSON syntax allow to protect `"`, but only the shell allows protection using single quote.
652
+
653
+ ```bash
654
+ ascli conf echo @json:'"\""' --format=text
655
+ ascli conf echo @json:\"\\\"\" --format=text
656
+ ascli conf echo @ruby:\'\"\' --format=text
657
+ ```
658
+
659
+ ```output
660
+ "
661
+ ```
662
+
663
+ Here a single quote or a backslash protects the double quote to avoid shell processing, and then an additional `\` is added to protect the `"` for JSON. But as `\` is also shell special, then it is protected by another `\`.
664
+
665
+ #### Shell and JSON or Ruby special characters in extended value
666
+
667
+ Construction of values with special characters is done like this:
668
+
669
+ * First select a syntax to represent the extended value, e.g. JSON or Ruby
670
+
671
+ * Write the expression using this syntax, for example, using JSON:
672
+
673
+ ```json
674
+ {"title":"Test \" ' & \\"}
675
+ ```
676
+
677
+ or using Ruby:
678
+
679
+ ```ruby
680
+ {"title"=>"Test \" ' & \\"}
681
+ {'title'=>%q{Test " ' & \\}}
682
+ ```
683
+
684
+ Both `"` and `\` are special characters for JSON and Ruby and can be protected with `\` (unless Ruby's extended single quote notation `%q` is used).
685
+
686
+ * Then, since the value will be evaluated by shell, any shell special characters must be protected, either using preceding `\` for each character to protect, or by enclosing in single quote:
687
+
688
+ ```bash
689
+ ascli conf echo @json:{\"title\":\"Test\ \\\"\ \'\ \&\ \\\\\"} --format=json
690
+ ascli conf echo @json:'{"title":"Test \" '\'' & \\"}' --format=json
691
+ ascli conf echo @ruby:"{'title'=>%q{Test \" ' & \\\\}}" --format=json
692
+ ```
693
+
694
+ ```json
695
+ {"title":"Test \" ' & \\"}
696
+ ```
697
+
698
+ #### Reading special characters interractively
699
+
700
+ If `ascli` is used interractively (a user typing on terminal), it is easy to require the user to type values:
701
+
702
+ ```bash
703
+ ascli conf echo @ruby:"{'title'=>gets.chomp}" --format=json
704
+ ```
705
+
706
+ `gets` is Ruby's method of terminal input (terminated by `\n`), and `chomp` removes the trailing `\n`.
707
+
708
+ #### Extended value using special characters read from environmental variables or files
709
+
710
+ Using a text editor or shell: create a file `title.txt` (and env var) that contains exactly the text required: `Test " ' & \` :
711
+
712
+ ```bash
713
+ export MYTITLE='Test " '\'' & \'
714
+ echo -n $MYTITLE > title.txt
715
+ ```
716
+
717
+ Using those values will not require any escaping of characters since values do not go through shell or JSON parsing.
718
+
719
+ If the value is to be assigned directly to an option of ascli, then you can directly use the content of the file or env var using the `@file:` or `@env:` readers:
720
+
721
+ ```bash
722
+ ascli conf echo @file:title.txt --format=text
723
+ ascli conf echo @env:MYTITLE --format=text
724
+ ```
725
+
726
+ ```output
727
+ Test " ' & \
728
+ ```
729
+
730
+ If the value to be used is in a more complex structure, then the `@ruby:` modifier can be used: it allows any ruby code in expression, including reading from file or env var. In those cases, there is no character to protect because values are not parsed by the shell, or JSON or even Ruby.
731
+
732
+ ```bash
733
+ ascli conf echo @ruby:"{'title'=>File.read('title.txt')}" --format=json
734
+ ascli conf echo @ruby:"{'title'=>ENV['MYTITLE']}" --format=json
735
+ ```
736
+
737
+ ```json
738
+ {"title":"Test \" ' & \\"}
739
+ ```
740
+
577
741
  ### Arguments : Commands and options
578
742
 
579
743
  Arguments are the units of command line, as parsed by the shell, typically separated by spaces (and called "argv").
@@ -677,6 +841,7 @@ If transposition of single object is not desired, use option: `transpose_single`
677
841
 
678
842
  The style of output can be set using the `format` parameter, supporting:
679
843
 
844
+ * `text` : Value as String
680
845
  * `table` : Text table
681
846
  * `ruby` : Ruby code
682
847
  * `json` : JSON code
@@ -1692,6 +1857,28 @@ For example the option `--ts=@json:'{"EX_ascp_args":["-DDL-"]}'` will activate d
1692
1857
  This is useful if the transfer fails.
1693
1858
  To store ascp logs in file `aspera-scp-transfer.log` in a folder, use `--ts=@json:'{"EX_ascp_args":["-L","/path/to/folder"]}'`.
1694
1859
 
1860
+ > Implementation note: when transfer agent [`direct`](#agt_direct) is used, the list of files to transfer is provided to `ascp` using either `--file-list` or `--file-pair-list` and a file list (or pair) file generated in a temporary folder. (unless `--file-list` or `--file-pair-list` is provided in option `ts` in `EX_ascp_args`).
1861
+
1862
+ In addition to standard methods described in section [File List](#file_list), it is possible to specify the list of file using those additional methods:
1863
+
1864
+ * Using the pseudo [*transfer-spec*](#transferspec) parameter `EX_file_list`
1865
+
1866
+ ```javascript
1867
+ --sources=@ts --ts=@json:'{"EX_file_list":"filelist.txt"}'
1868
+ ```
1869
+
1870
+ * Using the pseudo [*transfer-spec*](#transferspec) parameter `EX_ascp_args`
1871
+
1872
+ ```javascript
1873
+ --sources=@ts --ts=@json:'{"EX_ascp_args":["--file-list","myfilelist"]}'
1874
+ ```
1875
+
1876
+ > File lists is shown here, there are also similar options for file pair lists.
1877
+
1878
+ > Those 2 additional methods avoid the creation of a copy of the file list: if the standard options `--sources=@lines:@file:... --src-type=...` are used, then the file is list read and parsed, and a new file list is created in a temporary folder.
1879
+
1880
+ > Those methods have limitations: they apply **only** to the [`direct`](#agt_direct) transfer agent (i.e. local `ascp`) and not for Aspera on Cloud.
1881
+
1695
1882
  #### <a id="agt_connect"></a>IBM Aspera Connect Client GUI
1696
1883
 
1697
1884
  By specifying option: `--transfer=connect`, `ascli` will start transfers using the locally installed Aspera Connect Client. There are no option for `transfer_info`.
@@ -1702,6 +1889,7 @@ By specifying option: `--transfer=node`, the CLI will start transfers in an Aspe
1702
1889
  Transfer Server using the Node API, either on a local or remote node.
1703
1890
  Parameters provided in option `transfer_info` are:
1704
1891
 
1892
+ <table>
1705
1893
  <tr><th>Name</th><th>Type</th><th>Description</th></tr>
1706
1894
  <tr><td>url</td><td>string</td><td>URL of the node API</br>Mandatory</td></tr>
1707
1895
  <tr><td>username</td><td>string</td><td>node api user or access key</br>Mandatory</td></tr>
@@ -1802,7 +1990,7 @@ Fields with EX_ prefix are extensions to transfer agent [`direct`](#agt_direct).
1802
1990
 
1803
1991
  <table><tr><th>Field</th><th>Type</th><th>D</th><th>N</th><th>C</th><th>Description</th></tr>
1804
1992
  <tr><td>EX_ascp_args</td><td>array</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>Add native command line arguments to ascp</td></tr>
1805
- <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. Prefer to use standard: content_protection_password<br/>(env:ASPERA_SCP_FILEPASS)</td></tr>
1993
+ <tr><td>EX_at_rest_password</td><td>string</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>DEPRECATED: Prefer to use standard parameter: content_protection_password<br/>(env:ASPERA_SCP_FILEPASS)</td></tr>
1806
1994
  <tr><td>EX_file_list</td><td>string</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>source file list</td></tr>
1807
1995
  <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>
1808
1996
  <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>
@@ -1810,7 +1998,7 @@ Fields with EX_ prefix are extensions to transfer agent [`direct`](#agt_direct).
1810
1998
  <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>
1811
1999
  <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>
1812
2000
  <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>
1813
- <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>
2001
+ <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>
1814
2002
  <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>
1815
2003
  <tr><td>apply_local_docroot</td><td>bool</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>(--apply-local-docroot)</td></tr>
1816
2004
  <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>
@@ -1820,7 +2008,7 @@ Fields with EX_ prefix are extensions to transfer agent [`direct`](#agt_direct).
1820
2008
  <tr><td>content_protection_password</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Specifies CSEAR password. (content protection)<br/>(env:ASPERA_SCP_FILEPASS)</td></tr>
1821
2009
  <tr><td>cookie</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Metadata for transfer specified by application<br/>(env:ASPERA_SCP_COOKIE)</td></tr>
1822
2010
  <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>
1823
- <tr><td>delete_before_transfer</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>Before transfer, delete files that exist at the destination but not at the source. The source and destination arguments must be directories that have matching names. Objects on the destination that have the same name but different type or size as objects on the source are not deleted.<br/>(--delete-before-transfer)</td></tr>
2011
+ <tr><td>delete_before_transfer</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>Before transfer, delete files that exist at the destination but not at the source.<br/>The source and destination arguments must be directories that have matching names.<br/>Objects on the destination that have the same name but different type or size as objects<br/>on the source are not deleted.<br/>(--delete-before-transfer)</td></tr>
1824
2012
  <tr><td>delete_source</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>
1825
2013
  <tr><td>destination_root</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Destination root directory.</td></tr>
1826
2014
  <tr><td>dgram_size</td><td>int</td><td>Y</td><td>Y</td><td>Y</td><td>UDP datagram size in bytes<br/>(-Z)</td></tr>
@@ -1839,10 +2027,11 @@ Fields with EX_ prefix are extensions to transfer agent [`direct`](#agt_direct).
1839
2027
  <tr><td>lock_target_rate_kbps</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>&nbsp;</td></tr>
1840
2028
  <tr><td>min_rate_cap_kbps</td><td>int</td><td>Y</td><td>Y</td><td>Y</td><td>&nbsp;</td></tr>
1841
2029
  <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>
1842
- <tr><td>move_after_transfer</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>(--move-after-transfer)</td></tr>
1843
- <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>
1844
- <tr><td>multi_session_threshold</td><td>int</td><td>Y</td><td>Y</td><td>&nbsp;</td><td>Split files across multiple ascp sessions if their size in bytes is greater than or equal to the specified value. (0=no file is split)<br/>(--multi-session-threshold)</td></tr>
2030
+ <tr><td>move_after_transfer</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>The relative path to which the files will be moved after the transfer at the source side.<br/>(--move-after-transfer)</td></tr>
2031
+ <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.<br/></td></tr>
2032
+ <tr><td>multi_session_threshold</td><td>int</td><td>Y</td><td>Y</td><td>&nbsp;</td><td>Split files across multiple ascp sessions if their size in bytes is greater than or equal to the specified value.<br/>(0=no file is split)<br/>(--multi-session-threshold)</td></tr>
1845
2033
  <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>
2034
+ <tr><td>password</td><td>string</td><td>&nbsp;</td><td>Y</td><td>&nbsp;</td><td>Password for local Windows user when transfer user associated with node api user is not the same as the one running asperanoded.<br/>Allows impersonating the transfer user and have access to resources (e.g. network shares).<br/>Windows only, node api only.</td></tr>
1846
2035
  <tr><td>paths</td><td>array</td><td>Y</td><td>Y</td><td>Y</td><td>Array of path to the source (required) and a path to the destination (optional).</td></tr>
1847
2036
  <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>
1848
2037
  <tr><td>preserve_access_time</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>(--preserve-access-time)</td></tr>
@@ -1854,7 +2043,7 @@ Fields with EX_ prefix are extensions to transfer agent [`direct`](#agt_direct).
1854
2043
  <tr><td>preserve_remote_acls</td><td>string</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>Preserve remote access control lists.<br/>Allowed values: none, native, metafile<br/>(--remote-preserve-acls)</td></tr>
1855
2044
  <tr><td>preserve_source_access_time</td><td>bool</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>Preserve the time logged for when the source file was accessed<br/>(--preserve-source-access-time)</td></tr>
1856
2045
  <tr><td>preserve_times</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>(--preserve-times)</td></tr>
1857
- <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>
2046
+ <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>
1858
2047
  <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>
1859
2048
  <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>
1860
2049
  <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>
@@ -1866,10 +2055,11 @@ Fields with EX_ prefix are extensions to transfer agent [`direct`](#agt_direct).
1866
2055
  <tr><td>remove_skipped</td><td>bool</td><td>Y</td><td>Y</td><td>Y</td><td>Must also have remove_after_transfer set to true, Defaults to false, if true, skipped files will be removed as well.<br/>(--remove-skipped)</td></tr>
1867
2056
  <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>
1868
2057
  <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>
1869
- <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>
2058
+ <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>
1870
2059
  <tr><td>source_root_id</td><td>string</td><td>&nbsp;</td><td>Y</td><td>&nbsp;</td><td>The file ID of the source root directory. Required when using Bearer token auth for the source node.</td></tr>
2060
+ <tr><td>src_base</td><td>string</td><td>Y</td><td>Y</td><td>&nbsp;</td><td>Specify the prefix to be stripped off from each source object.<br/>The remaining portion of the source path is kept intact at the destination.<br/>Special care must be taken when used with cloud storage.<br/>(--src-base64)</td></tr>
1871
2061
  <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>
1872
- <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 PRIV4TE KEY-----\nMII...<br/> Note the JSON encoding: \n for newlines.<br/>(env:ASPERA_SCP_KEY)</td></tr>
2062
+ <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 PRIV4TE KEY-----\nMII...<br/>Note the JSON encoding: \n for newlines.<br/>(env:ASPERA_SCP_KEY)</td></tr>
1873
2063
  <tr><td>ssh_private_key_passphrase</td><td>string</td><td>Y</td><td>&nbsp;</td><td>&nbsp;</td><td>The passphrase associated with the transfer user's SSH private key. Available as of 3.7.2.<br/>(env:ASPERA_SCP_PASS)</td></tr>
1874
2064
  <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>
1875
2065
  <tr><td>symlink_policy</td><td>string</td><td>Y</td><td>Y</td><td>Y</td><td>Handle source side symbolic links<br/>Allowed values: follow, copy, copy+force, skip<br/>(--symbolic-links)</td></tr>
@@ -1896,89 +2086,98 @@ As such, it can be modified with option: `--ts=@json:'{"destination_root":"<path
1896
2086
  The option `to_folder` provides an equivalent and convenient way to change this parameter:
1897
2087
  `--to-folder=<path>` .
1898
2088
 
1899
- #### List of files for transfers
2089
+ #### <a id="file_list"></a>List of files for transfers
1900
2090
 
1901
- When uploading, downloading or sending files, the user must specify the list of files to transfer. The option to specify the list of files is `sources`, the default value is `@args`, which means: take remain non used arguments (not starting with `-` as list of files.
1902
- So, by default, the list of files to transfer will be simply specified on the command line:
2091
+ When uploading, downloading or sending files, the user must specify the list of files to transfer.
1903
2092
 
1904
- ```bash
1905
- ascli server upload ~/mysample.file secondfile
1906
- ```
2093
+ By default the list of files to transfer is simply provided on the command line.
1907
2094
 
1908
- This is equivalent to:
2095
+ The list of (source) files to transfer is specified by (extended value) option `sources` (default: `@args`).
2096
+ The list is either simply the list of source files, or a combined source/destination list (see below) depending on value of option `src_type` (default: `list`).
1909
2097
 
1910
- ```bash
1911
- ascli server upload --sources=@args ~/mysample.file secondfile
1912
- ```
2098
+ In `ascli`, all transfer parameters, including file list, are provided to the transfer agent in a [*transfer-spec*](#transferspec) so that execution of a transfer is independent of the transfer agent (direct, connect, node, transfer sdk...).
2099
+ So, eventually, the list of files to transfer is provided to the transfer agent using the [*transfer-spec*](#transferspec) field: `"paths"` which is a list (array) of pairs of `"source"` (mandatory) and `"destination"` (optional).
2100
+ The `sources` and `src_type` options provide convenient ways to populate the transfer spec with the source file list.
1913
2101
 
1914
- More advanced options are provided to adapt to various cases. In fact, list of files to transfer are normally conveyed using the [*transfer-spec*](#transferspec) using the field: "paths" which is a list (array) of pairs of "source" (mandatory) and "destination" (optional).
2102
+ Possible values for option `sources` are:
1915
2103
 
1916
- Note that this is different from the "ascp" command line. The paradigm used by `ascli` is:
1917
- all transfer parameters are kept in [*transfer-spec*](#transferspec) so that execution of a transfer is independent of the transfer agent. Note that other IBM Aspera interfaces use this: connect, node, transfer sdk.
2104
+ * `@args` : (default) the list of files (or file pair) is directly provided on the command line (after commands): unused arguments (not starting with `-`) are considered as source files.
2105
+ So, by default, the list of files to transfer will be simply specified on the command line. Example:
1918
2106
 
1919
- For ease of use and flexibility, the list of files to transfer is specified by the option `sources`. Accepted values are:
2107
+ ```bash
2108
+ ascli server upload ~/first.file secondfile
2109
+ ```
1920
2110
 
1921
- * `@args` : (default value) the list of files is directly provided at the end of the command line (see at the beginning of this section).
2111
+ This is the same as (with default values):
1922
2112
 
1923
- * an [Extended Value](#extended) holding an *Array of String*. Examples:
2113
+ ```bash
2114
+ ascli server upload --sources=@args --src-type=list ~/mysample.file secondfile
2115
+ ```
1924
2116
 
1925
- ```javascript
1926
- --sources=@json:'["file1","file2"]'
1927
- ```
2117
+ * an [Extended Value](#extended) with type **Array of String**
1928
2118
 
1929
- ```bash
1930
- --sources=@lines:@stdin:
1931
- ```
2119
+ > Note: extended values can be tested with the command `conf echo`
1932
2120
 
1933
- ```ruby
1934
- --sources=@ruby:'File.read("myfilelist").split("\n")'
1935
- ```
2121
+ Examples:
1936
2122
 
1937
- * `@ts` : the user provides the list of files directly in the `ts` option, in its `paths` field. Example:
2123
+ * Using extended value
1938
2124
 
1939
- ```javascript
1940
- --sources=@ts --ts=@json:'{"paths":[{"source":"file1"},{"source":"file2"}]}'
1941
- ```
2125
+ Create the file list:
1942
2126
 
1943
- providing a file list directly to ascp:
2127
+ ```bash
2128
+ echo ~/mysample.file > myfilelist.txt
2129
+ echo secondfile >> myfilelist.txt
2130
+ ```
1944
2131
 
1945
- ```javascript
1946
- ... --sources=@ts --ts=@json:'{"paths":[],"EX_file_list":"filelist.txt"}'
1947
- ```
2132
+ Use the file list: one path per line:
1948
2133
 
1949
- * Not recommended: It is possible to specify bare ascp arguments using the pseudo [*transfer-spec*](#transferspec) parameter `EX_ascp_args`.
2134
+ ```ruby
2135
+ --sources=@lines:@file:myfilelist.txt
2136
+ ```
1950
2137
 
1951
- ```javascript
1952
- --sources=@ts --ts=@json:'{"paths":[{"source":"dummy"}],"EX_ascp_args":["--file-list","myfilelist"]}'
1953
- ```
2138
+ * Using JSON array
1954
2139
 
1955
- This method avoids creating a copy of the file list, but has drawbacks: it applies *only* to the [`direct`](#agt_direct) transfer agent (i.e. local `ascp`) and not for Aspera on Cloud.
1956
- One must specify a dummy list in the [*transfer-spec*](#transferspec), which will be overridden by the `ascp` command line provided.
1957
- (TODO) In next version, dummy source paths can be removed.
2140
+ ```javascript
2141
+ --sources=@json:'["file1","file2"]'
2142
+ ```
1958
2143
 
1959
- In case the file list is provided on the command line i.e. using `--sources=@args` or `--sources=<Array>` (but not `--sources=@ts`), then the list of files will be used either as a simple file list or a file pair list depending on the value of the option: `src_type`:
2144
+ * Using STDIN, one path per line
1960
2145
 
1961
- * `list` : (default) the path of destination is the same as source
1962
- * `pair` : in that case, the first element is the first source, the second element is the first destination, and so on.
2146
+ ```bash
2147
+ --sources=@lines:@stdin:
2148
+ ```
1963
2149
 
1964
- Example:
2150
+ * Using ruby code (one path per line in file)
1965
2151
 
1966
- ```bash
1967
- ascli server upload --src-type=pair ~/Documents/Samples/200KB.1 /Upload/sample1
1968
- ```
2152
+ ```ruby
2153
+ --sources=@ruby:'File.read("myfilelist.txt").split("\n")'
2154
+ ```
1969
2155
 
1970
- Internally, when transfer agent [`direct`](#agt_direct) is used, a temporary file list (or pair) file is generated and provided to ascp, unless `--file-list` or `--file-pair-list` is provided in `ts` in `EX_ascp_args`.
2156
+ * `@ts` : the user provides the list of files directly in the `paths` field of transfer spec (option `ts`).
2157
+ Examples:
1971
2158
 
1972
- Note the special case when the source files are located on "Aspera on Cloud", i.e. using access keys and the `file id` API:
2159
+ * Using transfer spec
1973
2160
 
1974
- * All files must be in the same source folder.
1975
- * If there is a single file : specify the full path
1976
- * For multiple files, specify the source folder as first item in the list followed by the list of file names.
2161
+ ```javascript
2162
+ --sources=@ts --ts=@json:'{"paths":[{"source":"file1"},{"source":"file2"}]}'
2163
+ ```
1977
2164
 
1978
- Source files are located on "Aspera on cloud", when :
2165
+ The option `src_type` allows specifying if the list specified in option `sources` is a simple file list or if it is a file pair list.
2166
+
2167
+ > Note: Option `src_type` is not used if option `sources` is set to `@ts`
2168
+
2169
+ Supported values for `src_type` are:
1979
2170
 
1980
- * the server is Aspera on Cloud, and making a download / recv
1981
- * the agent is Aspera on Cloud, and making an upload / send
2171
+ * `list` : (default) the path of destination is the same as source and each entry is a source file path
2172
+ * `pair` : the first element is the first source, the second element is the first destination, and so on.
2173
+
2174
+ Example: Source file `200KB.1` is renamed `sample1` on destination:
2175
+
2176
+ ```bash
2177
+ ascli server upload --src-type=pair ~/Documents/Samples/200KB.1 /Upload/sample1
2178
+ ```
2179
+
2180
+ > Note there are some specific rules to specify file list when using "Aspera on Cloud", refer to the AoC plugin section.
1982
2181
 
1983
2182
  #### <a id="multisession"></a>Support of multi-session
1984
2183
 
@@ -2018,13 +2217,13 @@ activating CSEAR consists in using transfer spec parameters:
2018
2217
 
2019
2218
  Example: parameter to download a faspex package and decrypt on the fly
2020
2219
 
2021
- ```json
2220
+ ```javascript
2022
2221
  --ts=@json:'{"content_protection":"decrypt","content_protection_password":"_pass_here_"}'
2023
2222
  ```
2024
2223
 
2025
2224
  Note that up to version 4.6.0, the following parameters should be used for agent `direct`:
2026
2225
 
2027
- ```json
2226
+ ```javascript
2028
2227
  --ts=@json:'{"EX_ascp_args":["--file-crypt=decrypt"],"EX_at_rest_password":"_secret_here_"}'
2029
2228
  ```
2030
2229
 
@@ -2216,7 +2415,7 @@ ascli server upload "faux:///mydir?file=testfile&count=1m&size=0&inc=2&seq=seque
2216
2415
  ```text
2217
2416
  ascli -h
2218
2417
  NAME
2219
- ascli -- a command line tool for Aspera Applications (v4.8.0)
2418
+ ascli -- a command line tool for Aspera Applications (v4.9.0)
2220
2419
 
2221
2420
  SYNOPSIS
2222
2421
  ascli COMMANDS [OPTIONS] [ARGS]
@@ -2248,7 +2447,7 @@ ARGS
2248
2447
  OPTIONS: global
2249
2448
  --interactive=ENUM use interactive input of missing params: yes, [no]
2250
2449
  --ask-options=ENUM ask even optional options: yes, [no]
2251
- --format=ENUM output format: [table], ruby, json, jsonpp, yaml, csv, nagios
2450
+ --format=ENUM output format: text, nagios, ruby, json, jsonpp, yaml, [table], csv
2252
2451
  --display=ENUM output only some information: [info], data, error
2253
2452
  --fields=VALUE comma separated list of fields, or ALL, or DEF
2254
2453
  --select=VALUE select only some items in lists, extended value: hash (column, value)
@@ -2279,6 +2478,7 @@ OPTIONS:
2279
2478
  --value=VALUE extended value for create, update, list filter
2280
2479
  --property=VALUE name of property to set
2281
2480
  --id=VALUE resource identifier (modify,delete,show)
2481
+ --bulk=ENUM Bulk operation (only some): yes, [no]
2282
2482
  --config-file=VALUE read parameters from file in YAML format, current=/usershome/.aspera/ascli/config.yaml
2283
2483
  -N, --no-default do not load default configuration for plugin
2284
2484
  --override=ENUM Wizard: override existing value: yes, [no]
@@ -2301,11 +2501,11 @@ OPTIONS:
2301
2501
  --plugin-folder=VALUE folder where to find additional plugins
2302
2502
  --ts=VALUE override transfer spec values (Hash, use @json: prefix), current={"create_dir"=>true}
2303
2503
  --local-resume=VALUE set resume policy (Hash, use @json: prefix), current=
2304
- --to-folder=VALUE destination folder for downloaded files
2305
- --sources=VALUE list of source files (see doc)
2306
- --transfer-info=VALUE parameters for transfer agent
2504
+ --to-folder=VALUE destination folder for transfered files
2505
+ --sources=VALUE how list of transfered files is provided (@args,@ts,Array)
2307
2506
  --src-type=ENUM type of file list: list, pair
2308
2507
  --transfer=ENUM type of transfer agent: direct, node, connect, httpgw, trsdk
2508
+ --transfer-info=VALUE parameters for transfer agent
2309
2509
  --progress=ENUM type of progress bar: none, native, multi
2310
2510
 
2311
2511
 
@@ -2469,23 +2669,21 @@ OPTIONS:
2469
2669
  --name=VALUE resource name
2470
2670
  --path=VALUE file or folder path
2471
2671
  --link=VALUE public link to shared resource
2472
- --new-user-option=VALUE new user creation option
2672
+ --new-user-option=VALUE new user creation option for unknown package recipients
2473
2673
  --from-folder=VALUE share to share source folder
2474
2674
  --scope=VALUE OAuth scope for AoC API calls
2475
- --bulk=ENUM bulk operation: yes, [no]
2476
2675
  --default-ports=ENUM use standard FASP ports or get from node api: yes, [no]
2477
2676
  --validate-metadata=ENUM validate shared inbox metadata: yes, [no]
2478
2677
 
2479
2678
 
2480
2679
  COMMAND: server
2481
- SUBCOMMANDS: health nodeadmin userdata configurator ctl download upload browse delete rename ls rm mv du info mkdir cp df md5sum
2680
+ SUBCOMMANDS: health download upload browse delete rename ls rm mv du info mkdir cp df md5sum
2482
2681
  OPTIONS:
2483
2682
  --url=VALUE URL of application, e.g. https://org.asperafiles.com
2484
2683
  --username=VALUE username to log in
2485
2684
  --password=VALUE user's password
2486
- --ssh-keys=VALUE ssh key path list (Array or single)
2487
- --ssh-options=VALUE ssh options (Hash)
2488
- --cmd-prefix=VALUE prefix to add for as cmd execution, e.g. sudo or /opt/aspera/bin
2685
+ --ssh-keys=VALUE SSH key path list (Array or single)
2686
+ --ssh-options=VALUE SSH options (Hash)
2489
2687
 
2490
2688
 
2491
2689
  COMMAND: console
@@ -2502,6 +2700,12 @@ OPTIONS:
2502
2700
 
2503
2701
  Note that actions and parameter values can be written in short form.
2504
2702
 
2703
+ ### Bulk creation and deletion of resources
2704
+
2705
+ Bulk creation and deletion of resources are possible using option `bulk` (yes,no(default)).
2706
+ In that case, the operation expects an Array of Hash instead of a simple Hash using the [Extended Value Syntax](#extended).
2707
+ This option is available only for some of the resources: if you need it: try and see if the entities you try to create or delete support this option.
2708
+
2505
2709
  ## <a id="aoc"></a>Plugin: Aspera on Cloud
2506
2710
 
2507
2711
  Aspera on Cloud uses the more advanced Oauth v2 mechanism for authentication (HTTP Basic authentication is not supported).
@@ -2545,7 +2749,7 @@ ascli config wizard --value=aoc
2545
2749
 
2546
2750
  ### <a id="aocmanual"></a>Configuration: using manual setup
2547
2751
 
2548
- If you used the wizard (recommended): skip this section.
2752
+ > If you used the wizard (recommended): skip this section.
2549
2753
 
2550
2754
  #### Configuration details
2551
2755
 
@@ -2706,7 +2910,7 @@ Execute:
2706
2910
  ascli config preset update my_aoc_org --auth=jwt --private-key=@val:@file:~/.aspera/ascli/my_private_key --username=laurent.martin.aspera@fr.ibm.com
2707
2911
  ```
2708
2912
 
2709
- Note: the private key argument represents the actual PEM string. In order to read the content from a file, use the @file: prefix. But if the @file: argument is used as is, it will read the file and set in the config file. So to keep the "@file" tag in the configuration file, the @val: prefix is added.
2913
+ Note: the private key argument represents the actual PEM string. In order to read the content from a file, use the `@file:` prefix. But if the @file: argument is used as is, it will read the file and set in the config file. So to keep the "@file" tag in the configuration file, the `@val:` prefix is added.
2710
2914
 
2711
2915
  After this last step, commands do not require web login anymore.
2712
2916
 
@@ -2750,11 +2954,6 @@ The `admin` command allows several administrative tasks (and require admin privi
2750
2954
 
2751
2955
  It allows actions (create, update, delete) on "resources": users, group, nodes, workspace, etc... with the `admin resource` command.
2752
2956
 
2753
- #### Bulk creation and deletion of resource
2754
-
2755
- Bulk creation and deletion of resources are possible using option `bulk` (yes,no(default)).
2756
- In that case, the operation expects an Array of Hash instead of a simple Hash using the [Extended Value Syntax](#extended).
2757
-
2758
2957
  #### Listing resources
2759
2958
 
2760
2959
  The command `aoc admin res <type> list` lists all entities of given type. It uses paging and multiple requests if necessary.
@@ -3053,7 +3252,7 @@ ascli aoc admin res workspace_membership list --fields=member_type,manager,membe
3053
3252
  :.............:.........:..................................:
3054
3253
  ```
3055
3254
 
3056
- other query parameters:
3255
+ Other query parameters:
3057
3256
 
3058
3257
  ```javascript
3059
3258
  {"workspace_membership_through":true,"include_indirect":true}
@@ -3227,40 +3426,64 @@ ascli aoc admin res client list --fields=id --format=csv|ascli aoc admin res cli
3227
3426
  +-----+---------+
3228
3427
  ```
3229
3428
 
3230
- #### Example: Create a node
3429
+ #### Example: Create a Node
3231
3430
 
3232
3431
  AoC nodes as actually composed with two related entities:
3233
3432
 
3234
3433
  * An access key created on the Transfer Server (HSTS/ATS)
3235
3434
  * a `node` resource in the AoC application.
3236
3435
 
3237
- The web UI allows creation of both entities in one shot but not the CLI for more flexibility.
3238
- Note that when selecting "Use existing access key" in the web UI, this actually skips access key creation.
3436
+ The web UI allows creation of both entities in one shot.
3437
+ For more flexibility, `ascli` allows this in two separate steps.
3438
+ Note that when selecting "Use existing access key" in the web UI, this actually skips access key creation (first step).
3239
3439
 
3240
3440
  So, for example, the creation of a node using ATS in IBM Cloud looks like (see other example in this manual):
3241
3441
 
3242
- * create the access key on ATS
3442
+ * Create the access key on ATS
3243
3443
 
3244
- ```javascript
3245
- ascli aoc admin ats access_key create --cloud=softlayer --region=eu-de --params=@json:'{"storage":{"type":"ibm-s3","bucket":"mybucket","credentials":{"access_key_id":"mykey","secret_access_key":"mysecret"},"path":"/"}}'
3246
- ```
3444
+ The creation options are the ones of ATS API, refer to the [section on ATS](#ats_params) for more details and examples.
3247
3445
 
3248
- Take a note of the randomly generated `id` and `secret`.
3446
+ ```javascript
3447
+ ascli aoc admin ats access_key create --cloud=softlayer --region=eu-de --params=@json:'{"storage":{"type":"ibm-s3","bucket":"mybucket","credentials":{"access_key_id":"mykey","secret_access_key":"mysecret"},"path":"/"}}'
3448
+ ```
3249
3449
 
3250
- * Retrieve the ATS node address
3450
+ Once executed, the access key `id` and `secret`, randomly generated by the node api, is displayed: take note of it as the secrets will not be disclosed again.
3251
3451
 
3252
- ```bash
3253
- ascli aoc admin ats cluster show --cloud=softlayer --region=eu-de --fields=transfer_setup_url --format=csv --transpose-single=no
3254
- ```
3452
+ * Create the AoC node entity
3255
3453
 
3256
- * Create the node entity
3454
+ First, Retrieve the ATS node address
3257
3455
 
3258
- ```javascript
3259
- ascli aoc admin res node create @json:'{"name":"myname","access_key":"*accesskeyid*","ats_access_key":true,"ats_storage_type":"ibm-s3","url":"https://ats-sl-fra-all.aspera.io"}'
3260
- ```
3456
+ ```bash
3457
+ ascli aoc admin ats cluster show --cloud=softlayer --region=eu-de --fields=transfer_setup_url --format=csv --transpose-single=no
3458
+ ```
3459
+
3460
+ Then use the returned address for the `url` key to actually create the AoC Node entity:
3461
+
3462
+ ```javascript
3463
+ ascli aoc admin res node create @json:'{"name":"myname","access_key":"*accesskeyid*","ats_access_key":true,"ats_storage_type":"ibm-s3","url":"https://ats-sl-fra-all.aspera.io"}'
3464
+ ```
3261
3465
 
3262
3466
  Creation of a node with a self-managed node is similar, but the command `aoc admin ats access_key create` is replaced with `node access_key create` on the private node itself.
3263
3467
 
3468
+ ### List of files to transfer
3469
+
3470
+ Source files are provided as a list with the `sources` option. Refer to section [File list](#file_list)
3471
+
3472
+ Note the special case when the source files are located on "Aspera on Cloud" (i.e. using access keys and the `file id` API).
3473
+
3474
+ Source files are located on "Aspera on cloud", when :
3475
+
3476
+ * the server is Aspera on Cloud, and executing a download or recv
3477
+ * the agent is Aspera on Cloud, and executing an upload or send
3478
+
3479
+ In this case:
3480
+
3481
+ * If there is a single file : specify the full path
3482
+ * Else, if there are multiple files:
3483
+ * All source files must be in the same source folder
3484
+ * Specify the source folder as first item in the list
3485
+ * followed by the list of file names.
3486
+
3264
3487
  ### Packages
3265
3488
 
3266
3489
  The webmail-like application.
@@ -3328,6 +3551,31 @@ shbxid=$(ascli aoc packages shared_inboxes show name 'My Shared Inbox' --format=
3328
3551
  ascli aoc packages list --query=@json:'{"dropbox_id":"'$shbxid'","archived":false,"received":true,"has_content":true,"exclude_dropbox_packages":false,"include_draft":false,"sort":"-received_at"}'
3329
3552
  ```
3330
3553
 
3554
+ #### Example: Send a package with files from the Files app
3555
+
3556
+ Find files in Files app:
3557
+
3558
+ ```bash
3559
+ ascli aoc files browse /src_folder
3560
+ ```
3561
+
3562
+ ```bash
3563
+ +------------------------------+--------+----------------+--------------+----------------------+--------------+
3564
+ | name | type | recursive_size | size | modified_time | access_level |
3565
+ +------------------------------+--------+----------------+--------------+----------------------+--------------+
3566
+ | sample_video | link | | | 2020-11-29T22:49:09Z | edit |
3567
+ | 100G | file | | 107374182400 | 2021-04-21T18:19:25Z | edit |
3568
+ | 10M.dat | file | | 10485760 | 2021-05-18T08:22:39Z | edit |
3569
+ | Test.pdf | file | | 1265103 | 2022-06-16T12:49:55Z | edit |
3570
+ +------------------------------+--------+----------------+--------------+----------------------+--------------+
3571
+ ```
3572
+
3573
+ Let's send a package with the file `10M.dat` from subfolder /src_folder in a package:
3574
+
3575
+ ```bash
3576
+ ascli aoc files node_info /src_folder --format=json --display=data | ascli aoc package send --value=@json:'{"name":"test","recipients":["laurent.martin.aspera@fr.ibm.com"]}' 10M.dat --transfer=node --transfer-info=@json:@stdin:
3577
+ ```
3578
+
3331
3579
  #### <a id="aoccargo"></a>Receive new packages only (Cargo)
3332
3580
 
3333
3581
  It is possible to automatically download new packages, like using Aspera Cargo:
@@ -3352,26 +3600,47 @@ Folder sharing app.
3352
3600
 
3353
3601
  #### Download Files
3354
3602
 
3355
- Download of files is straightforward with a specific syntax for the `aoc files download` action: Like other commands the source file list is provided as a list with the `sources` option. Nevertheless, consider this:
3356
-
3357
- * if only one source is provided, it is downloaded
3358
- * if multiple sources must be downloaded, then the first in list is the path of the source folder, and the remaining items are the file names in this folder (without path).
3603
+ Download of files is straightforward using command: `aoc files download`
3359
3604
 
3360
3605
  #### Shared folders
3361
3606
 
3362
- * list shared folders in node
3607
+ Shared folder by users are managed through **permissions**.
3608
+ For creation, parameters are the same as for node api [permissions](https://developer.ibm.com/apis/catalog/aspera--aspera-node-api/api/API--aspera--node-api#post960739960).
3609
+ `ascli` expects the same payload for creation, but it will automatically populated required tags if needed.
3610
+ Also, the pseudo key `with` is added: it will lookup the name in the contacts and fill the proper type and id.
3611
+ The pseudo parameter `link_name` allows changing default "shared as" name.
3612
+
3613
+ * List permissions on a shared folder as user
3614
+
3615
+ ```bash
3616
+ ascli aoc files file --path=/shared_folder_test1 perm list
3617
+ ```
3618
+
3619
+ * Share a personal folder with other users
3620
+
3621
+ ```bash
3622
+ ascli aoc files file --path=/shared_folder_test1 perm create @json:'{"with":"laurent"}'
3623
+ ```
3624
+
3625
+ * Revoke shared access
3626
+
3627
+ ```bash
3628
+ ascli aoc files file --path=/shared_folder_test1 perm delete 6161
3629
+ ```
3630
+
3631
+ * List shared folders in node
3363
3632
 
3364
3633
  ```bash
3365
3634
  ascli aoc admin res node --id=8669 shared_folders
3366
3635
  ```
3367
3636
 
3368
- * list shared folders in workspace
3637
+ * List shared folders in workspace
3369
3638
 
3370
3639
  ```bash
3371
3640
  ascli aoc admin res workspace --id=10818 shared_folders
3372
3641
  ```
3373
3642
 
3374
- * list members of shared folder
3643
+ * List members of shared folder
3375
3644
 
3376
3645
  ```bash
3377
3646
  ascli aoc admin res node --id=8669 v4 perm 82 show
@@ -3503,6 +3772,8 @@ aoc files browse /
3503
3772
  aoc files browse / -N --link=my_aoc_publink_folder
3504
3773
  aoc files delete /testsrc
3505
3774
  aoc files download --transfer=connect /200KB.1
3775
+ aoc files file permission --path=/ascli_test list
3776
+ aoc files file show --path=/200KB.1
3506
3777
  aoc files file show my_file_id
3507
3778
  aoc files find / --value='\.partial$'
3508
3779
  aoc files http_node_download --to-folder=. /200KB.1
@@ -3518,6 +3789,7 @@ aoc files upload Test.pdf --transfer=node --transfer-info=@json:@stdin:
3518
3789
  aoc files v3 info
3519
3790
  aoc org -N --link=my_aoc_publink_recv_from_aocuser
3520
3791
  aoc organization
3792
+ aoc packages browse "my_package_id" /contents
3521
3793
  aoc packages list
3522
3794
  aoc packages list --query=@json:'{"dropbox_name":"my_aoc_shbx_name","sort":"-received_at","archived":false,"received":true,"has_content":true,"exclude_dropbox_packages":false}'
3523
3795
  aoc packages recv "my_package_id" --to-folder=.
@@ -3614,6 +3886,10 @@ ascli ats api_key create
3614
3886
  ascli config preset update my_ibm_ats --ats-key=ats_XXXXXXXXXXXXXXXXXXXXXXXX --ats-secret=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
3615
3887
  ```
3616
3888
 
3889
+ ### <a id="ats_params"></a>ATS Access key creation parameters
3890
+
3891
+ When creating an ATS access key, the option `params` must contain an extended value with the creation parameters. Those asre directly the parameters expected by the [ATS API](https://developer.ibm.com/apis/catalog?search=%22Aspera%20ATS%20API%22).
3892
+
3617
3893
  ### Misc. Examples
3618
3894
 
3619
3895
  Example: create access key on IBM Cloud (softlayer):
@@ -3678,11 +3954,6 @@ Modern mode is to use the node API and transfer tokens.
3678
3954
  ### Server sample commands
3679
3955
 
3680
3956
  ```bash
3681
- server -N -Ptst_hstsfaspex_ssh -Plocal_user configurator get_node_data
3682
- server -N -Ptst_hstsfaspex_ssh -Plocal_user ctl all:status
3683
- server -N -Ptst_hstsfaspex_ssh -Plocal_user health app_services --format=nagios
3684
- server -N -Ptst_hstsfaspex_ssh -Plocal_user health asctlstatus --format=nagios --cmd-prefix='sudo '
3685
- server -N -Ptst_hstsfaspex_ssh -Plocal_user nodeadmin -- -l
3686
3957
  server -N -Ptst_server_bykey -Plocal_user br /
3687
3958
  server browse /
3688
3959
  server browse folder_1/target_hot
@@ -3700,6 +3971,10 @@ server md5sum NEW_SERVER_FOLDER/testfile.bin
3700
3971
  server mkdir NEW_SERVER_FOLDER --logger=stdout
3701
3972
  server mkdir folder_1/target_hot
3702
3973
  server mv folder_1/200KB.2 folder_1/to.delete
3974
+ server upload --sources=@ts --ts=@json:'{"EX_ascp_args":["--file-list","'"filelist.txt"'"]}' --to-folder=NEW_SERVER_FOLDER
3975
+ server upload --sources=@ts --ts=@json:'{"EX_ascp_args":["--file-pair-list","'"filepairlist.txt"'"]}'
3976
+ server upload --sources=@ts --ts=@json:'{"EX_file_list":"'"filelist.txt"'"}' --to-folder=NEW_SERVER_FOLDER
3977
+ server upload --sources=@ts --ts=@json:'{"EX_file_pair_list":"'"filepairlist.txt"'"}'
3703
3978
  server upload --sources=@ts --ts=@json:'{"paths":[{"source":"testfile.bin","destination":"NEW_SERVER_FOLDER/othername"}]}'
3704
3979
  server upload --src-type=pair --sources=@json:'["testfile.bin","NEW_SERVER_FOLDER/othername"]'
3705
3980
  server upload --src-type=pair testfile.bin NEW_SERVER_FOLDER/othername --notif-to=my_recipient_email
@@ -3708,7 +3983,7 @@ server upload --to-folder=folder_1/target_hot --lock-port=12345 --ts=@json:'{"EX
3708
3983
  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
3709
3984
  ```
3710
3985
 
3711
- ### Authentication
3986
+ ### Authentication on Server with SSH session
3712
3987
 
3713
3988
  If SSH is the session control protocol (i.e. not WSS), then following session authentication methods are supported:
3714
3989
 
@@ -3723,8 +3998,10 @@ If no SSH password or key is provided and a transfer token is provided in transf
3723
3998
  ascli server --url=ssh://... --ts=@json:'{"token":"Basic abc123"}'
3724
3999
  ```
3725
4000
 
3726
- The value of the option `ssh_keys` can be a single value or an array.
3727
- Each value is a path to a private key and is expanded (`~` is replaced with the user's home folder).
4001
+ > Note: If you need to use the Aspera public keys, then specify an empty token: `--ts=@json:'{"token":""}'` : Aspera public SSH keys will be used, but the protocol will ignore the empty token.
4002
+
4003
+ The value of the `ssh_keys` option can be a single value or an array.
4004
+ Each value is a **path** to a private key and is expanded (`~` is replaced with the user's home folder).
3728
4005
 
3729
4006
  Examples:
3730
4007
 
@@ -3734,8 +4011,10 @@ ascli server --ssh-keys=@list:,~/.ssh/id_rsa
3734
4011
  ascli server --ssh-keys=@json:'["~/.ssh/id_rsa"]'
3735
4012
  ```
3736
4013
 
3737
- The underlying ssh library `net::ssh` provides several options that may be used depending on environment.
3738
- By default the ssh library expect that an ssh-agent is running.
4014
+ For non-transfer related command (browse, delete), the ruby SSH client library `Net::SSH` is used and provides several options settable using option `ssh_options`.
4015
+ For a list of SSH client options, refer to the ruby documentation of [Net::SSH](http://net-ssh.github.io/net-ssh/Net/SSH.html).
4016
+
4017
+ By default the SSH library expect that a local ssh-agent is running.
3739
4018
 
3740
4019
  On Linux, if you get an error message such as:
3741
4020
 
@@ -3749,12 +4028,12 @@ or on Windows:
3749
4028
  ERROR -- net.ssh.authentication.agent: could not connect to ssh-agent: pageant process not running
3750
4029
  ```
3751
4030
 
3752
- This means that you don't have such an ssh agent running, then:
4031
+ This means that you don't have such an SSH agent running, then:
3753
4032
 
3754
4033
  * check env var: `SSH_AGENT_SOCK`
3755
- * check if the ssh key is protected with a passphrase
4034
+ * check if the SSH key is protected with a passphrase (then, use the `passphrase` SSH option)
3756
4035
  * [check the manual](https://net-ssh.github.io/ssh/v1/chapter-2.html#s2)
3757
- * To disable use of `ssh-agent`, use the option `ssh_option` like this:
4036
+ * To disable the use of `ssh-agent`, use the option `ssh_options` like this:
3758
4037
 
3759
4038
  ```bash
3760
4039
  ascli server --ssh-options=@ruby:'{use_agent: false}' ...
@@ -3891,7 +4170,7 @@ ascli node access_key create --value=@json:'{"id":"eudemo-sedemo","secret":"myst
3891
4170
  ```bash
3892
4171
  node -N -Ptst_node_preview access_key create --value=@json:'{"id":"aoc_1","storage":{"type":"local","path":"/"}}'
3893
4172
  node -N -Ptst_node_preview access_key delete aoc_1
3894
- node access_key do my_aoc_ak_name br
4173
+ node access_key do my_aoc_ak_name br /
3895
4174
  node access_key list
3896
4175
  node api_details
3897
4176
  node async bandwidth 1
@@ -4022,19 +4301,19 @@ faspex5 package send --value=@json:'{"title":"test title","recipients":[{"name":
4022
4301
 
4023
4302
  * List all shared inboxes
4024
4303
 
4025
- ```json
4304
+ ```javascript
4026
4305
  ascli faspex5 admin res shared list --value=@json:'{"all":true}' --fields=id,name
4027
4306
  ```
4028
4307
 
4029
4308
  * Create Metadata profile
4030
4309
 
4031
- ```json
4310
+ ```javascript
4032
4311
  ascli faspex5 admin res metadata_profiles create --value=@json:'{"name":"the profile","default":false,"title":{"max_length":200,"illegal_chars":[]},"note":{"max_length":400,"illegal_chars":[],"enabled":false},"fields":[{"ordering":0,"name":"field1","type":"text_area","require":true,"illegal_chars":[],"max_length":100},{"ordering":1,"name":"fff2","type":"option_list","require":false,"choices":["opt1","opt2"]}]}'
4033
4312
  ```
4034
4313
 
4035
4314
  * Create a Shared inbox with specific metadata profile
4036
4315
 
4037
- ```json
4316
+ ```javascript
4038
4317
  ascli faspex5 admin res shared create --value=@json:'{"name":"the shared inbox","metadata_profile_id":1}'
4039
4318
  ```
4040
4319
 
@@ -4108,7 +4387,8 @@ if `id` is set to `ALL`, then all packages are downloaded, and if option `once_o
4108
4387
 
4109
4388
  ### Sending a Package
4110
4389
 
4111
- The command is `faspex package send`. Package information (title, note, metadata, options) is provided in option `delivery_info`. (Refer to Faspex API).
4390
+ The command is `faspex package send`. Package information (title, note, metadata, options) is provided in option `delivery_info`.
4391
+ The contents of `delivery_info` is directly the contents of the `send` v3 [API of Faspex 4](https://developer.ibm.com/apis/catalog/aspera--aspera-faspex-client-sdk/API%20v.3:%20Send%20Packages), consult it for extended supported parameters.
4112
4392
 
4113
4393
  Example:
4114
4394
 
@@ -4795,8 +5075,7 @@ Transfer is: <%=global_transfer_status%>
4795
5075
 
4796
5076
  ## Tool: `asession`
4797
5077
 
4798
- This gem comes with a second executable tool providing a simplified standardized interface
4799
- to start a FASP session: `asession`.
5078
+ This gem comes with a second executable tool providing a simplified standardized interface to start a FASP session: `asession`.
4800
5079
 
4801
5080
  It aims at simplifying the startup of a FASP session from a programmatic stand point as formatting a [*transfer-spec*](#transferspec) is:
4802
5081
 
@@ -4810,7 +5089,7 @@ This makes it easy to integrate with any language provided that one can spawn a
4810
5089
 
4811
5090
  The tool expect one single argument: a [*transfer-spec*](#transferspec).
4812
5091
 
4813
- If not argument is provided, it assumes a value of: `@json:@stdin:`, i.e. a JSON formatted [*transfer-spec*](#transferspec) on stdin.
5092
+ If no argument is provided, it assumes a value of: `@json:@stdin:`, i.e. a JSON formatted [*transfer-spec*](#transferspec) on stdin.
4814
5093
 
4815
5094
  Note that if JSON is the format, one has to specify `@json:` to tell the tool to decode the hash using JSON.
4816
5095
 
@@ -4827,18 +5106,24 @@ Note that in addition, many "EX_" [*transfer-spec*](#transferspec) parameters ar
4827
5106
 
4828
5107
  <table>
4829
5108
  <tr><th>feature/tool</th><th>asession</th><th>ascp</th><th>FaspManager</th><th>Transfer SDK</th></tr>
4830
- <tr><td>language integration</td><td>any</td><td>any</td><td>C/C++<br/>C#/.net<br/>Go<br/>Python<br/>java<br/></td><td>any</td></tr>
4831
- <tr><td>additional components to ascp</td><td>Ruby<br/>Aspera</td><td>-</td><td>library<br/>(headers)</td><td>daemon</td></tr>
5109
+ <tr><td>language integration</td><td>any</td><td>any</td><td>C/C++<br/>C#/.net<br/>Go<br/>Python<br/>java<br/></td><td>many</td></tr>
5110
+ <tr><td>required additional components to ascp</td><td>Ruby<br/>Aspera</td><td>-</td><td>library<br/>(headers)</td><td>daemon</td></tr>
4832
5111
  <tr><td>startup</td><td>JSON on stdin<br/>(standard APIs:<br/>JSON.generate<br/>Process.spawn)</td><td>command line arguments</td><td>API</td><td>daemon</td></tr>
4833
5112
  <tr><td>events</td><td>JSON on stdout</td><td>none by default<br/>or need to open management port<br/>and proprietary text syntax</td><td>callback</td><td>callback</td></tr>
4834
- <tr><td>platforms</td><td>any with ruby and ascp</td><td>any with ascp</td><td>any with ascp</td><td>any with ascp and transferdaemon</td></tr></table>
5113
+ <tr><td>platforms</td><td>any with ruby and ascp</td><td>any with ascp (and SDK if compiled)</td><td>any with ascp</td><td>any with ascp and transfer daemon</td></tr></table>
4835
5114
 
4836
5115
  ### Simple session
4837
5116
 
4838
- ```javascript
4839
- MY_TSPEC='{"remote_host":"demo.asperasoft.com","remote_user":"asperaweb","ssh_port":33001,"remote_password":"_pass_here_","direction":"receive","destination_root":"./test.dir","paths":[{"source":"/aspera-test-dir-tiny/200KB.1"}],"resume_level":"none"}'
5117
+ Create a file `session.json` with:
5118
+
5119
+ ```json
5120
+ {"remote_host":"demo.asperasoft.com","remote_user":"asperaweb","ssh_port":33001,"remote_password":"_pass_here_","direction":"receive","destination_root":"./test.dir","paths":[{"source":"/aspera-test-dir-tiny/200KB.1"}],"resume_level":"none"}
5121
+ ````
5122
+
5123
+ Then start the session:
4840
5124
 
4841
- echo "${MY_TSPEC}"|asession
5125
+ ```
5126
+ asession < session.json
4842
5127
  ```
4843
5128
 
4844
5129
  ### Asynchronous commands and Persistent session
@@ -5043,7 +5328,7 @@ Cause: `ascp` >= 4.x checks fingerprint of highest server host key, including EC
5043
5328
 
5044
5329
  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):
5045
5330
 
5046
- ```json
5331
+ ```javascript
5047
5332
  --ts=@json:'{"sshfp":null}'
5048
5333
  ```
5049
5334