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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +160 -4
- data/CONTRIBUTING.md +4 -2
- data/README.md +1 -1
- data/bin/asession +1 -1
- data/docs/README.md +1086 -331
- data/docs/test-mcp-with-ai.md +5 -3
- data/lib/aspera/agent/direct.rb +15 -4
- data/lib/aspera/agent/factory.rb +2 -1
- data/lib/aspera/agent/node.rb +1 -1
- data/lib/aspera/api/cos_node.rb +1 -1
- data/lib/aspera/api/faspex.rb +1 -1
- data/lib/aspera/api/node.rb +6 -2
- data/lib/aspera/ascp/installation.rb +47 -11
- data/lib/aspera/ascp/management.rb +89 -43
- data/lib/aspera/cli/ascp_actions.rb +5 -19
- data/lib/aspera/cli/bootstrapper.rb +1 -2
- data/lib/aspera/cli/command_registry.rb +43 -3
- data/lib/aspera/cli/command_spec.rb +3 -0
- data/lib/aspera/cli/completion/ascli.bash +39 -5
- data/lib/aspera/cli/completion/ascli.fish +16 -8
- data/lib/aspera/cli/completion/ascli.ps1 +41 -0
- data/lib/aspera/cli/completion/ascli.zsh +20 -4
- data/lib/aspera/cli/completion_actions.rb +360 -0
- data/lib/aspera/cli/error.rb +42 -0
- data/lib/aspera/cli/extended_value.rb +30 -5
- data/lib/aspera/cli/formatter.rb +118 -56
- data/lib/aspera/cli/hints.rb +0 -1
- data/lib/aspera/cli/http.rb +6 -5
- data/lib/aspera/cli/info.rb +10 -4
- data/lib/aspera/cli/mailer.rb +1 -1
- data/lib/aspera/cli/mcp/http_servlet.rb +156 -0
- data/lib/aspera/cli/mcp/secrets.rb +143 -0
- data/lib/aspera/cli/mcp/tool.rb +231 -0
- data/lib/aspera/cli/option_value.rb +9 -1
- data/lib/aspera/cli/options.schema.yaml +390 -39
- data/lib/aspera/cli/parser.rb +14 -5
- data/lib/aspera/cli/plugins/aoc.rb +8 -11
- data/lib/aspera/cli/plugins/base.rb +36 -15
- data/lib/aspera/cli/plugins/config.rb +15 -44
- data/lib/aspera/cli/plugins/console.rb +3 -1
- data/lib/aspera/cli/plugins/factory.rb +1 -1
- data/lib/aspera/cli/plugins/faspex5.rb +9 -19
- data/lib/aspera/cli/plugins/faspio.rb +36 -5
- data/lib/aspera/cli/plugins/httpgw.rb +1 -0
- data/lib/aspera/cli/plugins/mcp.rb +177 -118
- data/lib/aspera/cli/plugins/node.rb +14 -8
- data/lib/aspera/cli/plugins/orchestrator.rb +351 -38
- data/lib/aspera/cli/plugins/server.rb +3 -1
- data/lib/aspera/cli/plugins/shares.rb +205 -35
- data/lib/aspera/cli/preset_actions.rb +15 -7
- data/lib/aspera/cli/preset_manager.rb +24 -2
- data/lib/aspera/cli/prompt.rb +3 -1
- data/lib/aspera/cli/result.rb +17 -4
- data/lib/aspera/cli/runner.rb +133 -43
- data/lib/aspera/cli/security.rb +134 -0
- data/lib/aspera/cli/table_fitter.rb +116 -0
- data/lib/aspera/cli/terminal_formatter.rb +23 -34
- data/lib/aspera/cli/transfer_agent.rb +4 -1
- data/lib/aspera/cli/vault_manager.rb +6 -5
- data/lib/aspera/cli/version.rb +1 -1
- data/lib/aspera/cli/web_secret.html.erb +61 -0
- data/lib/aspera/cli/web_secret.rb +220 -0
- data/lib/aspera/cli/wizard.rb +19 -9
- data/lib/aspera/command_line_builder.rb +26 -0
- data/lib/aspera/data_repository.rb +38 -24
- data/lib/aspera/duration.rb +42 -0
- data/lib/aspera/environment.rb +88 -24
- data/lib/aspera/exec_spec.rb +6 -5
- data/lib/aspera/faspex_gw.rb +98 -32
- data/lib/aspera/faspex_postproc.rb +187 -44
- data/lib/aspera/formatter_interface.rb +0 -1
- data/lib/aspera/id_generator.rb +2 -1
- data/lib/aspera/json_rpc/client.rb +51 -32
- data/lib/aspera/json_rpc/version.rb +1 -0
- data/lib/aspera/keychain/base.rb +5 -0
- data/lib/aspera/keychain/encrypted_hash.rb +6 -2
- data/lib/aspera/keychain/factory.rb +2 -3
- data/lib/aspera/keychain/hashicorp_vault.rb +7 -4
- data/lib/aspera/keychain/macos_security.rb +119 -13
- data/lib/aspera/keychain/one_password_api.rb +8 -3
- data/lib/aspera/keychain/one_password_base.rb +14 -9
- data/lib/aspera/keychain/one_password_cli.rb +4 -2
- data/lib/aspera/log.rb +3 -6
- data/lib/aspera/markdown.rb +152 -115
- data/lib/aspera/mime.rb +6 -0
- data/lib/aspera/nagios.rb +3 -1
- data/lib/aspera/node_emulator.rb +98 -101
- data/lib/aspera/oauth/{base.rb → client/base.rb} +5 -4
- data/lib/aspera/oauth/{boot.rb → client/boot.rb} +3 -2
- data/lib/aspera/oauth/{factory.rb → client/factory.rb} +7 -0
- data/lib/aspera/oauth/{generic.rb → client/generic.rb} +1 -1
- data/lib/aspera/oauth/{json_credentials.rb → client/json_credentials.rb} +1 -1
- data/lib/aspera/oauth/{jwt.rb → client/jwt.rb} +1 -1
- data/lib/aspera/oauth/{url_json.rb → client/url_json.rb} +1 -1
- data/lib/aspera/oauth/{web.rb → client/web.rb} +2 -2
- data/lib/aspera/oauth/server/authorize.html.erb +34 -0
- data/lib/aspera/oauth/server/pkce.rb +426 -0
- data/lib/aspera/orchestrator_workflow_checker.rb +561 -0
- data/lib/aspera/preview/terminal.rb +3 -2
- data/lib/aspera/rainbow.rb +27 -1
- data/lib/aspera/rest/aspera_errors.rb +51 -59
- data/lib/aspera/rest/client.rb +21 -14
- data/lib/aspera/rest/error_analyzer.rb +9 -0
- data/lib/aspera/rest/list.rb +6 -6
- data/lib/aspera/rest/util.rb +7 -1
- data/lib/aspera/rest.rb +0 -1
- data/lib/aspera/schema/IBM Aspera Faspex API-5.0-enhanced.yaml +0 -2
- data/lib/aspera/schema/IBM Aspera Orchestrator API-v1-enhanced.yaml +4001 -0
- data/lib/aspera/schema/IBM Aspera faspio Gateway API-1.0.0-enhanced.yaml +1097 -0
- data/lib/aspera/schema/IBM Aspera on Cloud Automation API-1.0.5-enhanced.yaml +35 -35
- data/lib/aspera/schema/IBM_Aspera_Shares.yaml +819 -7
- data/lib/aspera/schema/documentation.rb +50 -78
- data/lib/aspera/schema/reader.rb +39 -11
- data/lib/aspera/schema/registry.rb +8 -2
- data/lib/aspera/secret_hider.rb +94 -15
- data/lib/aspera/secret_strength.rb +114 -0
- data/lib/aspera/servlet_helpers.rb +111 -0
- data/lib/aspera/sync/args.schema.yaml +3 -1
- data/lib/aspera/sync/conf.schema.yaml +16 -6
- data/lib/aspera/sync/operations.rb +21 -1
- data/lib/aspera/temp_file_manager.rb +79 -20
- data/lib/aspera/transfer/parameters.rb +5 -0
- data/lib/aspera/transfer/spec.rb +52 -12
- data/lib/aspera/transfer/spec.schema.yaml +8 -5
- data/lib/aspera/web_auth/index.html.erb +16 -0
- data/lib/aspera/web_auth/server.rb +18 -10
- data/lib/aspera/web_page.html.erb +262 -0
- data/lib/aspera/web_page.rb +61 -0
- data/lib/aspera/web_server_simple.rb +76 -10
- data.tar.gz.sig +0 -0
- metadata +47 -32
- metadata.gz.sig +0 -0
- data/lib/aspera/cli/mcp_tool.rb +0 -189
- data/lib/aspera/oauth.rb +0 -9
- data/lib/aspera/schema/IBM Aspera Orchestrator API-v1.yaml +0 -1784
- data/lib/aspera/schema/IBM Aspera faspio Gateway API-1.0.0.yaml +0 -249
- 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
|
|
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
|
|
6
|
-
match the actual on-screen UI text).
|
|
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.
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
468
|
+
Required Ruby version is version: >= 3.2.
|
|
442
469
|
|
|
443
470
|
> [!WARNING]
|
|
444
|
-
> The minimum Ruby version will be 3.
|
|
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`
|
|
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.
|
|
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
|
|
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
|
|
869
|
-
|
|
870
|
-
| `sdk_url`
|
|
871
|
-
| `locations_url` |
|
|
872
|
-
| `sdk_folder`
|
|
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
|
|
903
|
-
|
|
934
|
+
| Form | Relative example | Absolute example |
|
|
935
|
+
|-----------|-----------------------------|----------------------------------|
|
|
904
936
|
| Canonical | `file:///mydir/archive.zip` | `file:////home/user/archive.zip` |
|
|
905
|
-
| Short
|
|
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.
|
|
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.
|
|
1004
|
+
mv temp_folder/cache aspera-cli-4.28.0-gems
|
|
973
1005
|
rm -fr temp_folder
|
|
974
|
-
tar zcvf aspera-cli-4.
|
|
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.
|
|
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
|
|
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>] ... [
|
|
1662
|
+
@:[<MARKER>] <DOT_PATH>=<VALUE> [<DOT_PATH>=<VALUE>] ... [<MARKER>]
|
|
1631
1663
|
```
|
|
1632
1664
|
|
|
1633
|
-
-
|
|
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
|
|
1670
|
+
- `<MARKER>` (`END` by default): An optional argument that ends the collection.
|
|
1638
1671
|
|
|
1639
|
-
- Without
|
|
1672
|
+
- Without the marker: **All** remaining positional arguments are collected, and each one must contain `=`.
|
|
1640
1673
|
|
|
1641
|
-
- With
|
|
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
|
-
-
|
|
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
|
|
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`
|
|
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`
|
|
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=
|
|
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
|
|
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
|
|
2031
|
-
| `--out.utf8` | Unicode characters: table borders, check marks
|
|
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` |
|
|
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)
|
|
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
|
|
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 <
|
|
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:
|
|
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
|
|
2753
|
-
|
|
2754
|
-
|
|
2755
|
-
|
|
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
|
|
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
|
|
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
|
|
2922
|
-
wizard https://orch.example.com/path orchestrator --username=test --password
|
|
2923
|
-
wizard https://server.example.com/path server --username=my_username --password
|
|
2924
|
-
wizard https://shares.example.com/path shares --username=test --password
|
|
2925
|
-
wizard https://tst.example.com/path faspio --username=my_username --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
|
|
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":"
|
|
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 **
|
|
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
|
-
|
|
3177
|
+
PowerShell has no completion folder: save the script, and dot-source it in `$PROFILE`:
|
|
3015
3178
|
|
|
3016
|
-
```
|
|
3017
|
-
ascli
|
|
3018
|
-
|
|
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
|
-
|
|
3023
|
-
|
|
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
|
|
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
|
|
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
|
|
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` :
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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:'["
|
|
3963
|
+
ascli --proxy-credentials=@json:'["<USERNAME>","<PASSWORD>"]' ...
|
|
3731
3964
|
```
|
|
3732
3965
|
|
|
3733
3966
|
```shell
|
|
3734
|
-
ascli --proxy-credentials=@list
|
|
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","
|
|
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
|
|
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
|
|
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
|
|
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":"
|
|
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
|
-
|
|
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/>
|
|
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/>
|
|
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/>
|
|
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/>
|
|
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/>
|
|
4477
|
-
| `preserve_remote_extended_attrs` | `String` | Preserve remote extended attributes.<br/>
|
|
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/>
|
|
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
|
|
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)
|
|
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
|
-
|
|
5170
|
-
|
|
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
|
-
|
|
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>[
|
|
5420
|
+
file:///<PATH>?grow=<WAIT_TIME>[&<PARAMETER>=<VALUE>...]
|
|
5176
5421
|
```
|
|
5177
5422
|
|
|
5178
|
-
|
|
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
|
-
|
|
5182
|
-
|
|
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
|
-
|
|
5430
|
+
An absolute path starts with `/`, so the URI of an absolute path contains four slashes.
|
|
5185
5431
|
|
|
5186
|
-
|
|
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
|
-
|
|
5193
|
-
|
|
5194
|
-
|
|
5195
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
5524
|
+
ascli server upload app.log --ts.source_root='file:////var/log?grow=120' --to-folder=/Upload
|
|
5203
5525
|
```
|
|
5204
5526
|
|
|
5205
|
-
- **URI
|
|
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
|
|
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.
|
|
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=
|
|
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
|
-
--
|
|
5271
|
-
--temp
|
|
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=
|
|
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":"
|
|
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":"
|
|
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
|
|
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
|
|
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
|
|
7397
|
-
admin node do %name:my_node_name --secret
|
|
7398
|
-
admin node do %name:my_node_name --secret
|
|
7399
|
-
admin node do %name:my_node_name --secret
|
|
7400
|
-
admin node do %name:my_node_name --secret
|
|
7401
|
-
admin node do %name:my_node_name --secret
|
|
7402
|
-
admin node do %name:my_node_name --secret
|
|
7403
|
-
admin node do %name:my_node_name --secret
|
|
7404
|
-
admin node do %name:my_node_name --secret
|
|
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
|
|
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
|
|
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
|
|
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 <
|
|
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=<
|
|
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 │
|
|
7590
|
-
│ secret │
|
|
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
|
|
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":"
|
|
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
|
|
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":"
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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":"
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
8291
|
-
--url=http://localhost:12348 --username=sim --password
|
|
8292
|
-
--url=https://tst.example.com/path --password
|
|
8293
|
-
access_key create @json:'{"id":"my_username","secret":"
|
|
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
|
|
8296
|
-
access_key do my_ak_name delete /test_nd_ak2 --secret
|
|
8297
|
-
access_key do my_ak_name delete test_nd_ak3 --secret
|
|
8298
|
-
access_key do my_ak_name download test_nd_ak3 --to-folder=. --secret
|
|
8299
|
-
access_key do my_ak_name find my_test_folder --secret
|
|
8300
|
-
access_key do my_ak_name find my_test_folder @re:'\.jpg$' --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
|
|
8303
|
-
access_key do my_ak_name mkdir /tst_nd_ak --secret
|
|
8304
|
-
access_key do my_ak_name mkfile /mkfile.txt 'hello world' --secret
|
|
8305
|
-
access_key do my_ak_name mklink /mklink.txt --query=@json:'{"target":"/mkfile.txt","target_node_id":"123"}' --secret
|
|
8306
|
-
access_key do my_ak_name node_info / --secret
|
|
8307
|
-
access_key do my_ak_name rename /tst_nd_ak test_nd_ak2 --secret
|
|
8308
|
-
access_key do my_ak_name show %id:1 --secret
|
|
8309
|
-
access_key do my_ak_name upload 'faux:///test_nd_ak3?100k' --node-api.standard_ports=false --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":"
|
|
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":"
|
|
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
|
|
8376
|
-
upload --username=my_ak_name --password
|
|
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":"
|
|
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
|
-
| `
|
|
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
|
|
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":"
|
|
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
|
|
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
|
|
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
|
|
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
|
|
8992
|
+
--client-id=<CLIENT_ID>
|
|
8622
8993
|
--client-secret=<SECRET>
|
|
8623
|
-
--username
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
8747
|
-
packages receive <id> <f5_pack_first_file> --to-folder=. --ts.content_protection_password
|
|
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
|
|
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
|
|
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":"
|
|
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
|
-
|
|
|
9163
|
-
|
|
9164
|
-
|
|
|
9165
|
-
| `
|
|
9166
|
-
| `
|
|
9167
|
-
| `
|
|
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`
|
|
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
|
-
-
|
|
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://
|
|
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
|
|
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
|
|
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
|
|
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
|
-
>
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
9985
|
-
|
|
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
|
|
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`
|
|
10008
|
-
| `description`
|
|
10009
|
-
| `instructions`
|
|
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`
|
|
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
|
-
| `
|
|
10030
|
-
| `
|
|
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
|
-
>
|
|
10039
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
10403
|
-
| `ignore_remote_host_sync_name` | `Bool` | Do not check that the remote host being used for the current
|
|
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
|
|
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` |
|
|
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` |
|
|
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
|
|
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` |
|
|
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
|
|
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` |
|
|
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":"
|
|
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
|
```
|