aspera-cli 4.27.5 → 4.28.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 (139) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +160 -4
  4. data/CONTRIBUTING.md +4 -2
  5. data/README.md +1 -1
  6. data/bin/asession +1 -1
  7. data/docs/README.md +1086 -331
  8. data/docs/test-mcp-with-ai.md +5 -3
  9. data/lib/aspera/agent/direct.rb +15 -4
  10. data/lib/aspera/agent/factory.rb +2 -1
  11. data/lib/aspera/agent/node.rb +1 -1
  12. data/lib/aspera/api/cos_node.rb +1 -1
  13. data/lib/aspera/api/faspex.rb +1 -1
  14. data/lib/aspera/api/node.rb +6 -2
  15. data/lib/aspera/ascp/installation.rb +47 -11
  16. data/lib/aspera/ascp/management.rb +89 -43
  17. data/lib/aspera/cli/ascp_actions.rb +5 -19
  18. data/lib/aspera/cli/bootstrapper.rb +1 -2
  19. data/lib/aspera/cli/command_registry.rb +43 -3
  20. data/lib/aspera/cli/command_spec.rb +3 -0
  21. data/lib/aspera/cli/completion/ascli.bash +39 -5
  22. data/lib/aspera/cli/completion/ascli.fish +16 -8
  23. data/lib/aspera/cli/completion/ascli.ps1 +41 -0
  24. data/lib/aspera/cli/completion/ascli.zsh +20 -4
  25. data/lib/aspera/cli/completion_actions.rb +360 -0
  26. data/lib/aspera/cli/error.rb +42 -0
  27. data/lib/aspera/cli/extended_value.rb +30 -5
  28. data/lib/aspera/cli/formatter.rb +118 -56
  29. data/lib/aspera/cli/hints.rb +0 -1
  30. data/lib/aspera/cli/http.rb +6 -5
  31. data/lib/aspera/cli/info.rb +10 -4
  32. data/lib/aspera/cli/mailer.rb +1 -1
  33. data/lib/aspera/cli/mcp/http_servlet.rb +156 -0
  34. data/lib/aspera/cli/mcp/secrets.rb +143 -0
  35. data/lib/aspera/cli/mcp/tool.rb +231 -0
  36. data/lib/aspera/cli/option_value.rb +9 -1
  37. data/lib/aspera/cli/options.schema.yaml +390 -39
  38. data/lib/aspera/cli/parser.rb +14 -5
  39. data/lib/aspera/cli/plugins/aoc.rb +8 -11
  40. data/lib/aspera/cli/plugins/base.rb +36 -15
  41. data/lib/aspera/cli/plugins/config.rb +15 -44
  42. data/lib/aspera/cli/plugins/console.rb +3 -1
  43. data/lib/aspera/cli/plugins/factory.rb +1 -1
  44. data/lib/aspera/cli/plugins/faspex5.rb +9 -19
  45. data/lib/aspera/cli/plugins/faspio.rb +36 -5
  46. data/lib/aspera/cli/plugins/httpgw.rb +1 -0
  47. data/lib/aspera/cli/plugins/mcp.rb +177 -118
  48. data/lib/aspera/cli/plugins/node.rb +14 -8
  49. data/lib/aspera/cli/plugins/orchestrator.rb +351 -38
  50. data/lib/aspera/cli/plugins/server.rb +3 -1
  51. data/lib/aspera/cli/plugins/shares.rb +205 -35
  52. data/lib/aspera/cli/preset_actions.rb +15 -7
  53. data/lib/aspera/cli/preset_manager.rb +24 -2
  54. data/lib/aspera/cli/prompt.rb +3 -1
  55. data/lib/aspera/cli/result.rb +17 -4
  56. data/lib/aspera/cli/runner.rb +133 -43
  57. data/lib/aspera/cli/security.rb +134 -0
  58. data/lib/aspera/cli/table_fitter.rb +116 -0
  59. data/lib/aspera/cli/terminal_formatter.rb +23 -34
  60. data/lib/aspera/cli/transfer_agent.rb +4 -1
  61. data/lib/aspera/cli/vault_manager.rb +6 -5
  62. data/lib/aspera/cli/version.rb +1 -1
  63. data/lib/aspera/cli/web_secret.html.erb +61 -0
  64. data/lib/aspera/cli/web_secret.rb +220 -0
  65. data/lib/aspera/cli/wizard.rb +19 -9
  66. data/lib/aspera/command_line_builder.rb +26 -0
  67. data/lib/aspera/data_repository.rb +38 -24
  68. data/lib/aspera/duration.rb +42 -0
  69. data/lib/aspera/environment.rb +88 -24
  70. data/lib/aspera/exec_spec.rb +6 -5
  71. data/lib/aspera/faspex_gw.rb +98 -32
  72. data/lib/aspera/faspex_postproc.rb +187 -44
  73. data/lib/aspera/formatter_interface.rb +0 -1
  74. data/lib/aspera/id_generator.rb +2 -1
  75. data/lib/aspera/json_rpc/client.rb +51 -32
  76. data/lib/aspera/json_rpc/version.rb +1 -0
  77. data/lib/aspera/keychain/base.rb +5 -0
  78. data/lib/aspera/keychain/encrypted_hash.rb +6 -2
  79. data/lib/aspera/keychain/factory.rb +2 -3
  80. data/lib/aspera/keychain/hashicorp_vault.rb +7 -4
  81. data/lib/aspera/keychain/macos_security.rb +119 -13
  82. data/lib/aspera/keychain/one_password_api.rb +8 -3
  83. data/lib/aspera/keychain/one_password_base.rb +14 -9
  84. data/lib/aspera/keychain/one_password_cli.rb +4 -2
  85. data/lib/aspera/log.rb +3 -6
  86. data/lib/aspera/markdown.rb +152 -115
  87. data/lib/aspera/mime.rb +6 -0
  88. data/lib/aspera/nagios.rb +3 -1
  89. data/lib/aspera/node_emulator.rb +98 -101
  90. data/lib/aspera/oauth/{base.rb → client/base.rb} +5 -4
  91. data/lib/aspera/oauth/{boot.rb → client/boot.rb} +3 -2
  92. data/lib/aspera/oauth/{factory.rb → client/factory.rb} +7 -0
  93. data/lib/aspera/oauth/{generic.rb → client/generic.rb} +1 -1
  94. data/lib/aspera/oauth/{json_credentials.rb → client/json_credentials.rb} +1 -1
  95. data/lib/aspera/oauth/{jwt.rb → client/jwt.rb} +1 -1
  96. data/lib/aspera/oauth/{url_json.rb → client/url_json.rb} +1 -1
  97. data/lib/aspera/oauth/{web.rb → client/web.rb} +2 -2
  98. data/lib/aspera/oauth/server/authorize.html.erb +34 -0
  99. data/lib/aspera/oauth/server/pkce.rb +426 -0
  100. data/lib/aspera/orchestrator_workflow_checker.rb +561 -0
  101. data/lib/aspera/preview/terminal.rb +3 -2
  102. data/lib/aspera/rainbow.rb +27 -1
  103. data/lib/aspera/rest/aspera_errors.rb +51 -59
  104. data/lib/aspera/rest/client.rb +21 -14
  105. data/lib/aspera/rest/error_analyzer.rb +9 -0
  106. data/lib/aspera/rest/list.rb +6 -6
  107. data/lib/aspera/rest/util.rb +7 -1
  108. data/lib/aspera/rest.rb +0 -1
  109. data/lib/aspera/schema/IBM Aspera Faspex API-5.0-enhanced.yaml +0 -2
  110. data/lib/aspera/schema/IBM Aspera Orchestrator API-v1-enhanced.yaml +4001 -0
  111. data/lib/aspera/schema/IBM Aspera faspio Gateway API-1.0.0-enhanced.yaml +1097 -0
  112. data/lib/aspera/schema/IBM Aspera on Cloud Automation API-1.0.5-enhanced.yaml +35 -35
  113. data/lib/aspera/schema/IBM_Aspera_Shares.yaml +819 -7
  114. data/lib/aspera/schema/documentation.rb +50 -78
  115. data/lib/aspera/schema/reader.rb +39 -11
  116. data/lib/aspera/schema/registry.rb +8 -2
  117. data/lib/aspera/secret_hider.rb +94 -15
  118. data/lib/aspera/secret_strength.rb +114 -0
  119. data/lib/aspera/servlet_helpers.rb +111 -0
  120. data/lib/aspera/sync/args.schema.yaml +3 -1
  121. data/lib/aspera/sync/conf.schema.yaml +16 -6
  122. data/lib/aspera/sync/operations.rb +21 -1
  123. data/lib/aspera/temp_file_manager.rb +79 -20
  124. data/lib/aspera/transfer/parameters.rb +5 -0
  125. data/lib/aspera/transfer/spec.rb +52 -12
  126. data/lib/aspera/transfer/spec.schema.yaml +8 -5
  127. data/lib/aspera/web_auth/index.html.erb +16 -0
  128. data/lib/aspera/web_auth/server.rb +18 -10
  129. data/lib/aspera/web_page.html.erb +262 -0
  130. data/lib/aspera/web_page.rb +61 -0
  131. data/lib/aspera/web_server_simple.rb +76 -10
  132. data.tar.gz.sig +0 -0
  133. metadata +47 -32
  134. metadata.gz.sig +0 -0
  135. data/lib/aspera/cli/mcp_tool.rb +0 -189
  136. data/lib/aspera/oauth.rb +0 -9
  137. data/lib/aspera/schema/IBM Aspera Orchestrator API-v1.yaml +0 -1784
  138. data/lib/aspera/schema/IBM Aspera faspio Gateway API-1.0.0.yaml +0 -249
  139. data/lib/aspera/web_auth/index.html +0 -147
data/docs/README.md CHANGED
@@ -1,9 +1,10 @@
1
1
  # Command Line Interface for IBM Aspera products
2
2
  <!--
3
- EDITING GUIDELINES (developers and AI):
3
+ EDITING GUIDELINES:
4
4
  - This file is the source template for the generated README.md. Edit this file, not README.md.
5
- - Do not use Unicode characters unless strictly necessary (e.g. wizard menu labels that must
6
- match the actual on-screen UI text). Use plain ASCII equivalents instead:
5
+ - Do not use Unicode characters unless strictly necessary
6
+ (e.g. wizard menu labels that must match the actual on-screen UI text).
7
+ Use plain ASCII equivalents instead:
7
8
  apostrophe : ' (not ' or ')
8
9
  dash : - (not en-dash U+2013, not em-dash U+2014, not --)
9
10
  ellipsis : ... (not U+2026)
@@ -11,7 +12,7 @@ EDITING GUIDELINES (developers and AI):
11
12
  DO NOT EDIT: THIS FILE IS GENERATED, edit docs/README.erb.md.
12
13
  PANDOC_DEFAULTS_BEGIN
13
14
  metadata:
14
- subtitle: "ascli 4.27.5"
15
+ subtitle: "ascli 4.28.0"
15
16
  author: "Laurent Martin"
16
17
  PANDOC_DEFAULTS_END
17
18
  -->
@@ -96,23 +97,43 @@ Example implementations can be found at: <https://github.com/laurent-martin/aspe
96
97
  For scripting and ad hoc command-line tasks, `ascli` is ideal.
97
98
  It is developer-friendly and well-suited for testing and learning Aspera APIs (see [Logging, Debugging](#logging-debugging)).
98
99
 
99
- ### CLI landscape overview: `ascp`
100
+ ### `ascli` or `ascp`?
100
101
 
101
102
  `ascp` is the low-level command-line utility that implements the FASP protocol and is used for actual data transfers.
102
103
  Every Aspera transfer involves an `ascp` process on both the client and server sides.
103
- While `ascp` can be used directly, it is limited to basic send/receive operations and lacks features like configuration management, automatic resume, and remote file listing.
104
- `ascli` provides a higher-level interface that encompasses all `ascp` capabilities and adds significant usability improvements.
104
+ `ascli` is not an alternative transfer engine: it starts `ascp` (directly or through another [transfer agent](#agent-direct)), so transfer performance is identical.
105
105
 
106
- To use `ascp` directly as a command line, refer to the IBM Aspera documentation of either [Desktop Client](https://www.ibm.com/docs/en/asdc), [Endpoint](https://www.ibm.com/docs/en/ahte) or [Transfer Server](https://www.ibm.com/docs/en/ahts) - each of which includes [a dedicated section on `ascp`](https://www.ibm.com/docs/en/ahts/4.4?topic=linux-ascp-transferring-from-command-line).
106
+ Other low-level command line tools are included with Aspera transfer products, and `ascli` is a front end for them too:
107
+
108
+ - `async`: the IBM Aspera Sync utility, to synchronize folders (see [IBM Aspera Sync](#ibm-aspera-sync)).
109
+ - `ascp4`: an alternate transfer engine, selected with transfer spec parameter `use_ascp4`. `ascp4` will be deprecated: use `ascp` unless one of its specific features is needed.
110
+
111
+ Used directly, `ascp` is limited to sending and receiving files:
112
+
113
+ - Connection parameters (address, ports, user, credentials) must be provided on each command line: there are no connection profiles.
114
+ - The remote server cannot be browsed: remote paths must be known in advance.
115
+ - With Aspera applications (AoC, Faspex, Shares, Node API), the transfer address and token must first be obtained through the application's REST API.
116
+ - Multi-session requires starting and monitoring one `ascp` process per session (option `-C`).
117
+ - On interruption, `ascp` exits with an error: data already at destination is skipped on the next run (option `-k`), but restarting is up to the caller.
118
+
119
+ `ascli` adds:
107
120
 
108
- Using `ascli` with the `server` plugin instead of raw `ascp` provides several advantages:
121
+ - Configuration presets, with secrets protected in a vault (see [Option Preset](#option-preset) and [Secret Vault](#secret-vault))
122
+ - Detection of the Aspera application from its URL, and automatic retrieval of transfer parameters and tokens (see [Wizard](#wizard))
123
+ - Remote file browsing and management: list, create folder, rename, copy, delete, checksum
124
+ - Built-in multi-session, with an aggregated progress bar (see [Multi-session transfer](#multi-session-transfer))
125
+ - Automatic resume on retry-able errors, with increasing delay and token renewal (see [Agent: Direct](#agent-direct))
126
+ - Choice of transfer agents: Direct, Node, Connect, HTTP Gateway, Transfer Daemon
127
+ - Structured output (table, JSON, YAML, CSV) for scripting (see [Output](#output))
109
128
 
110
- - Automatic resume on error
111
- - Configuration file support
112
- - Choice of transfer agents
113
- - Built-in multi-session support
129
+ All `ascp` options remain available, either through transfer spec parameters (listed with `config ascp spec`), or by passing `ascp` arguments directly when using the `direct` agent (via `ascp_args` in option `transfer`).
114
130
 
115
- All `ascp` options are supported, either through transfer spec parameters (listed with `config ascp spec`), or by passing `ascp` arguments directly when using the `direct` agent (via `ascp_args` in option `transfer`).
131
+ Using `ascp` directly remains relevant when:
132
+
133
+ - `ascli` cannot be installed: `ascp` is included with every Aspera transfer product.
134
+ - The need is limited to simple transfers with an HSTS using SSH credentials.
135
+
136
+ To use `ascp` directly as a command line, refer to the IBM Aspera documentation of either [Desktop Client](https://www.ibm.com/docs/en/asdc), [Endpoint](https://www.ibm.com/docs/en/ahte) or [Transfer Server](https://www.ibm.com/docs/en/ahts) - each of which includes [a dedicated section on `ascp`](https://www.ibm.com/docs/en/ahts/4.4?topic=linux-ascp-transferring-from-command-line).
116
137
 
117
138
  ### Notations, Shell, Examples
118
139
 
@@ -145,7 +166,7 @@ This section walks you through your first interaction with `ascli` on Linux.
145
166
 
146
167
  ```shell
147
168
  mkdir -p $HOME/bin
148
- tar -C $HOME/bin -zxvf ascli-4.27.5-linux-x86_64.tgz
169
+ tar -C $HOME/bin -zxvf ascli-4.28.0-linux-x86_64.tgz
149
170
  export PATH=$PATH:$HOME/bin
150
171
  ```
151
172
 
@@ -159,7 +180,7 @@ ascli -v
159
180
  ```
160
181
 
161
182
  ```text
162
- 4.27.5
183
+ 4.28.0
163
184
  ```
164
185
 
165
186
  - Install the Aspera transfer runtime (tested version), as it is not included in the `ascli` package:
@@ -396,7 +417,11 @@ To uninstall, delete the folder, and the symbolic link if it was created.
396
417
  A ready-to-use ZIP archive for Windows (x64) is available in the [Releases](https://github.com/IBM/aspera-cli/releases): `aspera-cli-<VERSION>-windows-x86_64-portable.zip`.
397
418
 
398
419
  It contains the Ruby runtime, the aspera-cli gem with its dependencies, and the Aspera Transfer SDK (`ascp`).
399
- No installation step, no administrator rights, and no internet access are required.
420
+ Apart from the prerequisite below, no installation step, no administrator rights, and no internet access are required.
421
+
422
+ > [!IMPORTANT]
423
+ > The package does not include the Microsoft Visual C++ Redistributable (x64), which `ascp` requires.
424
+ > If it is not already present on the system, install it from [Microsoft Visual C++ Redistributable latest supported downloads](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist) (administrator rights required), otherwise transfers fail.
400
425
 
401
426
  1. Download the ZIP archive, then right-click on it and select **Extract All...**.
402
427
  Preferably, extract in a folder writable by the user, for example: `%LOCALAPPDATA%\Programs`.
@@ -414,6 +439,8 @@ No installation step, no administrator rights, and no internet access are requir
414
439
  ascli -v
415
440
  ```
416
441
 
442
+ 4. Optionally, activate the [shell completion](#shell-completion) of PowerShell (the folder must be in the `PATH`).
443
+
417
444
  > [!NOTE]
418
445
  > The launcher `ascli.cmd` uses the `ascp` located in folder `sdk` of the package, unless environment variable `ASCLI_SDK_FOLDER` is set.
419
446
  > So, `ascli config transferd install` is not needed.
@@ -438,10 +465,10 @@ Then, install the Aspera Transfer Daemon, see [Installing `ascp` through `transf
438
465
 
439
466
  A Ruby interpreter is required to run `ascli`.
440
467
 
441
- Required Ruby version is version: >= 3.1.
468
+ Required Ruby version is version: >= 3.2.
442
469
 
443
470
  > [!WARNING]
444
- > The minimum Ruby version will be 3.2 in a future version.
471
+ > The minimum Ruby version will be 3.3 in a future version.
445
472
 
446
473
  **Ruby can be installed using any of the following methods**: `rpm`, `yum`, `dnf`, `rvm`, `rbenv`, `brew`, Windows installer, ...
447
474
 
@@ -452,7 +479,8 @@ Required Ruby version is version: >= 3.1.
452
479
 
453
480
  For convenience, you may refer to the following sections for a proposed method for specific operating systems.
454
481
 
455
- `ascli` requires a Ruby version [at least under maintenance support](https://www.ruby-lang.org/en/downloads/branches/).
482
+ `ascli` supports a Ruby version until 18 months after its [end of official support](https://www.ruby-lang.org/en/downloads/branches/).
483
+ The minimum version is increased accordingly, and announced in advance.
456
484
  If only an older Ruby version must be used due to system constraints, use an older version of `ascli` that supports it; refer to [rubygems.org](https://rubygems.org/gems/aspera-cli).
457
485
 
458
486
  #### Windows: Installer
@@ -542,7 +570,7 @@ If your Linux distribution provides a standard Ruby package, you can use it prov
542
570
  - Enable the Ruby version you selected:
543
571
 
544
572
  ```shell
545
- dnf module -y enable ruby:3.2
573
+ dnf module -y enable ruby:3.3
546
574
 
547
575
  dnf install -y ruby-devel
548
576
  ```
@@ -726,7 +754,7 @@ Those are not installed as part of dependencies because they involve compilation
726
754
  See [Gemfile](../Gemfile):
727
755
 
728
756
  | name | version | comment |
729
- |---------------------|----------|-------------------------------------------------------------------------------|
757
+ |---------------------|-----------|-------------------------------------------------------------------------------|
730
758
  | rake | ~> 13.0 | |
731
759
  | debug | ~> 1.11 | (no jruby) |
732
760
  | grpc-tools | ~> 1.67 | |
@@ -738,16 +766,17 @@ See [Gemfile](../Gemfile):
738
766
  | rubocop-shopify | ~> 2.0 | |
739
767
  | simplecov | ~> 0.22 | |
740
768
  | solargraph | ~> 0.48 | (no jruby) |
769
+ | ferrum | ~> 0.19.1 | (no jruby) |
741
770
  | mcp | ~> 1.2 | for ascli mcp server (MCP protocol support) |
742
771
  | rack | ~> 3.0 | for ascli mcp server HTTP transport (required by mcp StreamableHTTPTransport) |
743
772
  | grpc | ~> 1.71 | (no jruby) for Aspera Transfer Daemon |
744
- | base64 | ~> 0.3 | if RUBY_VERSION >= '3.4' remove from standard gems |
745
773
  | sqlite3 | ~> 2.7 | (no jruby) for async DB |
746
774
  | jdbc-sqlite3 | ~> 3.46 | (jruby) for async DB |
747
775
  | sequel | ~> 5.96 | (jruby) for async DB |
748
776
  | ed25519 | ~> 1.4 | (no jruby) for ed25519 and OpenSSH file format |
749
777
  | bcrypt_pbkdf | ~> 1.1 | (no jruby) for ed25519 and OpenSSH file format |
750
778
  | syslog | ~> 0.3 | (no jruby) for logger=syslog |
779
+ | zxcvbn | ~> 1.0 | for better estimate of secret strength (faspex5 postprocessing secret_token) |
751
780
  | rmagick | ~> 6.1 | (no jruby) for terminal view |
752
781
 
753
782
  Install like this:
@@ -764,16 +793,17 @@ gem install rubocop-performance -v '~> 1.10'
764
793
  gem install rubocop-shopify -v '~> 2.0'
765
794
  gem install simplecov -v '~> 0.22'
766
795
  gem install solargraph -v '~> 0.48'
796
+ gem install ferrum -v '~> 0.19.1'
767
797
  gem install mcp -v '~> 1.2'
768
798
  gem install rack -v '~> 3.0'
769
799
  gem install grpc -v '~> 1.71'
770
- gem install base64 -v '~> 0.3'
771
800
  gem install sqlite3 -v '~> 2.7'
772
801
  gem install jdbc-sqlite3 -v '~> 3.46'
773
802
  gem install sequel -v '~> 5.96'
774
803
  gem install ed25519 -v '~> 1.4'
775
804
  gem install bcrypt_pbkdf -v '~> 1.1'
776
805
  gem install syslog -v '~> 0.3'
806
+ gem install zxcvbn -v '~> 1.0'
777
807
  gem install rmagick -v '~> 6.1'
778
808
  ```
779
809
 
@@ -857,7 +887,9 @@ The installation of the transfer binaries follows those steps:
857
887
 
858
888
  - **Select the SDK package to use**. Check the `sdk_url` option:
859
889
  - If the value is **not** the default value (`DEF`), it directly specifies the archive URL to download.
860
- - If the value is `DEF`, `ascli` downloads the YAML file from the URL specified by the `locations_url` option (default: <https://ibm.biz/sdk_location>).
890
+ - If the value is `DEF`, `ascli` downloads the YAML file from the URLs specified by the `locations_url` option.
891
+ - URLs are tried in order until one succeeds. All but the last are tried with a short timeout and no retry.
892
+ By default: <https://ibm.biz/sdk_location>, then its target on GitHub.
861
893
  - This YAML file lists supported architectures (OS, CPU) and Aspera Transfer Daemon versions with their associated package URLs.
862
894
  - The SDK version is selected as follows: if an additional **positional parameter** is provided it specifies the version; if the special value `LATEST` is given the latest available version is used; otherwise the version tested with this release of `ascli` is used.
863
895
  - The package URL matching the current system architecture is then used.
@@ -865,11 +897,11 @@ The installation of the transfer binaries follows those steps:
865
897
  - By default, the archive is extracted to `$HOME/.aspera/sdk`.
866
898
  - The destination folder can be changed by setting the `sdk_folder` option.
867
899
 
868
- | Option | Default | Description |
869
- |-----------------|---------|--------------------------------------------------------|
870
- | `sdk_url` | `DEF` | URL to download the Aspera Transfer Daemon archive.<br/>`DEF` means: select from available archives. |
871
- | `locations_url` | `https://ibm.biz/sdk_location` | URL to get download URLs of Aspera Transfer Daemon from IBM official repository. |
872
- | `sdk_folder` | `$HOME/.aspera/sdk` | Folder where the SDK archive is extracted. |
900
+ | Option | Description |
901
+ |---------------|--------------------------------------------------------------|
902
+ | `sdk_url` | URL to download the Aspera Transfer Daemon archive.<br/>Default: `DEF` (select from available archives.) |
903
+ | `locations_url` | List of URLs to get download URLs of Aspera Transfer Daemon from IBM official repository, tried in order.<br/>A list given in options replaces the default list.<br/>Default:<br/>- `https://ibm.biz/sdk_location`<br/>- `https://raw.githubusercontent.com/IBM/aspera-cli/refs/heads/main/docs/sdk_location.yaml`|
904
+ | `sdk_folder` | Folder where the SDK archive is extracted.<br/>Default: `$HOME/.aspera/sdk` |
873
905
 
874
906
  Transfer Daemon versions available from `locations_url` can be listed with: `ascli config transferd list`
875
907
 
@@ -899,10 +931,10 @@ ascli config transferd install --sdk-url=file:///macos-arm64-1.1.3-c6c7a2a.zip
899
931
 
900
932
  The format is: `file:///<PATH>` (canonical form) or `file:<PATH>` (short form), where `<PATH>` can be either a relative path (not starting with `/`), or an absolute path (starting with `/`).
901
933
 
902
- | Form | Relative example | Absolute example |
903
- |------|-----------------|-----------------|
934
+ | Form | Relative example | Absolute example |
935
+ |-----------|-----------------------------|----------------------------------|
904
936
  | Canonical | `file:///mydir/archive.zip` | `file:////home/user/archive.zip` |
905
- | Short | `file:mydir/archive.zip` | `file:/home/user/archive.zip` |
937
+ | Short | `file:mydir/archive.zip` | `file:/home/user/archive.zip` |
906
938
 
907
939
  Supported platforms are listed in the [Release Notes](https://developer.ibm.com/apis/catalog/aspera--aspera-transfer-sdk/Release+notes) and archives can be downloaded from [Downloads](https://developer.ibm.com/apis/catalog/aspera--aspera-transfer-sdk/downloads/downloads.json).
908
940
 
@@ -967,11 +999,11 @@ Alternatively, the necessary gems can be packaged into a `tar.gz` archive as fol
967
999
 
968
1000
  ```shell
969
1001
  mkdir temp_folder
970
- gem install aspera-cli:4.27.5 --no-document --install-dir temp_folder
1002
+ gem install aspera-cli:4.28.0 --no-document --install-dir temp_folder
971
1003
  find temp_folder
972
- mv temp_folder/cache aspera-cli-4.27.5-gems
1004
+ mv temp_folder/cache aspera-cli-4.28.0-gems
973
1005
  rm -fr temp_folder
974
- tar zcvf aspera-cli-4.27.5-gems.tgz aspera-cli-4.27.5-gems
1006
+ tar zcvf aspera-cli-4.28.0-gems.tgz aspera-cli-4.28.0-gems
975
1007
  ```
976
1008
 
977
1009
  #### Unix-like: Alternative installation using `rvm`
@@ -1107,7 +1139,7 @@ ascli -v
1107
1139
  ```
1108
1140
 
1109
1141
  ```text
1110
- 4.27.5
1142
+ 4.28.0
1111
1143
  ```
1112
1144
 
1113
1145
  To persist the configuration on the host, specify your user's configuration folder as a volume for the container.
@@ -1565,8 +1597,8 @@ Understanding this concept once makes it immediately usable everywhere it appear
1565
1597
 
1566
1598
  [Dot-path](#dot-path-notation) notation is used in four distinct places in `ascli`:
1567
1599
 
1568
- | Surface | Syntax | in/out | read/write |
1569
- |---------------------------|-----------------------|--------|------------|
1600
+ | Surface | Syntax | in/out | read/write |
1601
+ |----------------|-----------------------|--------|------------|
1570
1602
  | [Option](#options) names | `--opt.key.sub=value` | Input | write |
1571
1603
  | [Positional arguments](#positional-arguments) | `@: key.sub=value ... [END]` | Input | write |
1572
1604
  | [Extended value](#extended-value-syntax) `@preset:` | `@preset:key.sub` | Input | read |
@@ -1627,24 +1659,25 @@ It allows you to construct complex parameters (`Hash`es and `Array`s) directly f
1627
1659
  The general syntax for this argument is:
1628
1660
 
1629
1661
  ```text
1630
- @: <DOT_PATH>=<VALUE> [<DOT_PATH>=<VALUE>] ... [END]
1662
+ @:[<MARKER>] <DOT_PATH>=<VALUE> [<DOT_PATH>=<VALUE>] ... [<MARKER>]
1631
1663
  ```
1632
1664
 
1633
- - `@:`: The prefix that initiates the collection of [dot-path](#dot-path-notation) assignments into a single data structure.
1665
+ - `@:[<MARKER>]`: A standalone argument that starts collecting [dot-path](#dot-path-notation) assignments into a single data structure.
1666
+ The optional text after `:` sets the end marker. If it is empty, the marker is `END`.
1634
1667
 
1635
1668
  - `<DOT_PATH>=<VALUE>`: An assignment using the standard [dot-path](#dot-path-notation) notation. Multiple assignments can be provided in sequence to build a complex object.
1636
1669
 
1637
- - `END`: An optional marker that terminates the `@:` parsing session.
1670
+ - `<MARKER>` (`END` by default): An optional argument that ends the collection.
1638
1671
 
1639
- - Without `END`: **All** remaining positional arguments are consumed and interpreted as part of the nested structure, as if `END` were the last argument on the command line.
1672
+ - Without the marker: **All** remaining positional arguments are collected, and each one must contain `=`.
1640
1673
 
1641
- - With `END`: **Only** arguments between `@:` and `END` are used for the structure. Any arguments following `END` are treated as separate, subsequent positional parameters for the command.
1674
+ - With the marker: **Only** arguments between `@:` and the marker are used for the structure. Arguments after the marker are passed to the command as normal positional arguments.
1642
1675
 
1643
- - If another value than `END` is preferred, then specify: `@:<MARKER>` and use `@:<MARKER>` as replacement for `END`.
1676
+ - Example with a custom marker: `@:STOP a=1 STOP`.
1644
1677
 
1645
1678
  > [!IMPORTANT]
1646
1679
  > Use `END` whenever any positional argument must follow the object built with `@:` (for example, a file list, or any other subsequent positional parameter).
1647
- > Without `END`, those arguments are silently consumed as [dot-path](#dot-path-notation) keys instead of being passed to the command.
1680
+ > Without `END`, those arguments are collected as [dot-path](#dot-path-notation) assignments instead of being passed to the command: an argument without `=` causes an error, and an argument containing `=` is silently added to the structure.
1648
1681
 
1649
1682
  **Example**: Sending a package with a file list using `@:` for package information.
1650
1683
 
@@ -1653,7 +1686,7 @@ ascli aoc packages send @: name="<TITLE>" recipients.0=user@example.com END file
1653
1686
  ```
1654
1687
 
1655
1688
  > [!CAUTION]
1656
- > In the above example, removing `END` would cause `file1.dat` and `file2.dat` to be consumed as [dot-path](#dot-path-notation) keys, not passed as files.
1689
+ > In the above example, removing `END` causes an error, because `file1.dat` is read as a [dot-path](#dot-path-notation) assignment and does not contain `=`.
1657
1690
 
1658
1691
  > [!NOTE]
1659
1692
  > `@:` can also be used as an option value (for example, `--query=@: a=b`).
@@ -1745,11 +1778,11 @@ A command line argument is typically designed as option if:
1745
1778
  ### Interactive Input
1746
1779
 
1747
1780
  Some options and **Command Parameters** are mandatory and others are optional.
1748
- By default, `ascli` prompts for missing mandatory options or **Command Parameters** during interactive execution.
1781
+ By default, `ascli` raises an error for missing mandatory options or **Command Parameters**.
1749
1782
 
1750
1783
  The behavior can be controlled with:
1751
1784
 
1752
- - `--interactive=<yes|no>` (default=yes if STDIN is a terminal, else no)
1785
+ - `--interactive=<yes|no>` (default=no)
1753
1786
  - `yes`: Missing mandatory parameters/arguments are asked to the user.
1754
1787
  - `no`: Missing mandatory parameters/arguments raise an error message.
1755
1788
  - `--ask-options=<yes|no>` (default=no)
@@ -1810,7 +1843,7 @@ ascli config echo @json:'{"ni":null,"es":"","ea":[],"eh":{}}'
1810
1843
  The style of output can be set using the `format` option:
1811
1844
 
1812
1845
  | `format` | Output formatting |
1813
- |----------|---------------------------|
1846
+ | -------- | -------- |
1814
1847
  | `table` | Text table (default) |
1815
1848
  | `text` | Value as `String` |
1816
1849
  | `ruby` | Ruby code |
@@ -1844,6 +1877,11 @@ A special parameter is defined: `str_lst_sep` (`String`), default is `\n`.
1844
1877
  It defines how lists of strings are displayed.
1845
1878
  Alternatively, set to `,`.
1846
1879
 
1880
+ When the output is a terminal, the table is fitted to the terminal width: columns with text (e.g. `description`) are wrapped, the widest first.
1881
+ If not enough, other columns (names, identifiers) are wrapped too, preferably after a punctuation (`-`, `_`, `.`, `/`).
1882
+ If the table cannot fit, columns are narrowed to their minimum width (20 characters for text, 10 for others, or heading).
1883
+ Parameter `width` (`Integer`) sets the maximum table width (e.g. `--out.table.width=100`), also when the output is not a terminal.
1884
+
1847
1885
  For `format=csv`, options are described in gem [`csv`](https://ruby.github.io/csv/CSV.html#class-CSV-label-Options+for+Generating).
1848
1886
 
1849
1887
  For example, to display a CSV with headers and quotes:
@@ -1862,7 +1900,7 @@ If value is `no`, then object's `field` names are only the first level keys of t
1862
1900
 
1863
1901
  If value is `yes` (default), then objects are "flattened" using [dot-path](#dot-path-notation) notation with a variation:
1864
1902
 
1865
- - Final arrays are displayed as comma separated list of values
1903
+ - Final arrays are displayed as a list of values, one per line (see `str_lst_sep` in `--out.table` above)
1866
1904
  - `Array` of `Hash` with only `name` keys are displayed as comma separated list of values
1867
1905
  - `Array` of `Hash` with only `name` and `value` keys are displayed like a `Hash` with value of `name` as key.
1868
1906
 
@@ -2017,18 +2055,17 @@ The option `--out.level` controls the level of output:
2017
2055
 
2018
2056
  #### Option: `--out.secrets`: Hide or show secrets in results
2019
2057
 
2020
- - If value is `no` (default), then secrets are redacted from command results.
2058
+ - If value is `no` (default), then secrets are redacted from command results: replaced with `🔑`, or `***` if the terminal does not support Unicode (see [`--out.utf8`](#terminal-rendering-colors-and-utf-8)).
2021
2059
  - If value is `yes`, then secrets are shown in clear in results.
2022
- - If `--out.level` is `data`, secrets are included to allow piping results.
2023
2060
 
2024
2061
  #### Terminal rendering: Colors and UTF-8
2025
2062
 
2026
2063
  By default, `ascli` detects the capabilities of the terminal:
2027
2064
 
2028
2065
  | Option | Effect when `yes` | Auto-detection (default) |
2029
- |----------------|---------------------------------------------------------------|--------------------------------------------------------------------------------|
2030
- | `--out.colors` | ANSI colors and styles in results, messages and logs | `yes` if both `stdout` and `stderr` are terminals and `TERM` is not `dumb`, or if `CLICOLOR_FORCE=1` |
2031
- | `--out.utf8` | Unicode characters: table borders, check marks | `yes` if `stdout` is a terminal and the locale is UTF-8 |
2066
+ |--|--|--|
2067
+ | `--out.colors` | ANSI colors and styles in results, messages and logs | `no` if [`NO_COLOR`](https://no-color.org) is set or results are written to a file (`--out.file`), else `yes` if `CLICOLOR_FORCE` is set and not `0`, else `yes` if both `stdout` and `stderr` are terminals, `TERM` is not `dumb` and `CLICOLOR` is not `0` |
2068
+ | `--out.utf8` | Unicode characters: table borders, check marks, hidden secrets, symbols in messages, half blocks in images (else ASCII equivalents) | `yes` if `stdout` is a terminal and the locale is UTF-8, or on Windows, the terminal is Windows Terminal, VS Code, Git Bash, ConEmu, or sets `TERM` to `xterm*` |
2032
2069
 
2033
2070
  Set either option to `yes` or `no` to override detection, for example to keep colors when piping to `less -R`, or to get plain ASCII output in a terminal:
2034
2071
 
@@ -2096,6 +2133,76 @@ In the above example, the same result is obtained with option:
2096
2133
 
2097
2134
  Option `select` applies the filter after a possible "flattening" with option `--out.flat`.
2098
2135
 
2136
+ For comparisons, functions or reshaping of results, use option `--out.query`.
2137
+
2138
+ #### Option: `--out.query`
2139
+
2140
+ Option `--out.query` applies a [JMESPath](https://jmespath.org) expression to the result of a command, when it is an object or a list.
2141
+ JMESPath is a standard query language for JSON, also used by option `--query` of the AWS and Azure CLIs.
2142
+
2143
+ The expression is applied to the data as returned by the API, before the options `select` and `fields`, and before flattening with `--out.flat`.
2144
+ Its syntax is checked before the command is executed.
2145
+ Results of other types (status, no result) are not changed.
2146
+
2147
+ Examples:
2148
+
2149
+ ```shell
2150
+ # Name and email of ATS administrators
2151
+ ascli aoc admin user list --out.query='[?ats_admin].{name: name, email: email}'
2152
+ # Number of users
2153
+ ascli aoc admin user list --out.query='length(@)'
2154
+ # Email of users, one per line, for use in a shell loop
2155
+ ascli aoc admin user list --out.query='[].email' --format=text
2156
+ ```
2157
+
2158
+ > [!TIP]
2159
+ > Enclose the expression in single quotes for the shell.
2160
+ > In JMESPath, literal values are enclosed in backticks, for example: ``[?size > `1000`]``.
2161
+
2162
+ For processing that JMESPath does not provide (regular expressions, string manipulation, grouping), the value can be a Ruby lambda (`@ruby:`): it is called with the data, and returns the new data, converted to JSON data (for example, symbols and dates become strings).
2163
+ It is refused at [Security Level](#security-level) `medium` and `high`.
2164
+
2165
+ ```shell
2166
+ # Number of users per email domain
2167
+ ascli aoc admin user list --out.query=@ruby:'->(users){users.group_by{|u|u["email"].split("@").last}.transform_values(&:count)}'
2168
+ ```
2169
+
2170
+ The result of the query is displayed according to its type: a list of objects as a table, a list of values with one value per line, a single value as is.
2171
+ A list of lists (for example, `[].[name, email]`) is displayed only with a structured format (`json`, `yaml`, ...): to display a table, or CSV, use a multi-select hash instead, for example, `[].{name: name, email: email}`.
2172
+
2173
+ > [!NOTE]
2174
+ > Option `--query` gives filtering parameters to the API, while option `--out.query` filters and reshapes the result received.
2175
+ > Option `--out.query` is the equivalent of option `--query` of the AWS and Azure CLIs.
2176
+
2177
+ ### Exit status
2178
+
2179
+ The exit code of `ascli` indicates the category of error, so that scripts can react to it:
2180
+
2181
+ | Code | Description |
2182
+ |------|----------------------------------------------------------------------------|
2183
+ | `0` | Success |
2184
+ | `1` | Other error |
2185
+ | `2` | Command line error: unknown command or option, invalid or missing argument |
2186
+ | `3` | Authentication or authorization failure: SSH, HTTP 401 or 403, OAuth grant |
2187
+ | `4` | Resource not found, or several resources match the identifier, HTTP 404 |
2188
+ | `5` | Transfer failure |
2189
+ | `6` | Network or TLS failure: name resolution, connection, timeout, certificate |
2190
+ | `7` | Other error returned by a remote API |
2191
+ | `130` | Interrupted by user (Ctrl-C) |
2192
+
2193
+ With format `nagios`, the exit code is the status of the check: `0` (OK), `1` (WARNING), `2` (CRITICAL), and `3` (UNKNOWN) if the command fails, following the [Nagios plugin guidelines](https://nagios-plugins.org/doc/guidelines.html).
2194
+
2195
+ Example:
2196
+
2197
+ ```bash
2198
+ ascli aoc files download /report.csv
2199
+ case $? in
2200
+ 0) echo 'Downloaded' ;;
2201
+ 6) echo 'Network failure, retry later' ;;
2202
+ *) echo 'Failed' ;;
2203
+ esac
2204
+ ```
2205
+
2099
2206
  ### Extended Value Syntax
2100
2207
 
2101
2208
  An **Extended Value** is a structured value - typically a `Hash` (key/value dictionary) or `Array`, potentially nested - that is passed on the command line wherever a simple string is not sufficient.
@@ -2140,15 +2247,16 @@ The following decoders are supported:
2140
2247
  | `list` | `String` | `Array` | Split a string in multiple items taking first character as separator and return an `Array`. |
2141
2248
  | `none` | None | Nil | A `null` value. |
2142
2249
  | `path` | `String` | `String` | Performs path expansion on specified path (prefix `~/` is replaced with the user's home folder). For example, `--config-file=@path:~/sample_config.yml` |
2143
- | `preset` | `String` | `Hash` | Get value from configuration file using [dot-path](#dot-path-notation) notation. |
2250
+ | `preset` | `String` | Any | Get value from configuration file using [dot-path](#dot-path-notation) notation: a whole preset (`Hash`) or a single value. |
2144
2251
  | `extend` | `String` | `String` | Evaluates embedded [Extended Value](#extended-value-syntax) syntax in string. |
2145
2252
  | `re` | `String` | `Regexp` | Ruby Regular Expression (short for `@ruby:/.../`) |
2146
2253
  | `ruby` | `String` | Any | Execute specified Ruby code. |
2147
2254
  | `s` | Any | `String` | Converts argument to `String`. |
2148
- | `secret` | `String` | `String` | Ask password interactively (hides input). Argument is the prompt. |
2255
+ | `secret` | `String` | `String` | Ask password interactively: on terminal (hides input), or on a web page if option `ui` is `graphical`. Argument is the prompt. |
2149
2256
  | `stdin` | `String` | `String` | Read from stdin in text mode. Argument: `<empty>`, `bin` or `chomp`. |
2150
2257
  | `uri` | `String` | `String` | Read value from specified URL. Supported schemes: `http:`, `https:`, `data:`, `file:`. For example, `--fpac=@uri:http://serv/f.pac` or `--key=@uri:file:/path/to/key.pem` |
2151
2258
  | `val` | `String` | `String` | Prevent decoding by the decoders on the right. For example, `--key=@val:@file:foo` sets the option `key` to value `@file:foo`. |
2259
+ | `vault` | `String` | `String` | Read a secret from the [Secret Vault](#secret-vault): `<label>.<field>`. For example, `--password=@vault:my_label.password` |
2152
2260
  | `yaml` | `String` | Any | Decode YAML. |
2153
2261
  | `zlib` | `String` | `String` | Decompress data using zlib. |
2154
2262
  | `<empty>`| None | Any | The **dot-path** modifier: argument `@:` collects the following positional arguments as `key.subkey=value` assignments and builds a `Hash` or `Array` using [dot-path](#dot-path-notation) notation. Shell-friendly alternative to `@json:` for structured values.<br/>See [Positional Arguments with Dot-path](#positional-arguments-with-dot-path) for full syntax. Use `END` to stop collection when further positional arguments must follow. |
@@ -2470,6 +2578,38 @@ ascli config echo Hello\ World --format=text
2470
2578
  Hello World
2471
2579
  ```
2472
2580
 
2581
+ ### Security Level
2582
+
2583
+ On the command line, `ascli` can do anything that the user running it is allowed to do.
2584
+ Option `security` restricts the features that access local resources or execute code, for example, when commands come from another program, such as an MCP client (see [MCP Security](#security)).
2585
+ It is a `Hash` with the following keys:
2586
+
2587
+ | Key | Type | Default | Description |
2588
+ |-----|-----|-----|-----|
2589
+ | `level` | `string` | `low` | `low`, `medium`, or `high` |
2590
+ | `allowed_paths` | `Array<string>` | - | With level `medium`: files and folders that `@file:` can read |
2591
+
2592
+ | Level | `@file:` | `@ruby:`, `@uri:`, and `@env:` | Secret processed by another extended value |
2593
+ |---|---|---|---|
2594
+ | `low` | Allowed | Allowed | Allowed |
2595
+ | `medium` | Only files in `allowed_paths` | Refused | Refused |
2596
+ | `high` | Refused | Refused | Refused |
2597
+
2598
+ With level `medium`, the real path of the file is checked: a symbolic link leading outside of `allowed_paths` is refused.
2599
+
2600
+ A secret (read by `@secret:`, `@vault:`, or `@preset:`) is hidden in results by its value: processed by another extended value, it could be revealed (for example, split by `@list:@vault:...`, or with a short value in a text by `@extend:`).
2601
+ With levels `medium` and `high`, a secret must be the whole value of an option or argument, for example `@preset:<PRESET_NAME>.password` for option `password`, and it cannot be a parameter name of `config preset set`.
2602
+
2603
+ Options are evaluated in the order of the command line: place `--security` before options that use extended values.
2604
+
2605
+ ```shell
2606
+ ascli config echo @file:/etc/hosts --security.level=high
2607
+ ```
2608
+
2609
+ ```text
2610
+ ERRR Argument: Evaluation of file for argument: value: @file: extended value is disabled by security level high
2611
+ ```
2612
+
2473
2613
  ### Main, configuration and Persistency Folder
2474
2614
 
2475
2615
  `ascli` looks for configuration and persistency files (token cache, file lists, persistency files) in the folder specified using option `home`.
@@ -2512,7 +2652,7 @@ C:\Users\Kenji\.aspera\ascli
2512
2652
  When OAuth is used (AoC, Faspex 5), `ascli` keeps a cache of generated bearer tokens in folder `persist_store` located in the configuration folder by default.
2513
2653
  Option `cache_tokens` (**yes**/no) allows controlling if OAuth tokens are cached on file system, or generated for each request.
2514
2654
  The command `config tokens flush` clears that cache.
2515
- Tokens are kept on disk for a maximum of 30 minutes (`TOKEN_CACHE_EXPIRY_SEC`) and garbage collected after that.
2655
+ Tokens are kept on disk for a maximum of 30 minutes and garbage collected after that.
2516
2656
  When a token has expired, then a new token is generated, either using a `refresh_token` if it is available, or by the default method.
2517
2657
 
2518
2658
  ### Configuration file
@@ -2600,9 +2740,11 @@ An [Option Preset](#option-preset) is a collection of options and their associat
2600
2740
  A named [Option Preset](#option-preset) can be modified directly using `ascli`, which will update the configuration file:
2601
2741
 
2602
2742
  ```text
2603
- ascli config preset <set|delete|show|initialize|update> <PRESET_NAME>
2743
+ ascli config preset <show|delete|get|unset|set|initialize|update|ask> <PRESET_NAME> ...
2604
2744
  ```
2605
2745
 
2746
+ The syntax of all `config preset` commands, including `list` and `overview`, is displayed with `ascli config commands config preset`.
2747
+
2606
2748
  The command `initialize` allows setting several options at once, but it deletes an existing configuration instead of updating it, and expects a `Hash` [Extended Value](#extended-value-syntax).
2607
2749
 
2608
2750
  ```shell
@@ -2674,7 +2816,7 @@ demo_server:
2674
2816
  _comment: "Demo server - public credentials"
2675
2817
  url: ssh://demo.asperasoft.com:33001
2676
2818
  username: asperaweb
2677
- password: demoaspera
2819
+ password: <PASSWORD>
2678
2820
  ```
2679
2821
 
2680
2822
  > [!NOTE]
@@ -2748,11 +2890,25 @@ The default value is `_<>:"/\|?*`, corresponding to replacement character `_` an
2748
2890
 
2749
2891
  ### Managing temporary files
2750
2892
 
2751
- Some temporary files may be needed during runtime.
2752
- The temporary folder may be specified with option: `temp_folder`.
2753
- Temporary files are deleted at the end of execution unless option: `clean_temp` is set to `no`.
2754
- By default (`@sys`), the temporary folder is the system's temporary folder for the current user (Ruby `Etc.systmpdir`).
2755
- A special value of `@env` sets the folder to Ruby `Dir.tmpdir`, which uses the usual environment variables (for example, `TMPDIR`).
2893
+ Some temporary files may be needed during runtime, for example the file list of `ascp`.
2894
+ The composite option `temp` (use `--temp=help` to display this schema) controls them:
2895
+
2896
+ | Field | Type | Description |
2897
+ |--------|----------------------|----------------------------------------------------------------------------------|
2898
+ | `clean` | `Bool` | Delete temporary files created by the command when it ends. `false` keeps them, e.g. for debugging. Files left by previous commands are still deleted according to `expiry`.<br/>Default: `true`. |
2899
+ | `expiry` | `String, Number, Bool` | Age after which file lists of `ascp` left by previous commands (e.g. interrupted) are deleted, when a command starts. They are in folder `filelists` of the main folder (option `home`). A duration, e.g. `5d`, `12h`, `1w`, `1h 30m`, `1d 02:00:00`, a plain number is seconds. `false` or `null` (`@none:`): never delete them. `0`: delete all of them, including file lists of transfers in progress in other executions of ascli. Such a transfer fails if `ascp` reads its file list again: next session of a multi-session transfer, or resume after an error. Use `0` only when no other transfer is in progress, not in a permanent configuration.<br/>Default: `5d`. |
2900
+ | `folder` | `String` | Folder for temporary files, e.g. certificate for WSS transfers, logs of `transferd`. `@sys`: temporary folder of the system for the current user (Ruby `Etc.systmpdir`). `@env`: from environment variables, e.g. `TMPDIR` (Ruby `Dir.tmpdir`).<br/>Default: `@sys`. |
2901
+
2902
+ A plain value is the `folder`, for example: `--temp=/data/tmp`.
2903
+
2904
+ Temporary files of a command are deleted when it ends, unless `clean` is `false`.
2905
+ If a command is interrupted (for example, killed), its `ascp` file lists remain: a later command deletes them when they are older than `expiry`.
2906
+
2907
+ > [!WARNING]
2908
+ > `--temp.expiry=0` also deletes the file lists of transfers in progress in other executions of `ascli`, which may then fail: use it only when no other transfer is in progress.
2909
+
2910
+ > [!TIP]
2911
+ > Options `temp_folder` and `clean_temp` are deprecated aliases for `temp.folder` and `temp.clean`.
2756
2912
 
2757
2913
  ### Plugin: `config`: Configuration
2758
2914
 
@@ -2847,12 +3003,14 @@ echo -- --special-string
2847
3003
  echo @base64:SGVsbG8gV29ybGQK
2848
3004
  echo @csvt:@stdin:
2849
3005
  echo @env:USER
3006
+ echo @json:'[{"email":"a@x.com"},{"email":"b@x.com"},{"email":"c@y.org"}]' --out.query=@ruby:'->(users){users.group_by{|u|u["email"].split("@").last}.transform_values(&:count)}' --format=json
3007
+ echo @json:'[{"name":"alice","size":10},{"name":"bob","size":2000}]' --out.query='[?size > `100`].name' --format=text
2850
3008
  echo @json:'[{"user":{"id":1,"name":"foo"},"project":"bar"}]' --out.table.pivot=single
2851
3009
  echo @json:'[{"user":{"id":1,"name":"foo"},"project":"bar"}]' --out.table.pivot=yes
2852
3010
  echo @json:'{"empty":"","bool":true}' --out.colors=yes --out.utf8=yes
2853
3011
  echo @lines:@stdin:
2854
3012
  echo @list:,1,2,3
2855
- echo @secret:
3013
+ echo @secret: --ui=text --out.secrets=yes
2856
3014
  echo @stdin:bin
2857
3015
  echo @uri:/etc/hosts
2858
3016
  echo @uri:file:/etc/hosts
@@ -2888,7 +3046,7 @@ preset list
2888
3046
  preset overview
2889
3047
  preset set GLOBAL sdk_folder 'product:IBM Aspera Connect'
2890
3048
  preset set GLOBAL vault @: type=file name=/secure/vault_file
2891
- preset set GLOBAL vault_password _simple_one_
3049
+ preset set GLOBAL vault_password <PASSWORD>
2892
3050
  preset set GLOBAL version_check_days 0
2893
3051
  preset set conf_name param value
2894
3052
  preset set default shares conf_name
@@ -2909,7 +3067,7 @@ transfer list
2909
3067
  transfer status <conf_async_node_upload>
2910
3068
  transferd install
2911
3069
  transferd list
2912
- vault create @: label=my_label password=my_password_here 'description=my secret'
3070
+ vault create @: label=my_label password=<PASSWORD> 'description=my secret'
2913
3071
  vault delete foo --vault.type=system
2914
3072
  vault delete my_label
2915
3073
  vault ids
@@ -2918,11 +3076,11 @@ vault list
2918
3076
  vault show my_label
2919
3077
  wizard https://console.example.com/path console
2920
3078
  wizard https://f5.example.com/path faspex5 --key-path=my_private_key
2921
- wizard https://node.example.com/path node --username=test --password=test
2922
- wizard https://orch.example.com/path orchestrator --username=test --password=test
2923
- wizard https://server.example.com/path server --username=my_username --password=my_password
2924
- wizard https://shares.example.com/path shares --username=test --password=test
2925
- wizard https://tst.example.com/path faspio --username=my_username --password=my_password
3079
+ wizard https://node.example.com/path node --username=test --password=<PASSWORD>
3080
+ wizard https://orch.example.com/path orchestrator --username=test --password=<PASSWORD>
3081
+ wizard https://server.example.com/path server --username=my_username --password=<PASSWORD>
3082
+ wizard https://shares.example.com/path shares --username=test --password=<PASSWORD>
3083
+ wizard https://tst.example.com/path faspio --override=yes --username=my_username --password=<PASSWORD>
2926
3084
  wizard https://tst.example.com/path httpgw
2927
3085
  wizard my_org aoc --key-path=my_private_key --username=my_user_email --use-generic-client=yes
2928
3086
  wizard my_org aoc mypreset --key-path=my_private_key --username=my_user_email
@@ -2968,18 +3126,18 @@ ascli config preset unset cli_default interactive
2968
3126
  Example: Define options using command line:
2969
3127
 
2970
3128
  ```shell
2971
- ascli -N --url=_url_here_ --password=<PASSWORD> --username=_name_here_ node --show-config
3129
+ ascli -N --url=<URL> --password=<PASSWORD> --username=<USERNAME> node --show-config
2972
3130
  ```
2973
3131
 
2974
3132
  Example: Define options using a `Hash`:
2975
3133
 
2976
3134
  ```shell
2977
- ascli -N --preset=@json:'{"url":"_url_here_","password":"<PASSWORD>","username":"_name_here_"}' node --show-config
3135
+ ascli -N --preset=@json:'{"url":"<URL>","password":"<PASSWORD>","username":"<USERNAME>"}' node --show-config
2978
3136
  ```
2979
3137
 
2980
3138
  #### Shell Completion
2981
3139
 
2982
- `ascli` supports shell tab-completion for **Bash**, **Zsh**, and **Fish**.
3140
+ `ascli` supports shell tab-completion for **Bash**, **Zsh**, **Fish**, and **PowerShell** (Windows PowerShell 5.1 and PowerShell 7, on any OS).
2983
3141
  The command `ascli config completion <shell>` displays the completion script for the given shell.
2984
3142
 
2985
3143
  To activate completion, add the line for your shell to its startup file:
@@ -2999,6 +3157,11 @@ eval "$(ascli config completion zsh)"
2999
3157
  ascli config completion fish | source
3000
3158
  ```
3001
3159
 
3160
+ ```powershell
3161
+ # PowerShell, in $PROFILE (edit with notepad $PROFILE)
3162
+ ascli config completion powershell | Out-String | Invoke-Expression
3163
+ ```
3164
+
3002
3165
  The startup file then executes `ascli` each time a shell starts.
3003
3166
  Alternatively, save the script once in the completion folder of the shell (and save it again after an upgrade of `ascli`):
3004
3167
 
@@ -3011,16 +3174,40 @@ ascli config completion zsh > ~/.zsh/completions/_ascli
3011
3174
  ascli config completion fish > ~/.config/fish/completions/ascli.fish
3012
3175
  ```
3013
3176
 
3014
- Once active, press `Tab` to complete commands at any depth:
3177
+ PowerShell has no completion folder: save the script, and dot-source it in `$PROFILE`:
3015
3178
 
3016
- ```bash
3017
- ascli <Tab> # lists all plugins: aoc, server, node, ...
3018
- ascli server <Tab> # lists server sub-commands: upload, download, ls, ...
3019
- ascli aoc admin <Tab> # lists aoc admin sub-commands: user, node, ...
3179
+ ```powershell
3180
+ ascli config completion powershell | Set-Content "$HOME\ascli_completion.ps1"
3181
+ Add-Content -Path $PROFILE -Value ". '$HOME\ascli_completion.ps1'"
3020
3182
  ```
3021
3183
 
3022
- The scripts call `ascli config completion words [<word>...]`, which lists the words that can follow the given ones.
3023
- It can also be used directly to inspect available commands:
3184
+ In PowerShell, the words proposed are kept for the session, so only the first `Tab` at a given position executes `ascli`.
3185
+
3186
+ Once active, press `Tab` to complete:
3187
+
3188
+
3189
+ ```bash
3190
+ ascli <Tab> # plugins and global options: aoc, server, node, ..., --format, ...
3191
+ ascli server <Tab> # sub-commands and options of plugin: upload, download, ls, ..., --url, ...
3192
+ ascli aoc admin <Tab> # sub-commands at any depth: user, node, ...
3193
+ ascli server ls --u<Tab> # options, after any command: --url, --username, ...
3194
+ ascli --format=<Tab> # values of option: --format=json, --format=table, ...
3195
+ ascli --ts.<Tab> # keys of option, from its schema: --ts.direction, --ts.target_rate_kbps, ...
3196
+ ascli --ts.direction=<Tab> # values of key: --ts.direction=send, --ts.direction=receive
3197
+ ascli server upload <Tab> # local files
3198
+ ascli config preset show <Tab> # type of expected value, not inserted: <identifier>
3199
+ ascli aoc packages send <Tab> # type, and keys of structure (required ones with *): <Hash> name*, workspace_id*, ...
3200
+ ascli aoc packages send @: name=x <Tab> # end marker of structure built with @: END
3201
+ ```
3202
+
3203
+ Zsh, Fish and PowerShell also display the description of commands and options.
3204
+ Zsh lists options once `-` is typed (zsh style `prefix-needed`).
3205
+ The type of an expected value is displayed by Bash and Zsh, and by PowerShell in the list of `MenuComplete` (`Ctrl+Space`).
3206
+
3207
+ The scripts call `ascli config completion candidates -- [<word>...] <current word>`, which lists the candidates for the word at the cursor, with their description, followed by a directive for the shell.
3208
+ The words are not evaluated (e.g. `@env:` is not replaced).
3209
+ The command `ascli config completion words [<word>...]` lists the words that can follow the given ones.
3210
+ It can be used directly to inspect available commands:
3024
3211
 
3025
3212
  ```bash
3026
3213
  ascli config completion words aoc admin
@@ -3123,8 +3310,13 @@ Instead, they shall be hidden (logs, output) or encrypted (configuration).
3123
3310
 
3124
3311
  Terminal output (command result) secret removal is controlled by option `--out.secrets` (default: `no`).
3125
3312
  Log secret removal is controlled by option `log_secrets` (default: `no`).
3313
+ Secrets are identified by the name of their field (for example, `password`, `token`), and by their value: values of secret options and of presets, of [Extended Values](#extended-value-syntax) `@secret:` and `@vault:`, tokens obtained or generated, and secrets of transfer specs are hidden wherever they appear, also in field names.
3314
+ In presets, a secret made of digits only (for example, a password not quoted in the YAML file) is converted to a string, so that it is identified as a secret.
3315
+ A value shorter than 8 characters is hidden only when it is the whole value, not inside a text, except in responses of `mcp server`, where it is also hidden as a word (not next to a letter or digit).
3126
3316
  Mandatory command line options can be requested interactively (for example, password) using option `interactive`.
3127
3317
  It is possible to use [Extended Value](#extended-value-syntax) `@secret:[name]` to ask for a secret interactively.
3318
+ If option `ui` is `graphical` (see [Graphical Interactions](#graphical-interactions-browser-and-text-editor)), the secret is entered on a web page opened in the browser, served by a local web server on `127.0.0.1`, else on terminal.
3319
+ In MCP server mode, the secret is entered on a web page, see [Secrets entered in a web page](#secrets-entered-in-a-web-page).
3128
3320
  It is also possible to enter an option as an environment variable, for example, `ASCLI_PASSWORD` for option `password` and read the env var like this:
3129
3321
 
3130
3322
  ```shell
@@ -3157,32 +3349,32 @@ Quick start macOS:
3157
3349
  ```shell
3158
3350
  brew tap hashicorp/tap
3159
3351
  brew install hashicorp/tap/vault
3160
- vault server -dev -dev-root-token-id=dev-only-token
3352
+ vault server -dev -dev-root-token-id=<TOKEN>
3161
3353
  ```
3162
3354
 
3163
3355
  | Field | Type | Description |
3164
3356
  |----------|--------|----------------------------------------------------------------------------------|
3165
3357
  | **type** | `String` | `vault`: IBM HashiCorp Vault secret store. |
3166
3358
  | `token` | `String` | Authentication token. Defaults to the value of `vault_password`.<br/>Example: `dev-only-token`. |
3167
- | `type` | `String` | Vault type selector.<br/>Allowed values: `vault`. |
3168
- | `url` | `String` | URL of the HashiCorp Vault server.<br/>Example: `http://127.0.0.1:8200`. |
3359
+ | `type` | `String` | Vault type selector.<br/>Required.<br/>Allowed values: `vault`. |
3360
+ | `url` | `String` | URL of the HashiCorp Vault server.<br/>Required.<br/>Example: `http://127.0.0.1:8200`. |
3169
3361
  | **type** | `String` | `system`: macOS system keychain secret store. |
3170
- | `name` | `String` | Name of the keychain to use. |
3171
- | `type` | `String` | Vault type selector.<br/>Allowed values: `system`. |
3362
+ | `name` | `String` | Name of the keychain to use (file `<name>.keychain-db` in the keychain search list).<br/>Default: `ascli`. |
3363
+ | `type` | `String` | Vault type selector.<br/>Required.<br/>Allowed values: `system`. |
3172
3364
  | **type** | `String` | `file`: Encrypted file secret store. |
3173
3365
  | `name` | `String` | Path to the encrypted vault file. Relative paths are resolved from the configuration folder.<br/>Default: `vault.bin`. |
3174
- | `type` | `String` | Vault type selector.<br/>Allowed values: `file`. |
3366
+ | `type` | `String` | Vault type selector.<br/>Required.<br/>Allowed values: `file`. |
3175
3367
  | **type** | `String` | `1password`: 1Password secret store (Connect REST API or CLI). |
3176
3368
  | `account` | `String` | Account shorthand for `op` (used when `source` is `cli`). Uses the default account if omitted. |
3177
- | `source` | `String` | Backend source. Use `api` for the Connect REST API, `cli` for the `op` CLI.<br/>Allowed values: `api`, `cli`.<br/>Default: `api`. |
3369
+ | `source` | `String` | Backend source. Use `api` for the Connect REST API, `cli` for the `op` CLI.<br/>Required.<br/>Allowed values: `api`, `cli`.<br/>Default: `api`. |
3178
3370
  | `token` | `String` | Bearer token for the Connect API (required when `source` is `api`). Defaults to the value of `vault_password`. |
3179
- | `type` | `String` | Vault type selector.<br/>Allowed values: `1password`. |
3371
+ | `type` | `String` | Vault type selector.<br/>Required.<br/>Allowed values: `1password`. |
3180
3372
  | `url` | `String` | Base URL of the 1Password Connect server (required when `source` is `api`).<br/>Example: `http://localhost:8080`. |
3181
3373
  | `vault_id` | `String` | ID of the 1Password vault to use (required when `source` is `api`). |
3182
3374
  | `vault` | `String` | Name or ID of the 1Password vault to use with the CLI (used when `source` is `cli`). Uses the default vault if omitted. |
3183
3375
 
3184
3376
  ```shell
3185
- --vault=@json:'{"type":"vault","url":"http://127.0.0.1:8200"}' --vault-password=dev-only-token
3377
+ --vault=@json:'{"type":"vault","url":"http://127.0.0.1:8200"}' --vault-password=<TOKEN>
3186
3378
  ```
3187
3379
 
3188
3380
  #### Vault: System keychain
@@ -3190,7 +3382,8 @@ vault server -dev -dev-root-token-id=dev-only-token
3190
3382
  > [!WARNING]
3191
3383
  > **macOS only**
3192
3384
 
3193
- It is possible to manage secrets in macOS keychain (only read supported currently).
3385
+ It is possible to manage secrets in macOS keychain.
3386
+ Commands `list`, `ids` and `delete` are not supported: use the **Keychain Access** app.
3194
3387
 
3195
3388
  ```shell
3196
3389
  --vault=@json:'{"type":"system","name":"ascli"}'
@@ -3264,6 +3457,18 @@ No server to deploy: authentication is handled by the 1Password desktop app (bio
3264
3457
  > Install `op` on macOS with `brew install 1password-cli`, then connect it to the desktop app:
3265
3458
  > `op signin`
3266
3459
 
3460
+ ##### Referencing items
3461
+
3462
+ An item can be referenced by its title (label) or by its 1Password ID, in `@vault:<item>.<field>`:
3463
+
3464
+ ```shell
3465
+ --password=@vault:<ITEM_ID>.password
3466
+ --password=@vault:<ITEM_TITLE>.password
3467
+ ```
3468
+
3469
+ > [!NOTE]
3470
+ > If several items share the same title, use the item ID (or the `vault` parameter to restrict the search).
3471
+
3267
3472
  #### Vault: Operations
3268
3473
 
3269
3474
  Secrets can be manipulated using the `config vault` command:
@@ -3274,7 +3479,7 @@ Secrets can be manipulated using the `config vault` command:
3274
3479
  - `show` : Show a secret by label (or id)
3275
3480
  - `create` : Add a new secret to the vault
3276
3481
  - `delete` : Delete a secret by label (or id)
3277
- - `password` : Change the vault password
3482
+ - `password` : Set a new password for the vault
3278
3483
  - `import` : Import secrets from a JSON array (supports `--bulk`)
3279
3484
 
3280
3485
  To add a new password entry in the vault for label `<NAME>`:
@@ -3291,7 +3496,7 @@ To migrate all secrets from one vault backend to another (for example, from the
3291
3496
  > Use `list` (not `ids`) as the source: `ids` returns only labels, while `list` returns the full secret details needed for import.
3292
3497
 
3293
3498
  ```shell
3294
- ascli config vault list --format=json --out.level=data \
3499
+ ascli config vault list --format=json --out.level=data --out.secrets=yes \
3295
3500
  --vault=@json:'{"type":"file","name":"<SOURCE_VAULT_FILE>"}' \
3296
3501
  --vault-password=<SOURCE_PASSWORD> | \
3297
3502
  ascli config vault import @json:@stdin: --bulk=yes \
@@ -3300,7 +3505,7 @@ ascli config vault import @json:@stdin: --bulk=yes \
3300
3505
  ```
3301
3506
 
3302
3507
  > [!TIP]
3303
- > Use `--out.level=data` on the `list` command so that only the raw JSON array is written to stdout, with no table headers or status lines.
3508
+ > Use `--out.level=data` on the `list` command so that only the raw JSON array is written to stdout, with no table headers or status lines, and `--out.secrets=yes` so that secrets are not replaced by a placeholder.
3304
3509
 
3305
3510
  The `import` command accepts a JSON array where each element is a vault secret object (same schema as `create`).
3306
3511
  `--bulk` makes each entry reported individually in the result table; omit it to get a single-line summary.
@@ -3414,17 +3619,17 @@ ssh-keygen -t rsa -b 4096 -m PEM -N '' -f ${KEY_PAIR_PATH}
3414
3619
  To generate a key pair with a passphrase, the following can be used on any system:
3415
3620
 
3416
3621
  ```shell
3417
- openssl genrsa -passout pass:_passphrase_here_ -out ${KEY_PAIR_PATH} 4096
3622
+ openssl genrsa -passout pass:<PASSPHRASE> -out ${KEY_PAIR_PATH} 4096
3418
3623
  openssl rsa -pubout -in ${KEY_PAIR_PATH} -out ${KEY_PAIR_PATH}.pub
3419
3624
  ```
3420
3625
 
3421
3626
  `openssl` is sometimes compiled to support option `-nodes` (no DES, that is, no passphrase, for example, on macOS).
3422
- In that case, add option `-nodes` instead of `-passout pass:_passphrase_here_` to generate a key without passphrase.
3627
+ In that case, add option `-nodes` instead of `-passout pass:<PASSPHRASE>` to generate a key without passphrase.
3423
3628
 
3424
3629
  If option `-nodes` is not available, the passphrase can be removed using this method:
3425
3630
 
3426
3631
  ```shell
3427
- openssl rsa -passin pass:_passphrase_here_ -in ${KEY_PAIR_PATH} -out ${KEY_PAIR_PATH}.no_des
3632
+ openssl rsa -passin pass:<PASSPHRASE> -in ${KEY_PAIR_PATH} -out ${KEY_PAIR_PATH}.no_des
3428
3633
  mv ${KEY_PAIR_PATH}.no_des ${KEY_PAIR_PATH}
3429
3634
  ```
3430
3635
 
@@ -3463,6 +3668,16 @@ Parameter `url` (base URL) defines:
3463
3668
  - The local port number (default 443 for HTTPS, 80 for HTTP)
3464
3669
  - The **base path**, that is, the path under which requests are received (useful for routing when a reverse proxy is used).
3465
3670
 
3671
+ A web page open in a browser can send requests to a local web server, also on `localhost`.
3672
+ To refuse them, the server checks each request:
3673
+
3674
+ - When `url` is a loopback address (`localhost`, `127.0.0.0/8`, `::1`), header `Host` shall be a loopback name or address, else HTTP 403: a host name that resolves to `127.0.0.1` is refused (DNS rebinding).
3675
+ - Header `Origin`, sent by browsers, shall be the origin of the server, else HTTP 403.
3676
+ - A JSON body shall have `Content-Type: application/json`, else HTTP 415: a web page cannot send it to another site without the agreement of that site.
3677
+
3678
+ Clients that are not browsers send no `Origin`, and the `Host` of the URL they call.
3679
+ They shall send the type of a JSON body: for example, with `curl`, add `-H 'Content-Type: application/json'`.
3680
+
3466
3681
  ### Image and video thumbnails
3467
3682
 
3468
3683
  `ascli` can display thumbnails for images and videos in the **terminal**, using [iTerm2 inline image protocol](https://iterm2.com/documentation-images.html) or through colorized text.
@@ -3478,7 +3693,7 @@ The following options can be specified in option `--out.img`:
3478
3693
 
3479
3694
  | Field | Type | Description |
3480
3695
  |------------|---------|----------------------------------------------------------------------------------|
3481
- | `double` | `Bool` | Use double vertical resolution via half-block characters.<br/>Default: `true`. |
3696
+ | `double` | `Bool` | Use double vertical resolution via half-block characters (Unicode). Default is `true` if the terminal supports Unicode (see `utf8`). |
3482
3697
  | `font_ratio` | `Number` | Terminal font aspect ratio (height divided by width).<br/>Default: `2.3`. |
3483
3698
  | `reserve` | `Integer` | Number of terminal lines reserved for non-image output.<br/>Default: `3`. |
3484
3699
  | `text` | `Bool` | Display the image as colorized text instead of using the iTerm2 inline protocol.<br/>Default: `false`. |
@@ -3508,13 +3723,31 @@ ascli config image @stdin:bin < A-team.jpg
3508
3723
  Some actions may require the use of a graphical tool:
3509
3724
 
3510
3725
  - A browser for Aspera on Cloud authentication (web auth method)
3726
+ - A browser to enter a secret requested with `@secret:`
3511
3727
  - A text editor for editing the configuration file
3512
3728
 
3513
3729
  By default, `ascli` assumes that a graphical environment is available on Windows; on other systems, it relies on the presence of the `DISPLAY` environment variable.
3514
- It is also possible to force the graphical mode with option `ui`:
3730
+ The composite option `ui` (use `--ui=help` to display this schema) selects the mode and the browser command:
3731
+
3732
+ | Field | Type | Description |
3733
+ |---------|---------------|----------------------------------------------------------------------------------|
3734
+ | `command` | `Array[String]` | Command that opens a URL, instead of the system default. First item is the executable, then its arguments. The URL is added as last argument. When set, it is used to open URLs, whatever the `mode`. |
3735
+ | `mode` | `String` | `auto`: `browser` on Windows and macOS, or if env var `DISPLAY` is set, else `terminal`. `terminal`: URLs and files to open are displayed on terminal, and secrets are entered on terminal. `browser`: a browser opens URLs, secrets are entered on a web page, and a text editor opens files. `text` is an alias for `terminal`, and `graphical` is an alias for `browser`.<br/>Allowed values: `auto`, `terminal`, `browser`, `text`, `graphical`.<br/>Default: `auto`. |
3736
+
3737
+ A plain value is the `mode`:
3515
3738
 
3516
- - `--ui=graphical` forces a graphical environment: a browser is opened for URLs, or a text editor for files.
3517
- - `--ui=text` forces a text environment, the URL or file path to open is displayed on terminal.
3739
+ - `--ui=browser` (or `graphical`) forces a graphical environment: a browser is opened for URLs or secrets, or a text editor for files.
3740
+ - `--ui=terminal` (or `text`) forces a text environment, the URL or file path to open is displayed on terminal, and secrets are entered on terminal.
3741
+ - `--ui=auto` selects the mode from the environment (default).
3742
+
3743
+ The browser is opened, by priority, with: `--ui.command`, or the system default.
3744
+ When a command is defined, it is used to open URLs whatever the `mode`.
3745
+ The command is an array: the URL is appended as last argument.
3746
+ For example, to use Firefox:
3747
+
3748
+ ```bash
3749
+ ascli config echo @secret: --ui=browser --ui.command=@json:'["firefox","--private-window"]'
3750
+ ```
3518
3751
 
3519
3752
  ### Logging, Debugging
3520
3753
 
@@ -3594,7 +3827,7 @@ It will display the exact content of HTTP requests and responses.
3594
3827
  ### HTTP socket parameters
3595
3828
 
3596
3829
  To ignore SSL certificate for **any** address/port, use option: `insecure`, that is, `--insecure=yes`.
3597
- To ignore SSL certificate for a list of specific address/port, use option `ignore_certificate`, set to an `Array` of URLs for which the certificate is ignored (only the address and port are matched), for example, `--ignore-certificate=@list:,https://127.0.0.1:9092`
3830
+ To ignore SSL certificate for a list of specific address/port, use option `ignore_certificate`, set to a URL or an `Array` of URLs for which the certificate is ignored (only the address and port are matched), for example, `--ignore-certificate=https://127.0.0.1:9092` or `--ignore-certificate=@list:,https://127.0.0.1:9092,https://127.0.0.1:9093`
3598
3831
 
3599
3832
  > [!NOTE]
3600
3833
  > Ignoring certificate also applies to `ascp` WSS.
@@ -3727,16 +3960,16 @@ proxy://proxy.example.com:8080
3727
3960
  If the proxy found with the PAC requires credentials, then use option `proxy_credentials` with username and password provided as an `Array`:
3728
3961
 
3729
3962
  ```shell
3730
- ascli --proxy-credentials=@json:'["__username_here__","__password_here__"]' ...
3963
+ ascli --proxy-credentials=@json:'["<USERNAME>","<PASSWORD>"]' ...
3731
3964
  ```
3732
3965
 
3733
3966
  ```shell
3734
- ascli --proxy-credentials=@list::__username_here__:__password_here__ ...
3967
+ ascli --proxy-credentials=@list::<USERNAME>:<PASSWORD> ...
3735
3968
  ```
3736
3969
 
3737
3970
  #### Proxy for Legacy Aspera HTTP/S Fallback
3738
3971
 
3739
- Only supported with the `direct` agent: To specify a proxy for legacy HTTP fallback, use `ascp` native option `-x` and `ascp_args`: `--transfer=@json:'{"ascp_args":["-x","url_here"]}'`.
3972
+ Only supported with the `direct` agent: To specify a proxy for legacy HTTP fallback, use `ascp` native option `-x` and `ascp_args`: `--transfer=@json:'{"ascp_args":["-x","<PROXY_URL>"]}'`.
3740
3973
 
3741
3974
  #### FASP proxy (forward) for transfers
3742
3975
 
@@ -3877,7 +4110,7 @@ The list of agents and their short identifier can be displayed with:
3877
4110
  ascli config agents list
3878
4111
  ```
3879
4112
 
3880
- To display all configurable parameters for a specific agent:
4113
+ To display the configurable parameters of a specific agent (with required fields, default values, enumerated values):
3881
4114
 
3882
4115
  ```shell
3883
4116
  ascli config agents parameters <agent name>
@@ -3890,7 +4123,7 @@ ascli config agents parameters direct
3890
4123
  ascli config agents parameters node
3891
4124
  ```
3892
4125
 
3893
- To display the full detail of an agent (description, required fields, default values, enumerated values):
4126
+ To display the description of an agent:
3894
4127
 
3895
4128
  ```shell
3896
4129
  ascli config agents show <agent name>
@@ -4235,21 +4468,21 @@ Parameters provided in option `transfer` are:
4235
4468
 
4236
4469
  | Field | Type | Description |
4237
4470
  |----------|--------|---------------------------------------------------------------|
4238
- | `password` | `String` | Password, secret, or bearer token. |
4471
+ | `password` | `String` | Password, secret, or bearer token.<br/>Required. |
4239
4472
  | `root_id` | `String` | Root file ID. Mandatory only when `password` is a bearer token. |
4240
- | `url` | `String` | URL of the Node API. |
4241
- | `username` | `String` | Node API user or access key. |
4473
+ | `url` | `String` | URL of the Node API.<br/>Required. |
4474
+ | `username` | `String` | Node API user or access key.<br/>Required. |
4242
4475
 
4243
4476
  Like any other option, `transfer` can get its value from a pre-configured [Option Preset](#option-preset):
4244
4477
 
4245
4478
  ```shell
4246
- --transfer=@preset:_name_here_ --transfer.agent=node
4479
+ --transfer=@preset:<PRESET_NAME> --transfer.agent=node
4247
4480
  ```
4248
4481
 
4249
4482
  It can also directly use the [Extended Value](#extended-value-syntax) syntax:
4250
4483
 
4251
4484
  ```shell
4252
- --transfer=@json:'{"agent":"node","url":"https://...","username":"_user_here_","password":"<PASSWORD>"}'
4485
+ --transfer=@json:'{"agent":"node","url":"https://...","username":"<USERNAME>","password":"<PASSWORD>"}'
4253
4486
  ```
4254
4487
 
4255
4488
  If `transfer` is not specified and a default node has been configured (name in `node` for section `default`) then this node is used by default.
@@ -4270,7 +4503,7 @@ Parameters provided in option `transfer` are:
4270
4503
  | `api_version` | `String` | Force use of a specific API version.<br/>Allowed values: `v1`, `v2`.<br/>Default: `v2`. |
4271
4504
  | `synchronous` | `Bool` | Wait for acknowledgment after each message.<br/>Default: `false`. |
4272
4505
  | `upload_chunk_size` | `Integer` | Size in bytes of each upload chunk.<br/>Default: `64000`. |
4273
- | `url` | `String` | URL of the HTTP Gateway. |
4506
+ | `url` | `String` | URL of the HTTP Gateway.<br/>Required. |
4274
4507
 
4275
4508
  Example:
4276
4509
 
@@ -4396,7 +4629,14 @@ Parameters can be displayed with commands:
4396
4629
 
4397
4630
  ```shell
4398
4631
  ascli config ascp spec
4399
- ascli config ascp spec --select=@json:'{"d":"Y"}' --fields=-d,n,c
4632
+ ```
4633
+
4634
+ An optional parameter can be specified to display only the parameters supported by a specific transfer agent, or `overview` for one column per agent indicating which agents support each parameter:
4635
+
4636
+ ```shell
4637
+ ascli config ascp spec direct
4638
+ ascli config ascp spec overview
4639
+ ascli config ascp spec overview --fields=name,a,c,d,h,n,t
4400
4640
  ```
4401
4641
 
4402
4642
  A JSON Schema can be generated with command:
@@ -4411,7 +4651,7 @@ An optional parameter can be specified to display the schema for a specific tran
4411
4651
  ascli config ascp schema transferd --format=jsonpp
4412
4652
  ```
4413
4653
 
4414
- The description gives the corresponding `ascp` argument or environment variable.
4654
+ The description gives the supported agents, if not all, and the corresponding `ascp` argument or environment variable.
4415
4655
 
4416
4656
  #### Transfer Specification Reference
4417
4657
 
@@ -4428,7 +4668,7 @@ The description gives the corresponding `ascp` argument or environment variable.
4428
4668
  |--------------------------------|-----------------|----------------------------------------------------------------------------------|
4429
4669
  | `apply_local_docroot` | `Bool` | Apply local docroot to source paths.<br/>(A, T)<br/>(`--apply-local-docroot`) |
4430
4670
  | `authentication` | `String` | Set to `token` for SSH bypass keys, else password asked if not provided.<br/>(C) |
4431
- | `cipher_allowed` | `String` | Returned by node API. Valid literals include `aes-128` and `none`.<br/>(C)<br/>Allowed values: `none`, `aes-128`, `aes-192`, `aes-256`, `aes-128-cfb`, `aes-192-cfb`, `aes-256-cfb`, `aes-128-gcm`, `aes-192-gcm`, `aes-256-gcm`. |
4671
+ | `cipher_allowed` | `String` | Returned by node API. Valid literals include `aes-128` and `none`.<br/>Allowed values: `none`, `aes-128`, `aes-192`, `aes-256`, `aes-128-cfb`, `aes-192-cfb`, `aes-256-cfb`, `aes-128-gcm`, `aes-192-gcm`, `aes-256-gcm`.<br/>(C) |
4432
4672
  | `cipher` | `String` | In transit encryption algorithms.<br/>Allowed values: `none`, `aes-128`, `aes-192`, `aes-256`, `aes-128-cfb`, `aes-192-cfb`, `aes-256-cfb`, `aes-128-gcm`, `aes-192-gcm`, `aes-256-gcm`.<br/>Default: `none`.<br/>(`-c (conversion){enum}`) |
4433
4673
  | `content_protection_password` | `String` | Password for encryption/decryption of transferred assets.<br/>(env:`ASPERA_SCP_FILEPASS`) |
4434
4674
  | `content_protection` | `String` | Enable client-side content protection (CSEAR, encryption-at-rest).<br/>For uploads, set to `encrypt` to transfer encrypted files and store them on the server with the extension `.aspera-env`. (`aspera.conf` parameter `transfer_encryption_content_protection_extension`). To download and decrypt encrypted files, set to `decrypt`<br/>`content_protection_password` must be specified if this option is set.<br/>Allowed values: `encrypt`, `decrypt`.<br/>(`--file-crypt={enum}`) |
@@ -4437,15 +4677,15 @@ The description gives the corresponding `ascp` argument or environment variable.
4437
4677
  | `delete_before_transfer` | `Bool` | 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 on the source are not deleted.<br/>(`--delete-before-transfer`) |
4438
4678
  | `delete_source` | `Bool` | Remove transferred source files after transfer success. Equivalent to `remove_after_transfer` + `remove_empty_directories` + `remove_empty_source_directory`. Take precedence over those.<br/>(A, N, T) |
4439
4679
  | `destination_root_id` | `String` | The file ID of the destination root directory.<br/>Required when using Bearer token auth for the destination node.<br/>(T) |
4440
- | `destination_root` | `String` | Destination root directory. |
4680
+ | `destination_root` | `String` | Destination root directory.<br/>Required. |
4441
4681
  | `dgram_size` | `Integer` | UDP datagram size in bytes.<br/>(`-Z {integer}`) |
4442
- | `direction` | `String` | Direction of transfer (on client side).<br/>Allowed values: `send`, `receive`.<br/>(`--mode=(conversion){enum}`) |
4682
+ | `direction` | `String` | Direction of transfer (on client side).<br/>Required.<br/>Allowed values: `send`, `receive`.<br/>(`--mode=(conversion){enum}`) |
4443
4683
  | `exclude_newer_than` | `String` | Exclude files, but not directories, from the transfer if they are newer than the specified number of seconds added to the source computer's epoch.<br/>e.g. `-86400` for newer than a day back.<br/>(`--exclude-newer-than={string}`) |
4444
4684
  | `exclude_older_than` | `String` | Exclude files, but not directories, from the transfer if they are older than the specified number of seconds added to the source computer's epoch.<br/>e.g. `-86400` for older than a day back.<br/>(`--exclude-older-than={string}`) |
4445
4685
  | `fail_bad_filepass` | `Bool` | Fail on bad file decryption passphrase.<br/>(A, T)<br/>(`--fail-bad-filepass`) |
4446
4686
  | `fasp_port` | `Integer` | Specifies fasp (UDP) port.<br/>Default: `33001`.<br/>(`-O {integer}`) |
4447
4687
  | `fasp_proxy` | `Hash` | Proxy for communications between the remote server and the (local) client.<br/>(T) |
4448
- | `file_checksum` | `String` | Enable checksum reporting for transferred files by specifying the hash to use.<br/>(A, N)<br/>Allowed values: `sha-512`, `sha-384`, `sha-256`, `sha1`, `md5`, `none`.<br/>Default: `none`.<br/>(`--file-checksum={enum}`) |
4688
+ | `file_checksum` | `String` | Enable checksum reporting for transferred files by specifying the hash to use.<br/>Allowed values: `sha-512`, `sha-384`, `sha-256`, `sha1`, `md5`, `none`.<br/>Default: `none`.<br/>(A, N)<br/>(`--file-checksum={enum}`) |
4449
4689
  | `http_fallback_port` | `Integer` | Specifies HTTP port when no cipher is used.<br/>(`-t {integer}`) |
4450
4690
  | `http_fallback` | `Bool, String` | When true(1), attempts to perform an HTTP transfer if a FASP transfer cannot be performed.<br/>(`-y (conversion){boolean\|string}`) |
4451
4691
  | `https_fallback_port` | `Integer` | Specifies HTTPS port when cipher is used.<br/>(`-t {integer}`) |
@@ -4464,26 +4704,26 @@ The description gives the corresponding `ascp` argument or environment variable.
4464
4704
  | `obfuscate_file_names` | `Bool` | HTTP Gateway obfuscates file names when set to `true`.<br/>(H) |
4465
4705
  | `overwrite` | `String` | Overwrite files at the destination with source files of the same name based on the policy:<br/>- `always` : Always overwrite the file.<br/>- `never` : Never overwrite the file. If the destination contains partial files that are older or the same as the source files and resume is enabled, the partial files resume transfer. Partial files with checksums or sizes that differ from the source files are not overwritten.<br/>- `diff` : (default) Overwrite the file if it is different from the source, depending on the compare method (default is size). If the destination is object storage, `diff` has the same effect as always. If resume is not enabled, partial files are overwritten if they are different from the source, otherwise they are skipped. If resume is enabled, only partial files with different sizes or checksums from the source are overwritten; otherwise, files resume.<br/>- `diff+older` : Overwrite the file if it is older and different from the source, depending on the compare method (default is size). If resume is not enabled, partial files are overwritten if they are older and different from the source, otherwise they are skipped. If resume is enabled, only partial files that are different and older than the source are overwritten, otherwise they are resumed.<br/>- `older` : Overwrite the file if its timestamp is older than the source timestamp.<br/>If you set an overwrite policy of `diff` or `diff+older`, difference is determined by the value set for `resume_policy`:<br/>`none` : The source and destination files are always considered different and the destination file is always overwritten<br/>`attributes` : The source and destination files are compared based on file attributes <br/>`sparse_checksum` : The source and destination files are compared based on sparse checksums, (currently file size)<br/>`full_checksum` : The source and destination files are compared based on full checksums<br/>Allowed values: `never`, `always`, `diff`, `older`, `diff+older`.<br/>Default: `diff`.<br/>(`--overwrite={enum}`) |
4466
4706
  | `password` | `String` | 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.<br/>(N) |
4467
- | `paths` | `Array` | Array of path to the source (required) and a path to the destination (optional). |
4707
+ | `paths` | `Array` | Array of path to the source (required) and a path to the destination (optional).<br/>Required. |
4468
4708
  | `precalculate_job_size` | `Bool` | Specifies whether to precalculate the job size.<br/>(`--precalculate-job-size / --precalculate-disable`) |
4469
4709
  | `preserve_access_time` | `Bool` | Preserve the source-file access timestamps at the destination.<br/>Because source access times are updated by the transfer operation, the timestamp that is preserved is the one just before to the transfer.<br/>(`--preserve-access-time`) |
4470
- | `preserve_acls` | `String` | Preserve access control lists.<br/>(A, T)<br/>Allowed values: `none`, `native`, `metafile`.<br/>Default: `none`.<br/>(`--preserve-acls={enum}`) |
4710
+ | `preserve_acls` | `String` | Preserve access control lists.<br/>Allowed values: `none`, `native`, `metafile`.<br/>Default: `none`.<br/>(A, T)<br/>(`--preserve-acls={enum}`) |
4471
4711
  | `preserve_creation_time` | `Bool` | Preserve source-file creation timestamps at the destination.<br/>Only Windows systems retain information about creation time. If the destination is not a Windows computer, this option is ignored.<br/>(`--preserve-creation-time`) |
4472
- | `preserve_extended_attrs` | `String` | Preserve the extended attributes.<br/>(A, T)<br/>Allowed values: `none`, `native`, `metafile`.<br/>Default: `none`.<br/>(`--preserve-xattrs={enum}`) |
4712
+ | `preserve_extended_attrs` | `String` | Preserve the extended attributes.<br/>Allowed values: `none`, `native`, `metafile`.<br/>Default: `none`.<br/>(A, T)<br/>(`--preserve-xattrs={enum}`) |
4473
4713
  | `preserve_file_owner_gid` | `Bool` | Preserve the group ID for a file owner.<br/>(A, T)<br/>(`--preserve-file-owner-gid`) |
4474
4714
  | `preserve_file_owner_uid` | `Bool` | Preserve the user ID for a file owner.<br/>(A, T)<br/>(`--preserve-file-owner-uid`) |
4475
4715
  | `preserve_modification_time` | `Bool` | Set the modification time, the last time a file or directory was modified (written), of a transferred file to the modification of the source file or directory.<br/>Preserve source-file modification timestamps at the destination.<br/>(`--preserve-modification-time`) |
4476
- | `preserve_remote_acls` | `String` | Preserve remote access control lists.<br/>(A, T)<br/>Allowed values: `none`, `native`, `metafile`.<br/>Default: `none`.<br/>(`--remote-preserve-acls={enum}`) |
4477
- | `preserve_remote_extended_attrs` | `String` | Preserve remote extended attributes.<br/>(A, T)<br/>Allowed values: `none`, `native`, `metafile`.<br/>Default: `none`.<br/>(`--remote-preserve-xattrs={enum}`) |
4716
+ | `preserve_remote_acls` | `String` | Preserve remote access control lists.<br/>Allowed values: `none`, `native`, `metafile`.<br/>Default: `none`.<br/>(A, T)<br/>(`--remote-preserve-acls={enum}`) |
4717
+ | `preserve_remote_extended_attrs` | `String` | Preserve remote extended attributes.<br/>Allowed values: `none`, `native`, `metafile`.<br/>Default: `none`.<br/>(A, T)<br/>(`--remote-preserve-xattrs={enum}`) |
4478
4718
  | `preserve_source_access_time` | `Bool` | Preserve the time logged for when the source file was accessed.<br/>(A, T)<br/>(`--preserve-source-access-time`) |
4479
4719
  | `preserve_times` | `Bool` | Preserve file timestamps.<br/>(A, N, T)<br/>(`-p`) |
4480
4720
  | `proxy` | `String` | 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/>(A)<br/>(`--proxy={string}`) |
4481
- | `rate_policy_allowed` | `String` | Specifies most aggressive rate policy that is allowed. Returned by node API.<br/>(C)<br/>Allowed values: `low`, `fair`, `high`, `fixed`. |
4721
+ | `rate_policy_allowed` | `String` | Specifies most aggressive rate policy that is allowed. Returned by node API.<br/>Allowed values: `low`, `fair`, `high`, `fixed`.<br/>(C) |
4482
4722
  | `rate_policy` | `String` | The transfer rate policy to use when sharing bandwidth. Allowable values:<br/>- `high` : When sharing bandwidth, transfer at twice the rate of a transfer using a fair policy.<br/>- `fair` : (Default) Share bandwidth equally with other traffic.<br/>- `low` : Use only unused bandwidth.<br/>- `fixed` : Transfer at the target rate, regardless of the actual network capacity. Do not share bandwidth. Aspera recommends that you do not use this setting except under special circumstances, otherwise the destination storage can be damaged.<br/>Allowed values: `low`, `fair`, `high`, `fixed`.<br/>(`--policy={enum}`) |
4483
4723
  | `remote_access_key` | `String` | The access key ID of the access key that was used to construct the bearer token that is used to authenticate to the remote node.<br/>(T) |
4484
- | `remote_host` | `String` | IP or fully qualified domain name (FQDN) of the remote server.<br/>(`--host={string}`) |
4724
+ | `remote_host` | `String` | IP or fully qualified domain name (FQDN) of the remote server.<br/>Required.<br/>(`--host={string}`) |
4485
4725
  | `remote_password` | `String` | SSH session password.<br/>(env:`ASPERA_SCP_PASS`) |
4486
- | `remote_user` | `String` | Remote user. Default value is `xfer` on node or connect.<br/>(`--user={string}`) |
4726
+ | `remote_user` | `String` | Remote user. Default value is `xfer` on node or connect.<br/>Required.<br/>(`--user={string}`) |
4487
4727
  | `remove_after_transfer` | `Bool` | Remove SRC files after transfer success.<br/>(A, N, T)<br/>(`--remove-after-transfer`) |
4488
4728
  | `remove_empty_directories` | `Bool` | Specifies whether to remove empty directories.<br/>(A, N, T)<br/>(`--remove-empty-directories`) |
4489
4729
  | `remove_empty_source_dir` | `Bool` | Remove empty source subdirectories and remove the source directory itself, if empty.<br/>(T) |
@@ -4509,10 +4749,10 @@ The description gives the corresponding `ascp` argument or environment variable.
4509
4749
  | `tags` | `Hash` | Metadata for transfer as JSON. Key `aspera` is reserved. Key `aspera.xfer_retry` specifies a "retry timeout" but is not actually used for node API initiated transfers.<br/>(`--tags64=(conversion){object}`) |
4510
4750
  | `target_rate_cap_kbps` | `Integer` | Maximum target rate for incoming transfers, in kilobits per second. Returned by upload/download_setup node API.<br/>(C, T) |
4511
4751
  | `target_rate_kbps` | `Integer` | Specifies desired speed for the transfer.<br/>(`-l {integer}`) |
4512
- | `target_rate` | `String` | Pseudo-parameter: desired transfer rate as a human-readable string with an optional unit suffix. Converted to `target_rate_kbps` before the transfer is started, overriding it if both are present. Accepted formats: plain integer (kbps), or integer followed by `k`/`K` (kbps), `m`/`M` (x1000 kbps), `g`/`G` (x1000000 kbps). Examples: `100000`, `100000k`, `100m`, `1g`. |
4752
+ | `target_rate` | `String, Integer` | Pseudo-parameter: desired transfer rate in bps, with an optional unit suffix. Converted to `target_rate_kbps` (rounded down) before the transfer is started, overriding it if both are present. Also applies to `async` (sync). Accepted formats: integer (bps), or integer followed by `k`/`K` (x1000), `m`/`M` (x1000000), `g`/`G` (x1000000000). Examples: `100000000`, `100000k`, `100m`, `1g`. |
4513
4753
  | `title` | `String` | Title of the transfer.<br/>(C, N, T) |
4514
4754
  | `token` | `String` | Authorization token. Type is Bearer, Basic or ATM.<br/>(env:`ASPERA_SCP_TOKEN`) |
4515
- | `use_ascp4` | `Bool` | Specify version of protocol. `ascp4` will be deprecated.<br/>(A, N, T)<br/>Default: `false`. |
4755
+ | `use_ascp4` | `Bool` | Specify version of protocol. `ascp4` will be deprecated.<br/>Default: `false`.<br/>(A, N, T) |
4516
4756
  | `use_system_ssh` | `Bool` | Use an external `ssh` program instead of the built-in `libssh2` implementation to establish the connection to the remote host. The desired `ssh` program must be in the environment's `PATH`.<br/>To enable debugging of the `ssh` process, supply `-DD` and `--ssh-arg=-vv` arguments to `ascp`.<br/>(A, T)<br/>(`-SSH`) |
4517
4757
  | `wss_enabled` | `Bool` | Server has Web Socket service enabled.<br/>(special:`--ws-connect`) |
4518
4758
  | `wss_port` | `Integer` | TCP port used for Web Socket service feed. |
@@ -5166,54 +5406,164 @@ ascli server upload "faux:///mydir?file=testfile&count=1000&size=1" --to-folder=
5166
5406
 
5167
5407
  ### `file:` for growing files
5168
5408
 
5169
- The built-in `file` PVCL adapter allows referencing a local file using a URI-style path with optional query parameters.
5170
- This is particularly useful for transferring **growing files** - files that are still being written at the time of transfer (for example, live recordings, log files, streaming output).
5409
+ A growing file is a file that another program is still writing during the transfer, for example a live recording, a log file, or a stream capture.
5410
+ The built-in `file` PVCL adapter of `ascp` transfers such a file: `ascp` sends the data as the file grows, and completes the transfer when the file stops changing.
5411
+ This is a feature of `ascp`, not `ascli`.
5412
+
5413
+ For more information, see the [HSTS `ascp` command reference](https://www.ibm.com/docs/en/ahts/4.4.x?topic=line-ascp-command-reference).
5171
5414
 
5172
- The source parameter syntax is:
5415
+ #### Syntax of the `file:` URI
5416
+
5417
+ To transfer a growing file, specify the source file as a `file:` URI that contains the `grow` parameter:
5173
5418
 
5174
5419
  ```shell
5175
- file:///<PATH>?grow=<WAIT_TIME>[&wait_start=[mtime|null_read]][&confirm_stop=[true|false]]
5420
+ file:///<PATH>?grow=<WAIT_TIME>[&<PARAMETER>=<VALUE>...]
5176
5421
  ```
5177
5422
 
5178
- A transfer is considered complete when the source file has not changed for `wait_time` seconds.
5179
- See [HSTS `ascp` command reference](https://www.ibm.com/docs/en/ahts/4.4.x?topic=line-ascp-command-reference) for full details.
5423
+ The path of the file follows the prefix `file:///`:
5180
5424
 
5181
- > [!NOTE]
5182
- > The source file must reside on a **native file system**.
5425
+ | Path | Example URI | File |
5426
+ |----------|------------------------------------|----------------------------------|
5427
+ | Relative | `file:///live.log?grow=60` | `live.log` in the current folder |
5428
+ | Absolute | `file:////var/log/app.log?grow=60` | `/var/log/app.log` |
5183
5429
 
5184
- Key query parameters:
5430
+ An absolute path starts with `/`, so the URI of an absolute path contains four slashes.
5185
5431
 
5186
- | Parameter | Description |
5187
- |----------------|----------------------------------------------------------------------|
5188
- | `grow` | **(Required)** Wait time in seconds after last file change before the transfer is declared complete.<br/>Default wait time is 10 s if set to a non-numeric string. |
5189
- | `wait_start` | How the wait time is measured:<br/>- `mtime` (default) file modification time<br/>- `null_read` first zero-byte read. |
5190
- | `confirm_stop` | Set to `true` to let an external program signal completion by setting:<br/>`mtime < current_time - wait_time`.<br/>Ignored when `wait_start=null_read`. |
5432
+ The URI supports the following parameters:
5191
5433
 
5192
- > [!NOTE]
5193
- > `ascp` requires that all sources in a single transfer session share the same PVCL URI scheme.
5194
- > This means the `file:` URI (with its query parameters) must be specified either directly on the command line, or uniformly as a source prefix - it cannot be mixed with plain paths in a file list.
5195
- > So, use one of the following methods:
5434
+ | Parameter | Description |
5435
+ |-----------------|----------------------------------------------------------------|
5436
+ | `grow` | Wait time, in seconds: the transfer completes when the file does not change during this time.<br/>Required.<br/>If the value is not a number, for example `grow=default`, the wait time is 10 seconds. |
5437
+ | `wait_start` | Start of the wait time:<br/>- `mtime`: the last modification time of the file.<br/>- `null_read`: the time when `ascp` reaches the end of the file, that is, when a read of the file returns no data.<br/>Default: `mtime` |
5438
+ | `confirm_stop` | If `true`, the program that writes the file confirms the end of the file. See [Confirming the end of a growing file](#confirming-the-end-of-a-growing-file).<br/>Ignored if `wait_start` is `null_read`.<br/>Default: `false` |
5439
+ | `max_grow_size` | Maximum size of the file, in bytes.<br/>Accepts the suffixes `k`, `m`, `g`, `t`, `p`, and `e` (powers of 1024).<br/>Default: 2<sup>63</sup> - 1 bytes, or the maximum file size of the file system if lower. |
5440
+
5441
+ > [!IMPORTANT]
5442
+ > The growing file must be on a native file system, that is, a file system that the operating system accesses directly.
5443
+
5444
+ > [!TIP]
5445
+ > On the command line, enclose the URI in single quotes: the characters `?` and `&` have a special meaning for the shell.
5446
+
5447
+ #### Completion of the transfer
5448
+
5449
+ `ascp` sends the data as the program writes it.
5450
+ When `ascp` has sent all the data that the file contains, it starts to count the wait time.
5451
+ If the file grows during the wait time, `ascp` sends the new data and starts to count the wait time again.
5452
+ When the wait time ends without a change to the file, the transfer completes.
5453
+
5454
+ As a result:
5455
+
5456
+ - The command completes after the wait time that follows the last write.
5457
+ For example, with `grow=120`, the command completes about 2 minutes after the program stops writing.
5458
+ - If the program pauses for longer than the wait time, the transfer completes before the end of the file, and the destination file is incomplete.
5459
+ Set a wait time that is longer than the longest pause of the program.
5460
+
5461
+ To complete the transfer without waiting, use `confirm_stop`.
5462
+
5463
+ #### Confirming the end of a growing file
5464
+
5465
+ With `confirm_stop=true`, the program that writes the file signals the end of the file, so the transfer does not wait.
5466
+
5467
+ 1. Start the transfer with `confirm_stop=true` and a wait time that is longer than the longest pause of the program:
5468
+
5469
+ ```shell
5470
+ ascli server upload live.log --ts.source_root='file:///?grow=600&confirm_stop=true' --to-folder=/Upload
5471
+ ```
5472
+
5473
+ 2. When the program finishes writing the file, set the modification time of the file to a time earlier than the wait time.
5474
+ For example:
5475
+
5476
+ ```shell
5477
+ touch -t 200001010000 live.log
5478
+ ```
5479
+
5480
+ The transfer completes immediately.
5481
+
5482
+ > [!IMPORTANT]
5483
+ > With `confirm_stop=true`, if the wait time ends before the program sets the modification time, `ascp` considers the file invalid and the transfer fails.
5196
5484
 
5197
- - **File list with `source_root` transfer spec** (preferred)
5485
+ To report an error in the file, with or without `confirm_stop`, the program sets the modification time of the file to 0, that is, `1970-01-01 00:00:00 UTC`.
5486
+ `ascp` then fails the transfer of the file.
5487
+ For example:
5488
+
5489
+ ```shell
5490
+ TZ=UTC touch -t 197001010000 live.log
5491
+ ```
5492
+
5493
+ #### Uploading a growing file
5494
+
5495
+ `ascp` activates the growing file mode only if it finds the `grow` parameter in one of the following locations:
5496
+
5497
+ - The first source on its command line.
5498
+ - The source prefix: `ascp` option `--source-prefix`, set by transfer spec parameter `source_root`.
5499
+ - The docroot of the transfer user, on the server.
5500
+
5501
+ `ascp` does not look for the `grow` parameter in a file list.
5502
+ By default, the [`direct`](#agent-direct) agent provides the sources to `ascp` in a file list.
5503
+ As a result, if you specify a `file:` URI as a source with the default options, the transfer fails with the error `Session initiation failed, fail to set pvcl`.
5504
+
5505
+ Use one of the following methods.
5506
+ The examples use the [`direct`](#agent-direct) agent.
5507
+
5508
+ - **Set the URI as source prefix** (recommended)
5198
5509
 
5199
- Place only the bare filename(s) in the file list, and pass the `file:` URI as the source prefix so that the query parameters apply uniformly to every entry:
5510
+ Set transfer spec parameter `source_root` to a `file:` URI that contains the folder of the files and the parameters.
5511
+ Specify the sources as paths relative to this folder.
5512
+ `ascp` inserts each source path before the parameters: for example, `file:////var/log?grow=120` and `app.log` give `file:////var/log/app.log?grow=120`.
5513
+ All the files of the transfer use the same parameters.
5514
+
5515
+ To upload `live.log` from the current folder:
5516
+
5517
+ ```shell
5518
+ ascli server upload live.log --ts.source_root='file:///?grow=120' --to-folder=/Upload
5519
+ ```
5520
+
5521
+ To upload `/var/log/app.log`:
5200
5522
 
5201
5523
  ```shell
5202
- ascli server upload growing --to-folder=/Upload --ts.source_root='file:///?grow=120' --transfer.quiet=false
5524
+ ascli server upload app.log --ts.source_root='file:////var/log?grow=120' --to-folder=/Upload
5203
5525
  ```
5204
5526
 
5205
- - **URI directly on the command line with `file_list=false`**
5527
+ - **Set the URI as source on the command line**
5528
+
5529
+ Set transfer parameter `file_list` to `false`, so that `ascli` places the source on the `ascp` command line instead of in a file list.
5530
+ Use this method for a single file.
5206
5531
 
5207
5532
  ```shell
5208
- ascli server upload 'file:///./growing?grow=120' --to-folder=/Upload --transfer.file_list=false --transfer.quiet=false
5533
+ ascli server upload 'file:///live.log?grow=120' --to-folder=/Upload --transfer.file_list=false
5209
5534
  ```
5210
5535
 
5536
+ > [!TIP]
5537
+ > To display the native progress bar of `ascp` instead of the progress bar of `ascli`, add `--transfer.quiet=false`.
5538
+
5539
+ #### Downloading a growing file
5540
+
5541
+ For a download, the growing file is on the server.
5542
+ The transfer user on the server usually has a docroot, and the server does not resolve a `file:` URI from the client in this docroot: the transfer fails with the error `No such file or directory`.
5543
+ Instead, the server administrator sets the parameters in the docroot of the transfer user.
5544
+ For example, on the server:
5545
+
5546
+ ```shell
5547
+ asconfigurator -x 'set_user_data;user_name,xfer_live;absolute,file:////data/live?grow=120'
5548
+ ```
5549
+
5550
+ Then, the client downloads the file with a path relative to the docroot, as for any other file:
5551
+
5552
+ ```shell
5553
+ ascli server download live.log --to-folder=.
5554
+ ```
5555
+
5556
+ All the transfers of this user are then growing file transfers, so use a dedicated transfer user.
5557
+ This method also applies to transfers that use a token, for example with the Node API or Aspera on Cloud: for a download with a token, `ascp` does not accept a `file:` URI as source prefix.
5558
+
5559
+ If the transfer user has no docroot and the transfer does not use a token, you can also use the upload methods, with absolute paths on the server.
5560
+
5211
5561
  ### Usage
5212
5562
 
5213
5563
  ```text
5214
5564
  ascli -h
5215
5565
  NAME
5216
- ascli -- a command line tool for Aspera Applications (v4.27.5)
5566
+ ascli -- a command line tool for Aspera Applications (v4.28.0)
5217
5567
 
5218
5568
  SYNOPSIS
5219
5569
  ascli [GLOBAL_OPTIONS] <command> [OPTIONS] [ARGS]
@@ -5241,10 +5591,21 @@ OPTIONS
5241
5591
  ARGS
5242
5592
  Some commands require mandatory arguments, e.g. a path.
5243
5593
 
5594
+ EXIT STATUS
5595
+ 0 Success
5596
+ 1 Other error
5597
+ 2 Command line error: unknown command or option, invalid or missing argument
5598
+ 3 Authentication or authorization failure: SSH, HTTP 401 or 403, OAuth grant
5599
+ 4 Resource not found, or several resources match the identifier, HTTP 404
5600
+ 5 Transfer failure
5601
+ 6 Network or TLS failure: name resolution, connection, timeout, certificate
5602
+ 7 Other error returned by a remote API
5603
+ 130 Interrupted by user (Ctrl-C)
5604
+
5244
5605
  OPTIONS: global
5245
5606
  --interactive=yes|no Use interactive input of missing params
5246
5607
  --ask-options=yes|no Ask even optional options
5247
- --out=HASH Output rendering options (dot-notation: format, level, file, fields, select, table[.pivot], flat, secrets, colors, utf8, img)
5608
+ --out=HASH Output rendering options (dot-notation: format, level, file, fields, select, query, table[.pivot], flat, secrets, colors, utf8, img)
5248
5609
  --display=info|data|error Output only some information (deprecated after 4.27.0: use --out.level)
5249
5610
  --format=ENUM Output format (also: --out.format)
5250
5611
  --output=VALUE Destination for results (deprecated after 4.27.0: use --out.file)
@@ -5258,17 +5619,19 @@ OPTIONS: global
5258
5619
  -h, --help Show this message
5259
5620
  --show-config Display parameters used for the provided action
5260
5621
  -v, --version Display version
5261
- --ui=text|graphical Method to start browser
5622
+ --ui=HASH User interface (dot-notation: mode, command)
5262
5623
  --invalid-characters=VALUE Replacement character and invalid filename characters
5263
5624
  --log-level=ENUM Log level
5264
5625
  --log-format=VALUE Log formatter
5265
5626
  --logger=stderr|stdout|syslog Logging method
5266
5627
  --log=HASH Logging options (dot-notation: level, type, format, secrets)
5628
+ --security=HASH Security restrictions (dot-notation: level, allowed_paths)
5267
5629
  --lock-port=INT Prevent dual execution of a command, e.g. in cron
5268
5630
  --once-only=yes|no Process only new items (some commands)
5269
5631
  --log-secrets=yes|no Show passwords in logs
5270
- --clean-temp=yes|no Cleanup temporary files on exit
5271
- --temp-folder=VALUE Temporary folder
5632
+ --temp=HASH Temporary files (dot-notation: folder, clean, expiry)
5633
+ --clean-temp=yes|no Cleanup temporary files on exit (deprecated after 4.27.5: use --temp.clean)
5634
+ --temp-folder=VALUE Temporary folder (deprecated after 4.27.5: use --temp.folder)
5272
5635
  --pid-file=VALUE Write process identifier to file, delete on exit
5273
5636
  --parser=none|json|ruby|yaml Default parser for structured parameters and options
5274
5637
  --home=VALUE Home folder for tool
@@ -5284,7 +5647,7 @@ OPTIONS: global
5284
5647
  --version-check-days=INT Period in days to check new version (zero to disable)
5285
5648
  --plugin-folder=VALUE Folder where to find additional plugins
5286
5649
  --sdk-url=VALUE Ascp: URL to get Aspera Transfer Executables
5287
- --locations-url=VALUE Ascp: URL to get download locations of Aspera Transfer Daemon
5650
+ --locations-url=LIST Ascp: URLs to get download locations of Aspera Transfer Daemon
5288
5651
  --sdk-folder=VALUE Ascp: Path to folder with ascp (or product with "product:")
5289
5652
  --smtp=HASH SMTP email server configuration
5290
5653
  --notify-to=VALUE Email: Recipient for notification of transfers
@@ -5900,6 +6263,7 @@ To register with web-based authentication (auth=web):
5900
6263
  > [!NOTE]
5901
6264
  > For web based authentication, `ascli` listens on a local port (for example, specified by the `redirect_uri` parameter, in this example: `12345`), and the browser will provide the OAuth code there.
5902
6265
  > For `ascli`, HTTP is required, and `12345` is the default port.
6266
+ > The host of `redirect_uri` shall be loopback: `localhost`, an address of `127.0.0.0/8`, or `[::1]`.
5903
6267
 
5904
6268
  Once the client is registered, a **Client ID** and **Secret** are created; these values are used in the next step.
5905
6269
 
@@ -6106,11 +6470,12 @@ empty
6106
6470
 
6107
6471
  The command `ascli aoc bearer_token` can be used to generate an OAuth token suitable to call any AoC API.
6108
6472
  This can be useful when a command is not yet available.
6473
+ The token is a secret: it is hidden in the output, unless option `--out.secrets=yes` is used.
6109
6474
 
6110
6475
  Example:
6111
6476
 
6112
6477
  ```shell
6113
- curl -s -H "Authorization: $(ascli aoc bearer_token)" 'https://api.ibmaspera.com/api/v1/group_memberships?embed[]=dropbox&embed[]=workspace'|jq -r '.[]|(.workspace.name + " -> " + .dropbox.name)'
6478
+ curl -s -H "Authorization: $(ascli aoc bearer_token --out.secrets=yes)" 'https://api.ibmaspera.com/api/v1/group_memberships?embed[]=dropbox&embed[]=workspace'|jq -r '.[]|(.workspace.name + " -> " + .dropbox.name)'
6114
6479
  ```
6115
6480
 
6116
6481
  It is also possible to get the bearer token for node, as user or as admin using:
@@ -6714,7 +7079,7 @@ So, for example, the creation of a node using ATS in IBM Cloud looks like (see o
6714
7079
  The creation options are the ones of ATS API, refer to the [section on ATS](#ats-access-key-creation-parameters) for more details and examples.
6715
7080
 
6716
7081
  ```shell
6717
- ascli aoc admin ats access_key create @json:'{"storage":{"type":"ibm-s3","bucket":"mybucket","credentials":{"access_key_id":"mykey","secret_access_key":"mysecret"},"path":"/"}}' --cloud=softlayer --region=eu-de
7082
+ ascli aoc admin ats access_key create @json:'{"storage":{"type":"ibm-s3","bucket":"mybucket","credentials":{"access_key_id":"<ACCESS_KEY_ID>","secret_access_key":"<SECRET>"},"path":"/"}}' --cloud=softlayer --region=eu-de
6718
7083
  ```
6719
7084
 
6720
7085
  Once executed, the access key `id` and `secret`, randomly generated by the Node API, are displayed.
@@ -6734,7 +7099,7 @@ ascli aoc admin ats cluster show --cloud=softlayer --region=eu-de --fields=trans
6734
7099
  Then use the returned address for the `url` key to create the AoC Node resource:
6735
7100
 
6736
7101
  ```shell
6737
- ascli aoc admin node create @json:'{"name":"myname","access_key":"myaccesskeyid","ats_access_key":true,"ats_storage_type":"ibm-s3","url":"https://ats-sl-fra-all.aspera.io"}'
7102
+ ascli aoc admin node create @json:'{"name":"myname","access_key":"<ACCESS_KEY>","ats_access_key":true,"ats_storage_type":"ibm-s3","url":"https://ats-sl-fra-all.aspera.io"}'
6738
7103
  ```
6739
7104
 
6740
7105
  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_keys create` on the private node itself.
@@ -6849,7 +7214,7 @@ ascli aoc files browse /src_folder
6849
7214
  To send a package with the file `10M.dat` from subfolder /src_folder:
6850
7215
 
6851
7216
  ```shell
6852
- ascli aoc files node_info /src_folder --format=json --out.level=data | ascli aoc packages send @json:'{"name":"test","recipients":["someuser@example.com"]}' 10M.dat --transfer=@json:@stdin: --transfer.agent=node
7217
+ ascli aoc files node_info /src_folder --format=json --out.level=data --out.secrets=yes | ascli aoc packages send @json:'{"name":"test","recipients":["someuser@example.com"]}' 10M.dat --transfer=@json:@stdin: --transfer.agent=node
6853
7218
  ```
6854
7219
 
6855
7220
  #### Receive packages
@@ -7322,7 +7687,7 @@ Procedure to send a file from org1 to org2:
7322
7687
  - Execute the following:
7323
7688
 
7324
7689
  ```shell
7325
- ascli -Porg1 aoc files node_info <SOURCE_FOLDER> --format=json --out.level=data | ascli -Porg2 aoc files upload <SOURCE_FILE> --to-folder=<DEST_FOLDER> --transfer=@json:@stdin: --transfer.agent=node
7690
+ ascli -Porg1 aoc files node_info <SOURCE_FOLDER> --format=json --out.level=data --out.secrets=yes | ascli -Porg2 aoc files upload <SOURCE_FILE> --to-folder=<DEST_FOLDER> --transfer=@json:@stdin: --transfer.agent=node
7326
7691
  ```
7327
7692
 
7328
7693
  Explanation:
@@ -7367,16 +7732,16 @@ admin application instance list --query.organization_apps=true
7367
7732
  admin application membership list
7368
7733
  admin application types
7369
7734
  admin ats access_key create --cloud=aws --region=my_region @json:'{"id":"ak_aws_aoc","name":"my test key AWS","storage":{"type":"aws_s3","bucket":"my_bucket","credentials":{"access_key_id":"my_access_key","secret_access_key":"my_secret_key"},"path":"/"}}'
7370
- admin ats access_key create --cloud=softlayer --region=my_region @: id=ak1ibmcloud secret=my_secret_here 'name="my test key"' storage.type=ibm-s3 storage.bucket=my_bucket storage.credentials.access_key_id=my_access_key storage.credentials.secret_access_key=my_secret_key storage.path=/
7735
+ admin ats access_key create --cloud=softlayer --region=my_region @: id=ak1ibmcloud secret=<SECRET> 'name="my test key"' storage.type=ibm-s3 storage.bucket=my_bucket storage.credentials.access_key_id=my_access_key storage.credentials.secret_access_key=my_secret_key storage.path=/
7371
7736
  admin ats access_key delete ak1ibmcloud
7372
7737
  admin ats access_key list --fields=name,id
7373
- admin ats access_key node ak1ibmcloud --secret=my_secret_here browse /
7738
+ admin ats access_key node ak1ibmcloud --secret=<SECRET> browse /
7374
7739
  admin ats cluster clouds
7375
7740
  admin ats cluster list
7376
7741
  admin ats cluster show --cloud=aws --region=eu-west-1
7377
7742
  admin ats cluster show 1f412ae7-869a-445c-9c05-02ad16813be2
7378
7743
  admin auth_providers list
7379
- admin bearer_token --out.level=data
7744
+ admin bearer_token --out.level=data --out.secrets=yes
7380
7745
  admin client list
7381
7746
  admin client_access_key list
7382
7747
  admin client_registration_token create @json:'{"data":{"name":"test_client_reg1","client_subject_scopes":["alee","aejd"],"client_subject_enabled":true}}'
@@ -7393,15 +7758,15 @@ admin kms_profile list
7393
7758
  admin network_policy list
7394
7759
  admin network_policy show <id>
7395
7760
  admin node bearer_token %name:my_node_name user:all
7396
- admin node do %name:my_node_name --secret=my_ak_secret browse /
7397
- admin node do %name:my_node_name --secret=my_ak_secret browse /folder_sub --node-api.cache=false
7398
- admin node do %name:my_node_name --secret=my_ak_secret delete /folder1
7399
- admin node do %name:my_node_name --secret=my_ak_secret delete /folder_sub
7400
- admin node do %name:my_node_name --secret=my_ak_secret mkdir /folder1
7401
- admin node do %name:my_node_name --secret=my_ak_secret mkdir /folder_sub
7402
- admin node do %name:my_node_name --secret=my_ak_secret v3 access_key create @json:'{"id":"testsub1","storage":{"path":"/folder_sub"}}'
7403
- admin node do %name:my_node_name --secret=my_ak_secret v3 access_key delete testsub1
7404
- admin node do %name:my_node_name --secret=my_ak_secret v3 events
7761
+ admin node do %name:my_node_name --secret=<AK_SECRET> browse /
7762
+ admin node do %name:my_node_name --secret=<AK_SECRET> browse /folder_sub --node-api.cache=false
7763
+ admin node do %name:my_node_name --secret=<AK_SECRET> delete /folder1
7764
+ admin node do %name:my_node_name --secret=<AK_SECRET> delete /folder_sub
7765
+ admin node do %name:my_node_name --secret=<AK_SECRET> mkdir /folder1
7766
+ admin node do %name:my_node_name --secret=<AK_SECRET> mkdir /folder_sub
7767
+ admin node do %name:my_node_name --secret=<AK_SECRET> v3 access_key create @json:'{"id":"testsub1","storage":{"path":"/folder_sub"}}'
7768
+ admin node do %name:my_node_name --secret=<AK_SECRET> v3 access_key delete testsub1
7769
+ admin node do %name:my_node_name --secret=<AK_SECRET> v3 events
7405
7770
  admin node do %name:my_node_name delete test_shared_folder
7406
7771
  admin node do %name:my_node_name mkdir test_shared_folder
7407
7772
  admin node do %name:my_node_name perm test_shared_folder create @json:'{"with":"","as":"other_name_shared"}' --workspace=my_workspace_shared_inbox
@@ -7418,6 +7783,7 @@ admin subscription account
7418
7783
  admin subscription usage
7419
7784
  admin subscription usage MONTH
7420
7785
  admin user list
7786
+ admin user list --out.query='[?ats_admin].{name: name, email: email}'
7421
7787
  admin user modify %name:my_user_email @: deactivated=false
7422
7788
  admin user notifications %name:my_user_email show
7423
7789
  admin user preferences %name:my_user_email show
@@ -7433,13 +7799,13 @@ automation workflow delete <id>
7433
7799
  automation workflow list
7434
7800
  automation workflow list --query.show_org_workflows=@val:true
7435
7801
  automation workflow list --select.name=test_workflow --fields=id
7436
- bearer_token --out.level=data
7802
+ bearer_token --out.level=data --out.secrets=yes
7437
7803
  files bearer /
7438
7804
  files bearer_token_node / --cache-tokens=no
7439
7805
  files browse /
7440
7806
  files browse / --url=my_private_link_shared_folder
7441
7807
  files browse / --url=my_public_link_folder_no_pass
7442
- files browse / --url=my_public_link_folder_with_pass --password=my_public_link_folder_password
7808
+ files browse / --url=my_public_link_folder_with_pass --password=<PUBLIC_LINK_FOLDER_PASSWORD>
7443
7809
  files browse my_remote_file
7444
7810
  files browse my_remote_folder
7445
7811
  files browse my_remote_folder/
@@ -7486,7 +7852,7 @@ packages receive INIT --once-only=yes --query.dropbox_name=my_shared_inbox_name
7486
7852
  packages send --workspace=my_workspace_shared_inbox --validate-metadata=yes @json:'{"name":"package title","recipients":["my_shared_inbox_meta"],"metadata":[{"input_type":"single-text","name":"Project Id","values":["123"]},{"input_type":"single-dropdown","name":"Type","values":["Opt2"]},{"input_type":"multiple-checkbox","name":"CheckThose","values":["Check1","Check2"]},{"input_type":"date","name":"Optional Date","values":["2021-01-13T15:02:00.000Z"]}]}' test_file.bin
7487
7853
  packages send --workspace=my_workspace_shared_inbox --validate-metadata=yes @json:'{"name":"package title","recipients":["my_shared_inbox_meta"],"metadata":{"Project Id":"456","Type":"Opt2","CheckThose":["Check1","Check2"],"Optional Date":"2021-01-13T15:02:00.000Z"}}' test_file.bin
7488
7854
  packages send --workspace=my_workspace_shared_inbox @json:'{"name":"package title","recipients":["my_shared_inbox_name"]}' test_file.bin
7489
- packages send @: 'name=package title' END test_file.bin --url=my_public_link_send_aoc_user --password=my_public_link_send_use_pass
7855
+ packages send @: 'name=package title' END test_file.bin --url=my_public_link_send_aoc_user --password=<PUBLIC_LINK_SEND_USE_PASS>
7490
7856
  packages send @: 'name=package title' END test_file.bin --url=my_public_link_send_shared_inbox
7491
7857
  packages send @: 'name=package title' recipients.0=my_username 'note=some notes' END test_file.bin
7492
7858
  packages send @json:'{"name":"package title","recipients":["my_email_external"]}' --new-user-option.package_contact=true test_file.bin
@@ -7494,7 +7860,7 @@ packages shared_inboxes list
7494
7860
  packages shared_inboxes short_link public %name:my_shared_inbox_name create --fields=id
7495
7861
  packages shared_inboxes short_link public %name:my_shared_inbox_name delete <aoc_shared_inbox_short_link_create>
7496
7862
  packages shared_inboxes short_link public %name:my_shared_inbox_name list
7497
- packages shared_inboxes short_link public %name:my_shared_inbox_name modify <aoc_shared_inbox_short_link_create> @: password=my_public_link_folder_password
7863
+ packages shared_inboxes short_link public %name:my_shared_inbox_name modify <aoc_shared_inbox_short_link_create> @: password=<PUBLIC_LINK_FOLDER_PASSWORD>
7498
7864
  packages shared_inboxes short_link public %name:my_shared_inbox_name show <aoc_shared_inbox_short_link_create>
7499
7865
  packages shared_inboxes show %name:my_shared_inbox_name
7500
7866
  packages show '%name:package title'
@@ -7542,7 +7908,7 @@ Please preserve the API key! It cannot be retrieved after it's created.
7542
7908
  Name <KEY_NAME>
7543
7909
  Description <DESCRIPTION>
7544
7910
  Created At 2019-09-30T12:17+0000
7545
- API Key <SECRET>_api_key_here
7911
+ API Key <API_KEY>
7546
7912
  Locked false
7547
7913
  UUID ApiKey-05b8fadf-e7fe-abcd-93a9-6fd348c5ab1f
7548
7914
  ```
@@ -7559,7 +7925,7 @@ Then, to register the key by default for the `ats` plugin, create a preset.
7559
7925
  Execute:
7560
7926
 
7561
7927
  ```shell
7562
- ascli config preset update <PRESET_NAME> --ibm-api-key=<SECRET>_api_key_here
7928
+ ascli config preset update <PRESET_NAME> --ibm-api-key=<API_KEY>
7563
7929
  ```
7564
7930
 
7565
7931
  ```shell
@@ -7583,16 +7949,16 @@ ascli ats api_key create --out.secrets=yes
7583
7949
  ```
7584
7950
 
7585
7951
  ```text
7586
- ╭────────┬──────────────────────────────────────────────╮
7587
- │ field │ value │
7588
- ╞════════╪══════════════════════════════════════════════╡
7589
- │ id │ ats_XXXXXXXXXXXXXXXXXXXXXXXX │
7590
- │ secret │ YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY │
7591
- ╰────────┴──────────────────────────────────────────────╯
7952
+ ╭────────┬──────────────╮
7953
+ │ field │ value │
7954
+ ╞════════╪══════════════╡
7955
+ │ id │ <ATS_KEY> │
7956
+ │ secret │ <ATS_SECRET> │
7957
+ ╰────────┴──────────────╯
7592
7958
  ```
7593
7959
 
7594
7960
  ```shell
7595
- ascli config preset update <PRESET_NAME> --ats-key=ats_XXXXXXXXXXXXXXXXXXXXXXXX --ats-secret=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
7961
+ ascli config preset update <PRESET_NAME> --ats-key=<ATS_KEY> --ats-secret=<ATS_SECRET>
7596
7962
  ```
7597
7963
 
7598
7964
  ### ATS Access key creation parameters
@@ -7612,7 +7978,7 @@ ascli ats access_key create @json:'{"storage":{"type":"softlayer_swift","contain
7612
7978
  Example: create access key on AWS:
7613
7979
 
7614
7980
  ```shell
7615
- ascli ats access_key create @json:'{"id":"<ACCESS_KEY>","name":"laurent key AWS","storage":{"type":"aws_s3","bucket":"my-bucket","credentials":{"access_key_id":"_access_key_id_here_","secret_access_key":"<SECRET>"},"path":"/laurent"}}' --cloud=aws --region=eu-west-1
7981
+ ascli ats access_key create @json:'{"id":"<ACCESS_KEY>","name":"laurent key AWS","storage":{"type":"aws_s3","bucket":"my-bucket","credentials":{"access_key_id":"<ACCESS_KEY_ID>","secret_access_key":"<SECRET>"},"path":"/laurent"}}' --cloud=aws --region=eu-west-1
7616
7982
  ```
7617
7983
 
7618
7984
  Example: create access key on Azure SAS:
@@ -7644,13 +8010,13 @@ The parameters provided to ATS for access key creation are the ones of [ATS API]
7644
8010
  > Add `ascli ats` in front of the following commands:
7645
8011
 
7646
8012
  ```shell
7647
- access_key cluster ak2ibmcloud --secret=my_secret_here
8013
+ access_key cluster ak2ibmcloud --secret=<SECRET>
7648
8014
  access_key create --cloud=aws --region=my_region @json:'{"id":"ak_aws","name":"my test key AWS","storage":{"type":"aws_s3","bucket":"my_bucket","credentials":{"access_key_id":"my_access_key","secret_access_key":"my_secret_key"},"path":"/"}}'
7649
- access_key create --cloud=softlayer --region=my_region @json:'{"id":"ak2ibmcloud","secret":"my_secret_here","name":"my test key","storage":{"type":"ibm-s3","bucket":"my_bucket","credentials":{"access_key_id":"my_access_key","secret_access_key":"my_secret_key"},"path":"/"}}'
8015
+ access_key create --cloud=softlayer --region=my_region @json:'{"id":"ak2ibmcloud","secret":"<SECRET>","name":"my test key","storage":{"type":"ibm-s3","bucket":"my_bucket","credentials":{"access_key_id":"my_access_key","secret_access_key":"my_secret_key"},"path":"/"}}'
7650
8016
  access_key delete ak2ibmcloud
7651
8017
  access_key entitlement ak2ibmcloud
7652
8018
  access_key list --fields=name,id
7653
- access_key node ak2ibmcloud browse / --secret=my_secret_here
8019
+ access_key node ak2ibmcloud browse / --secret=<SECRET>
7654
8020
  access_key show ak2ibmcloud
7655
8021
  api_key create
7656
8022
  api_key instances
@@ -7674,12 +8040,12 @@ Then, commands `ascp` (for transfers) and `ascmd` (for file operations) are exec
7674
8040
  > If you have Node API credentials, or Access Key/Secret, use the plugin: `node`.
7675
8041
  > This plugin is exclusively using SSH credentials.
7676
8042
 
7677
- The URL to be provided with option `url` shall be like `ssh://_server_address_:33001`, then option `username` is used to specify the transfer user, and finally either option `password` or `ssh_keys` (with one or several paths) for the authentication.
8043
+ The URL to be provided with option `url` shall be like `ssh://<SERVER_ADDRESS>:33001`, then option `username` is used to specify the transfer user, and finally either option `password` or `ssh_keys` (with one or several paths) for the authentication.
7678
8044
 
7679
8045
  Typically:
7680
8046
 
7681
8047
  ```shell
7682
- ascli server --url=ssh://hsts.example.com:33001 --username=john --password=_something_here_ ...
8048
+ ascli server --url=ssh://hsts.example.com:33001 --username=john --password=<PASSWORD> ...
7683
8049
  ```
7684
8050
 
7685
8051
  ```shell
@@ -7693,7 +8059,7 @@ ascli server --url=ssh://hsts.example.com:33001 --username=john --ssh-keys=~/.ss
7693
8059
 
7694
8060
  ```shell
7695
8061
  browse /
7696
- browse / --password=@none: --ssh-options.number_of_password_prompts=0 --ssh-keys=<serv_key_path>
8062
+ browse / --password @none: --ssh-options.number_of_password_prompts=0 --ssh-keys=<serv_key_path>
7697
8063
  browse my_inside_folder/test_file.bin
7698
8064
  browse my_upload_folder/target_hot
7699
8065
  cp my_inside_folder/test_file.bin my_upload_folder/200KB.2
@@ -7715,17 +8081,17 @@ sync admin file_info /data/local_sync
7715
8081
  sync admin overview /data/local_sync
7716
8082
  sync admin query --sql='SELECT name FROM sqlite_master WHERE type='table'' /data/local_sync
7717
8083
  sync admin status /data/local_sync
8084
+ sync pull my_inside_folder --to-folder=/data/local_sync @: name=serv_sync_pull_conf
7718
8085
  sync pull my_inside_folder --to-folder=/data/local_sync @json:'{"name":"serv_sync_pull_conf","reset":true,"transport":{"target_rate":my_bps}}'
7719
- sync pull my_inside_folder --to-folder=/data/local_sync @json:'{"name":"serv_sync_pull_conf"}'
7720
8086
  upload 'faux:///test.bin?1k' --to-folder=my_upload_folder
7721
8087
  upload --sources=@ts --transfer.ascp_args=@list:,--file-list,file_list.txt --to-folder=my_inside_folder
7722
8088
  upload --sources=@ts --transfer.ascp_args=@list:,--file-pair-list,file_pair_list.txt
7723
8089
  upload --sources=@ts --ts=@json:'{"paths":[{"source":"test_file.bin","destination":"my_inside_folder/other_name_4"}]}' --transfer.agent=transferd
7724
8090
  upload --src-type=pair --sources=@json:'["test_file.bin","my_inside_folder/other_name_3"]' --transfer.quiet=false
7725
8091
  upload --src-type=pair test_file.bin my_inside_folder/other_name_2 --notify-to=my_email_external '--transfer.ascp_args=@list: -l 100m'
7726
- upload --src-type=pair test_file.bin my_upload_folder/other_name_5 --ts=@json:'{"cipher":"aes-192-gcm","content_protection":"encrypt","content_protection_password":"my_secret_here","cookie":"biscuit","create_dir":true,"delete_before_transfer":false,"delete_source":false,"exclude_newer_than":"-1","exclude_older_than":"-10000","fasp_port":33001,"http_fallback":false,"multi_session":0,"overwrite":"diff+older","precalculate_job_size":true,"preserve_access_time":true,"preserve_creation_time":true,"rate_policy":"fair","resume_policy":"sparse_csum"}'
8092
+ upload --src-type=pair test_file.bin my_upload_folder/other_name_5 --ts=@json:'{"cipher":"aes-192-gcm","content_protection":"encrypt","content_protection_password":"<PASSWORD>","cookie":"biscuit","create_dir":true,"delete_before_transfer":false,"delete_source":false,"exclude_newer_than":"-1","exclude_older_than":"-10000","fasp_port":33001,"http_fallback":false,"multi_session":0,"overwrite":"diff+older","precalculate_job_size":true,"preserve_access_time":true,"preserve_creation_time":true,"rate_policy":"fair","resume_policy":"sparse_csum"}'
7727
8093
  upload --to-folder=my_upload_folder/target_hot --lock-port=50101 --transfer.ascp_args=@list:,--remove-after-transfer,--remove-empty-directories,--exclude-newer-than=-8,--src-base,hot_folder hot_folder
7728
- upload /test_file.bin --to-folder=my_upload_folder --transfer.agent=node --transfer.url=http://localhost:12348 --transfer.username=sim --transfer.password=sim
8094
+ upload /test_file.bin --to-folder=my_upload_folder --transfer.agent=node --transfer.url=http://localhost:12348 --transfer.username=sim --transfer.password=<PASSWORD>
7729
8095
  upload test_file.bin --to-folder=my_inside_folder --ts=@json:'{"multi_session":3,"multi_session_threshold":1,"resume_policy":"none","target_rate_kbps":100000}' --transfer=@json:'{"spawn_delay_sec":2.5,"multi_incr_udp":false}' --progress-bar=yes
7730
8096
  ```
7731
8097
 
@@ -7743,7 +8109,7 @@ If neither SSH password nor key is provided and a transfer token is provided in
7743
8109
  Example:
7744
8110
 
7745
8111
  ```shell
7746
- ascli server --url=ssh://_server_address_:33001 ... --ts=@json:'{"token":"Basic _token_here_"}'
8112
+ ascli server --url=ssh://<SERVER_ADDRESS>:33001 ... --ts=@json:'{"token":"Basic <TOKEN>"}'
7747
8113
  ```
7748
8114
 
7749
8115
  > [!NOTE]
@@ -7830,7 +8196,7 @@ ascli server download /aspera-test-dir-large/200MB
7830
8196
  If an SSH private key is used for authentication with a passphrase, the passphrase needs to be provided to both options: `ssh_options` (for browsing) and `ts` (for transfers):
7831
8197
 
7832
8198
  ```shell
7833
- ascli server --url=ssh://_server_address_here_:33001 --username=_user_here_ --ssh-keys=_private_key_path_here_ --passphrase=_passphrase_here_
8199
+ ascli server --url=ssh://<SERVER_ADDRESS>:33001 --username=<USERNAME> --ssh-keys=<PRIVATE_KEY_PATH> --passphrase=<PASSPHRASE>
7834
8200
  ```
7835
8201
 
7836
8202
  ## Plugin: `node`: IBM Aspera High Speed Transfer Server Node
@@ -8113,7 +8479,7 @@ ascli aoc files thumbnail /preview_samples/Aspera.mpg
8113
8479
  ```
8114
8480
 
8115
8481
  > [!TIP]
8116
- > To specify the file by its file ID, use the selector syntax: `%id:_file_id_here_`
8482
+ > To specify the file by its file ID, use the selector syntax: `%id:<FILE_ID>`
8117
8483
 
8118
8484
  > [!NOTE]
8119
8485
  > To force textual display of the preview on **iTerm**, prefix command with: `env -u TERM_PROGRAM -u LC_TERMINAL`
@@ -8259,7 +8625,7 @@ ascli node access_keys modify %id:self @ruby:'{token_verification_key: File.read
8259
8625
  - Create a Bearer token for the user:
8260
8626
 
8261
8627
  ```shell
8262
- ascli node bearer_token @file:./myorgkey.pem @json:'{"user_id":"'$my_user_id'","_validity":3600}' --out.file=bearer.txt
8628
+ ascli node bearer_token @file:./myorgkey.pem @json:'{"user_id":"'$my_user_id'","_validity":3600}' --out.secrets=yes --out.file=bearer.txt
8263
8629
  ```
8264
8630
 
8265
8631
  > [!NOTE]
@@ -8287,26 +8653,26 @@ ascli node -N --url=https://... --password="Bearer $(cat bearer.txt)" --root-id=
8287
8653
  > Add `ascli node` in front of the following commands:
8288
8654
 
8289
8655
  ```shell
8290
- --url=http://localhost:12348 --username=sim --password=sim browse / --fields=path --format=csv --select=@json:'{"basename":"test_file.bin"}'
8291
- --url=http://localhost:12348 --username=sim --password=sim transfer list --fields=status
8292
- --url=https://tst.example.com/path --password='Bearer <nd_bearer_token>' --root-id=<id> access_key do self browse /
8293
- access_key create @json:'{"id":"my_username","secret":"my_password_here","storage":{"type":"local","path":"/"}}'
8656
+ --url=http://localhost:12348 --username=sim --password=<PASSWORD> browse / --fields=path --format=csv --select=@json:'{"basename":"test_file.bin"}'
8657
+ --url=http://localhost:12348 --username=sim --password=<PASSWORD> transfer list --fields=status
8658
+ --url=https://tst.example.com/path --password 'Bearer <nd_bearer_token>' --root-id=<id> access_key do self browse /
8659
+ access_key create @json:'{"id":"my_username","secret":"<PASSWORD>","storage":{"type":"local","path":"/"}}'
8294
8660
  access_key delete my_username
8295
- access_key do my_ak_name browse / --secret=my_ak_secret
8296
- access_key do my_ak_name delete /test_nd_ak2 --secret=my_ak_secret
8297
- access_key do my_ak_name delete test_nd_ak3 --secret=my_ak_secret
8298
- access_key do my_ak_name download test_nd_ak3 --to-folder=. --secret=my_ak_secret
8299
- access_key do my_ak_name find my_test_folder --secret=my_ak_secret
8300
- access_key do my_ak_name find my_test_folder @re:'\.jpg$' --secret=my_ak_secret
8661
+ access_key do my_ak_name browse / --secret=<AK_SECRET>
8662
+ access_key do my_ak_name delete /test_nd_ak2 --secret=<AK_SECRET>
8663
+ access_key do my_ak_name delete test_nd_ak3 --secret=<AK_SECRET>
8664
+ access_key do my_ak_name download test_nd_ak3 --to-folder=. --secret=<AK_SECRET>
8665
+ access_key do my_ak_name find my_test_folder --secret=<AK_SECRET>
8666
+ access_key do my_ak_name find my_test_folder @re:'\.jpg$' --secret=<AK_SECRET>
8301
8667
  access_key do my_ak_name find my_test_folder @ruby:'->(f){f["name"].end_with?(".jpg")}'
8302
- --secret=my_ak_secret
8303
- access_key do my_ak_name mkdir /tst_nd_ak --secret=my_ak_secret
8304
- access_key do my_ak_name mkfile /mkfile.txt 'hello world' --secret=my_ak_secret
8305
- access_key do my_ak_name mklink /mklink.txt --query=@json:'{"target":"/mkfile.txt","target_node_id":"123"}' --secret=my_ak_secret
8306
- access_key do my_ak_name node_info / --secret=my_ak_secret
8307
- access_key do my_ak_name rename /tst_nd_ak test_nd_ak2 --secret=my_ak_secret
8308
- access_key do my_ak_name show %id:1 --secret=my_ak_secret
8309
- access_key do my_ak_name upload 'faux:///test_nd_ak3?100k' --node-api.standard_ports=false --secret=my_ak_secret
8668
+ --secret=<AK_SECRET>
8669
+ access_key do my_ak_name mkdir /tst_nd_ak --secret=<AK_SECRET>
8670
+ access_key do my_ak_name mkfile /mkfile.txt 'hello world' --secret=<AK_SECRET>
8671
+ access_key do my_ak_name mklink /mklink.txt --query=@json:'{"target":"/mkfile.txt","target_node_id":"123"}' --secret=<AK_SECRET>
8672
+ access_key do my_ak_name node_info / --secret=<AK_SECRET>
8673
+ access_key do my_ak_name rename /tst_nd_ak test_nd_ak2 --secret=<AK_SECRET>
8674
+ access_key do my_ak_name show %id:1 --secret=<AK_SECRET>
8675
+ access_key do my_ak_name upload 'faux:///test_nd_ak3?100k' --node-api.standard_ports=false --secret=<AK_SECRET>
8310
8676
  access_key do self permission %id:<id> create @json:'{"access_type":"user","access_id":"666"}'
8311
8677
  access_key do self permission / delete 1
8312
8678
  access_key do self permission / modify 1 @: 'access_levels=@list: read list'
@@ -8333,7 +8699,7 @@ central session list
8333
8699
  delete @list:,my_upload_folder/a_folder,my_upload_folder/tdlink,my_upload_folder/a_file
8334
8700
  delete my_upload_folder/test_file.bin
8335
8701
  download my_upload_folder/test_file.bin --to-folder=.
8336
- emulator @json:'{"url":"http://localhost:12348","username":"sim","password":"sim","docroot":"/data"}'
8702
+ emulator @json:'{"url":"http://localhost:12348","username":"sim","password":"<PASSWORD>","password_min_bits":0,"docroot":"/data"}'
8337
8703
  health
8338
8704
  info --fpac='function FindProxyForURL(url,host){return "DIRECT"}'
8339
8705
  license
@@ -8350,7 +8716,7 @@ space /
8350
8716
  spec
8351
8717
  ssync bandwidth %name:my_node_sync
8352
8718
  ssync counters %name:my_node_sync
8353
- ssync create @json:'{"configuration":{"name":"my_node_sync","local":{"path":"my_local_path_real"},"remote":{"host":"my_host","port":my_port,"user":"my_username","pass":"my_password_here","path":"my_remote_path"}}}'
8719
+ ssync create @json:'{"configuration":{"name":"my_node_sync","local":{"path":"my_local_path_real"},"remote":{"host":"my_host","port":my_port,"user":"my_username","pass":"<PASSWORD>","path":"my_remote_path"}}}'
8354
8720
  ssync delete %name:my_node_sync
8355
8721
  ssync files %name:my_node_sync
8356
8722
  ssync list
@@ -8372,8 +8738,8 @@ transfer sessions
8372
8738
  transfer show <id>
8373
8739
  transport
8374
8740
  upload 'faux:///testfile1?1m' --to-folder=my_local_path
8375
- upload --to-folder=my_upload_folder --sources=@ts --ts=@json:'{"paths":[{"source":"/aspera-test-dir-small/10MB.2"}],"precalculate_job_size":true}' --transfer.agent=node --transfer.url=https://node.example.com/path --transfer.username=my_username --transfer.password=my_password
8376
- upload --username=my_ak_name --password=my_ak_secret test_file.bin
8741
+ upload --to-folder=my_upload_folder --sources=@ts --ts=@json:'{"paths":[{"source":"/aspera-test-dir-small/10MB.2"}],"precalculate_job_size":true}' --transfer.agent=node --transfer.url=https://node.example.com/path --transfer.username=my_username --transfer.password=<PASSWORD>
8742
+ upload --username=my_ak_name --password=<AK_SECRET> test_file.bin
8377
8743
  upload my_mxf my_docx --ts=@json:'{"target_rate_kbps":1000000,"resume_policy":"none"}'
8378
8744
  watch_folder list
8379
8745
  ```
@@ -8401,7 +8767,7 @@ Identify the region and the endpoint URL will be `https://otlp-[region]-saas.ins
8401
8767
  For convenience, those parameters can be provided in a preset, for example, named `otel_default`.
8402
8768
 
8403
8769
  ```shell
8404
- ascli config preset initialize otel_default @json:'{"url":"https://otlp-orange-saas.instana.io:4318","key":"*********","interval":1.1}'
8770
+ ascli config preset initialize otel_default @json:'{"url":"https://otlp-orange-saas.instana.io:4318","key":"<KEY>","interval":1.1}'
8405
8771
  ```
8406
8772
 
8407
8773
  Then it is invoked like this (assuming a default node is configured):
@@ -8431,44 +8797,49 @@ The emulator starts its own `transferd`, and stops it on exit.
8431
8797
  It takes an optional `Hash` argument with the following parameters:
8432
8798
 
8433
8799
  | Field | Type | Description |
8434
- |---------------|---------|----------------------------------------------------------------------------------|
8800
+ |-------------------|---------|----------------------------------------------------------------------------------|
8435
8801
  | `cert` | `String` | Path to the TLS certificate file. Accepted formats: PEM (`.pem`) or PKCS12 (`.p12` / `.pfx`).<br/>Example: `/path/to/cert.pem`. |
8436
8802
  | `chain` | `String` | Path to the PEM certificate chain file (appended as extra chain certificates).<br/>Example: `/path/to/chain.pem`. |
8437
8803
  | `docroot` | `String` | Local folder of the node files. Paths of `/files/browse` and local paths of transfers (sources of `send`, destination of `receive`) are relative to it, and confined in it. Defaults to the current working directory.<br/>Example: `/data/aspera`. |
8438
8804
  | `key` | `String` | Path to the PEM private key file, or the PKCS12 passphrase when `cert` is a `.p12`/`.pfx` file.<br/>Example: `/path/to/key.pem`. |
8439
- | `password` | `String` | Password expected from clients in HTTP Basic authentication, for the above `username`.<br/>Example: `my_password`. |
8805
+ | `password_min_bits` | `Integer` | Minimum estimated strength of `password`, in bits (log2 of the number of guesses to find it). The strength is estimated with gem `zxcvbn` if installed, else with a built-in estimate that detects repeats, sequences, keyboard rows, words and years. `0` disables the check. A random password of 32 bytes (`openssl rand -hex 32`) is far above the default.<br/>Default: `80`. |
8806
+ | `password` | `String` | Password expected from clients in HTTP Basic authentication, for the above `username`. Generate it with `openssl rand -hex 32`: a weak password is refused (see `password_min_bits`).<br/>Example: `my_password`. |
8440
8807
  | `retention_sec` | `Integer` | Time in seconds a transfer stays in the list of transfers after it ended (completed, failed or canceled, and no more retried).<br/>Default: `86400`. |
8441
8808
  | `url` | `String` | Address and port the emulator listens on. Use `https://` with `cert`/`key` for TLS.<br/>Default: `http://localhost:8080`. |
8442
- | `username` | `String` | Username expected from clients in HTTP Basic authentication. Set together with `password`. When not set, requests are accepted without authentication.<br/>Example: `node_user`. |
8809
+ | `username` | `String` | Username expected from clients in HTTP Basic authentication. Set together with `password`. When not set, requests are accepted without authentication. Mandatory when `url` is not a loopback address (`localhost`, `127.0.0.0/8`, `::1`).<br/>Example: `node_user`. |
8443
8810
 
8444
8811
  For details on `url` and HTTPS, see [Web service](#web-service).
8445
8812
 
8446
8813
  Like on a real node, the files of the emulator are in its `docroot`: paths of `browse`, and local paths of transfers, are relative to it.
8447
8814
  Local paths are the sources of an upload (`send`), and the destination of a download (`receive`).
8448
- Paths leading out of the `docroot` are rejected.
8815
+ Paths leading out of the `docroot`, also through symbolic links, are rejected.
8449
8816
 
8450
8817
  Start the emulator, it runs until interrupted:
8451
8818
 
8452
8819
  ```shell
8453
- ascli node emulator @json:'{"url":"http://localhost:12348","username":"sim","password":"sim","docroot":"/data"}'
8820
+ ascli node emulator @json:'{"url":"http://localhost:12348","username":"sim","password":"<PASSWORD>","docroot":"/data"}'
8454
8821
  ```
8455
8822
 
8823
+ Generate the password with `openssl rand -hex 32`.
8824
+ A weak password is refused at startup: its strength is estimated in bits, and shall be at least `password_min_bits`.
8825
+ `username` and `password` are mandatory when `url` is not a loopback address (`localhost`, `127.0.0.0/8`, `::1`): anyone reaching the emulator could send the files of the `docroot` to any host.
8826
+
8456
8827
  Then, in another terminal, use it as a node, for example, to list the files in `/data`:
8457
8828
 
8458
8829
  ```shell
8459
- ascli node --url=http://localhost:12348 --username=sim --password=sim browse /
8830
+ ascli node --url=http://localhost:12348 --username=sim --password=<PASSWORD> browse /
8460
8831
  ```
8461
8832
 
8462
8833
  Or as the transfer agent, for example, to upload the file `/data/my_file.dat` to a transfer server:
8463
8834
 
8464
8835
  ```shell
8465
- ascli server upload /my_file.dat --transfer.agent=node --transfer.url=http://localhost:12348 --transfer.username=sim --transfer.password=sim
8836
+ ascli server upload /my_file.dat --transfer.agent=node --transfer.url=http://localhost:12348 --transfer.username=sim --transfer.password=<PASSWORD>
8466
8837
  ```
8467
8838
 
8468
8839
  The transfer is executed by `transferd`, and its status is available on the emulator:
8469
8840
 
8470
8841
  ```shell
8471
- ascli node --url=http://localhost:12348 --username=sim --password=sim transfer list
8842
+ ascli node --url=http://localhost:12348 --username=sim --password=<PASSWORD> transfer list
8472
8843
  ```
8473
8844
 
8474
8845
  Supported endpoints:
@@ -8486,7 +8857,7 @@ Supported endpoints:
8486
8857
  Limitations:
8487
8858
 
8488
8859
  - Only transfers started through the emulator are known. They are kept in memory, and lost when the emulator stops. Ended transfers are removed from the list after `retention_sec` (default: one day).
8489
- - Only Basic authentication is supported: when `username` and `password` are set, bearer tokens and access keys are rejected. When they are not set, all requests are accepted.
8860
+ - Only Basic authentication is supported: when `username` and `password` are set, bearer tokens and access keys are rejected. When they are not set (loopback `url` only), all requests are accepted.
8490
8861
  - Not supported: `files/upload_setup` and `files/download_setup` (so, `node upload|download` on the emulator), `ops/transfers/bandwidth`, pause and resume of transfers, query parameters `iteration_token` and `tag`.
8491
8862
 
8492
8863
  ## Plugin: `faspex5`: IBM Aspera Faspex v5
@@ -8618,9 +8989,9 @@ Then use these options:
8618
8989
 
8619
8990
  ```text
8620
8991
  --auth=jwt
8621
- --client-id=_client_id_here_
8992
+ --client-id=<CLIENT_ID>
8622
8993
  --client-secret=<SECRET>
8623
- --username=_username_here_
8994
+ --username=<USERNAME>
8624
8995
  --private-key=@file:.../path/to/key.pem
8625
8996
  ```
8626
8997
 
@@ -8633,7 +9004,7 @@ Typically, users create a preset so they don't have to enter these options each
8633
9004
  Example:
8634
9005
 
8635
9006
  ```shell
8636
- ascli config preset update <F5_PRESET> --auth=jwt --client-id=_client_id_here_ --client-secret=<SECRET> --username=_username_here_ --private-key=@file:.../path/to/key.pem
9007
+ ascli config preset update <F5_PRESET> --auth=jwt --client-id=<CLIENT_ID> --client-secret=<SECRET> --username=<USERNAME> --private-key=@file:.../path/to/key.pem
8637
9008
 
8638
9009
  ascli config preset set default faspex5 <F5_PRESET>
8639
9010
 
@@ -8654,7 +9025,7 @@ The user will use the following options:
8654
9025
 
8655
9026
  ```text
8656
9027
  --auth=web
8657
- --client-id=_client_id_here_
9028
+ --client-id=<CLIENT_ID>
8658
9029
  --client-secret=<SECRET>
8659
9030
  --redirect-uri=https://127.0.0.1:8888
8660
9031
  ```
@@ -8666,7 +9037,7 @@ If all you have is a public link received by email or other, you can still do au
8666
9037
  For example, for a public link to post a package:
8667
9038
 
8668
9039
  ```shell
8669
- ascli faspex5 packages send --url='https://faspex5.example.com/?context=_some_long_string_here_'
9040
+ ascli faspex5 packages send --url='https://faspex5.example.com/?context=<CONTEXT>'
8670
9041
  ```
8671
9042
 
8672
9043
  ### Faspex 5 bootstrap authentication
@@ -8681,7 +9052,7 @@ For `boot` method: (will be removed in future)
8681
9052
  Use this token as password and use `--auth=boot`.
8682
9053
 
8683
9054
  ```shell
8684
- ascli config preset update f5boot --url=https://localhost/aspera/faspex --auth=boot --password=_token_here_
9055
+ ascli config preset update f5boot --url=https://localhost/aspera/faspex --auth=boot --password=<TOKEN>
8685
9056
  ```
8686
9057
 
8687
9058
  ### Tested commands for `faspex5`
@@ -8743,14 +9114,14 @@ packages receive --box=my_shared_box_name <id> --to-folder=.
8743
9114
  packages receive --box=my_workgroup --group-type=workgroups <id> --to-folder=.
8744
9115
  packages receive --url=my_public_link_recv_fr_user --to-folder=.
8745
9116
  packages receive --url=my_public_link_recv_fr_user ALL --to-folder=.
8746
- packages receive <id> --to-folder=. --ts.content_protection_password=my_secret_here
8747
- packages receive <id> <f5_pack_first_file> --to-folder=. --ts.content_protection_password=my_secret_here
9117
+ packages receive <id> --to-folder=. --ts.content_protection_password=<PASSWORD>
9118
+ packages receive <id> <f5_pack_first_file> --to-folder=. --ts.content_protection_password=<PASSWORD>
8748
9119
  packages receive ALL --once-only=yes --to-folder=. --query.max=5
8749
9120
  packages receive INIT --once-only=yes
8750
9121
  packages send --url=my_public_link_send_shared_box @json:'{"title":"test title"}' test_file.bin
8751
9122
  packages send --url=my_public_link_send_to_user @json:'{"title":"test title"}' test_file.bin
8752
9123
  packages send @: 'title=for shared inbox' recipients.0=my_shared_box_name metadata.Options=Opt1 'metadata.TextInput=example text' END test_file.bin
8753
- packages send @: 'title=test title' recipients.0.name=my_username END test_file.bin --ts.content_protection_password=my_secret_here
9124
+ packages send @: 'title=test title' recipients.0.name=my_username END test_file.bin --ts.content_protection_password=<PASSWORD>
8754
9125
  packages send @json:'{"title":"test title","recipients":["my_workgroup"]}' test_file.bin
8755
9126
  packages send @json:'{"title":"test_webhook_ascli","recipients":["my_shared_box_name"]}' 'faux:///test1?1m'
8756
9127
  packages show --box=my_shared_box_name <id>
@@ -8758,7 +9129,7 @@ packages show --box=my_workgroup --group-type=workgroups <id>
8758
9129
  packages show <id>
8759
9130
  packages status <f5_pack_send_shared> @list:,failed,completed
8760
9131
  packages status <id>
8761
- postprocessing @json:'{"url":"https://localhost:8553/asclihook","script_folder":"/path/to/scripts","cert":".../localhost.p12","key":"changeit"}'
9132
+ postprocessing @: url=https://localhost:8553/asclihook script_folder=/path/to/scripts cert=.../localhost.p12 key=<PASSWORD>
8762
9133
  shared browse %name:my_shared_folder_name
8763
9134
  shared list
8764
9135
  shared_folders browse %name:my_shared_folder_name
@@ -9056,7 +9427,7 @@ ascli faspex5 shared_folders browse %name:'Server Files' /folder
9056
9427
  ```
9057
9428
 
9058
9429
  ```shell
9059
- ascli faspex5 packages send @json:'{"title":"hello","recipients":[{"name":"_recipient_here_"}]}' --shared-folder=%name:partages /folder/file
9430
+ ascli faspex5 packages send @json:'{"title":"hello","recipients":[{"name":"<RECIPIENT>"}]}' --shared-folder=%name:partages /folder/file
9060
9431
  ```
9061
9432
 
9062
9433
  > [!TIP]
@@ -9147,6 +9518,8 @@ To send a password reset link to a user, use command `faspex5 admin accounts res
9147
9518
  The command `ascli faspex5 postprocessing` emulates Faspex 4 post-processing script execution in Faspex 5.
9148
9519
  It implements a web hook for Faspex 5 and calls a script with the same environment variables as set by Faspex 4.
9149
9520
  Environment variables are set to the values provided by the web hook, which are the same as Faspex 4 post-processing.
9521
+ Only values whose key starts with `faspex_` are passed: other keys are ignored, as they could change the behavior of the script (e.g. `PATH`).
9522
+ A structured value (object or array) is passed as JSON.
9150
9523
 
9151
9524
  It allows migrating workflows from Faspex 4 to Faspex 5 while preserving scripts.
9152
9525
  Nevertheless, in the long term, a native approach shall be considered, such as using Aspera Orchestrator or other workflow engine, using Faspex 5 native web hooks or File Processing.
@@ -9159,37 +9532,71 @@ ascli faspex5 postprocessing
9159
9532
 
9160
9533
  An optional positional parameter can be provided as [Extended Value](#extended-value-syntax) `Hash`:
9161
9534
 
9162
- | Parameter | Type | Default | Description |
9163
- |-------------------|-----------|-------|-----------------------------------------------------|
9164
- | **server info** | - | - | See [Web service](#web-service). |
9165
- | `script_folder` | `String` | `.` | Prefix added to script path (Default: CWD) |
9166
- | `fail_on_error` | `Bool` | false | Fail if true and process exits with non-zero code |
9167
- | `timeout_seconds` | `Integer` | 60 | Time out before script is killed |
9535
+ | Field | Type | Description |
9536
+ |-----------------------|-----------------------|----------------------------------------------------------------------------------|
9537
+ | `allowed_ips` | `String, Array[String]` | IP address or network (CIDR, e.g. `10.89.0.0/24`), or list of them, allowed to call the listener. Requests from any other source IP are rejected with HTTP 403. When not set, no IP restriction is applied. This parameter or `secret_token` is required when `url` is not a local address. |
9538
+ | `cert` | `String` | Path to the TLS certificate file. Accepted formats: PEM (`.pem`) or PKCS12 (`.p12` / `.pfx`).<br/>Example: `/path/to/cert.pem`. |
9539
+ | `chain` | `String` | Path to the PEM certificate chain file (appended as extra chain certificates).<br/>Example: `/path/to/chain.pem`. |
9540
+ | `fail_on_error` | `Bool` | When `true`, return HTTP 500 if the script exits with a non-zero status code. When `false` (default), the exit code is reported in the response body but HTTP 200 is returned.<br/>Default: `false`. |
9541
+ | `key` | `String` | Path to the PEM private key file, or the PKCS12 passphrase when `cert` is a `.p12`/`.pfx` file.<br/>Example: `/path/to/key.pem`. |
9542
+ | `script_folder` | `String` | Folder containing the post-processing scripts. The URL path (after the base path) is appended to this folder to locate the script to execute.<br/>Default: `.`.<br/>Example: `/opt/faspex/scripts`. |
9543
+ | `secret_token_min_bits` | `Integer` | Minimum estimated strength of `secret_token`, in bits (log2 of the number of guesses to find it). The strength is estimated with gem `zxcvbn` if installed, else with a built-in estimate that detects repeats, sequences, keyboard rows, words and years. `0` disables the check. A random token of 32 bytes (`openssl rand -hex 32`) is far above the default.<br/>Default: `80`. |
9544
+ | `secret_token` | `String` | Shared secret for webhook authentication. When set, every incoming request must include `?token=<value>` in the URL; requests without the correct token are rejected with HTTP 401. Configure the Faspex webhook URL as `http://host:port/path/script.sh?token=<value>`. This parameter or `allowed_ips` is required when `url` is not a local address. Generate it with `openssl rand -hex 32`: a weak token is refused (see `secret_token_min_bits`). |
9545
+ | `timeout_seconds` | `Integer` | Maximum time in seconds to wait for the script to complete before killing it.<br/>Default: `60`. |
9546
+ | `url` | `String` | Address and port the server listens on. Use `https://` with `cert`/`key` for TLS.<br/>Default: `http://localhost:8080`. |
9547
+
9548
+ For details on `url` and HTTPS (`cert`, `key`, `chain`), see [Web service](#web-service).
9168
9549
 
9169
9550
  When a request on `ascli` is received the following happens:
9170
9551
 
9171
- - `ascli` gets the path of the URL called
9552
+ - If `allowed_ips` is set, `ascli` checks the source IP address of the request (else HTTP 403).
9553
+ - If `secret_token` is set, `ascli` checks the `token` parameter of the URL (else HTTP 401).
9554
+ - `ascli` gets the path of the URL called.
9172
9555
  - It removes the **base path** of base URL.
9173
- - It prepends it with the value of `script_folder`
9174
- - It executes the script at that path
9175
- - Upon success, a success code is returned
9556
+ - It prepends it with the value of `script_folder`.
9557
+ - It executes the script at that path, if it exists (else HTTP 404) and is inside `script_folder` (else HTTP 403).
9558
+ - The script is killed if it does not finish within `timeout_seconds`.
9559
+ - Upon success, a success code is returned.
9176
9560
 
9177
9561
  For example:
9178
9562
 
9179
9563
  ```shell
9180
- ascli faspex5 postprocessing @json:'{"url":"http://localhost:8080/processing","script_folder":"/opt/scripts"}'
9564
+ ascli faspex5 postprocessing @json:'{"url":"http://0.0.0.0:8080/processing","script_folder":"/opt/scripts","secret_token":"<TOKEN>"}'
9181
9565
  ```
9182
9566
 
9567
+ Generate the token with `openssl rand -hex 32`.
9568
+ A weak token is refused at startup: its strength is estimated in bits, and shall be at least `secret_token_min_bits`.
9569
+ The estimate uses the optional gem `zxcvbn` if installed, else a built-in estimate.
9570
+
9183
9571
  In Faspex 5, the URL of the webhook endpoint shall be reachable from within Faspex containers.
9184
9572
  For example, if `ascli` is running on the host, the URL hostname shall not be `localhost`, as this refers to the local address inside the Faspex container.
9185
9573
  Instead, one can specify the **IP address of the host** or `host.containers.internal` (Check `podman` manual).
9574
+ So, `ascli` shall listen on an address reachable from the containers: the IP address of the host, or `0.0.0.0` for all interfaces.
9575
+
9576
+ > [!NOTE]
9577
+ > **Security**: by default the listener binds to loopback (`localhost`) and is not reachable from outside the host.
9578
+ > When `url` is not a loopback address (`localhost`, `127.0.0.0/8`, `::1`), at least one of the following protections is required:
9579
+ >
9580
+ > - **`secret_token`**: include the token in the Faspex webhook URL: `http://host:8080/processing/script1.sh?token=<TOKEN>`. Requests without the correct token are rejected with HTTP 401.
9581
+ > - **`allowed_ips`**: restrict the listener to the known Faspex container IPs or network, e.g. `@json:'{"allowed_ips":["192.168.1.10","10.89.0.0/24"]}'`. Requests from other IPs are rejected with HTTP 403.
9186
9582
 
9187
9583
  Define the web hook as follows:
9188
9584
 
9189
- **Webhook endpoint URI**: `http://host.containers.internal:8080/processing/script1.sh`
9585
+ **Webhook endpoint URI**: `http://host.containers.internal:8080/processing/script1.sh?token=<TOKEN>`
9190
9586
 
9191
9587
  Then the post-processing script executed will be `/opt/scripts/script1.sh`.
9192
9588
 
9589
+ A Ruby script can also be evaluated in the process of `ascli`, instead of being executed in a new process.
9590
+ For this, add `lambda` to the query of the URL, e.g. `http://host.containers.internal:8080/processing/notify.rb?token=<TOKEN>&lambda`.
9591
+ The script shall have extension `.rb`, and return a lambda, which is called with all the webhook values (`Hash`).
9592
+ For example:
9593
+
9594
+ ```ruby
9595
+ ->(params) { File.write('/tmp/last_package.txt', params['faspex_pkg_name']) }
9596
+ ```
9597
+
9598
+ The lambda runs with the privileges and configuration of `ascli`, and is stopped after `timeout_seconds`.
9599
+
9193
9600
  ### Faspex 5: Faspex 4 Gateway
9194
9601
 
9195
9602
  > [!NOTE]
@@ -9198,33 +9605,48 @@ Then the post-processing script executed will be `/opt/scripts/script1.sh`.
9198
9605
 
9199
9606
  For legacy Faspex client applications that use the `send` API (only) of Faspex v4, the command `gateway` provides the capability to present an API compatible with Faspex 4, and it will call the Faspex 5 API.
9200
9607
 
9201
- It takes a single argument which is the URL at which the gateway will be located (locally):
9608
+ It takes an optional `Hash` argument:
9609
+
9610
+ | Field | Type | Description |
9611
+ |-------------------|---------|----------------------------------------------------------------------------------|
9612
+ | `cert` | `String` | Path to the TLS certificate file. Accepted formats: PEM (`.pem`) or PKCS12 (`.p12` / `.pfx`).<br/>Example: `/path/to/cert.pem`. |
9613
+ | `chain` | `String` | Path to the PEM certificate chain file (appended as extra chain certificates).<br/>Example: `/path/to/chain.pem`. |
9614
+ | `key` | `String` | Path to the PEM private key file, or the PKCS12 passphrase when `cert` is a `.p12`/`.pfx` file.<br/>Example: `/path/to/key.pem`. |
9615
+ | `password_min_bits` | `Integer` | Minimum estimated strength of `password`, in bits (log2 of the number of guesses to find it). The strength is estimated with gem `zxcvbn` if installed, else with a built-in estimate that detects repeats, sequences, keyboard rows, words and years. `0` disables the check. A random password of 32 bytes (`openssl rand -hex 32`) is far above the default.<br/>Default: `80`. |
9616
+ | `password` | `String` | Password expected from clients in HTTP Basic authentication, for the above `username`. Generate it with `openssl rand -hex 32`: a weak password is refused (see `password_min_bits`).<br/>Example: `my_password`. |
9617
+ | `url` | `String` | Address and port the server listens on. Use `https://` with `cert`/`key` for TLS.<br/>Default: `http://localhost:8080`. |
9618
+ | `username` | `String` | Username expected from clients in HTTP Basic authentication. Set together with `password`. When not set, requests are accepted without authentication. Mandatory when `url` is not a loopback address (`localhost`, `127.0.0.0/8`, `::1`).<br/>Example: `fx4_user`. |
9619
+
9620
+ Example:
9202
9621
 
9203
9622
  ```shell
9204
- ascli faspex5 gateway @json:'{"url":"https://localhost:12345/aspera/faspex"}'
9623
+ ascli faspex5 gateway @json:'{"url":"https://localhost:12345/aspera/faspex","username":"fx4","password":"<PASSWORD>"}'
9205
9624
  ```
9206
9625
 
9626
+ Clients authenticate with HTTP Basic, as on Faspex 4, with the `username` and `password` of the gateway.
9627
+ Generate the password with `openssl rand -hex 32`.
9628
+ A weak password is refused at startup: its strength is estimated in bits, and shall be at least `password_min_bits`.
9629
+ `username` and `password` are mandatory when `url` is not a loopback address (`localhost`, `127.0.0.0/8`, `::1`): anyone reaching the gateway could send packages to anyone, as the Faspex 5 user.
9630
+ When they are not set, requests are accepted without authentication.
9631
+
9207
9632
  There are many limitations:
9208
9633
 
9209
9634
  - It's only to emulate the Faspex 4 `send` API (send package).
9210
9635
  - No support for remote sources, only for an actual file transfer by the client.
9211
9636
  - The client must use the transfer spec returned by the API (not `faspe:` URL).
9212
9637
  - Tags returned in transfer spec must be used in transfer.
9213
- - Only a single authentication is possible (per gateway) on Faspex 5.
9214
- - No authentication on the Faspex 4 side (ignored).
9638
+ - Only a single authentication is possible (per gateway) on Faspex 5: all packages are sent by the same Faspex 5 user.
9215
9639
 
9216
9640
  Behavior:
9217
9641
  The API client calls the Faspex 4 API on the gateway, then the gateway transforms this into a Faspex 5 API call, which returns a transfer spec, which is returned to the calling client.
9218
9642
  The calling client uses this to start a transfer to HSTS, which is managed by Faspex 5.
9219
9643
 
9220
- For other parameters, see [Web service](#web-service).
9221
-
9222
9644
  ### Faspex 5: Get Bearer token to use API
9223
9645
 
9224
9646
  If a command is missing, then it is still possible to call the API directly on the command line using `curl`:
9225
9647
 
9226
9648
  ```shell
9227
- curl -H "Authorization: $(ascli faspex5 bearer_token)" https://faspex5.example.com/aspera/faspex/api/v5/api_endpoint_here
9649
+ curl -H "Authorization: $(ascli faspex5 bearer_token --out.secrets=yes)" https://faspex5.example.com/aspera/faspex/api/v5/<API_ENDPOINT>
9228
9650
  ```
9229
9651
 
9230
9652
  ## Plugin: `shares`: IBM Aspera Shares v1
@@ -9263,12 +9685,24 @@ ascli shares admin share user_permissions %name:test1 create @json:'{"user_id":'
9263
9685
  ascli shares admin share user_permissions %name:test1 list
9264
9686
  ```
9265
9687
 
9266
- Share permissions (`user_permissions`, `group_permissions`) are identified by the user or group identifier: e.g. `show %username:john@example.com`.
9688
+ Share permissions are granted, modified and revoked on the share, with `share user_permissions` and `share group_permissions` (`create`, `list`, `show`, `modify`, `delete`).
9689
+ They are identified by the user or group identifier: e.g. `show %username:john@example.com`.
9267
9690
  Permissions not specified on creation take their default value.
9268
9691
  Available permissions: `browse_permission`, `download_permission`, `upload_permission`, `mkdir_permission`, `delete_permission`, `rename_permission`, `content_availability_permission`, `manage_permission`.
9269
9692
 
9270
9693
  > [!NOTE]
9271
- > Permissions of a user or group on all shares (`user all share_permissions`, `group all share_permissions`) are read-only: only `list` and `show` are available.
9694
+ > The permissions of a user or group on all shares are listed with `user all share_permissions` and `group all share_permissions`.
9695
+ > These are read-only (`list` and `show`): to change them, use `share user_permissions` and `share group_permissions`.
9696
+
9697
+ Example: Give a user (`jane@example.com`) the same share permissions as another user (`john@example.com`), using `jq`.
9698
+
9699
+ ```shell
9700
+ new_user_id=$(ascli shares admin user all show %username:jane@example.com --fields=id --out.level=data)
9701
+ ascli shares admin user all share_permissions %username:john@example.com list --format=json --out.level=data |
9702
+ jq -c '.[]' | while read -r permission; do
9703
+ ascli shares admin share user_permissions "$(jq .share_id <<< "$permission")" create @json:"$(jq -c --argjson id "$new_user_id" '{user_id: $id} + with_entries(select(.key | endswith("_permission")))' <<< "$permission")"
9704
+ done
9705
+ ```
9272
9706
 
9273
9707
  ### Tested commands for `shares`
9274
9708
 
@@ -9276,7 +9710,10 @@ Available permissions: `browse_permission`, `download_permission`, `upload_permi
9276
9710
  > Add `ascli shares` in front of the following commands:
9277
9711
 
9278
9712
  ```shell
9713
+ admin authenticate @: username=my_username password=<PASSWORD>
9714
+ admin directory list
9279
9715
  admin group all list
9716
+ admin group search list
9280
9717
  admin node list
9281
9718
  admin share list --fields=DEF,-status,status_message
9282
9719
  admin share user_permissions %name:my_share list
@@ -9291,6 +9728,7 @@ admin user all share_permissions %username:my_username show %name:my_share
9291
9728
  admin user ldap add the_name
9292
9729
  admin user local list
9293
9730
  admin user saml import @json:'{"id":"the_id","name_id":"the_name"}'
9731
+ admin user search list
9294
9732
  files browse /
9295
9733
  files delete my_share_folder/new_folder
9296
9734
  files delete my_share_folder/test_file.bin
@@ -9305,6 +9743,7 @@ files upload --to-folder=my_share_folder test_file.bin --transfer.agent=httpgw -
9305
9743
  files upload send_folder --to-folder=my_share_folder --transfer.agent=httpgw --transfer.url=https://tst.example.com/path --transfer.synchronous=true --transfer.api_version=v1 --transfer.upload_chunk_size=100000
9306
9744
  health --url=https://shares.example.com/path
9307
9745
  info
9746
+ share list
9308
9747
  ```
9309
9748
 
9310
9749
  ## Plugin: `console`: IBM Aspera Console
@@ -9338,6 +9777,32 @@ transfer smart sub my_smart_id @: source.paths.0=my_smart_file source_type=user_
9338
9777
 
9339
9778
  ## Plugin: `orchestrator`: IBM Aspera Orchestrator
9340
9779
 
9780
+ To write workflow files without the designer, refer to the [Workflow Authoring Guide](https://github.com/laurent-martin/aspera-orchestrator-plugins-doc/blob/main/docs/workflow-authoring-guide.md): file format, graph, execution, examples and REST API.
9781
+
9782
+ Command `workflows development` displays the documentation for workflow development, read from GitHub: this guide (`authoring`), or the [Action Template Reference](https://github.com/laurent-martin/aspera-orchestrator-plugins-doc/blob/main/docs/action-template-reference.md) (`templates`).
9783
+ With `toc`, it lists the sections of the document, and with the anchor of a section, it displays only that section.
9784
+ It does not require access to Orchestrator.
9785
+ The [MCP server](#plugin-mcp-model-context-protocol-server) instructs AI assistants to read it before writing or modifying a workflow.
9786
+
9787
+ ```shell
9788
+ ascli orchestrator workflows development authoring toc
9789
+ ascli orchestrator workflows development templates customruby
9790
+ ```
9791
+
9792
+ Command `plugins spec` displays the specifications of action plugins, read from GitHub: [plugins.yml](https://github.com/laurent-martin/aspera-orchestrator-plugins-doc/blob/main/docs/plugins.yml).
9793
+ For each plugin: template attributes (label, allowed values, defaults), and inputs and outputs of its steps, with the template settings they depend on.
9794
+ The fields are described in section [Plugin specifications](https://github.com/laurent-martin/aspera-orchestrator-plugins-doc/blob/main/docs/workflow-authoring-guide.md#plugin-specifications) of the guide.
9795
+ Without argument, it lists the plugins.
9796
+ With a plugin name (class name, case insensitive), it displays its specification, or one section: `attributes`, `inputs` or `outputs`.
9797
+ It does not require access to Orchestrator.
9798
+ Option `plugin_specs` gives another URL or path of the file, for example for another version of Orchestrator.
9799
+
9800
+ ```shell
9801
+ ascli orchestrator plugins spec --select=@json:'{"category":"Triggers"}'
9802
+ ascli orchestrator plugins spec AmazonS3Operation --format=yaml
9803
+ ascli orchestrator plugins spec ascpclient inputs
9804
+ ```
9805
+
9341
9806
  ### Authentication
9342
9807
 
9343
9808
  The Orchestrator plugin supports different credentials and authentication styles configured via `--auth_style`:
@@ -9380,6 +9845,99 @@ ascli orchestrator workflows start 1234 @json:'{"Param":"world !"}' @json:'{"ste
9380
9845
  > [!NOTE]
9381
9846
  > Options `synchronous` and `result` (`--result=<WORK_STEP>:<VARIABLE>`) are deprecated: use `execution` instead.
9382
9847
 
9848
+ ### Import a workflow
9849
+
9850
+ Command `workflows export` displays a workflow in Orchestrator's export format (YAML).
9851
+ With option `dependencies`, it saves instead a package (`.wkf`) that also contains the sub-workflows and remote nodes used by the workflow, in the folder given by option `to_folder` (default: current folder).
9852
+ Command `workflows import` creates a new workflow from such a file, and displays it, including its new `id`.
9853
+ The imported workflow is a draft: publish it with `workflows publish` before starting it.
9854
+
9855
+ Example: Copy workflow `1234` to another Orchestrator, where the imported workflow gets `id` `5678`:
9856
+
9857
+ ```shell
9858
+ ascli orchestrator workflows export 1234 --out.file=my_workflow.yml
9859
+ ascli orchestrator workflows import my_workflow.yml --preset=other_orchestrator --out.fields=id
9860
+ ascli orchestrator workflows publish 5678 --preset=other_orchestrator
9861
+ ```
9862
+
9863
+ Example: Save workflow `1234` with its dependencies in folder `/tmp`, and import the package:
9864
+
9865
+ ```shell
9866
+ ascli orchestrator workflows export 1234 @json:'{"dependencies":true}' --to-folder=/tmp
9867
+ ascli orchestrator workflows import /tmp/Workflow_my_workflow_v100.wkf
9868
+ ```
9869
+
9870
+ Command `workflows import` always creates a new workflow.
9871
+ Command `workflows import_with_constraints` imports a workflow file already present on the Orchestrator host, either as a new workflow or as a new revision of an existing workflow (`add_as_revision`), and resolves conflicts with existing global templates, sub-workflows and remote nodes.
9872
+ Command `workflows import` stores each uploaded file in folder `<run_dir>/workflows/import/` of the Orchestrator host.
9873
+
9874
+ Example: Add the file uploaded by a previous `workflows import` as a new revision of workflow `1234`, and publish it:
9875
+
9876
+ ```shell
9877
+ ascli orchestrator workflows import_with_constraints @json:'{"filename":"/opt/aspera/orchestrator/var/run/orchestrator/workflows/import/my_workflow.yml","add_as_revision":1234}'
9878
+ ascli orchestrator workflows publish 1234
9879
+ ```
9880
+
9881
+ #### Check a workflow before import
9882
+
9883
+ Orchestrator does not validate the graph of a workflow on import: an invalid workflow is imported, then fails to publish, or at run time.
9884
+ Command `workflows check_import` checks a workflow file (`.yml`) or package (`.wkf`) with the rules of the workflow designer, and does not need access to Orchestrator:
9885
+
9886
+ ```shell
9887
+ ascli orchestrator workflows check_import my_workflow.yml
9888
+ ```
9889
+
9890
+ It displays one line per issue, or `no problem found`.
9891
+ An issue has these fields:
9892
+
9893
+ | Field | Description |
9894
+ |------------|-------------|
9895
+ | `severity` | `error`: the workflow will not import, publish or run correctly. `warning`: to check. |
9896
+ | `code` | Stable identifier of the rule, for programs, for example `graph.step_orphan`. |
9897
+ | `file` | File of the package where the issue is (only for a `.wkf`). |
9898
+ | `path` | Where in the file, for example `graph/Step[Say hello]`. |
9899
+ | `message` | Description. |
9900
+
9901
+ Checked: format of the file (YAML, number of elements, plain format layout), attributes, `error_free`, action template keys, XML of the graph, `Start`, `End`, `Fail` and `Error` nodes, unique step names, step template, prerequisites, `Synch_factor`, steps that have no output or no prerequisite, references to outputs and parameters.
9902
+
9903
+ With the specifications of plugins (see `plugins spec`), it also checks action templates and the inputs of steps, for the settings of each template:
9904
+
9905
+ - plugin class name, attributes of the template, and their values (type, allowed values),
9906
+ - required inputs not mapped (`step.input_missing`),
9907
+ - inputs that the plugin does not have with this template, which Orchestrator ignores (`step.input_unknown`),
9908
+ - mapped outputs that the source step does not produce (`step.output_not_produced`).
9909
+
9910
+ If the specifications cannot be read (option `plugin_specs`), these checks are skipped, with a warning (`plugins.specs_unavailable`).
9911
+ Not checked: the plugins enabled on the server (see `workflows find_constraints`).
9912
+
9913
+ Command `workflows import` runs the same check, and logs the issues as warnings; it does not stop the import.
9914
+ Use `--log-level=warn` to see them.
9915
+
9916
+ The check is done by `ascli`, behind one method that has the shape of a REST operation: the file goes in, a structure with `valid`, `file_name` and the list of `issues` comes out.
9917
+ It can be replaced by a call to Orchestrator if such an API becomes available.
9918
+
9919
+ #### Resolve conflicts before import
9920
+
9921
+ The web interface of Orchestrator lists the conflicts with existing sub-workflows, global templates and remote nodes, and the plugins to enable, and asks for a choice for each of them.
9922
+ Command `workflows find_constraints` does the same for a file present on the Orchestrator host (see `workflows import_with_constraints`):
9923
+
9924
+ ```shell
9925
+ ascli orchestrator workflows find_constraints /opt/aspera/orchestrator/var/run/orchestrator/workflows/import/my_workflow.yml
9926
+ ascli orchestrator workflows find_constraints /opt/aspera/orchestrator/var/run/orchestrator/workflows/import/my_workflow.yml 1234
9927
+ ```
9928
+
9929
+ The optional second argument is the id of the workflow that receives the file as a new revision.
9930
+ Each line is a conflict (`type`: `subwf_constraints`, `action_template_constraints`, `remote_node_constraints`), with its `name` and the possible `choices`, or a plugin to enable (`missing_plugins`).
9931
+ The `type` is the key to use in the argument of `import_with_constraints`.
9932
+ Orchestrator does not check that the file exists: a wrong path gives the same answer as a file without conflict.
9933
+
9934
+ Orchestrator does not refuse an incomplete resolution: `workflows import_with_constraints` checks with `find_constraints` first, and refuses to import in these cases:
9935
+
9936
+ - Plugins are not enabled and `auto_enable_missing_plugins` is not `true` (Orchestrator fails with an internal error).
9937
+ - A resolution is given for some conflicts of a type, but not all (Orchestrator imports the others as copies, without error).
9938
+
9939
+ `auto_enable_missing_plugins` must be a boolean (`true` or `false`): Orchestrator takes the string `"false"` as true, and `ascli` refuses a string.
9940
+
9383
9941
  ### Tested commands for `orchestrator`
9384
9942
 
9385
9943
  > [!NOTE]
@@ -9390,9 +9948,16 @@ ascli orchestrator workflows start 1234 @json:'{"Param":"world !"}' @json:'{"ste
9390
9948
  --auth_style=token workflow list
9391
9949
  health
9392
9950
  info
9393
- monitors
9951
+ journal files journal --query=@json:'{"details":"false"}'
9952
+ monitors list node
9953
+ monitors snapshot
9394
9954
  plugins list
9955
+ plugins spec --select=@json:'{"category":"Triggers"}'
9956
+ plugins spec AmazonS3Operation --format=yaml
9957
+ plugins spec ascpclient inputs
9395
9958
  processes
9959
+ queues list
9960
+ workflow check_import orch_wf_check.yml
9396
9961
  workflow details my_workflow_id
9397
9962
  workflow export my_workflow_id
9398
9963
  workflow inputs my_workflow_id
@@ -9405,6 +9970,8 @@ workflow status ALL
9405
9970
  workflow status my_workflow_id
9406
9971
  workflow workorders my_workflow_id
9407
9972
  workflow workorders my_workflow_id --fields=id --query.max_results=1
9973
+ workflows development authoring toc
9974
+ workflows development templates customruby
9408
9975
  workorder cancel <id>
9409
9976
  workorder output <id>
9410
9977
  workorder reset <id>
@@ -9443,7 +10010,7 @@ If you already have these parameters, provide the following options to `ascli`:
9443
10010
  Example: Create a Default Configuration
9444
10011
 
9445
10012
  ```shell
9446
- ascli config preset update <COS_PRESET_NAME> --bucket=mybucket --endpoint=https://s3.us-east.cloud-object-storage.appdomain.cloud --apikey=abcdefgh --crn=crn:v1:bluemix:public:iam-identity::a/xxxxxxx
10013
+ ascli config preset update <COS_PRESET_NAME> --bucket=mybucket --endpoint=https://s3.us-east.cloud-object-storage.appdomain.cloud --apikey=<API_KEY> --crn=<CRN>
9447
10014
  ascli config preset set default cos <COS_PRESET_NAME>
9448
10015
  ```
9449
10016
 
@@ -9470,7 +10037,7 @@ Or, using the IBM Cloud CLI:
9470
10037
 
9471
10038
  ```shell
9472
10039
  ibmcloud resource service-keys
9473
- ibmcloud resource service-key _service_key_name_here_ --output JSON|jq '.[0].credentials'>$HOME/service_creds.json
10040
+ ibmcloud resource service-key <SERVICE_KEY_NAME> --output JSON|jq '.[0].credentials'>$HOME/service_creds.json
9474
10041
  ```
9475
10042
 
9476
10043
  > [!NOTE]
@@ -9914,7 +10481,7 @@ The preview generator supports rendering of those file categories:
9914
10481
  - `office`
9915
10482
  - `video`
9916
10483
 
9917
- To avoid generation for some categories, specify a list using option `skip_types`.
10484
+ To avoid generation for some categories, specify a list using option `skip_types`, for example, `--skip-types=office` or `--skip-types=@list:,office,video`.
9918
10485
 
9919
10486
  Each category has a specific rendering method to produce the PNG thumbnail.
9920
10487
 
@@ -9980,9 +10547,9 @@ The `mcp` plugin starts a [Model Context Protocol (MCP)](https://modelcontextpro
9980
10547
  The server registers a single tool, `execute_ascli_command`, which executes any `ascli` command in-process and returns the result as text.
9981
10548
 
9982
10549
  > [!IMPORTANT]
9983
- > The `mcp` and `rack` gems are required.
9984
- > Check section [Installing Optional Gems](#installing-optional-gems).
9985
- > Install them with the following command:
10550
+ > The `mcp` and `rack` gems are required, see section [Installing Optional Gems](#installing-optional-gems).
10551
+
10552
+ Install them with the following command:
9986
10553
 
9987
10554
  ```shell
9988
10555
  gem install mcp rack
@@ -9993,28 +10560,29 @@ gem install mcp rack
9993
10560
  ```shell
9994
10561
  ascli mcp server
9995
10562
  ascli mcp server @: instructions="Use this server to manage Aspera transfers"
9996
- ascli mcp server @: transport=http port=3000
10563
+ ascli mcp server @: transport=http
9997
10564
  ```
9998
10565
 
9999
10566
  ### `server` command options
10000
10567
 
10001
- The `server` command accepts an optional [Hash](#extended-value-syntax) argument with the following keys:
10568
+ The `server` command accepts an optional [Hash](#extended-value-syntax) argument with the following keys.
10569
+ Keys of a transport are refused with the other transport.
10002
10570
 
10003
10571
  #### General
10004
10572
 
10005
10573
  | Key | Type | Default | Description |
10006
- |-----|------|---------|-------------|
10007
- | `transport` | `string` | `stdio` | Transport to use: `stdio` or `http` |
10008
- | `description` | `string` | - | Short description of the server shown in the AI client UI |
10009
- | `instructions` | `string` | - | Longer hint shown to the AI client describing what the server does and how to use it |
10574
+ |---|---|---|---|
10575
+ | `transport` | `string` | `stdio` | Transport to use: `stdio` or `http` |
10576
+ | `description` | `string` | - | Short description of the server shown in the AI client UI |
10577
+ | `instructions` | `string` | - | Longer hint shown to the AI client describing what the server does and how to use it |
10010
10578
  | `protocol_version` | `string` | - | MCP protocol version to advertise, for example, `2024-11-05` |
10011
10579
  | `validate_tool_call_arguments` | `boolean` | `true` | Whether to validate tool arguments against the input schema |
10012
- | `max_text_bytes` | `integer` | `100000` | Maximum byte size of the JSON text content for list results. Items are appended whole until the limit is reached; the full list is always available in `structuredContent` |
10580
+ | `max_text_bytes` | `integer` | `100000` | Maximum byte size of the JSON text content for list results. Items are appended whole until the limit is reached; the full list is always available in `structuredContent` |
10013
10581
 
10014
10582
  #### `stdio` transport
10015
10583
 
10016
10584
  | Key | Type | Default | Description |
10017
- |-----|------|---------|-------------|
10585
+ |-----|-----|-----|-----|
10018
10586
  | `max_line_bytes` | `integer` | 4194304 (4 MiB) | Maximum JSON frame size in bytes |
10019
10587
 
10020
10588
  > [!NOTE]
@@ -10025,9 +10593,17 @@ The `server` command accepts an optional [Hash](#extended-value-syntax) argument
10025
10593
  #### `http` transport (Streamable HTTP)
10026
10594
 
10027
10595
  | Key | Type | Default | Description |
10028
- |-----|------|---------|-------------|
10029
- | `port` | `integer` | `3000` | TCP port to listen on |
10030
- | `bind` | `string` | `127.0.0.1` | Bind address |
10596
+ |-----|-----|-----|-----|
10597
+ | `url` | `string` | `http://127.0.0.1:3000` | Address and port the server listens on, without path, for example, `http://0.0.0.0:3000`. Use `https://` for TLS. |
10598
+ | `cert` | `string` | - | With `https://`: path to the TLS certificate file, PEM or PKCS12 (`.p12`, `.pfx`). Without `cert` and `key`, a self-signed certificate is generated. |
10599
+ | `key` | `string` | - | With `https://`: path to the PEM private key file, or the PKCS12 passphrase. |
10600
+ | `chain` | `string` | - | With `https://`: path to the PEM certificate chain file. |
10601
+ | `public_url` | `string` | from `url` | URL of the server for clients, used in OAuth metadata and in the URL of secret pages, for example, `https://your-server:3000`. Mandatory with `oauth` when the host of `url` is `0.0.0.0` or `::`. |
10602
+ | `auth_token` | `string` | - | Static Bearer token. If set, all MCP requests must carry `Authorization: Bearer <token>`, else HTTP 401. Cannot be empty. It is also the access code asked on secret pages, and on the consent page with `oauth`. Generate it with `openssl rand -hex 32`. |
10603
+ | `auth_token_min_bits` | `integer` | `80` | Minimum estimated strength of `auth_token`, in bits: a weak token is refused at startup. The estimate uses the optional gem `zxcvbn` if installed, else a built-in estimate. `0` disables the check. |
10604
+ | `oauth` | `boolean` | `false` | Enable OAuth 2.0 PKCE flow with dynamic client registration. When `true`, clients register automatically and users authenticate via a browser consent page. |
10605
+ | `oauth_access_token_ttl` | `integer` | `3600` | OAuth access token lifetime in seconds. |
10606
+ | `oauth_refresh_token_ttl` | `integer` | `2592000` | OAuth refresh token lifetime in seconds (30 days). |
10031
10607
  | `stateless` | `boolean` | `false` | Enable stateless mode |
10032
10608
  | `allowed_origins` | `Array<string>` | - | List of allowed origins |
10033
10609
  | `allowed_hosts` | `Array<string>` | - | List of allowed hostnames |
@@ -10035,8 +10611,98 @@ The `server` command accepts an optional [Hash](#extended-value-syntax) argument
10035
10611
  | `max_sessions` | `integer` | - | Maximum number of concurrent sessions |
10036
10612
 
10037
10613
  > [!NOTE]
10038
- > **HTTP transport discovery endpoint** - When using `http` transport, the server exposes a `GET /` endpoint that returns a JSON object with `name`, `version`, and `description` fields.
10039
- > AI clients that support this convention (such as Bob) automatically read the description from this endpoint and display it in their MCP server list without any manual configuration.
10614
+ > `port` and `bind` are deprecated: use `url`, for example, `url=http://0.0.0.0:8080` instead of `port=8080 bind=0.0.0.0`.
10615
+
10616
+ ### Security
10617
+
10618
+ > [!WARNING]
10619
+ > The tool executes any `ascli` command with the credentials and presets of the user running the server.
10620
+ > When the host of `url` or `public_url` is not a loopback address, `auth_token` is **mandatory**, also with `oauth`: the server refuses to start without it.
10621
+
10622
+ With the `http` transport:
10623
+
10624
+ - With `oauth`, the consent page asks for `auth_token` as access code, else anyone reaching the server could approve its own client.
10625
+ It shows where the authorization is sent (origin of `redirect_uri`): allow only if it is the expected AI client, for example `http://127.0.0.1:<port>`.
10626
+ - For local-only deployments (hosts of `url` and `public_url` are loopback: `localhost`, `127.0.0.0/8`, `::1`), `auth_token` and `oauth` are optional but recommended.
10627
+ Without `auth_token`, the consent page only asks to click **Allow**.
10628
+ - `auth_token` and `oauth` can coexist: a request is accepted if it carries a valid static token **or** a valid OAuth access token.
10629
+ - A weak `auth_token` is refused at startup (see `auth_token_min_bits`): generate it with `openssl rand -hex 32`.
10630
+ - On a network, use `https://` in `url` (or a reverse proxy with TLS): with `http://`, the token is sent in clear.
10631
+ - `allowed_hosts` and `allowed_origins` protect against DNS rebinding but do not authenticate clients.
10632
+ They apply to all endpoints, also OAuth and secret pages, which also accept the origin of `public_url` (for a reverse proxy that changes header `Host`).
10633
+
10634
+ With both transports:
10635
+
10636
+ - Extended value `@stdin:` is refused.
10637
+ - `@secret:` is entered by the user on a web page, see [Secrets entered in a web page](#secrets-entered-in-a-web-page).
10638
+ - Secrets are hidden in responses, also a value shorter than 8 characters as a word in a text (for example, a short password in an error message).
10639
+ - The [Security Level](#security-level) is `high` by default: `@ruby:`, `@file:`, `@uri:`, and `@env:` are refused, and a secret must be the whole value: hidden in results, it cannot be processed by another extended value.
10640
+ It applies to commands sent by the client, and to presets, because the client can modify presets.
10641
+ Commands sent by the client cannot change option `security`.
10642
+
10643
+ To use another level, set option `security` when starting the server, for example:
10644
+
10645
+ ```shell
10646
+ ascli mcp server --security.level=medium --security.allowed_paths.0=$HOME/.aspera/ascli/my_private_key
10647
+ ```
10648
+
10649
+ > [!NOTE]
10650
+ > A level set by option also applies to the parameters of the `server` command: for example, `auth_token=@env:MCP_TOKEN` requires level `low`.
10651
+ > Without option `security`, the parameters of the `server` command are not restricted.
10652
+ >
10653
+ > A preset created by `aoc wizard` or `faspex5 wizard` reads the private key with `@file:`.
10654
+ > With level `high`, either store the key in the preset (`ascli config preset set <AOC_ORG> private_key @file:<PATH>`, without `@val:`), or use level `medium` with the key in `allowed_paths`.
10655
+
10656
+ ### HTTP endpoints
10657
+
10658
+ With the `http` transport, the server exposes the following endpoints:
10659
+
10660
+ | Endpoint | Description |
10661
+ |---|---|
10662
+ | `GET /` | Discovery: JSON object with `name`, `version`, and `description` of the server, no authentication |
10663
+ | `POST`, `GET`, `DELETE` `/mcp` | MCP endpoint (Streamable HTTP), the URL to configure in the AI client. Requires `auth_token` or an OAuth access token, if configured |
10664
+ | `GET`, `POST` `/secret/<id>` | Secret pages, see [Secrets entered in a web page](#secrets-entered-in-a-web-page) |
10665
+ | `GET /.well-known/oauth-authorization-server` | With `oauth`: OAuth discovery metadata (RFC 8414) |
10666
+ | `POST /oauth/register` | With `oauth`: Dynamic client registration (RFC 7591) — any client may register and receive a `client_id`. At most 100 clients are kept: beyond, the least recently used is removed. At most 10 `redirect_uris`, absolute and without fragment |
10667
+ | `GET /oauth/authorize` | With `oauth`: Consent page shown to the user in a browser, with the `client_id` and where the code is sent (origin of `redirect_uri`) |
10668
+ | `POST /oauth/authorize` | With `oauth`: Processes the user decision (allow/deny) and issues an authorization code |
10669
+ | `POST /oauth/token` | With `oauth`: Exchanges the code for tokens (`authorization_code`) or renews them (`refresh_token`) |
10670
+
10671
+ AI clients that support the discovery endpoint (such as Bob) read the description from it and display it in their MCP server list without any manual configuration.
10672
+
10673
+ AI clients that support the MCP Authorization spec (such as Bob) detect the OAuth endpoints automatically via the `WWW-Authenticate` header returned on HTTP 401, register dynamically, and launch the browser-based login flow without any extra configuration.
10674
+
10675
+ ### Secrets entered in a web page
10676
+
10677
+ [Extended Value](#extended-value-syntax) `@secret:[name]` asks for a secret, for example, a password.
10678
+ In MCP server mode, there is no terminal: the user enters the secret on a web page of the server instead, following the [URL mode elicitation](https://modelcontextprotocol.io/specification/2026-07-28/client/elicitation) of the MCP protocol.
10679
+ The secret goes from the browser to the MCP server only: it is not sent to the MCP client or the AI model, and it is hidden in the results of the command.
10680
+
10681
+ `@secret:` can be used in commands sent by the AI client, for example, `--password=@secret:password`, and in presets of the user running the server.
10682
+
10683
+ For a command that needs a secret:
10684
+
10685
+ 1. The server replies to the tool call with the URL of a secret page.
10686
+ 1. The MCP client shows the URL and asks the user for consent to open it in a browser.
10687
+ 1. The user enters the secret on the page and submits it, or cancels.
10688
+ 1. The MCP client calls the tool again, and the server executes the command with the secret.
10689
+
10690
+ If the command needs several secrets, these steps are repeated for each secret.
10691
+
10692
+ The secret page is served:
10693
+
10694
+ - With the `http` transport: by the MCP server, at `<public_url>/secret/<id>`.
10695
+ If `auth_token` is set, the page also asks for it as access code.
10696
+ Set `public_url` if the browser does not reach the server on the address of `url`.
10697
+ - With the `stdio` transport: by a local web server on `http://127.0.0.1` with a random port, started on first use.
10698
+
10699
+ A secret request expires after 10 minutes.
10700
+ Secrets are kept in memory only, until the command completes.
10701
+
10702
+ > [!NOTE]
10703
+ > The MCP client must support URL mode elicitation (capability `elicitation.url`), else the command fails with an error.
10704
+ > Protocol `2026-07-28` (result `input_required`) and `2025-11-25` (request `elicitation/create` from the server) are supported.
10705
+ > With protocol `2025-11-25`, the `http` transport must not be `stateless`.
10040
10706
 
10041
10707
  ### Examples
10042
10708
 
@@ -10049,7 +10715,13 @@ ascli mcp server
10049
10715
  Start an MCP server over HTTP on port 8080:
10050
10716
 
10051
10717
  ```shell
10052
- ascli mcp server @: transport=http port=8080 bind=0.0.0.0
10718
+ ascli mcp server @: transport=http url=http://0.0.0.0:8080 auth_token=@env:MCP_TOKEN
10719
+ ```
10720
+
10721
+ Start an MCP server over HTTPS, with a certificate:
10722
+
10723
+ ```shell
10724
+ ascli mcp server @: transport=http url=https://0.0.0.0:8443 cert=<PATH>/cert.pem key=<PATH>/key.pem auth_token=@env:MCP_TOKEN
10053
10725
  ```
10054
10726
 
10055
10727
  Start with custom instructions and a specific protocol version:
@@ -10058,14 +10730,22 @@ Start with custom instructions and a specific protocol version:
10058
10730
  ascli mcp server @: instructions="Aspera transfer automation" protocol_version=2024-11-05
10059
10731
  ```
10060
10732
 
10733
+ Start an MCP server with OAuth 2.0 PKCE authentication (for AI clients such as Bob that support the MCP Authorization spec):
10734
+
10735
+ ```shell
10736
+ ascli mcp server @: transport=http url=http://0.0.0.0:3000 public_url=http://your-server:3000 oauth=true auth_token=@env:MCP_TOKEN
10737
+ ```
10738
+
10061
10739
  ### MCP client configuration
10062
10740
 
10063
10741
  #### Streamable HTTP transport
10064
10742
 
10743
+ ##### Local server (no authentication required)
10744
+
10065
10745
  Start the server in a separate terminal first:
10066
10746
 
10067
10747
  ```shell
10068
- ascli mcp server @: transport=http port=3000
10748
+ ascli mcp server @: transport=http
10069
10749
  ```
10070
10750
 
10071
10751
  Then register it in the AI client's MCP configuration file.
@@ -10096,6 +10776,77 @@ For other clients (Claude Desktop, VS Code, and so on):
10096
10776
  }
10097
10777
  ```
10098
10778
 
10779
+ ##### Remote server with static token
10780
+
10781
+ When the server is exposed on a non-local address, `auth_token` is required.
10782
+
10783
+ **Option A: static Bearer token** - suitable for all MCP clients.
10784
+ Set the token in the environment and start the server:
10785
+
10786
+ ```shell
10787
+ export MCP_TOKEN=$(openssl rand -hex 32)
10788
+ ascli mcp server @: transport=http url=http://0.0.0.0:3000 auth_token=@env:MCP_TOKEN
10789
+ ```
10790
+
10791
+ For [**IBM Bob**](https://bob.ibm.com/docs/ide/configuration/mcp/mcp-in-bob), pass the same token in the `Authorization` header:
10792
+
10793
+ ```json
10794
+ {
10795
+ "mcpServers": {
10796
+ "ascli": {
10797
+ "type": "streamable-http",
10798
+ "url": "http://your-server:3000/mcp",
10799
+ "headers": {
10800
+ "Authorization": "Bearer <TOKEN>"
10801
+ }
10802
+ }
10803
+ }
10804
+ }
10805
+ ```
10806
+
10807
+ For other clients (Claude Desktop, VS Code, and so on):
10808
+
10809
+ ```json
10810
+ {
10811
+ "mcpServers": {
10812
+ "ascli": {
10813
+ "type": "http",
10814
+ "url": "http://your-server:3000/mcp",
10815
+ "headers": {
10816
+ "Authorization": "Bearer <TOKEN>"
10817
+ }
10818
+ }
10819
+ }
10820
+ }
10821
+ ```
10822
+
10823
+ ##### Remote server with OAuth 2.0 PKCE
10824
+
10825
+ **Option B: OAuth 2.0 PKCE flow** - for AI clients that support the MCP Authorization spec (such as Bob).
10826
+ No token to configure in the client: the client registers dynamically and opens a browser window for user consent on first connection.
10827
+ The consent page asks for the access code: the value of `auth_token`.
10828
+
10829
+ Start the server with OAuth enabled:
10830
+
10831
+ ```shell
10832
+ ascli mcp server @: transport=http url=http://0.0.0.0:3000 public_url=http://your-server:3000 oauth=true auth_token=@env:MCP_TOKEN
10833
+ ```
10834
+
10835
+ For [**IBM Bob**](https://bob.ibm.com/docs/ide/configuration/mcp/mcp-in-bob), register the URL with no extra configuration:
10836
+
10837
+ ```json
10838
+ {
10839
+ "mcpServers": {
10840
+ "ascli": {
10841
+ "type": "streamable-http",
10842
+ "url": "http://your-server:3000/mcp"
10843
+ }
10844
+ }
10845
+ }
10846
+ ```
10847
+
10848
+ Bob detects the OAuth endpoints via the `WWW-Authenticate` header on the first HTTP 401 response and triggers the browser-based login flow automatically.
10849
+
10099
10850
  > [!NOTE]
10100
10851
  > With `http` transport, the client connects to a running server process.
10101
10852
  > The server must be started and kept running independently before the AI client tries to connect.
@@ -10174,18 +10925,14 @@ server @: transport=http port=13777
10174
10925
 
10175
10926
  ### End-to-end AI testing
10176
10927
 
10177
- The file [`docs/test-mcp-with-ai.md`](test-mcp-with-ai.md) contains a step-by-step test
10178
- procedure for validating the MCP server with a live AI assistant (Bob, Claude Desktop,
10179
- VS Code Copilot, or any MCP-capable client).
10180
- It covers tool visibility, self-discovery, Hash schema introspection, option listing,
10181
- documentation retrieval, live transfer tasks, truncation handling, error handling, and
10182
- credential safety.
10928
+ The file [`docs/test-mcp-with-ai.md`](test-mcp-with-ai.md) contains a step-by-step test procedure for validating the MCP server with a live AI assistant (Bob, Claude Desktop, VS Code Copilot, or any MCP-capable client).
10929
+ It covers tool visibility, self-discovery, Hash schema introspection, option listing, documentation retrieval, live transfer tasks, truncation handling, error handling, and credential safety.
10183
10930
 
10184
10931
  ### MCP usage patterns for AI
10185
10932
 
10186
10933
  > [!TIP]
10187
- > This section is for AI assistants using the MCP server. Follow these patterns to avoid
10188
- > common first-call failures and unnecessary retries.
10934
+ > This section is for AI assistants using the MCP server.
10935
+ > Follow these patterns to avoid common first-call failures and unnecessary retries.
10189
10936
 
10190
10937
  #### Session bootstrap
10191
10938
 
@@ -10196,8 +10943,7 @@ Always start a session with two discovery calls before doing anything else:
10196
10943
  ["config", "preset", "show", "default"]
10197
10944
  ```
10198
10945
 
10199
- The second call returns the mapping from `plugin` to `preset_name` so you know which credentials
10200
- are active for each plugin.
10946
+ The second call returns the mapping from `plugin` to `preset_name` so you know which credentials are active for each plugin.
10201
10947
 
10202
10948
  #### Command discovery
10203
10949
 
@@ -10206,8 +10952,7 @@ Add command words to list only the commands under that path, e.g. `["config", "c
10206
10952
  A line ending with `<command...>` provides the commands of another plugin, given by `(see: ...)`.
10207
10953
  Use option `--expand-mounts=yes` to list them in place.
10208
10954
  Omit `<plugin>` to list the commands of all plugins (much larger result).
10209
- Never guess command names from training data: names like `shared_folders` vs
10210
- `shared_inboxes` are easily confused.
10955
+ Never guess command names from training data: names like `shared_folders` vs `shared_inboxes` are easily confused.
10211
10956
 
10212
10957
  #### Schema introspection for Hash arguments
10213
10958
 
@@ -10217,13 +10962,22 @@ Whenever a command syntax shows a Hash argument (e.g. `<account:Hash>`), call `h
10217
10962
  ["<plugin>", "<cmd>", ..., "help"]
10218
10963
  ```
10219
10964
 
10220
- This returns a table of field names, types, and descriptions. Never infer field names from
10221
- server error messages.
10965
+ This returns a table of field names, types, and descriptions.
10966
+ Never infer field names from server error messages.
10967
+
10968
+ #### Secrets
10969
+
10970
+ To use a secret the user did not provide (password, passphrase), pass `@secret:<name>` as value.
10971
+ The user enters it on a web page and you never see it: prefer it to asking for the secret in the conversation.
10972
+
10973
+ ```json
10974
+ ["server", "browse", "/", "--url=ssh://host:33001", "--username=user", "--password=@secret:password"]
10975
+ ```
10222
10976
 
10223
10977
  #### Async transfers and cross-call status tracking
10224
10978
 
10225
- The `direct` agent keeps transfer state in-memory. A job started in one MCP call **cannot**
10226
- be monitored in a subsequent call: the in-memory agent is gone between calls.
10979
+ The `direct` agent keeps transfer state in-memory.
10980
+ A job started in one MCP call **cannot** be monitored in a subsequent call: the in-memory agent is gone between calls.
10227
10981
 
10228
10982
  Use the `transferd` agent when you need to check transfer status in a later call:
10229
10983
 
@@ -10235,8 +10989,8 @@ The `desktop` agent is also unaffected because it runs in an external process.
10235
10989
 
10236
10990
  #### Workspace context for AoC
10237
10991
 
10238
- `aoc files` and `aoc packages` commands require a workspace context. If no default
10239
- workspace is configured in the preset, always add `--workspace=NAME`:
10992
+ `aoc files` and `aoc packages` commands require a workspace context.
10993
+ If no default workspace is configured in the preset, always add `--workspace=NAME`:
10240
10994
 
10241
10995
  ```json
10242
10996
  ["aoc", "files", "ls", "/", "--workspace=MyWorkspace"]
@@ -10247,7 +11001,8 @@ List available workspaces with `["aoc", "user", "workspaces", "list"]`.
10247
11001
  #### Admin operations and privilege checks
10248
11002
 
10249
11003
  Before calling any `admin` sub-command, verify that the active preset has admin rights.
10250
- `access_denied` typically means the wrong preset is active, not a syntax error. Check with:
11004
+ `access_denied` typically means the wrong preset is active, not a syntax error.
11005
+ Check with:
10251
11006
 
10252
11007
  ```json
10253
11008
  ["config", "preset", "show", "<preset_name>"]
@@ -10395,14 +11150,14 @@ ascli config sync spec
10395
11150
  | `exclude_dirs_older_than.absolute` | `String` | UTC timestamp. Empty value for disabled. |
10396
11151
  | `exclude_dirs_older_than.relative_seconds` | `Integer` | Relative to async start time. `-1` for disabled.<br/>Default: `-1`. |
10397
11152
  | `exclude_dirs_older_than` | `Hash` | Don't scan directories with a recursive modified time older than absolute or async start time - relative_seconds |
10398
- | `filters[].rule` | `String` | The rule for the filter.<br/>Allowed values: `include`, `exclude`, `include_from`, `exclude_from`. |
10399
- | `filters[].value` | `String` | On include or exclude, the filter's pattern. On include_from or exclude_from, the path containing filter specifications |
11153
+ | `filters[].rule` | `String` | The rule for the filter.<br/>Required.<br/>Allowed values: `include`, `exclude`, `include_from`, `exclude_from`. |
11154
+ | `filters[].value` | `String` | On include or exclude, the filter's pattern. On include_from or exclude_from, the path containing filter specifications<br/>Required. |
10400
11155
  | `filters` | `Array[Hash]` | The filters allow to further specify which files have to be excluded and included from the transfer list. Each filter is defined by a rule and a value. Order of filters matters |
10401
11156
  | `ignore_delete` | `Bool` | Do not copy removals to the peer.<br/>Default: `false`.<br/>(`--ignore-delete`) |
10402
- | `ignore_mode` | `Bool` | Source files that have had their mode changed after the initial. transfer will not update the destination file mode.<br/>Default: `false`.<br/>(`--ignore-mode`) |
10403
- | `ignore_remote_host_sync_name` | `Bool` | Do not check that the remote host being used for the current. transfer matches the host used when the local database was created<br/>Default: `false`. |
11157
+ | `ignore_mode` | `Bool` | Source files that have had their mode changed after the initial transfer will not update the destination file mode.<br/>Default: `false`.<br/>(`--ignore-mode`) |
11158
+ | `ignore_remote_host_sync_name` | `Bool` | Do not check that the remote host being used for the current transfer matches the host used when the local database was created<br/>Default: `false`. |
10404
11159
  | `local.pass` | `String` | Authenticate the local async with the specified password. |
10405
- | `local.path` | `String` | The directory to be synchronized on the local host.<br/>(`--local-dir={string}`)(-d) |
11160
+ | `local.path` | `String` | The directory to be synchronized on the local host.<br/>Required.<br/>(`--local-dir={string}`)(-d) |
10406
11161
  | `local_apply_docroot` | `Bool` | Prepend the docroot to the directory on the local host.<br/>Default: `false`.<br/>(`--apply-local-docroot`) |
10407
11162
  | `local_checksum_threads` | `Integer` | Maximum number of threads to do checksum on the local host. Value must be between 1 and 99.<br/>Default: `4`.<br/>(`--local-checksum-threads={integer}`) |
10408
11163
  | `local_db_dir` | `String` | Use the specified database directory on the local host. Default is `.private-asp` at the root level of the synchronized directory.<br/>(`--local-db-dir={string}`)(-b) |
@@ -10414,19 +11169,19 @@ ascli config sync spec
10414
11169
  | `local_move_cache_timeout_seconds` | `Integer` | Delay in seconds before aborting moving a file from local cache to final destination. `-1` for disabled.<br/>Default: `-1`.<br/>(`--local-move-cache-timeout={integer}`) |
10415
11170
  | `local_preserve_acls` | `String` | Preserve access control lists on the local host.<br/>Allowed values: `native`, `metafile`, `none`.<br/>Default: `none`.<br/>(`--preserve-acls={enum}`) |
10416
11171
  | `local_preserve_xattrs` | `String` | Preserve extended attributes on the local.<br/>Allowed values: `native`, `metafile`, `none`.<br/>Default: `none`.<br/>(`--preserve-xattrs={enum}`) |
10417
- | `local_scan_interval_milliseconds` | `Integer` | Enable periodic scans on the local host during a continuous sync. `-1` for disabled<br/>Default: `-1`.<br/>(`--scan-interval={integer}`) |
11172
+ | `local_scan_interval_milliseconds` | `Integer` | Enable periodic scans on the local host during a continuous sync. `-1` for disabled. On the command line, the value is a duration, e.g. `1h 30m`, `2s500ms`, `5:30`, `1d 02:00:00.250`. A plain number is in seconds. Stored in milliseconds.<br/>Default: `-1`.<br/>(`--scan-interval={integer}`) |
10418
11173
  | `local_scan_threads` | `Integer` | Number of directory scanning threads on the local host. Value must be between 1 and 99<br/>Default: `1`.<br/>(`--scan-threads={integer}`) |
10419
11174
  | `local_stat_cache_size` | `Integer` | Set stat cache size on the local host. 0 for disabled.<br/>Default: `0`. |
10420
- | `local` | `Hash` | &nbsp; |
11175
+ | `local` | `Hash` | Required. |
10421
11176
  | `log.level` | `String` | Use the specified log level.<br/>Allowed values: `log`, `dbg1`, `dbg2`.<br/>Default: `log`.<br/>(special:`-D`) |
10422
11177
  | `log.local_dir` | `String` | Use the specified logging directory on the local host.<br/>(`--alt-logdir={string}`)(-L) |
10423
11178
  | `log.remote_dir` | `String` | Use the specified logging directory on the remote host.<br/>(`--remote-logdir={string}`)(-R) |
10424
- | `log` | `Hash` | &nbsp; |
11179
+ | `log` | `Hash` | |
10425
11180
  | `manifest_path` | `String` | A directory path where ascp will create manifest TEXT files (passed to ascp as --file-manifest-path) |
10426
11181
  | `mirror` | `Bool` | Force the pulling side to be exactly like the pushing side, removing files on the destination that don't exist on the source and resending source files that don't have an exact match on the destination. Cannot be used in bi-directional mode.<br/>Default: `false`.<br/>(`--mirror`) |
10427
11182
  | `mode` | `String` | Specify whether async runs continuously or not. In `one_time` mode, async stops after the first full synchronization. `continuous` supported only if the source is Windows or Linux.<br/>Allowed values: `one_time`, `continuous`.<br/>Default: `one_time`.<br/>(special:`--continuous`)(-C) |
10428
11183
  | `monitor_buffer_size` | `Integer` | Bytes to allocate for the change monitor buffer. Applies to any Windows machine on either side. `-1` to use the computed value.<br/>Default: `-1`. |
10429
- | `name` | `String` | Name of the synchronization pair.<br/>(`--name={string}`)(-N) |
11184
+ | `name` | `String` | Name of the synchronization pair.<br/>Required.<br/>(`--name={string}`)(-N) |
10430
11185
  | `no_log` | `String` | Suppress log messages for ITEM. The only currently supported ITEM is 'stats', which suppresses both STATS and PROG log messages.<br/>(`--no-log={string}`) |
10431
11186
  | `no_preserve_root_attrs` | `Bool` | Disable the preservation of attributes on the Sync root.<br/>Default: `false`.<br/>(`--no-preserve-root-attrs`) |
10432
11187
  | `no_scan` | `Bool` | Skip initial scanning.<br/>Default: `false`.<br/>(`--no-scan`) |
@@ -10444,20 +11199,20 @@ ascli config sync spec
10444
11199
  | `quiet` | `Bool` | Disable progress display.<br/>Default: `true`.<br/>(`--quiet`)(-q) |
10445
11200
  | `remote.connect_mode` | `String` | Define how to connect to the remote.<br/>Allowed values: `ssh`, `ws`.<br/>Default: `ssh`.<br/>(special:`--ws-connect`) |
10446
11201
  | `remote.fingerprint` | `String` | Check it against server SSH host key fingerprint. |
10447
- | `remote.host` | `String` | Use the specified host name or address of the remote host.<br/>(`--host={string}`) |
11202
+ | `remote.host` | `String` | Use the specified host name or address of the remote host.<br/>Required.<br/>(`--host={string}`) |
10448
11203
  | `remote.pass` | `String` | Authenticate the transfer with the specified password.<br/>(`--pass={string}`)(-w) |
10449
- | `remote.path` | `String` | Synchronize the specified directory on the remote host.<br/>(`--remote-dir={string}`)(-r) |
11204
+ | `remote.path` | `String` | Synchronize the specified directory on the remote host.<br/>Required.<br/>(`--remote-dir={string}`)(-r) |
10450
11205
  | `remote.port` | `Integer` | Use the specified TCP port for SSH. Used when connect_mode is `ssh`<br/>Default: `22`.<br/>(`--tcp-port={integer}`)(-P) |
10451
11206
  | `remote.private_key_paths` | `Array[String]` | Authenticate with the specified SSH private key file.<br/>(`--private-key-path={array}`)(-i) |
10452
11207
  | `remote.proxy.host` | `String` | Use the specified host name or address of the proxy. |
10453
11208
  | `remote.proxy.pass` | `String` | Authenticate to the proxy with the specified password. |
10454
- | `remote.proxy.port` | `Integer` | Use the specified port, default is 9091 for dnat, 9092. for dnats |
11209
+ | `remote.proxy.port` | `Integer` | Use the specified port. Default is 9091 for dnat, 9092 for dnats. |
10455
11210
  | `remote.proxy.protocol` | `String` | The protocol to be used.<br/>Allowed values: `none`, `dnat`, `dnats`.<br/>Default: `none`. |
10456
11211
  | `remote.proxy.user` | `String` | Authenticate to the proxy with the specified username. |
10457
11212
  | `remote.proxy` | `Hash` | Specify the address of the Aspera high-speed proxy server.<br/>(special:`--proxy={object}`) |
10458
11213
  | `remote.token_node_user` | `String` | Node API user identity associated with the token. Required for node user bearer tokens |
10459
11214
  | `remote.token` | `String` | Token string passed to server's authentication service. |
10460
- | `remote.user` | `String` | Authenticate the transfer with the specified username.<br/>(`--user={string}`) |
11215
+ | `remote.user` | `String` | Authenticate the transfer with the specified username.<br/>Required.<br/>(`--user={string}`) |
10461
11216
  | `remote.ws_port` | `Integer` | Use the specified port for Websocket. Used when connect_mode is `ws`.<br/>Default: `9093`. |
10462
11217
  | `remote_checksum_threads` | `Integer` | Maximum number of threads to do checksum on the remote host. Value must be between 1 and 99<br/>Default: `4`.<br/>(`--remote-checksum-threads={integer}`) |
10463
11218
  | `remote_db_dir` | `String` | Use the specified database directory on the remote host. Default is `.private-asp` at the root level of the synchronized directory.<br/>(`--remote-db-dir={string}`)(-B) |
@@ -10469,10 +11224,10 @@ ascli config sync spec
10469
11224
  | `remote_move_cache_timeout_seconds` | `Integer` | Delay in seconds before aborting moving a file from remote cache to final destination. `-1` for disabled.<br/>Default: `-1`.<br/>(`--remote-move-cache-timeout={integer}`) |
10470
11225
  | `remote_preserve_acls` | `String` | Preserve access control lists on the remote host. If not specified, the default behavior is to use the same storage mode as specified by `preserve_acls`.<br/>Allowed values: `native`, `metafile`, `none`.<br/>(`--remote-preserve-acls={enum}`) |
10471
11226
  | `remote_preserve_xattrs` | `String` | Preserve extended attributes on the remote host. If not specified, the default behavior is to use the same storage mode as specified by `preserve_xattrs`.<br/>Allowed values: `native`, `metafile`, `none`.<br/>(`--remote-preserve-xattrs={enum}`) |
10472
- | `remote_scan_interval_milliseconds` | `Integer` | Enable periodic scans on the remote host. `-1` for disabled.<br/>Default: `-1`.<br/>(special:`--remote-scan-interval={integer}`) |
11227
+ | `remote_scan_interval_milliseconds` | `Integer` | Enable periodic scans on the remote host. `-1` for disabled. On the command line, the value is a duration, e.g. `1h 30m`, `2s500ms`, `5:30`, `1d 02:00:00.250`. A plain number is in seconds. Stored in milliseconds.<br/>Default: `-1`.<br/>(special:`--remote-scan-interval={integer}`) |
10473
11228
  | `remote_scan_threads` | `Integer` | Number of directory scanning threads on the remote host. Value must be between 1 and 99.<br/>Default: `1`.<br/>(`--remote-scan-threads={integer}`) |
10474
11229
  | `remote_stat_cache_size` | `Integer` | Set stat cache size on the remote host. 0 for disabled.<br/>Default: `0`. |
10475
- | `remote` | `Hash` | &nbsp; |
11230
+ | `remote` | `Hash` | Required. |
10476
11231
  | `remove_after_transfer` | `Bool` | Remove source files after they are successfully synchronized.<br/>Default: `false`.<br/>(`--remove-after-transfer`) |
10477
11232
  | `reset` | `Bool` | Clear the snapshot database and rescan the synchronized directories and files to create a fresh snapshot<br/>Default: `false`.<br/>(`--reset`)(-x) |
10478
11233
  | `resume.enabled` | `Bool` | Enable the possibility of resuming individual file transfers between async sessions.<br/>Default: `false`. |
@@ -10480,7 +11235,7 @@ ascli config sync spec
10480
11235
  | `resume.min_size` | `Integer` | This field specifies the minimum size of files that will be allowed to resume.<br/>Default: `1048576`.<br/>(`--support-resume={integer}`) |
10481
11236
  | `resume_scan` | `Bool` | Resume the scan from where the previous execution left off.<br/>Default: `false`.<br/>(`--resume-scan`) |
10482
11237
  | `resume` | `Hash` | Partial transfers may exist if communication disruptions caused the underlying ascp processes to terminate early. Note that transfer resumption can only happen if the `reset` option is disabled. If an async session starts with `reset` enabled and resume enabled, transfers interrupted during that session will be resumable, but only if async is then restarted with 'reset' disabled. |
10483
- | `scan_dir_rename` | `Bool` | Enable the detection of renamed directories and files compared. to the previous scan, based on matching inodes<br/>Default: `false`.<br/>(`--scan-dir-rename`) |
11238
+ | `scan_dir_rename` | `Bool` | Enable the detection of renamed directories and files compared to the previous scan, based on matching inodes<br/>Default: `false`.<br/>(`--scan-dir-rename`) |
10484
11239
  | `scan_file_rename` | `Bool` | Enable the detection of renamed files compared to the previous scan, based on matching inodes.<br/>Default: `false`.<br/>(`--scan-file-rename`) |
10485
11240
  | `scan_intensity` | `String` | Scan at the set intensity. `vlow` minimizes system activity. `vhigh` maximizes system activity by continuously scanning files without rest.<br/>Allowed values: `vlow`, `low`, `medium`, `high`, `vhigh`.<br/>Default: `medium`.<br/>(`--scan-intensity={enum}`)(-H) |
10486
11241
  | `sharing_retry_max` | `Integer` | Retry synchronizations up to the specified maximum number after a sharing violation.<br/>Default: `3`.<br/>(`--sharing-retry-max={integer}`) |
@@ -10488,7 +11243,7 @@ ascli config sync spec
10488
11243
  | `symbolic_links` | `String` | Handle symbolic links with the specified method. Default is `skip` on windows, `copy` otherwise.<br/>Allowed values: `copy`, `skip`, `follow`.<br/>(`--symbolic-links={enum}`)(-n) |
10489
11244
  | `tags` | `Hash` | User-defined metadata tags.<br/>(special:`--tags64={object}`) |
10490
11245
  | `transfer_threads[].size` | `Integer` | Upper limit. `-1` for infinity.<br/>Default: `-1`. |
10491
- | `transfer_threads[].threads` | `Integer` | The number of threads. |
11246
+ | `transfer_threads[].threads` | `Integer` | The number of threads.<br/>Required. |
10492
11247
  | `transfer_threads` | `Array[Hash]` | Use the specified number of dedicated transfer threads to process files smaller or equal to the specified size<br/>(special:`--transfer-threads={array}`) |
10493
11248
  | `transport.cipher` | `String` | Specify encryption algorithm for file data.<br/>Allowed values: `none`, `aes128`, `aes192`, `aes256`, `aes128cfb`, `aes192cfb`, `aes256cfb`, `aes128gcm`, `aes192gcm`, `aes256gcm`.<br/>Default: `aes128`.<br/>(`--cipher={enum}`)(-c) |
10494
11249
  | `transport.compression` | `String` | Compress a file before transfer using the specified MODE.<br/>Allowed values: `none`, `zlib`.<br/>Default: `none`.<br/>(`--compression={enum}`) |
@@ -10498,10 +11253,10 @@ ascli config sync spec
10498
11253
  | `transport.raw_options` | `Array[String]` | Pass arbitrary arguments to `ascp`.<br/>(special:`--raw-options={array}`) |
10499
11254
  | `transport.read_block_size` | `Integer` | Use the specified block size (in bytes) for reading. Default is determined by `aspera.conf`.<br/>(`--read-block-size={integer}`)(-g) |
10500
11255
  | `transport.rexmsg_size` | `Integer` | Use the specified size (in bytes) for a retransmission request. Default is determined by `aspera.conf`.<br/>(`--rexmsg-size={integer}`)(-X) |
10501
- | `transport.target_rate` | `Integer` | Transfer no faster than the specified rate (in bps).<br/>Default: `10000000`.<br/>(`--target-rate={integer}`)(-l) |
11256
+ | `transport.target_rate` | `Integer` | Transfer no faster than the specified rate (in bps). A string with suffix `k`, `m` or `g` is converted to bps by `ascli` (e.g. `100m`).<br/>Default: `10000000`.<br/>(`--target-rate={integer}`)(-l) |
10502
11257
  | `transport.udp_port` | `Integer` | Use the specified UDP port for FASP data transfer.<br/>Default: `33001`.<br/>(`--udp-port={integer}`)(-O) |
10503
11258
  | `transport.write_block_size` | `Integer` | Use the specified block size (in bytes) for writing. Default is determined by `aspera.conf`.<br/>(`--write-block-size={integer}`)(-G) |
10504
- | `transport` | `Hash` | &nbsp; |
11259
+ | `transport` | `Hash` | |
10505
11260
  | `watchd.datastore` | `String` | Specify the type of datastore, `none` for disabled.<br/>Allowed values: `none`, `redis`, `scalekv`.<br/>Default: `none`. |
10506
11261
  | `watchd.domain` | `String` | Specify the domain. Default is the current username. |
10507
11262
  | `watchd.host` | `String` | Use the specified host name or address to connect to the datastore. |
@@ -10839,7 +11594,7 @@ The `smtp` option is a `Hash` ([Extended Value](#extended-value-syntax)) with th
10839
11594
  | `from_name` | `String` | Display name of the sender. Defaults to the local-part of `from_email`.<br/>Example: `John Wayne`. |
10840
11595
  | `password` | `String` | Password for the above `username`.<br/>Example: `my_password`. |
10841
11596
  | `port` | `Integer` | Port for the SMTP service.<br/>Defaults: `587` (TLS), `465` (SSL), `25` (plain).<br/>Example: `587`. |
10842
- | `server` | `String` | SMTP server address.<br/>Example: `smtp.gmail.com`. |
11597
+ | `server` | `String` | SMTP server address.<br/>Required.<br/>Example: `smtp.gmail.com`. |
10843
11598
  | `ssl` | `Bool` | Enable `TLS/SSL` (port 465).<br/>Default: `false`. |
10844
11599
  | `tls` | `Bool` | Enable `STARTTLS` (port 587).<br/>Default: `true`. |
10845
11600
  | `username` | `String` | User to authenticate on the SMTP server. Leave empty for open (unauthenticated) relay.<br/>Example: `john@example.com`. |
@@ -11024,7 +11779,7 @@ USAGE
11024
11779
  {"type":"START","source":"xx","destination":"yy"}
11025
11780
  {"type":"DONE"}
11026
11781
  EXAMPLES
11027
- asession @json:'{"spec":{"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"}]}}'
11782
+ asession @json:'{"spec":{"remote_host":"demo.asperasoft.com","remote_user":"asperaweb","ssh_port":33001,"remote_password":"<PASSWORD>","direction":"receive","destination_root":"./test.dir","paths":[{"source":"/aspera-test-dir-tiny/200KB.1"}]}}'
11028
11783
  echo '{"spec":{"remote_host":...}}'|asession @json:@stdin:
11029
11784
 
11030
11785
  ```