aspera-cli 4.27.0 → 4.27.2
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 +46 -1
- data/CONTRIBUTING.md +1 -7
- data/TODO.md +50 -0
- data/docs/README.md +709 -489
- data/lib/aspera/agent/base.rb +10 -2
- data/lib/aspera/agent/connect.rb +7 -7
- data/lib/aspera/agent/desktop.rb +3 -3
- data/lib/aspera/agent/direct.rb +48 -19
- data/lib/aspera/agent/factory.rb +3 -3
- data/lib/aspera/agent/httpgw.rb +55 -14
- data/lib/aspera/agent/node.rb +2 -2
- data/lib/aspera/agent/transferd.rb +12 -12
- data/lib/aspera/api/aoc.rb +28 -28
- data/lib/aspera/api/cos_node.rb +10 -9
- data/lib/aspera/api/faspex.rb +2 -2
- data/lib/aspera/api/httpgw.rb +20 -20
- data/lib/aspera/api/node.rb +31 -53
- data/lib/aspera/ascmd.rb +13 -13
- data/lib/aspera/ascp/installation.rb +43 -36
- data/lib/aspera/ascp/management.rb +6 -6
- data/lib/aspera/assert.rb +12 -13
- data/lib/aspera/cli/ascp_actions.rb +7 -7
- data/lib/aspera/cli/async_transfer_store.rb +49 -5
- data/lib/aspera/cli/bootstrapper.rb +9 -9
- data/lib/aspera/cli/command_registry.rb +1 -1
- data/lib/aspera/cli/command_spec.rb +6 -3
- data/lib/aspera/cli/context.rb +3 -3
- data/lib/aspera/cli/extended_value.rb +26 -26
- data/lib/aspera/cli/formatter.rb +76 -54
- data/lib/aspera/cli/gem_checker.rb +1 -1
- data/lib/aspera/cli/hints.rb +2 -2
- data/lib/aspera/cli/http.rb +22 -29
- data/lib/aspera/cli/mailer.rb +7 -7
- data/lib/aspera/cli/mcp_tool.rb +31 -4
- data/lib/aspera/cli/option_declarator.rb +77 -0
- data/lib/aspera/cli/options.schema.yaml +273 -3
- data/lib/aspera/cli/parser.rb +539 -280
- data/lib/aspera/cli/plugins/alee.rb +1 -1
- data/lib/aspera/cli/plugins/aoc.rb +303 -314
- data/lib/aspera/cli/plugins/ats.rb +25 -21
- data/lib/aspera/cli/plugins/base.rb +357 -186
- data/lib/aspera/cli/plugins/basic_auth.rb +0 -12
- data/lib/aspera/cli/plugins/config.rb +76 -73
- data/lib/aspera/cli/plugins/console.rb +8 -8
- data/lib/aspera/cli/plugins/cos.rb +4 -3
- data/lib/aspera/cli/plugins/factory.rb +2 -2
- data/lib/aspera/cli/plugins/faspex5.rb +259 -248
- data/lib/aspera/cli/plugins/faspio.rb +7 -2
- data/lib/aspera/cli/plugins/httpgw.rb +1 -1
- data/lib/aspera/cli/plugins/mcp.rb +11 -11
- data/lib/aspera/cli/plugins/node.rb +227 -283
- data/lib/aspera/cli/plugins/orchestrator.rb +23 -23
- data/lib/aspera/cli/plugins/preview.rb +61 -64
- data/lib/aspera/cli/plugins/server.rb +36 -31
- data/lib/aspera/cli/plugins/shares.rb +174 -135
- data/lib/aspera/cli/preset_actions.rb +39 -19
- data/lib/aspera/cli/preset_manager.rb +74 -32
- data/lib/aspera/cli/result.rb +18 -16
- data/lib/aspera/cli/runner.rb +75 -39
- data/lib/aspera/cli/secret_finder.rb +1 -1
- data/lib/aspera/cli/sync_actions.rb +36 -35
- data/lib/aspera/cli/terminal_formatter.rb +2 -2
- data/lib/aspera/cli/transfer_actions.rb +17 -10
- data/lib/aspera/cli/transfer_agent.rb +44 -44
- data/lib/aspera/cli/transfer_progress.rb +7 -7
- data/lib/aspera/cli/vault_manager.rb +34 -12
- data/lib/aspera/cli/version.rb +1 -1
- data/lib/aspera/cli/wizard.rb +17 -20
- data/lib/aspera/colors.rb +3 -3
- data/lib/aspera/command_line_builder.rb +17 -16
- data/lib/aspera/command_line_converter.rb +1 -1
- data/lib/aspera/coverage.rb +1 -2
- data/lib/aspera/data_repository.rb +1 -1
- data/lib/aspera/dot_container.rb +8 -8
- data/lib/aspera/environment.rb +13 -13
- data/lib/aspera/faspex_gw.rb +4 -4
- data/lib/aspera/faspex_postproc.rb +14 -9
- data/lib/aspera/graphql.rb +4 -2
- data/lib/aspera/hash_ext.rb +2 -2
- data/lib/aspera/json_rpc/client.rb +1 -1
- data/lib/aspera/keychain/base.rb +10 -3
- data/lib/aspera/keychain/encrypted_hash.rb +92 -17
- data/lib/aspera/keychain/factory.rb +17 -5
- data/lib/aspera/keychain/hashicorp_vault.rb +1 -1
- data/lib/aspera/keychain/macos_security.rb +23 -25
- data/lib/aspera/keychain/one_password_api.rb +86 -0
- data/lib/aspera/keychain/one_password_base.rb +34 -0
- data/lib/aspera/keychain/one_password_cli.rb +98 -0
- data/lib/aspera/link_header.rb +2 -2
- data/lib/aspera/log.rb +13 -13
- data/lib/aspera/markdown.rb +5 -5
- data/lib/aspera/nagios.rb +8 -8
- data/lib/aspera/node_simulator.rb +33 -27
- data/lib/aspera/oauth/base.rb +4 -5
- data/lib/aspera/oauth/boot.rb +3 -3
- data/lib/aspera/oauth/factory.rb +5 -5
- data/lib/aspera/oauth/jwt.rb +5 -7
- data/lib/aspera/oauth/web.rb +4 -4
- data/lib/aspera/persistency_action_once.rb +4 -4
- data/lib/aspera/persistency_folder.rb +8 -8
- data/lib/aspera/preview/file_types.rb +4 -4
- data/lib/aspera/preview/generator.rb +49 -46
- data/lib/aspera/preview/options.rb +3 -2
- data/lib/aspera/preview/terminal.rb +5 -5
- data/lib/aspera/preview/utils.rb +65 -18
- data/lib/aspera/products/connect.rb +2 -2
- data/lib/aspera/products/desktop.rb +1 -1
- data/lib/aspera/products/other.rb +2 -2
- data/lib/aspera/products/transferd.rb +3 -3
- data/lib/aspera/proxy_auto_config.rb +10 -10
- data/lib/aspera/rest.rb +149 -115
- data/lib/aspera/rest_error_analyzer.rb +3 -3
- data/lib/aspera/rest_list.rb +10 -9
- data/lib/aspera/schema/IBM Aspera Node API-4.4.6.yaml +6232 -0
- data/lib/aspera/schema/IBM Aspera faspio Gateway API-1.0.0.yaml +249 -0
- data/lib/aspera/schema/IBM Aspera on Cloud API-0.2.6-enhanced.yaml +39 -0
- data/lib/aspera/schema/IBM_Aspera_Shares.yaml +4653 -0
- data/lib/aspera/schema/documentation.rb +17 -11
- data/lib/aspera/schema/reader.rb +78 -4
- data/lib/aspera/schema/registry.rb +26 -7
- data/lib/aspera/secret_hider.rb +5 -5
- data/lib/aspera/ssh.rb +64 -31
- data/lib/aspera/ssl.rb +3 -3
- data/lib/aspera/sync/database.rb +2 -2
- data/lib/aspera/sync/operations.rb +13 -13
- data/lib/aspera/temp_file_manager.rb +24 -4
- data/lib/aspera/transfer/faux_file.rb +2 -2
- data/lib/aspera/transfer/parameters.rb +15 -15
- data/lib/aspera/transfer/resumer.rb +9 -9
- data/lib/aspera/transfer/spec.rb +1 -1
- data/lib/aspera/transfer/spec.schema.yaml +1 -0
- data/lib/aspera/uri_reader.rb +52 -15
- data/lib/aspera/web_auth.rb +6 -5
- data/lib/aspera/web_server_simple.rb +9 -9
- data/lib/aspera/yaml.rb +4 -4
- data.tar.gz.sig +0 -0
- metadata +10 -4
- metadata.gz.sig +0 -0
- data/lib/aspera/cli/plugins/faspex.rb +0 -576
- data/lib/aspera/transfer/uri.rb +0 -56
data/docs/README.md
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
# Command Line Interface for IBM Aspera products
|
|
2
2
|
<!--
|
|
3
|
+
EDITING GUIDELINES (developers and AI):
|
|
4
|
+
- This file is the source template for the generated README.md. Edit this file, not README.md.
|
|
5
|
+
- Do not use Unicode characters unless strictly necessary (e.g. wizard menu labels that must
|
|
6
|
+
match the actual on-screen UI text). Use plain ASCII equivalents instead:
|
|
7
|
+
apostrophe : ' (not ' or ')
|
|
8
|
+
dash : - (not en-dash U+2013, not em-dash U+2014, not --)
|
|
9
|
+
ellipsis : ... (not U+2026)
|
|
10
|
+
- Emphasis style: use **bold** (double asterisks) only. Do not use *single asterisk italic*, _underscore_, or __double underscore__ style.
|
|
3
11
|
DO NOT EDIT: THIS FILE IS GENERATED, edit docs/README.erb.md.
|
|
4
12
|
PANDOC_DEFAULTS_BEGIN
|
|
5
13
|
metadata:
|
|
6
|
-
subtitle: "ascli 4.27.
|
|
14
|
+
subtitle: "ascli 4.27.2"
|
|
7
15
|
author: "Laurent Martin"
|
|
8
16
|
PANDOC_DEFAULTS_END
|
|
9
17
|
-->
|
|
@@ -25,7 +33,7 @@ Designed for automation, scripting, and integration scenarios, `ascli` enables o
|
|
|
25
33
|
### Key Features
|
|
26
34
|
|
|
27
35
|
**Multi-Product Integration**
|
|
28
|
-
: Unified interface supporting Aspera on Cloud, Faspex
|
|
36
|
+
: Unified interface supporting Aspera on Cloud, Faspex 5, Shares, Node API, Console, Orchestrator, and High-Speed Transfer Server (HSTS).
|
|
29
37
|
|
|
30
38
|
**Flexible Authentication**
|
|
31
39
|
: Support for OAuth 2.0, JWT, Basic Authentication, and SSH key-based authentication across different Aspera products.
|
|
@@ -78,7 +86,7 @@ Internally, `ascli` integrates several components:
|
|
|
78
86
|
For programmatic integration with languages such as C/C++, Go, Python, NodeJS, and others, it is recommended to use the [Aspera APIs](https://ibm.biz/aspera_api) directly.
|
|
79
87
|
These include:
|
|
80
88
|
|
|
81
|
-
- REST APIs for products like Aspera on Cloud (AoC), Faspex, and Node
|
|
89
|
+
- REST APIs for products like Aspera on Cloud (AoC), Faspex 5, and Node
|
|
82
90
|
- The Transfer Daemon with gRPC interfaces and language-specific stubs (C/C++, Python, .NET/C#, Java, Go, Ruby, Rust, and so on)
|
|
83
91
|
|
|
84
92
|
These APIs are generally more suitable for long-term development and maintenance.
|
|
@@ -137,8 +145,8 @@ This section walks you through your first interaction with `ascli` on Linux.
|
|
|
137
145
|
|
|
138
146
|
```shell
|
|
139
147
|
mkdir -p $HOME/bin
|
|
140
|
-
tar zxvf ascli.4.27.
|
|
141
|
-
mv ascli.4.27.
|
|
148
|
+
tar zxvf ascli.4.27.2.linux-x86_64.tgz
|
|
149
|
+
mv ascli.4.27.2.linux-x86_64 $HOME/bin/ascli
|
|
142
150
|
export PATH=$PATH:$HOME/bin
|
|
143
151
|
```
|
|
144
152
|
|
|
@@ -152,7 +160,7 @@ ascli -v
|
|
|
152
160
|
```
|
|
153
161
|
|
|
154
162
|
```text
|
|
155
|
-
4.27.
|
|
163
|
+
4.27.2
|
|
156
164
|
```
|
|
157
165
|
|
|
158
166
|
- Install the Aspera transfer runtime (tested version), as it is not included in the `ascli` package:
|
|
@@ -424,17 +432,19 @@ brew install ruby
|
|
|
424
432
|
> Do not use it.
|
|
425
433
|
> Use the required version of Ruby.
|
|
426
434
|
|
|
427
|
-
This installs a recent Ruby suitable for `ascli`.
|
|
435
|
+
This installs a recent Ruby version suitable for `ascli`.
|
|
428
436
|
|
|
429
|
-
|
|
437
|
+
After installation, Homebrew's Ruby is not on the `PATH` by default (this is shown at the end of the `brew install ruby` output and by `brew info ruby`).
|
|
438
|
+
Add it to your shell configuration file:
|
|
430
439
|
|
|
431
|
-
|
|
432
|
-
PATH="$(brew --prefix ruby)/bin:$($(brew --prefix ruby)/bin/gem env gemdir)/bin:$PATH"
|
|
433
|
-
```
|
|
440
|
+
- **zsh** (default shell on macOS — run this once in a terminal):
|
|
434
441
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
442
|
+
```shell
|
|
443
|
+
echo 'PATH="$(brew --prefix ruby)/bin:$($(brew --prefix ruby)/bin/gem env gemdir)/bin:$PATH"' >> ~/.zprofile
|
|
444
|
+
source ~/.zprofile
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
- **bash** — replace `~/.zprofile` with `~/.bash_profile` in the commands above.
|
|
438
448
|
|
|
439
449
|
#### Linux: Package
|
|
440
450
|
|
|
@@ -647,7 +657,7 @@ Those are not installed as part of dependencies because they involve compilation
|
|
|
647
657
|
See [Gemfile](../Gemfile):
|
|
648
658
|
|
|
649
659
|
| name | version | comment |
|
|
650
|
-
|
|
660
|
+
|---------------------|----------|-------------------------------------------------------------------------------|
|
|
651
661
|
| rake | ~> 13.0 | |
|
|
652
662
|
| debug | ~> 1.11 | (no jruby) |
|
|
653
663
|
| grpc-tools | ~> 1.67 | |
|
|
@@ -662,8 +672,6 @@ See [Gemfile](../Gemfile):
|
|
|
662
672
|
| mcp | ~> 1.2 | for ascli mcp server (MCP protocol support) |
|
|
663
673
|
| rack | ~> 3.0 | for ascli mcp server HTTP transport (required by mcp StreamableHTTPTransport) |
|
|
664
674
|
| grpc | ~> 1.71 | (no jruby) for Aspera Transfer Daemon |
|
|
665
|
-
| symmetric-encryption | ~> 4.6 | for encrypted hash file secrets |
|
|
666
|
-
| bigdecimal | ~> 3.1 | if RUBY_VERSION >= '3.4' for symmetric-encryption ? |
|
|
667
675
|
| base64 | ~> 0.3 | if RUBY_VERSION >= '3.4' remove from standard gems |
|
|
668
676
|
| sqlite3 | ~> 2.7 | (no jruby) for async DB |
|
|
669
677
|
| jdbc-sqlite3 | ~> 3.46 | (jruby) for async DB |
|
|
@@ -690,8 +698,6 @@ gem install solargraph -v '~> 0.48'
|
|
|
690
698
|
gem install mcp -v '~> 1.2'
|
|
691
699
|
gem install rack -v '~> 3.0'
|
|
692
700
|
gem install grpc -v '~> 1.71'
|
|
693
|
-
gem install symmetric-encryption -v '~> 4.6'
|
|
694
|
-
gem install bigdecimal -v '~> 3.1'
|
|
695
701
|
gem install base64 -v '~> 0.3'
|
|
696
702
|
gem install sqlite3 -v '~> 2.7'
|
|
697
703
|
gem install jdbc-sqlite3 -v '~> 3.46'
|
|
@@ -822,7 +828,12 @@ If installation from a local file is preferred (air-gapped installation) instead
|
|
|
822
828
|
ascli config transferd install --sdk-url=file:///macos-arm64-1.1.3-c6c7a2a.zip
|
|
823
829
|
```
|
|
824
830
|
|
|
825
|
-
The format is: `file:///<PATH
|
|
831
|
+
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 `/`).
|
|
832
|
+
|
|
833
|
+
| Form | Relative example | Absolute example |
|
|
834
|
+
|------|-----------------|-----------------|
|
|
835
|
+
| Canonical | `file:///mydir/archive.zip` | `file:////home/user/archive.zip` |
|
|
836
|
+
| Short | `file:mydir/archive.zip` | `file:/home/user/archive.zip` |
|
|
826
837
|
|
|
827
838
|
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).
|
|
828
839
|
|
|
@@ -887,11 +898,11 @@ Alternatively, the necessary gems can be packaged into a `tar.gz` archive as fol
|
|
|
887
898
|
|
|
888
899
|
```shell
|
|
889
900
|
mkdir temp_folder
|
|
890
|
-
gem install aspera-cli:4.27.
|
|
901
|
+
gem install aspera-cli:4.27.2 --no-document --install-dir temp_folder
|
|
891
902
|
find temp_folder
|
|
892
|
-
mv temp_folder/cache aspera-cli-4.27.
|
|
903
|
+
mv temp_folder/cache aspera-cli-4.27.2-gems
|
|
893
904
|
rm -fr temp_folder
|
|
894
|
-
tar zcvf aspera-cli-4.27.
|
|
905
|
+
tar zcvf aspera-cli-4.27.2-gems aspera-cli-4.27.2-gems.tgz
|
|
895
906
|
```
|
|
896
907
|
|
|
897
908
|
#### Unix-like: Alternative installation using `rvm`
|
|
@@ -1025,7 +1036,7 @@ ascli -v
|
|
|
1025
1036
|
```
|
|
1026
1037
|
|
|
1027
1038
|
```text
|
|
1028
|
-
4.27.
|
|
1039
|
+
4.27.2
|
|
1029
1040
|
```
|
|
1030
1041
|
|
|
1031
1042
|
To keep persistency of configuration on the host, specify your user's configuration folder as a volume for the container.
|
|
@@ -1288,7 +1299,7 @@ ascli config echo @uri:https://curl.haxx.se/ca/cacert.pem --format=text
|
|
|
1288
1299
|
To download that certificate store:
|
|
1289
1300
|
|
|
1290
1301
|
```shell
|
|
1291
|
-
ascli config echo @uri:https://curl.haxx.se/ca/cacert.pem --format=text --
|
|
1302
|
+
ascli config echo @uri:https://curl.haxx.se/ca/cacert.pem --format=text --out.file=/tmp/cacert.pem
|
|
1292
1303
|
```
|
|
1293
1304
|
|
|
1294
1305
|
Then, use this store by setting the option `cert_stores` (or env var `SSL_CERT_FILE`).
|
|
@@ -1296,7 +1307,7 @@ Then, use this store by setting the option `cert_stores` (or env var `SSL_CERT_F
|
|
|
1296
1307
|
To trust a specific certificate (for example, self-signed), **provided that the `CN` is correct**, save the certificate chain to a file:
|
|
1297
1308
|
|
|
1298
1309
|
```shell
|
|
1299
|
-
ascli config remote_certificate chain https://localhost:9092 --insecure=yes --
|
|
1310
|
+
ascli config remote_certificate chain https://localhost:9092 --insecure=yes --out.file=<SERVER_PRESET_NAME>.pem
|
|
1300
1311
|
```
|
|
1301
1312
|
|
|
1302
1313
|
> [!NOTE]
|
|
@@ -1430,28 +1441,25 @@ Typically, the `create` verb takes a resource creation data as a parameter.
|
|
|
1430
1441
|
#### Identifiers
|
|
1431
1442
|
|
|
1432
1443
|
Identifiers uniquely identify a resource.
|
|
1433
|
-
They are typically located immediately after a verb
|
|
1434
|
-
Some resources accept selection using other unique identifier, other than the native identifier (typically: `id`), using the **percent selector
|
|
1444
|
+
They are typically located immediately after a verb like `show`, `modify` or `delete`, itself placed after the resource type, for example: `user show foobar`.
|
|
1445
|
+
Some resources accept selection using other unique identifier, other than the native identifier (typically: `id`), using the [**percent selector**](#percent-selector).
|
|
1435
1446
|
|
|
1436
1447
|
##### Percent selector
|
|
1437
1448
|
|
|
1438
|
-
|
|
1439
|
-
If the resource can also be uniquely identified by a name, then the name can be used instead of the identifier, using the **percent selector**.
|
|
1440
|
-
For example, if the name of the user is `john` and a field for this resource named `name` has a value `john`:
|
|
1449
|
+
The **percent selector** is a special syntax that lets you identify a resource by any unique field, instead of its default identifier (typically a numeric `id`).
|
|
1441
1450
|
|
|
1442
|
-
|
|
1443
|
-
ascli aoc admin user show %name:john
|
|
1444
|
-
```
|
|
1451
|
+
Syntax: `%<FIELD>:<VALUE>`
|
|
1445
1452
|
|
|
1446
|
-
The
|
|
1453
|
+
- The leading `%` marks the argument as a percent selector (not a plain identifier).
|
|
1454
|
+
- `<FIELD>` is the name of the field to match on (e.g. `name`, `email`).
|
|
1455
|
+
- `<VALUE>` is the expected value of that field.
|
|
1447
1456
|
|
|
1448
|
-
|
|
1457
|
+
The tool then looks up the resource whose `<FIELD>` equals `<VALUE>` and uses its native identifier internally.
|
|
1449
1458
|
|
|
1450
|
-
|
|
1451
|
-
For example, in the following command, `<USER_ID>` is the user's identifier:
|
|
1459
|
+
For example, to show the user whose `name` field is `john`:
|
|
1452
1460
|
|
|
1453
1461
|
```shell
|
|
1454
|
-
ascli aoc admin user show
|
|
1462
|
+
ascli aoc admin user show %name:john
|
|
1455
1463
|
```
|
|
1456
1464
|
|
|
1457
1465
|
#### Command Parameters
|
|
@@ -1601,7 +1609,9 @@ Command-line options, such as `--log-level=debug`, follow these conventions:
|
|
|
1601
1609
|
Option name in config file use underscores (`_`) as word separators.
|
|
1602
1610
|
Example: `--log-level=debug` is `log_level` in config file.
|
|
1603
1611
|
- **Values**:
|
|
1604
|
-
An option
|
|
1612
|
+
An option's value is assigned using `=` (for example, `--log-level=debug`).
|
|
1613
|
+
Alternatively, the value can be provided as a separate, space-separated token (for example, `--log-level debug`).
|
|
1614
|
+
Both forms are equivalent.
|
|
1605
1615
|
- **Prefix Usage**:
|
|
1606
1616
|
Options support prefix matching (see [Enumerations](#enumerations)), though full names are recommended.
|
|
1607
1617
|
- **Optionality**:
|
|
@@ -1614,7 +1624,7 @@ Exceptions and Special Cases:
|
|
|
1614
1624
|
- **Short Forms**
|
|
1615
1625
|
|
|
1616
1626
|
Some options have short forms.
|
|
1617
|
-
For example, `-Ptoto`
|
|
1627
|
+
For example, `-Ptoto` and `-P toto` are both equivalent to `--preset=toto` and `--preset toto`.
|
|
1618
1628
|
See the manual or `-h` for details.
|
|
1619
1629
|
- **Flags**
|
|
1620
1630
|
|
|
@@ -1626,9 +1636,10 @@ Exceptions and Special Cases:
|
|
|
1626
1636
|
- [**dot-path notation**](#dot-path-notation)
|
|
1627
1637
|
- **Cumulative Hashes**
|
|
1628
1638
|
|
|
1629
|
-
When an option of type `Hash` is set, the value is deep-merged
|
|
1630
|
-
Setting to `@
|
|
1631
|
-
|
|
1639
|
+
When an option of type `Hash` is set, the value is deep-merged with any existing value.
|
|
1640
|
+
Setting to `@json:{}` starts from an empty hash (the existing value is discarded for that merge step).
|
|
1641
|
+
Setting to `@none:` explicitly disables the option: it is set to `nil` and any preset or default value is prevented from restoring it.
|
|
1642
|
+
This is useful, for example, to disable a vault or any Hash option that is configured in a default preset.
|
|
1632
1643
|
|
|
1633
1644
|
Example:
|
|
1634
1645
|
|
|
@@ -1748,16 +1759,16 @@ The style of output can be set using the `format` option:
|
|
|
1748
1759
|
|
|
1749
1760
|
By default, result of type `single_object` and `object_list` are displayed using format `table`.
|
|
1750
1761
|
|
|
1751
|
-
#### Option: `
|
|
1762
|
+
#### Option: `--out.table`
|
|
1752
1763
|
|
|
1753
|
-
The way `format`: `table` and `csv` are generated can be customized with option
|
|
1764
|
+
The way `format`: `table` and `csv` are generated can be customized with option `--out.table` which expects a `Hash`.
|
|
1754
1765
|
|
|
1755
1766
|
For `format=table`, options are the ones described in gem [`terminal-table`](https://github.com/tj/terminal-table).
|
|
1756
1767
|
|
|
1757
1768
|
For example, to display a table with thick Unicode borders:
|
|
1758
1769
|
|
|
1759
1770
|
```shell
|
|
1760
|
-
ascli config preset over --table
|
|
1771
|
+
ascli config preset over --out.table=@ruby:'{border: :unicode_thick_edge}'
|
|
1761
1772
|
```
|
|
1762
1773
|
|
|
1763
1774
|
> [!NOTE]
|
|
@@ -1774,10 +1785,10 @@ For `format=csv`, options are described in gem [`csv`](https://ruby.github.io/cs
|
|
|
1774
1785
|
For example, to display a CSV with headers and quotes:
|
|
1775
1786
|
|
|
1776
1787
|
```shell
|
|
1777
|
-
ascli config echo @json:'[{"name":"foo","id":1},{"name":"bar","id":8}]' --format=csv --table=@json:'{"headers":true,"force_quotes":true}'
|
|
1788
|
+
ascli config echo @json:'[{"name":"foo","id":1},{"name":"bar","id":8}]' --format=csv --out.table=@json:'{"headers":true,"force_quotes":true}'
|
|
1778
1789
|
```
|
|
1779
1790
|
|
|
1780
|
-
#### Option:
|
|
1791
|
+
#### Option: `--out.flat`: Single level `Hash`
|
|
1781
1792
|
|
|
1782
1793
|
This option controls how object fields are displayed for complex objects.
|
|
1783
1794
|
|
|
@@ -1811,7 +1822,7 @@ ascli config echo @json:'{"A":"a","B":[{"name":"B1","value":"b1"},{"name":"B2","
|
|
|
1811
1822
|
╰────────┴───────╯
|
|
1812
1823
|
```
|
|
1813
1824
|
|
|
1814
|
-
For the same command, adding option `--flat=no`:
|
|
1825
|
+
For the same command, adding option `--out.flat=no`:
|
|
1815
1826
|
|
|
1816
1827
|
```text
|
|
1817
1828
|
╭───────┬────────────────────────────────────────────────────────────────────────╮
|
|
@@ -1824,7 +1835,7 @@ For the same command, adding option `--flat=no`:
|
|
|
1824
1835
|
╰───────┴────────────────────────────────────────────────────────────────────────╯
|
|
1825
1836
|
```
|
|
1826
1837
|
|
|
1827
|
-
#### Option: `
|
|
1838
|
+
#### Option: `--out.table.pivot`
|
|
1828
1839
|
|
|
1829
1840
|
This option controls how result fields are displayed as columns or lines, when option `format` is set to `table`.
|
|
1830
1841
|
Default is `no`.
|
|
@@ -1852,7 +1863,7 @@ The display of result is as follows:
|
|
|
1852
1863
|
This parameter can be set as a global default with:
|
|
1853
1864
|
|
|
1854
1865
|
```shell
|
|
1855
|
-
ascli config preset set GLOBAL
|
|
1866
|
+
ascli config preset set GLOBAL out.table.pivot single
|
|
1856
1867
|
```
|
|
1857
1868
|
|
|
1858
1869
|
Examples:
|
|
@@ -1860,7 +1871,7 @@ Examples:
|
|
|
1860
1871
|
Simulate a result by executing this command:
|
|
1861
1872
|
|
|
1862
1873
|
```shell
|
|
1863
|
-
ascli config echo @json:'<JSON_VALUE>' --
|
|
1874
|
+
ascli config echo @json:'<JSON_VALUE>' --out.table.pivot=<no|yes|single>
|
|
1864
1875
|
```
|
|
1865
1876
|
|
|
1866
1877
|
Example 1: A list of one object
|
|
@@ -1925,7 +1936,7 @@ Display with `yes` (multiple Simple):
|
|
|
1925
1936
|
╰───────┴───────╯
|
|
1926
1937
|
```
|
|
1927
1938
|
|
|
1928
|
-
#### Option:
|
|
1939
|
+
#### Option: `--out.level`: Verbosity of output
|
|
1929
1940
|
|
|
1930
1941
|
Output messages are categorized in 3 types:
|
|
1931
1942
|
|
|
@@ -1933,17 +1944,17 @@ Output messages are categorized in 3 types:
|
|
|
1933
1944
|
- `data` output contains the actual output of the command (object, or list of objects)
|
|
1934
1945
|
- `error` output contains error messages
|
|
1935
1946
|
|
|
1936
|
-
The option `
|
|
1947
|
+
The option `--out.level` controls the level of output:
|
|
1937
1948
|
|
|
1938
1949
|
- `info` displays all messages: `info`, `data`, and `error`
|
|
1939
1950
|
- `data` display `data` and `error` messages
|
|
1940
1951
|
- `error` display only error messages.
|
|
1941
1952
|
|
|
1942
|
-
#### Option:
|
|
1953
|
+
#### Option: `--out.secrets`: Hide or show secrets in results
|
|
1943
1954
|
|
|
1944
1955
|
- If value is `no` (default), then secrets are redacted from command results.
|
|
1945
1956
|
- If value is `yes`, then secrets shown in clear in results.
|
|
1946
|
-
- If `
|
|
1957
|
+
- If `--out.level` is `data`, secrets are included to allow piping results.
|
|
1947
1958
|
|
|
1948
1959
|
#### Option: `fields`: Selection of output object fields
|
|
1949
1960
|
|
|
@@ -2000,15 +2011,22 @@ In the above example, the same result is obtained with option:
|
|
|
2000
2011
|
--select=@ruby:'->(i){i["ats_admin"]}'
|
|
2001
2012
|
```
|
|
2002
2013
|
|
|
2003
|
-
Option `select` applies the filter after a possible "flattening" with option
|
|
2014
|
+
Option `select` applies the filter after a possible "flattening" with option `--out.flat`.
|
|
2004
2015
|
|
|
2005
2016
|
### Extended Value Syntax
|
|
2006
2017
|
|
|
2018
|
+
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.
|
|
2019
|
+
|
|
2007
2020
|
Most options and arguments are specified by a simple string (for example, `username` or `url`).
|
|
2008
|
-
|
|
2009
|
-
Some options expect a more complex value such as `Hash` or `Array`.
|
|
2021
|
+
However, some situations require a complex structure:
|
|
2010
2022
|
|
|
2011
|
-
|
|
2023
|
+
- An option expects a **structured value** (`Hash`, `Array`) rather than a plain string.
|
|
2024
|
+
- The value is too long or complex to type inline (for example, a PEM private key, a JSON body).
|
|
2025
|
+
- The value must be **read from a file, an environment variable, or a URL** at runtime rather than embedded in the command.
|
|
2026
|
+
- The value needs **type coercion**: for example, an integer `1` instead of the string `"1"`, or a boolean `true`.
|
|
2027
|
+
|
|
2028
|
+
The **Extended Value** syntax addresses all of these needs with a uniform, composable mechanism.
|
|
2029
|
+
It lets you specify **what the value is** and **how to obtain or decode it**, entirely on the command line.
|
|
2012
2030
|
|
|
2013
2031
|
#### Syntax and Decoders
|
|
2014
2032
|
|
|
@@ -2046,11 +2064,11 @@ The following decoders are supported:
|
|
|
2046
2064
|
| `s` | Any | `String` | Converts argument to `String`. |
|
|
2047
2065
|
| `secret` | `String` | `String` | Ask password interactively (hides input). Argument is the prompt. |
|
|
2048
2066
|
| `stdin` | `String` | `String` | Read from stdin in text mode. Argument: `<empty>`, `bin` or `chomp`. |
|
|
2049
|
-
| `uri` | `String` | `String` | Read value from specified URL. for example, `--fpac=@uri:http://serv/f.pac` |
|
|
2067
|
+
| `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` |
|
|
2050
2068
|
| `val` | `String` | `String` | Prevent decoders on the right to be decoded. for example, `--key=@val:@file:foo` sets the option `key` to value `@file:foo`. |
|
|
2051
2069
|
| `yaml` | `String` | Any | Decode YAML. |
|
|
2052
2070
|
| `zlib` | `String` | `String` | Decompress data using zlib. |
|
|
2053
|
-
| `<empty>`| None | Any | The
|
|
2071
|
+
| `<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. |
|
|
2054
2072
|
|
|
2055
2073
|
> [!NOTE]
|
|
2056
2074
|
> A few commands support a value of type `Proc` (lambda expression).
|
|
@@ -2066,11 +2084,85 @@ It expects a `@` to close the embedded [Extended Value](#extended-value-syntax)
|
|
|
2066
2084
|
Option `parser` allows definition of a default parser when the positional parameter or option expects a `Hash` or `Array`.
|
|
2067
2085
|
For example, with `--parser=json`, the parameter `{}` will be parsed as an empty JSON Hash, even without prefix `@json:`.
|
|
2068
2086
|
|
|
2087
|
+
#### Syntax Equivalences
|
|
2088
|
+
|
|
2089
|
+
There are four main ways to express a structured value (for example, a `Hash` with two keys).
|
|
2090
|
+
They are all equivalent and produce the same result:
|
|
2091
|
+
|
|
2092
|
+
| Syntax | Example | Best for |
|
|
2093
|
+
|--------|---------|----------|
|
|
2094
|
+
| `@json:` | `@json:'{"name":"alice","age":30}'` | Scripts, API payloads, copy-paste from docs |
|
|
2095
|
+
| `@yaml:` | `@yaml:@stdin:` + here-doc | Multi-line or deeply nested structures |
|
|
2096
|
+
| `@ruby:` | `@ruby:'{"name"=>"alice","age"=>30}'` | Advanced use: lambdas, file reads, logic |
|
|
2097
|
+
| dot-path (`key.subkey=value`) via `@:` | `@: name=alice age=30` | Interactive CLI, simple structures, no quoting |
|
|
2098
|
+
|
|
2099
|
+
All four examples above produce the same `Hash`: `{"name" => "alice", "age" => 30}`.
|
|
2100
|
+
|
|
2101
|
+
```shell
|
|
2102
|
+
ascli config echo @json:'{"name":"alice","age":30}' --format=json
|
|
2103
|
+
ascli config echo @ruby:'{"name"=>"alice","age"=>30}' --format=json
|
|
2104
|
+
ascli config echo @: name=alice age=30 --format=json
|
|
2105
|
+
```
|
|
2106
|
+
|
|
2107
|
+
```json
|
|
2108
|
+
{"name":"alice","age":30}
|
|
2109
|
+
```
|
|
2110
|
+
|
|
2111
|
+
> [!NOTE]
|
|
2112
|
+
> The dot-path form (`key.subkey=value` assignments via `@:`) does **not** need quotes for simple string values and is the most shell-friendly.
|
|
2113
|
+
> The `@json:` form requires enclosing in single quotes to protect `"` from the shell.
|
|
2114
|
+
> The `@ruby:` form accepts both single and double quotes and supports arbitrary Ruby expressions.
|
|
2115
|
+
> The `@yaml:` form is most convenient when combined with a shell **here-document** (`<<EOF`).
|
|
2116
|
+
|
|
2117
|
+
##### Equivalences: Positional Parameter vs Option
|
|
2118
|
+
|
|
2119
|
+
The same `Hash` value `{"a":1,"b":"two"}` can be expressed differently depending on whether it is supplied as a **positional parameter** or as an **option**.
|
|
2120
|
+
|
|
2121
|
+
**As a positional parameter** (argument to a command):
|
|
2122
|
+
|
|
2123
|
+
```shell
|
|
2124
|
+
# JSON form
|
|
2125
|
+
some_command @json:'{"a":1,"b":"two"}'
|
|
2126
|
+
# Dot-path form (END is optional when no positional argument follows)
|
|
2127
|
+
some_command @: a=1 b=two
|
|
2128
|
+
some_command @: a=1 b=two END
|
|
2129
|
+
```
|
|
2130
|
+
|
|
2131
|
+
**As an option** named `opt`:
|
|
2132
|
+
|
|
2133
|
+
```shell
|
|
2134
|
+
# JSON form
|
|
2135
|
+
--opt=@json:'{"a":1,"b":"two"}'
|
|
2136
|
+
# Dot-path form via option name (each key as a separate option flag)
|
|
2137
|
+
--opt.a=1 --opt.b=two
|
|
2138
|
+
# Dot-path form via option value (consumes following positional arguments)
|
|
2139
|
+
--opt=@: a=1 b=two END
|
|
2140
|
+
```
|
|
2141
|
+
|
|
2142
|
+
> [!NOTE]
|
|
2143
|
+
> `--opt.a=1 --opt.b=two` and `--opt=@json:'{"a":1,"b":"two"}'` and `--opt=@: a=1 b=two` all produce the same `Hash` assigned to option `opt`.
|
|
2144
|
+
> The `--opt.key=value` form is the most concise when only a few keys need to be set.
|
|
2145
|
+
> Use `END` with `@:` when further positional arguments follow on the command line; it is optional otherwise.
|
|
2146
|
+
|
|
2147
|
+
#### Which Syntax to Choose?
|
|
2148
|
+
|
|
2149
|
+
**When in doubt: start with dot-path** (`--opt.key=value` for options, `@: key=value` for positional arguments).
|
|
2150
|
+
It requires no quoting, auto-converts types, and reads naturally on the command line.
|
|
2151
|
+
Switch to `@json:` when you already have a JSON payload from an API doc or external tool.
|
|
2152
|
+
|
|
2153
|
+
| Context | Recommended syntax | Reason |
|
|
2154
|
+
|---------|--------------------|--------|
|
|
2155
|
+
| Interactive CLI, simple values | dot-path `key.subkey=value` via `@:` or `--opt.key=value` | No quoting needed, auto-typed, readable |
|
|
2156
|
+
| Shell scripts, API payloads | `@json:` | Standard, portable, easy to copy from API docs |
|
|
2157
|
+
| Multi-line or nested structures in scripts | `@yaml:` + `@stdin:` heredoc | Readable, no escaping |
|
|
2158
|
+
| Dynamic values, lambdas, file reads | `@ruby:` | Full Ruby expressiveness |
|
|
2159
|
+
|
|
2069
2160
|
#### Common Usage Examples
|
|
2070
2161
|
|
|
2071
|
-
Example: Create a `Hash` value
|
|
2162
|
+
Example: Create a `Hash` value - for a small structure, the dot-path `key.subkey=value` form (via `@:`) is simpler; for larger or API-sourced structures, use `@json:`:
|
|
2072
2163
|
|
|
2073
2164
|
```shell
|
|
2165
|
+
ascli config echo @: key1=value1 key2=value2
|
|
2074
2166
|
ascli config echo @json:'{"key1":"value1","key2":"value2"}'
|
|
2075
2167
|
```
|
|
2076
2168
|
|
|
@@ -2212,12 +2304,31 @@ This works for any `Hash` option or positional parameter that has a defined sche
|
|
|
2212
2304
|
|
|
2213
2305
|
#### Testing Extended Value
|
|
2214
2306
|
|
|
2215
|
-
|
|
2216
|
-
|
|
2307
|
+
Two complementary commands help verify that a value is parsed as expected:
|
|
2308
|
+
|
|
2309
|
+
| What to check | Tool | How |
|
|
2310
|
+
|---|---|---|
|
|
2311
|
+
| Value of a **positional parameter** | `config echo` | Pass the expression as the sole argument |
|
|
2312
|
+
| Value of an **option** | `--show-config` | Append `--show-config` to any command line |
|
|
2313
|
+
|
|
2314
|
+
**Checking a positional parameter with `config echo`**:
|
|
2315
|
+
|
|
2316
|
+
`config echo` takes exactly **one** argument which can use the [Extended Value](#extended-value-syntax) syntax, and displays its parsed value.
|
|
2217
2317
|
Unprocessed command line arguments are shown in the error message.
|
|
2218
2318
|
|
|
2219
|
-
|
|
2220
|
-
|
|
2319
|
+
```shell
|
|
2320
|
+
ascli config echo @json:'{"a":1,"b":"two"}' --format=json
|
|
2321
|
+
ascli config echo @: a=1 b=two --format=json
|
|
2322
|
+
```
|
|
2323
|
+
|
|
2324
|
+
```json
|
|
2325
|
+
{"a":1,"b":"two"}
|
|
2326
|
+
```
|
|
2327
|
+
|
|
2328
|
+
> [!NOTE]
|
|
2329
|
+
> The value is shown after both shell command-line parsing and `ascli` [Extended Value](#extended-value-syntax) parsing.
|
|
2330
|
+
|
|
2331
|
+
Example: the shell parses three arguments (`1`, `2`, `3`), but `config echo` only processes the first:
|
|
2221
2332
|
|
|
2222
2333
|
```shell
|
|
2223
2334
|
ascli config echo 1 2 3
|
|
@@ -2228,10 +2339,19 @@ ascli config echo 1 2 3
|
|
|
2228
2339
|
ERROR: Argument: unprocessed values: ["2", "3"]
|
|
2229
2340
|
```
|
|
2230
2341
|
|
|
2231
|
-
|
|
2342
|
+
**Checking an option value with `--show-config`**:
|
|
2232
2343
|
|
|
2233
|
-
|
|
2234
|
-
|
|
2344
|
+
Adding `--show-config` to any command line performs a dry run and displays the resolved value of all options that would be used, without executing the command.
|
|
2345
|
+
|
|
2346
|
+
To display a specific option, add `--fields=<option_name>`.
|
|
2347
|
+
Add `--flat=no` when the option holds a structured value (`Hash`, `Array`) to display it as-is rather than flattened into dot-path keys:
|
|
2348
|
+
|
|
2349
|
+
```shell
|
|
2350
|
+
ascli --opt=@json:'{"a":1,"b":"two"}' some_plugin --show-config --fields=opt --flat=no
|
|
2351
|
+
ascli --opt.a=1 --opt.b=two some_plugin --show-config --fields=opt --flat=no
|
|
2352
|
+
```
|
|
2353
|
+
|
|
2354
|
+
Both lines above display the same resolved value for option `opt`.
|
|
2235
2355
|
|
|
2236
2356
|
In the following examples (using a POSIX shell, such as `bash`), several equivalent commands are provided.
|
|
2237
2357
|
For all examples, most special character handling is not specific to `ascli`:
|
|
@@ -2421,6 +2541,22 @@ Example:
|
|
|
2421
2541
|
ascli config preset set demo_server password <PASSWORD>
|
|
2422
2542
|
```
|
|
2423
2543
|
|
|
2544
|
+
The parameter name supports **dot-notation** to set nested hash options.
|
|
2545
|
+
If an intermediate hash already exists, the new value is **deep-merged** into it (existing sibling keys are preserved).
|
|
2546
|
+
|
|
2547
|
+
```shell
|
|
2548
|
+
ascli config preset set GLOBAL out.table.pivot single
|
|
2549
|
+
ascli config preset set GLOBAL out.level data
|
|
2550
|
+
```
|
|
2551
|
+
|
|
2552
|
+
The parameter value is **automatically coerced** to its natural type: integers, floats and booleans (`true`/`false`) are stored as native YAML types rather than strings.
|
|
2553
|
+
|
|
2554
|
+
To **delete** a key from a preset, pass `@none:` as the value (evaluates to `nil`):
|
|
2555
|
+
|
|
2556
|
+
```shell
|
|
2557
|
+
ascli config preset set GLOBAL out.table.pivot @none:
|
|
2558
|
+
```
|
|
2559
|
+
|
|
2424
2560
|
A full terminal based overview of the configuration can be displayed using:
|
|
2425
2561
|
|
|
2426
2562
|
```shell
|
|
@@ -2433,6 +2569,20 @@ A list of [Option Preset](#option-preset) can be displayed using:
|
|
|
2433
2569
|
ascli config preset list
|
|
2434
2570
|
```
|
|
2435
2571
|
|
|
2572
|
+
Any key starting with `_` (underscore) in a preset is treated as a comment and is ignored when the preset is applied.
|
|
2573
|
+
This is useful to annotate presets directly in the configuration file:
|
|
2574
|
+
|
|
2575
|
+
```yaml
|
|
2576
|
+
demo_server:
|
|
2577
|
+
_comment: "Demo server - public credentials"
|
|
2578
|
+
url: ssh://demo.asperasoft.com:33001
|
|
2579
|
+
username: asperaweb
|
|
2580
|
+
password: demoaspera
|
|
2581
|
+
```
|
|
2582
|
+
|
|
2583
|
+
> [!NOTE]
|
|
2584
|
+
> Comment keys are preserved and visible in `config preset overview` for inspection, but are never injected as CLI options.
|
|
2585
|
+
|
|
2436
2586
|
A good practice is to not manually edit the configuration file and use modification commands instead.
|
|
2437
2587
|
If necessary, the configuration file can be opened in a text editor with:
|
|
2438
2588
|
|
|
@@ -2473,7 +2623,9 @@ Usually, [Option presets](#option-preset) are used to contain pre-defined option
|
|
|
2473
2623
|
When a plugin is invoked, the preset associated with the name of the plugin is loaded, unless the option `--no-default` (or `-N`) is used.
|
|
2474
2624
|
|
|
2475
2625
|
> [!NOTE]
|
|
2476
|
-
>
|
|
2626
|
+
> The special plugin name `config` in the `default` preset points to a preset containing **global default options**
|
|
2627
|
+
> (such as `--log-level`, `--vault`, `--interactive`), loaded before any plugin is invoked.
|
|
2628
|
+
> To set global default options, use the `GLOBAL` keyword (see [Plugin: `config`](#plugin-config-configuration)).
|
|
2477
2629
|
|
|
2478
2630
|
Operations on this preset are done using regular `config` operations:
|
|
2479
2631
|
|
|
@@ -2528,7 +2680,8 @@ When `ascli` starts, it looks for the `default` Option Preset and checks the val
|
|
|
2528
2680
|
If set, it loads the options independently of the plugin used.
|
|
2529
2681
|
|
|
2530
2682
|
> [!NOTE]
|
|
2531
|
-
> If
|
|
2683
|
+
> If `default.config` is not set, `ascli` automatically uses `global_common_defaults` as the global preset name
|
|
2684
|
+
> and saves that mapping in the configuration file the first time the `GLOBAL` keyword is used.
|
|
2532
2685
|
|
|
2533
2686
|
> [!TIP]
|
|
2534
2687
|
> If you do not know the name of the global preset, you can use `GLOBAL` to refer to it.
|
|
@@ -2549,13 +2702,10 @@ Set a global parameter:
|
|
|
2549
2702
|
ascli config preset set GLOBAL version_check_days 0
|
|
2550
2703
|
```
|
|
2551
2704
|
|
|
2552
|
-
If
|
|
2705
|
+
If you want to use a custom name instead of `global_common_defaults`:
|
|
2553
2706
|
|
|
2554
2707
|
```shell
|
|
2555
2708
|
ascli config preset set default config <GLOBAL_OPTIONS_NAME>
|
|
2556
|
-
```
|
|
2557
|
-
|
|
2558
|
-
```shell
|
|
2559
2709
|
ascli config preset set GLOBAL version_check_days 0
|
|
2560
2710
|
```
|
|
2561
2711
|
|
|
@@ -2584,12 +2734,12 @@ check_update
|
|
|
2584
2734
|
coffee
|
|
2585
2735
|
coffee --log-level=trace2 --log-format=caller
|
|
2586
2736
|
coffee --ui=text
|
|
2587
|
-
coffee --ui=text --
|
|
2588
|
-
coffee --ui=text --
|
|
2737
|
+
coffee --ui=text --out.img.text=true
|
|
2738
|
+
coffee --ui=text --out.img=@json:'{"text":true,"double":false}'
|
|
2589
2739
|
commands
|
|
2590
2740
|
detect app.example.com
|
|
2591
|
-
detect https://
|
|
2592
|
-
detect https://
|
|
2741
|
+
detect https://f5.example.com/path
|
|
2742
|
+
detect https://f5.example.com/path faspex5
|
|
2593
2743
|
detect https://node.example.com/path
|
|
2594
2744
|
detect https://server.example.com/path
|
|
2595
2745
|
detect https://shares.example.com/path shares
|
|
@@ -2600,13 +2750,13 @@ doc
|
|
|
2600
2750
|
doc github transfer-parameters
|
|
2601
2751
|
doc local quick-start --ui=text
|
|
2602
2752
|
doc toc
|
|
2603
|
-
echo '<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50" fill="#069"/></svg>' --format=image --
|
|
2753
|
+
echo '<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50" fill="#069"/></svg>' --format=image --out.img.text=true
|
|
2604
2754
|
echo -- --special-string
|
|
2605
2755
|
echo @base64:SGVsbG8gV29ybGQK
|
|
2606
2756
|
echo @csvt:@stdin:
|
|
2607
2757
|
echo @env:USER
|
|
2608
|
-
echo @json:'[{"user":{"id":1,"name":"foo"},"project":"bar"}]' --
|
|
2609
|
-
echo @json:'[{"user":{"id":1,"name":"foo"},"project":"bar"}]' --
|
|
2758
|
+
echo @json:'[{"user":{"id":1,"name":"foo"},"project":"bar"}]' --out.table.pivot=single
|
|
2759
|
+
echo @json:'[{"user":{"id":1,"name":"foo"},"project":"bar"}]' --out.table.pivot=yes
|
|
2610
2760
|
echo @lines:@stdin:
|
|
2611
2761
|
echo @list:,1,2,3
|
|
2612
2762
|
echo @secret:
|
|
@@ -2643,7 +2793,7 @@ preset initialize conf_name @json:'{"p1":"v1","p2":"v2"}'
|
|
|
2643
2793
|
preset list
|
|
2644
2794
|
preset overview
|
|
2645
2795
|
preset set GLOBAL sdk_folder 'product:IBM Aspera Connect'
|
|
2646
|
-
preset set GLOBAL vault @: type=file
|
|
2796
|
+
preset set GLOBAL vault @: type=file name=/secure/vault_file
|
|
2647
2797
|
preset set GLOBAL vault_password _simple_one_
|
|
2648
2798
|
preset set GLOBAL version_check_days 0
|
|
2649
2799
|
preset set conf_name param value
|
|
@@ -2668,12 +2818,12 @@ transferd list
|
|
|
2668
2818
|
vault create @: label=my_label password=my_password_here 'description=my secret'
|
|
2669
2819
|
vault delete foo --vault.type=system
|
|
2670
2820
|
vault delete my_label
|
|
2821
|
+
vault ids
|
|
2671
2822
|
vault info
|
|
2672
2823
|
vault list
|
|
2673
2824
|
vault show my_label
|
|
2674
2825
|
wizard https://console.example.com/path console
|
|
2675
|
-
wizard https://
|
|
2676
|
-
wizard https://faspex5.example.com/path faspex5 --key-path=my_private_key
|
|
2826
|
+
wizard https://f5.example.com/path faspex5 --key-path=my_private_key
|
|
2677
2827
|
wizard https://node.example.com/path node --username=test --password=test
|
|
2678
2828
|
wizard https://orch.example.com/path orchestrator --username=test --password=test
|
|
2679
2829
|
wizard https://server.example.com/path server --username=my_username --password=my_password
|
|
@@ -2783,7 +2933,7 @@ Copy the completion script to Fish's completions directory:
|
|
|
2783
2933
|
cp $(gem contents aspera-cli | grep fish_autocomplete) ~/.config/fish/completions/ascli.fish
|
|
2784
2934
|
```
|
|
2785
2935
|
|
|
2786
|
-
No further configuration is needed
|
|
2936
|
+
No further configuration is needed - Fish loads files from `~/.config/fish/completions/` automatically.
|
|
2787
2937
|
|
|
2788
2938
|
Once active, press `Tab` to complete commands at any depth:
|
|
2789
2939
|
|
|
@@ -2833,7 +2983,7 @@ The user is told where to place the associated public key PEM in the application
|
|
|
2833
2983
|
|
|
2834
2984
|
#### Example of configuration for a plugin
|
|
2835
2985
|
|
|
2836
|
-
For Faspex, Shares, Node (including ATS, Aspera Transfer Service), Console,
|
|
2986
|
+
For Faspex 5, Shares, Node (including ATS, Aspera Transfer Service), Console,
|
|
2837
2987
|
only username/password and URL are required (either on command line, or from configuration file).
|
|
2838
2988
|
Those can be usually provided on the command line:
|
|
2839
2989
|
|
|
@@ -2894,7 +3044,7 @@ For security reasons, those secrets shall not be exposed in clear, either:
|
|
|
2894
3044
|
|
|
2895
3045
|
Instead, they shall be hidden (logs, output) or encrypted (configuration).
|
|
2896
3046
|
|
|
2897
|
-
Terminal output (command result) secret removal is controlled by option `
|
|
3047
|
+
Terminal output (command result) secret removal is controlled by option `--out.secrets` (default: `no`).
|
|
2898
3048
|
Log secret removal is controlled by option `log_secrets` (default: `no`).
|
|
2899
3049
|
Mandatory command line options can be requested interactively (for example, password) using option `interactive`.
|
|
2900
3050
|
It is possible to use [Extended Value](#extended-value-syntax) `@secret:[name]` to ask for a secret interactively.
|
|
@@ -2907,24 +3057,20 @@ export ASCLI_PASSWORD
|
|
|
2907
3057
|
|
|
2908
3058
|
Another possibility is to retrieve values from a secret vault.
|
|
2909
3059
|
|
|
2910
|
-
The vault is
|
|
2911
|
-
|
|
2912
|
-
`vault` shall be a `Hash` describing the vault:
|
|
2913
|
-
|
|
2914
|
-
```json
|
|
2915
|
-
{"type":"system","name":"ascli"}
|
|
2916
|
-
```
|
|
2917
|
-
|
|
2918
|
-
`vault_password` specifies the password for the vault.
|
|
2919
|
-
|
|
2920
|
-
Although it can be specified on command line, for security reason you should avoid exposing the secret.
|
|
2921
|
-
For example, it can be securely specified on command line like this:
|
|
3060
|
+
The vault is configured with option `vault` (a `Hash` describing the vault type and parameters, see sections below) and unlocked with option `vault_password`.
|
|
3061
|
+
To avoid exposing the vault password in the shell history, provide it via an environment variable:
|
|
2922
3062
|
|
|
2923
3063
|
```shell
|
|
2924
|
-
|
|
2925
|
-
export ASCLI_VAULT_PASSWORD
|
|
3064
|
+
export ASCLI_VAULT_PASSWORD=<YOUR_PASSWORD>
|
|
2926
3065
|
```
|
|
2927
3066
|
|
|
3067
|
+
> [!TIP]
|
|
3068
|
+
> Set it interactively using `read` so that it is not recorded in the shell history:
|
|
3069
|
+
>
|
|
3070
|
+
> ```shell
|
|
3071
|
+
> read -rs ASCLI_VAULT_PASSWORD && export ASCLI_VAULT_PASSWORD
|
|
3072
|
+
> ```
|
|
3073
|
+
|
|
2928
3074
|
#### Vault: IBM HashiCorp Vault
|
|
2929
3075
|
|
|
2930
3076
|
<https://developer.hashicorp.com/vault>
|
|
@@ -2949,6 +3095,14 @@ vault server -dev -dev-root-token-id=dev-only-token
|
|
|
2949
3095
|
| **type** | `String` | `file`: Encrypted file secret store. |
|
|
2950
3096
|
| `name` | `String` | Path to the encrypted vault file. Relative paths are resolved from the configuration folder.<br/>Default: `vault.bin`. |
|
|
2951
3097
|
| `type` | `String` | Vault type selector.<br/>Allowed values: `file`. |
|
|
3098
|
+
| **type** | `String` | `1password`: 1Password secret store (Connect REST API or CLI). |
|
|
3099
|
+
| `account` | `String` | Account shorthand for `op` (used when `source` is `cli`). Uses the default account if omitted. |
|
|
3100
|
+
| `source` | `String` | Backend source. Use `api` for the Connect REST API, `cli` for the `op` CLI.<br/>Allowed values: `api`, `cli`.<br/>Default: `api`. |
|
|
3101
|
+
| `token` | `String` | Bearer token for the Connect API (required when `source` is `api`). Defaults to the value of `vault_password`. |
|
|
3102
|
+
| `type` | `String` | Vault type selector.<br/>Allowed values: `1password`. |
|
|
3103
|
+
| `url` | `String` | Base URL of the 1Password Connect server (required when `source` is `api`).<br/>Example: `http://localhost:8080`. |
|
|
3104
|
+
| `vault_id` | `String` | ID of the 1Password vault to use (required when `source` is `api`). |
|
|
3105
|
+
| `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. |
|
|
2952
3106
|
|
|
2953
3107
|
```shell
|
|
2954
3108
|
--vault=@json:'{"type":"vault","url":"http://127.0.0.1:8200"}' --vault_password=dev-only-token
|
|
@@ -2973,21 +3127,106 @@ It is possible to store and use secrets encrypted in a file using option `vault`
|
|
|
2973
3127
|
{"type":"file","name":"vault.bin"}
|
|
2974
3128
|
```
|
|
2975
3129
|
|
|
2976
|
-
|
|
3130
|
+
To configure the encrypted file vault as the default, set the `vault` option in the global preset:
|
|
3131
|
+
|
|
3132
|
+
```shell
|
|
3133
|
+
ascli config preset set GLOBAL vault @: type=file name=vault.bin
|
|
3134
|
+
```
|
|
3135
|
+
|
|
3136
|
+
The vault file is created automatically on first use - no explicit initialization is needed.
|
|
3137
|
+
|
|
3138
|
+
> [!WARNING]
|
|
3139
|
+
> The `vault_password` option should **not** be stored in the config file: doing so would protect secrets with a password that is itself stored in plain text, defeating the purpose of the vault.
|
|
3140
|
+
> Use an environment variable as described above.
|
|
3141
|
+
|
|
3142
|
+
#### Vault: 1Password
|
|
3143
|
+
|
|
3144
|
+
Use `type: 1password` with a `source` parameter to select the backend.
|
|
2977
3145
|
|
|
2978
|
-
|
|
3146
|
+
##### Source: API (Connect REST API)
|
|
2979
3147
|
|
|
2980
|
-
|
|
3148
|
+
<https://developer.1password.com/docs/connect/>
|
|
3149
|
+
|
|
3150
|
+
[1Password Connect](https://developer.1password.com/docs/connect/) exposes a local REST API backed by a 1Password vault.
|
|
3151
|
+
Deploy the Connect server with Docker, then point `ascli` at it:
|
|
3152
|
+
|
|
3153
|
+
```shell
|
|
3154
|
+
docker run -d --name op-connect \
|
|
3155
|
+
-p 8080:8080 \
|
|
3156
|
+
-v /path/to/1password-credentials.json:/home/opuser/.op/1password-credentials.json \
|
|
3157
|
+
1password/connect-api:latest
|
|
3158
|
+
```
|
|
3159
|
+
|
|
3160
|
+
```shell
|
|
3161
|
+
--vault=@json:'{"type":"1password","source":"api","url":"http://localhost:8080","vault_id":"<VAULT_ID>"}' \
|
|
3162
|
+
--vault_password=<CONNECT_TOKEN>
|
|
3163
|
+
```
|
|
3164
|
+
|
|
3165
|
+
> [!TIP]
|
|
3166
|
+
> The `vault_id` is the alphanumeric ID shown in the 1Password web app under **Vault Settings**.
|
|
3167
|
+
> The `vault_password` holds the Connect bearer token generated when creating the Connect server credentials.
|
|
3168
|
+
|
|
3169
|
+
> [!NOTE]
|
|
3170
|
+
> The [1Password Service Accounts API](https://developer.1password.com/docs/service-accounts/) is also supported: use `url=https://api.1password.com` with a service account token as `vault_password`.
|
|
3171
|
+
> No local server is required in that case.
|
|
3172
|
+
|
|
3173
|
+
##### Source: Cli (`op` CLI)
|
|
3174
|
+
|
|
3175
|
+
<https://developer.1password.com/docs/cli/>
|
|
3176
|
+
|
|
3177
|
+
Requires the `op` CLI to be installed and signed in.
|
|
3178
|
+
No server to deploy — authentication is handled by the 1Password desktop app (biometric unlock) or by `op signin`.
|
|
3179
|
+
|
|
3180
|
+
```shell
|
|
3181
|
+
--vault=@json:'{"type":"1password","source":"cli"}'
|
|
3182
|
+
# or, to target a specific vault and account:
|
|
3183
|
+
--vault=@json:'{"type":"1password","source":"cli","vault":"<VAULT_NAME>","account":"<ACCOUNT_SHORTHAND>"}'
|
|
3184
|
+
```
|
|
3185
|
+
|
|
3186
|
+
> [!TIP]
|
|
3187
|
+
> Install `op` on macOS with `brew install 1password-cli`, then connect it to the desktop app:
|
|
3188
|
+
> `op signin`
|
|
3189
|
+
|
|
3190
|
+
#### Vault: Operations
|
|
3191
|
+
|
|
3192
|
+
Secrets can be manipulated using the `config vault` command:
|
|
2981
3193
|
|
|
2982
3194
|
- `create`
|
|
2983
3195
|
- `show`
|
|
2984
3196
|
- `list`
|
|
2985
3197
|
- `delete`
|
|
3198
|
+
- `import`
|
|
3199
|
+
|
|
3200
|
+
To add a new password entry in the vault for label `<NAME>`:
|
|
3201
|
+
|
|
3202
|
+
```shell
|
|
3203
|
+
ascli config vault create @: label=<NAME> password=@secret:password description='for this account'
|
|
3204
|
+
```
|
|
3205
|
+
|
|
3206
|
+
#### Vault: Migration between vaults
|
|
3207
|
+
|
|
3208
|
+
To migrate all secrets from one vault backend to another (for example, from the encrypted file vault to 1Password), use `vault overview` piped into `vault import`.
|
|
3209
|
+
|
|
3210
|
+
> [!NOTE]
|
|
3211
|
+
> Use `overview` (not `list`) as the source: `list` returns only labels, while `overview` returns the full secret details needed for import.
|
|
2986
3212
|
|
|
2987
3213
|
```shell
|
|
2988
|
-
ascli config vault
|
|
3214
|
+
ascli config vault overview --format=json --out.level=data \
|
|
3215
|
+
--vault=@json:'{"type":"file","name":"<SOURCE_VAULT_FILE>"}' \
|
|
3216
|
+
--vault_password=<SOURCE_PASSWORD> | \
|
|
3217
|
+
ascli config vault import @json:@stdin: --bulk \
|
|
3218
|
+
--vault=@json:'{"type":"1password","url":"<CONNECT_URL>","vault_id":"<VAULT_ID>"}' \
|
|
3219
|
+
--vault_password=<CONNECT_TOKEN>
|
|
2989
3220
|
```
|
|
2990
3221
|
|
|
3222
|
+
> [!TIP]
|
|
3223
|
+
> Use `--out.level=data` on the `overview` command so that only the raw JSON array is written to stdout, with no table headers or status lines.
|
|
3224
|
+
|
|
3225
|
+
The `import` command accepts a JSON array where each element is a vault secret object (same schema as `create`).
|
|
3226
|
+
`--bulk` makes each entry reported individually in the result table; omit it to get a single-line summary.
|
|
3227
|
+
On error (for example a duplicate label), the default behavior is to stop (`--bfail=yes`).
|
|
3228
|
+
Pass `--bfail=no` to skip failures and continue with the remaining entries.
|
|
3229
|
+
|
|
2991
3230
|
#### Configuration Finder
|
|
2992
3231
|
|
|
2993
3232
|
When a secret is needed by a sub command, the command can search for existing configurations in the configuration file by setting option `secret` to the special value `PRESET`.
|
|
@@ -3003,25 +3242,37 @@ Example:
|
|
|
3003
3242
|
ascli config preset update <PRESET_NAME> --url=... --username=... --password=...
|
|
3004
3243
|
```
|
|
3005
3244
|
|
|
3006
|
-
For
|
|
3245
|
+
For more secure storage, first create a vault entry (see [Vault: Operations](#vault-operations)), then refer to it in the preset:
|
|
3007
3246
|
|
|
3008
3247
|
```shell
|
|
3009
3248
|
ascli config preset update <PRESET_NAME> --url=... --username=... --password=@val:@vault:<VAULT_LABEL>.password
|
|
3010
3249
|
```
|
|
3011
3250
|
|
|
3251
|
+
> [!NOTE]
|
|
3252
|
+
> Use `@val:` in front of `@vault:` so that the [Extended Value](#extended-value-syntax) is not evaluated.
|
|
3253
|
+
|
|
3254
|
+
To migrate existing clear-text passwords from presets to the vault in one step, use the `secure` command.
|
|
3255
|
+
The vault must already be configured (option `vault`, see [Secret Vault](#secret-vault)).
|
|
3256
|
+
|
|
3012
3257
|
```shell
|
|
3013
|
-
ascli config
|
|
3258
|
+
ascli config preset secure
|
|
3014
3259
|
```
|
|
3015
3260
|
|
|
3016
|
-
|
|
3017
|
-
|
|
3261
|
+
This scans all presets (or a single one if a name is provided) and, for every option whose name ends with `password` or `secret`, moves the value into the vault and replaces it with a `@vault:` reference.
|
|
3262
|
+
|
|
3263
|
+
```shell
|
|
3264
|
+
ascli config preset secure <PRESET_NAME>
|
|
3265
|
+
```
|
|
3266
|
+
|
|
3267
|
+
When a vault is configured, the `update`, `set`, and `ask` preset commands automatically move secret values (options ending with `password` or `secret`) into the vault as they are written, so no manual migration is needed.
|
|
3268
|
+
To disable this behavior for a single command, pass `--vault=@none:`.
|
|
3018
3269
|
|
|
3019
3270
|
### Private Key
|
|
3020
3271
|
|
|
3021
3272
|
Some Aspera applications allow the user to be authenticated using [Public Key Cryptography](https://en.wikipedia.org/wiki/Public-key_cryptography):
|
|
3022
3273
|
|
|
3023
3274
|
- For SSH: Server
|
|
3024
|
-
- For OAuth JWT: AoC, Faspex5,
|
|
3275
|
+
- For OAuth JWT: AoC, Faspex5, Shares
|
|
3025
3276
|
|
|
3026
3277
|
It consists in using a pair of associated keys: a private key and a public key.
|
|
3027
3278
|
The same pair can be used for multiple applications.
|
|
@@ -3157,7 +3408,7 @@ Examples:
|
|
|
3157
3408
|
- Display image as colorized text (requires `rmagick`)
|
|
3158
3409
|
|
|
3159
3410
|
```shell
|
|
3160
|
-
ascli config image https://eudemo.asperademo.com/wallpaper.jpg --ui=text --
|
|
3411
|
+
ascli config image https://eudemo.asperademo.com/wallpaper.jpg --ui=text --out.img.text=true
|
|
3161
3412
|
```
|
|
3162
3413
|
|
|
3163
3414
|
- Display image from byte stream as image in terminal (requires iTerm2-compatible terminal)
|
|
@@ -3574,12 +3825,10 @@ Parameters in transfer-spec can be modified with option `ts`.
|
|
|
3574
3825
|
|
|
3575
3826
|
#### Asynchronous Transfer Mode
|
|
3576
3827
|
|
|
3577
|
-
For agents that delegate transfers to an external daemon (`desktop`, `node`, `connect`, `transferd`),
|
|
3578
|
-
the transfer lives entirely in that daemon — `ascli` does not need to stay connected while it runs.
|
|
3579
3828
|
Adding `asynchronous: true` to the `transfer` option makes `ascli` return immediately after
|
|
3580
3829
|
submitting the transfer, without waiting for completion.
|
|
3581
3830
|
|
|
3582
|
-
The returned `job_id` can be used at any time
|
|
3831
|
+
The returned `job_id` can be used at any time to check progress:
|
|
3583
3832
|
|
|
3584
3833
|
```shell
|
|
3585
3834
|
# Start a download and return immediately
|
|
@@ -3596,21 +3845,28 @@ ascli config transfer list
|
|
|
3596
3845
|
ascli config transfer cleanup
|
|
3597
3846
|
```
|
|
3598
3847
|
|
|
3599
|
-
|
|
3600
|
-
|
|
3601
|
-
|
|
|
3602
|
-
|
|
|
3603
|
-
| `
|
|
3604
|
-
| `
|
|
3605
|
-
| `
|
|
3606
|
-
| `
|
|
3848
|
+
All transfer agents support asynchronous mode:
|
|
3849
|
+
|
|
3850
|
+
| Agent | Status source | Persisted across restart |
|
|
3851
|
+
| ----------- | ----------------------------------------------------------------------------- | ------------------------ |
|
|
3852
|
+
| `desktop` | JSON-RPC `get_transfer` (auto-discovered URL) | Yes |
|
|
3853
|
+
| `node` | REST `ops/transfers/{id}` | Yes |
|
|
3854
|
+
| `connect` | REST `transfers/info/{id}` (auto-discovered URL) | Yes |
|
|
3855
|
+
| `transferd` | gRPC `monitor_transfers` | Yes |
|
|
3856
|
+
| `direct` | In-process thread state (re-queryable while process lives, e.g. MCP mode) | No — returns `unknown` after restart |
|
|
3857
|
+
| `httpgw` | In-process thread state (re-queryable while process lives, e.g. MCP mode) | No — returns `unknown` after restart |
|
|
3858
|
+
|
|
3859
|
+
For `direct` and `httpgw`, the transfer runs as a Ruby thread inside the `ascli` process.
|
|
3860
|
+
The `job_id` is persisted on disk but the live thread state is only available as long as the same process is running.
|
|
3861
|
+
If the process is restarted, `config transfer status` returns `unknown` for those jobs.
|
|
3607
3862
|
|
|
3608
3863
|
> [!NOTE]
|
|
3609
|
-
> **`asynchronous` and MCP**
|
|
3864
|
+
> **`asynchronous` and MCP** - When `ascli` is used as an MCP server, an AI assistant calling
|
|
3610
3865
|
> a transfer command may time out or cancel the request and retry, causing duplicate transfers.
|
|
3611
|
-
> Using `asynchronous: true` eliminates this risk: the transfer is submitted
|
|
3612
|
-
>
|
|
3866
|
+
> Using `asynchronous: true` eliminates this risk: the transfer is submitted immediately,
|
|
3867
|
+
> the `job_id` is returned, and the AI can poll
|
|
3613
3868
|
> `config transfer status <job_id>` to track progress without any risk of duplication.
|
|
3869
|
+
> This works with all agents, including `direct` and `httpgw`.
|
|
3614
3870
|
|
|
3615
3871
|
#### Agent: Direct
|
|
3616
3872
|
|
|
@@ -3651,14 +3907,14 @@ max( sleep_max, sleep_initial * sleep_factor ^ iter_index )
|
|
|
3651
3907
|
To display the native progress bar of `ascp`, use:
|
|
3652
3908
|
|
|
3653
3909
|
```shell
|
|
3654
|
-
--progress-bar=no --transfer.quiet=false
|
|
3910
|
+
--progress-bar=no --transfer.quiet=false
|
|
3655
3911
|
```
|
|
3656
3912
|
|
|
3657
3913
|
To skip usage of management port (which disables custom progress bar), set option `monitor` to `false`.
|
|
3658
3914
|
In that, use the native progress bar:
|
|
3659
3915
|
|
|
3660
3916
|
```shell
|
|
3661
|
-
--transfer.monitor=false --transfer.quiet=false
|
|
3917
|
+
--transfer.monitor=false --transfer.quiet=false
|
|
3662
3918
|
```
|
|
3663
3919
|
|
|
3664
3920
|
By default, Ruby's root CA store is used to validate any HTTPS endpoint used by `ascp` (for example, WSS).
|
|
@@ -3936,7 +4192,7 @@ Parameters provided in option `transfer` are:
|
|
|
3936
4192
|
Example:
|
|
3937
4193
|
|
|
3938
4194
|
```shell
|
|
3939
|
-
ascli
|
|
4195
|
+
ascli faspex5 packages recv 323 --transfer.url=https://asperagw.example.com:9443/aspera/http-gwy --transfer=httpgw
|
|
3940
4196
|
```
|
|
3941
4197
|
|
|
3942
4198
|
> [!NOTE]
|
|
@@ -4019,7 +4275,7 @@ To remove a (deep) key from transfer spec, set the value to `null`.
|
|
|
4019
4275
|
> Default transfer spec values can be displayed with command:
|
|
4020
4276
|
|
|
4021
4277
|
```shell
|
|
4022
|
-
ascli config ascp info --fields=ts --flat
|
|
4278
|
+
ascli config ascp info --fields=ts --out.flat=no
|
|
4023
4279
|
```
|
|
4024
4280
|
|
|
4025
4281
|
It is possible to specify `ascp` options when the `transfer` option is set to [`direct`](#agent-direct) using `transfer` option parameter: `ascp_args`.
|
|
@@ -4086,7 +4342,7 @@ ascli config ascp schema transferd --format=jsonpp
|
|
|
4086
4342
|
| T | Transferd |
|
|
4087
4343
|
|
|
4088
4344
|
| Field | Type | Description |
|
|
4089
|
-
|
|
4345
|
+
|--------------------------------|-----------------|----------------------------------------------------------------------------------|
|
|
4090
4346
|
| `apply_local_docroot` | `Bool` | Apply local docroot to source paths.<br/>(A, T)<br/>(`--apply-local-docroot`) |
|
|
4091
4347
|
| `authentication` | `String` | Set to `token` for SSH bypass keys, else password asked if not provided.<br/>(C) |
|
|
4092
4348
|
| `cipher_allowed` | `String` | Returned by node API. Valid literals include `aes-128` and `none`.<br/>(C)<br/>Allowed values: `none`, `aes-128`, `aes-192`, `aes-256`, `aes-128-cfb`, `aes-192-cfb`, `aes-256-cfb`, `aes-128-gcm`, `aes-192-gcm`, `aes-256-gcm`. |
|
|
@@ -4108,7 +4364,7 @@ ascli config ascp schema transferd --format=jsonpp
|
|
|
4108
4364
|
| `fasp_proxy` | `Hash` | Proxy for communications between the remote server and the (local) client.<br/>(T) |
|
|
4109
4365
|
| `file_checksum` | `String` | Enable checksum reporting for transferred files by specifying the hash to use.<br/>(A, N)<br/>Allowed values: `sha-512`, `sha-384`, `sha-256`, `sha1`, `md5`, `none`.<br/>Default: `none`.<br/>(`--file-checksum={enum}`) |
|
|
4110
4366
|
| `http_fallback_port` | `Integer` | Specifies HTTP port when no cipher is used.<br/>(`-t {integer}`) |
|
|
4111
|
-
| `http_fallback` | `
|
|
4367
|
+
| `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}`) |
|
|
4112
4368
|
| `https_fallback_port` | `Integer` | Specifies HTTPS port when cipher is used.<br/>(`-t {integer}`) |
|
|
4113
4369
|
| `icos` | `Hash` | Configuration parameters for IBM Cloud Object Storage (ICOS).<br/>(T) |
|
|
4114
4370
|
| `keepalive` | `Bool` | The session is running in persistent session mode.<br/>(A, T)<br/>(`--keepalive`) |
|
|
@@ -4137,7 +4393,7 @@ ascli config ascp schema transferd --format=jsonpp
|
|
|
4137
4393
|
| `preserve_remote_acls` | `String` | Preserve remote access control lists.<br/>(A, T)<br/>Allowed values: `none`, `native`, `metafile`.<br/>Default: `none`.<br/>(`--remote-preserve-acls={enum}`) |
|
|
4138
4394
|
| `preserve_remote_extended_attrs` | `String` | Preserve remote extended attributes.<br/>(A, T)<br/>Allowed values: `none`, `native`, `metafile`.<br/>Default: `none`.<br/>(`--remote-preserve-xattrs={enum}`) |
|
|
4139
4395
|
| `preserve_source_access_time` | `Bool` | Preserve the time logged for when the source file was accessed.<br/>(A, T)<br/>(`--preserve-source-access-time`) |
|
|
4140
|
-
| `preserve_times` | `Bool` | Preserve file timestamps.<br/>(A, N, T)<br/>(`-p
|
|
4396
|
+
| `preserve_times` | `Bool` | Preserve file timestamps.<br/>(A, N, T)<br/>(`-p`) |
|
|
4141
4397
|
| `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}`) |
|
|
4142
4398
|
| `rate_policy_allowed` | `String` | Specifies most aggressive rate policy that is allowed. Returned by node API.<br/>(C)<br/>Allowed values: `low`, `fair`, `high`, `fixed`. |
|
|
4143
4399
|
| `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}`) |
|
|
@@ -4151,7 +4407,7 @@ ascli config ascp schema transferd --format=jsonpp
|
|
|
4151
4407
|
| `remove_empty_source_directory` | `Bool` | Remove empty source subdirectories and remove the source directory itself, if empty.<br/>(A)<br/>(`--remove-empty-source-directory`) |
|
|
4152
4408
|
| `remove_skipped` | `Bool` | Must also have `remove_after_transfer` set to `true`. Defaults to `false`. If `true`, skipped files will be removed as well.<br/>(A, C, N)<br/>(`--remove-skipped`) |
|
|
4153
4409
|
| `resume_policy` | `String` | If a transfer is interrupted or fails to finish, this policy directs the transfer to resume without retransferring the files. Allowable values:<br/>- `none` : Always re-transfer the entire file.<br/>- `attrs` : Compare file attributes and resume if they match, and re-transfer if they do not.<br/>- `sparse_csum` : Compare file attributes and the sparse file checksums; resume if they match, and re-transfer if they do not.<br/>- `full_csum` : Compare file attributes and the full file checksums; resume if they match, and re-transfer if they do not.<br/>Note: transferd uses values: `attributes`, `sparse_checksum`, `full_checksum`.<br/>Allowed values: `none`, `attrs`, `sparse_csum`, `full_csum`.<br/>Default: `faspmgr:none;other:sparse_csum`.<br/>(`-k (conversion){enum}`) |
|
|
4154
|
-
| `retry_duration` | `
|
|
4410
|
+
| `retry_duration` | `Integer, String` | Specifies how long to wait before retrying transfer (e.g. `5min`).<br/>(T) |
|
|
4155
4411
|
| `save_before_overwrite` | `Bool` | If a transfer would result in an existing file <filename>.<ext> being overwritten, move that file to <filename>.yyyy.mm.dd.hh.mm.ss.index.<ext> (where index is set to 1 at the beginning of each new second and incremented for each file saved in this manner during the same second) in the same directory before writing the new file.<br/>File attributes are maintained in the renamed file.<br/>(A, N, T)<br/>(`--save-before-overwrite`) |
|
|
4156
4412
|
| `skip_duplicate_check` | `Bool` | Don't check for duplicate files at the destination.<br/>(A, T)<br/>(`--skip-dir-traversal-dupes`) |
|
|
4157
4413
|
| `skip_special_files` | `Bool` | All assets other than files, directories and symbolic links are considered special. A transfer will fail if the user attempts to transfer special assets. If `true`, `ascp` skips special assets and proceeds with the transfer of all other assets.<br/>(A, T)<br/>(`--skip-special-files`) |
|
|
@@ -4501,7 +4757,7 @@ Define a name for the server, for example: `ascli_job` as `<NAME>` below.
|
|
|
4501
4757
|
|
|
4502
4758
|
[Service]
|
|
4503
4759
|
Type=oneshot
|
|
4504
|
-
ExecStart=/home/xfer/bin/ascli_tool preview scan --logger=syslog --
|
|
4760
|
+
ExecStart=/home/xfer/bin/ascli_tool preview scan --logger=syslog --out.level=error
|
|
4505
4761
|
User=xfer
|
|
4506
4762
|
Group=xfer
|
|
4507
4763
|
```
|
|
@@ -4554,8 +4810,8 @@ Example of `crontab` for user `xfer`.
|
|
|
4554
4810
|
|
|
4555
4811
|
```shell
|
|
4556
4812
|
crontab<<EOF
|
|
4557
|
-
0 * * * * /home/xfer/bin/ascli_tool preview scan --logger=syslog --
|
|
4558
|
-
2-59 * * * * /home/xfer/bin/ascli_tool preview trev --logger=syslog --
|
|
4813
|
+
0 * * * * /home/xfer/bin/ascli_tool preview scan --logger=syslog --out.level=error
|
|
4814
|
+
2-59 * * * * /home/xfer/bin/ascli_tool preview trev --logger=syslog --out.level=error
|
|
4559
4815
|
EOF
|
|
4560
4816
|
```
|
|
4561
4817
|
|
|
@@ -4865,10 +5121,10 @@ Key query parameters:
|
|
|
4865
5121
|
```text
|
|
4866
5122
|
ascli -h
|
|
4867
5123
|
NAME
|
|
4868
|
-
ascli -- a command line tool for Aspera Applications (v4.27.
|
|
5124
|
+
ascli -- a command line tool for Aspera Applications (v4.27.2)
|
|
4869
5125
|
|
|
4870
5126
|
SYNOPSIS
|
|
4871
|
-
ascli
|
|
5127
|
+
ascli [GLOBAL_OPTIONS] <command> [OPTIONS] [ARGS]
|
|
4872
5128
|
|
|
4873
5129
|
DESCRIPTION
|
|
4874
5130
|
Use Aspera application to perform operations on command line.
|
|
@@ -4887,79 +5143,80 @@ COMMANDS
|
|
|
4887
5143
|
OPTIONS
|
|
4888
5144
|
Options begin with a '-' (minus), and value is provided on command line.
|
|
4889
5145
|
Special values are supported beginning with special prefix @pfx:, where pfx is one of:
|
|
4890
|
-
val, base64, csvt, env, file, uri, json, lines, list, none, path, re, ruby, s, secret, stdin, yaml, zlib, extend,
|
|
4891
|
-
Dates format is '
|
|
5146
|
+
val, base64, csvt, env, file, uri, json, lines, list, none, path, re, ruby, s, secret, stdin, yaml, zlib, extend, preset, vault
|
|
5147
|
+
Dates format is 'YYYY-MM-DD HH:MM:SS', or 'now' or '-<num>h'
|
|
4892
5148
|
|
|
4893
5149
|
ARGS
|
|
4894
5150
|
Some commands require mandatory arguments, e.g. a path.
|
|
4895
5151
|
|
|
4896
|
-
OPTIONS:
|
|
4897
|
-
--interactive=
|
|
4898
|
-
--ask-options=
|
|
4899
|
-
--
|
|
4900
|
-
--
|
|
4901
|
-
--
|
|
4902
|
-
--
|
|
4903
|
-
--
|
|
4904
|
-
--
|
|
4905
|
-
--
|
|
4906
|
-
--
|
|
4907
|
-
--
|
|
4908
|
-
--
|
|
4909
|
-
|
|
4910
|
-
|
|
4911
|
-
-
|
|
4912
|
-
|
|
4913
|
-
--
|
|
4914
|
-
--
|
|
4915
|
-
--log-
|
|
4916
|
-
--
|
|
4917
|
-
--
|
|
4918
|
-
--
|
|
4919
|
-
--
|
|
4920
|
-
--
|
|
4921
|
-
--
|
|
4922
|
-
--temp
|
|
4923
|
-
--
|
|
4924
|
-
--
|
|
4925
|
-
--
|
|
4926
|
-
--
|
|
4927
|
-
--
|
|
4928
|
-
--
|
|
4929
|
-
--vault
|
|
4930
|
-
--
|
|
4931
|
-
--
|
|
4932
|
-
--
|
|
4933
|
-
--
|
|
4934
|
-
|
|
4935
|
-
|
|
4936
|
-
--
|
|
4937
|
-
--
|
|
4938
|
-
--
|
|
4939
|
-
--
|
|
4940
|
-
--
|
|
4941
|
-
--
|
|
4942
|
-
--notify-
|
|
4943
|
-
--
|
|
4944
|
-
--
|
|
4945
|
-
--
|
|
4946
|
-
--
|
|
4947
|
-
|
|
4948
|
-
|
|
4949
|
-
--
|
|
4950
|
-
--
|
|
4951
|
-
--
|
|
4952
|
-
--
|
|
4953
|
-
--
|
|
4954
|
-
--
|
|
4955
|
-
--
|
|
4956
|
-
--http-
|
|
4957
|
-
--
|
|
4958
|
-
--
|
|
4959
|
-
--
|
|
4960
|
-
--
|
|
4961
|
-
--
|
|
4962
|
-
--transfer
|
|
5152
|
+
OPTIONS: global
|
|
5153
|
+
--interactive=yes|no Use interactive input of missing params
|
|
5154
|
+
--ask-options=yes|no Ask even optional options
|
|
5155
|
+
--out=HASH Output rendering options (dot-notation: format, level, file, fields, select, table[.pivot], flat, secrets, img)
|
|
5156
|
+
--display=info|data|error Output only some information (deprecated: use --out.level)
|
|
5157
|
+
--format=ENUM Output format (also: --out.format)
|
|
5158
|
+
--output=VALUE Destination for results (deprecated: use --out.file)
|
|
5159
|
+
--fields=LIST Comma separated list of: fields, or ALL, or DEF (also: --out.fields)
|
|
5160
|
+
--select=HASH Select only some items in lists: column, value (also: --out.select)
|
|
5161
|
+
--table-style=HASH (Table) Display style (deprecated: use --out.table)
|
|
5162
|
+
--flat-hash=yes|no (Table) Display deep values as additional keys (deprecated: use --out.flat)
|
|
5163
|
+
--multi-single=no|yes|single (Table) Control how object list is displayed as single table, or multiple objects (deprecated: use --out.table.pivot)
|
|
5164
|
+
--show-secrets=yes|no Show secrets on command output (deprecated: use --out.secrets)
|
|
5165
|
+
--image=HASH Options for displaying images and thumbnails in the terminal (deprecated: use --out.img)
|
|
5166
|
+
-h, --help Show this message
|
|
5167
|
+
--show-config Display parameters used for the provided action
|
|
5168
|
+
-v, --version Display version
|
|
5169
|
+
--ui=text|graphical Method to start browser
|
|
5170
|
+
--invalid-characters=VALUE Replacement character and invalid filename characters
|
|
5171
|
+
--log-level=ENUM Log level
|
|
5172
|
+
--log-format=VALUE Log formatter
|
|
5173
|
+
--logger=stderr|stdout|syslog Logging method
|
|
5174
|
+
--log=HASH Logging options (dot-notation: level, type, format, secrets)
|
|
5175
|
+
--lock-port=INT Prevent dual execution of a command, e.g. in cron
|
|
5176
|
+
--once-only=yes|no Process only new items (some commands)
|
|
5177
|
+
--log-secrets=yes|no Show passwords in logs
|
|
5178
|
+
--clean-temp=yes|no Cleanup temporary files on exit
|
|
5179
|
+
--temp-folder=VALUE Temporary folder
|
|
5180
|
+
--pid-file=VALUE Write process identifier to file, delete on exit
|
|
5181
|
+
--parser=none|json|ruby|yaml Default parser for structured parameters and options
|
|
5182
|
+
--home=VALUE Home folder for tool
|
|
5183
|
+
--config-file=VALUE Path to YAML file with preset configuration
|
|
5184
|
+
--secret=VALUE Secret for access keys
|
|
5185
|
+
--vault=HASH Secret vault configuration
|
|
5186
|
+
--vault-password=VALUE Vault password
|
|
5187
|
+
--progress-bar=yes|no Display progress bar
|
|
5188
|
+
--fpac=VALUE Proxy auto configuration script
|
|
5189
|
+
--proxy-credentials=LIST HTTP proxy credentials for fpac: user, password
|
|
5190
|
+
--sql=VALUE SQL suffix appended to sqlite3 queries for admin subcommands (e.g. WHERE clause)
|
|
5191
|
+
-P, --preset=VALUE Load the named option preset from current config file
|
|
5192
|
+
--version-check-days=INT Period in days to check new version (zero to disable)
|
|
5193
|
+
--plugin-folder=VALUE Folder where to find additional plugins
|
|
5194
|
+
--sdk-url=VALUE Ascp: URL to get Aspera Transfer Executables
|
|
5195
|
+
--locations-url=VALUE Ascp: URL to get download locations of Aspera Transfer Daemon
|
|
5196
|
+
--sdk-folder=VALUE Ascp: Path to folder with ascp (or product with "product:")
|
|
5197
|
+
--smtp=HASH SMTP email server configuration
|
|
5198
|
+
--notify-to=VALUE Email: Recipient for notification of transfers
|
|
5199
|
+
--notify-template=VALUE Email: ERB template for notification of transfers
|
|
5200
|
+
--cache-tokens=yes|no Save and reuse OAuth tokens
|
|
5201
|
+
--query=HASH Additional filter for for some commands (list/delete)
|
|
5202
|
+
--bulk=yes|no Bulk operation (only some)
|
|
5203
|
+
--bfail=yes|no Bulk operation error handling
|
|
5204
|
+
-N, --no-default Do not load default configuration for plugin
|
|
5205
|
+
--override=yes|no Wizard: override existing value
|
|
5206
|
+
--default=yes|no Wizard: set as default configuration for specified plugin (also: update)
|
|
5207
|
+
--key-path=VALUE Wizard: path to private key for JWT
|
|
5208
|
+
--insecure=yes|no HTTP/S: Do not validate any certificate
|
|
5209
|
+
--ignore-certificate=LIST HTTP/S: Do not validate certificate for these URLs
|
|
5210
|
+
--warn-insecure=yes|no HTTP/S: Issue a warning if certificate is ignored
|
|
5211
|
+
--cert-stores=LIST HTTP/S: List of folder with trusted certificates
|
|
5212
|
+
--http-options=HASH HTTP/S connection parameters for REST calls (not `ascp` WSS)
|
|
5213
|
+
--http-proxy=VALUE HTTP/S: URL for proxy with optional credentials
|
|
5214
|
+
--ts=HASH Override transfer spec values
|
|
5215
|
+
--to-folder=VALUE Destination folder for transferred files
|
|
5216
|
+
--sources=VALUE How list of transferred files is provided (@args,@ts,Array)
|
|
5217
|
+
--src-type=list|pair Type of file list
|
|
5218
|
+
--transfer=HASH Transfer agent type, or agent parameters with optional agent key
|
|
5219
|
+
--transfer-info=HASH Parameters for transfer agent (deprecated: use --transfer instead)
|
|
4963
5220
|
|
|
4964
5221
|
PLUGINS
|
|
4965
5222
|
alee Aspera License Entitlement Engine
|
|
@@ -4967,7 +5224,6 @@ PLUGINS
|
|
|
4967
5224
|
ats Aspera Transfer Service
|
|
4968
5225
|
console Console
|
|
4969
5226
|
cos IBM Cloud Object Storage
|
|
4970
|
-
faspex Faspex v4
|
|
4971
5227
|
faspex5 Faspex v5
|
|
4972
5228
|
faspio faspio Gateway
|
|
4973
5229
|
httpgw HTTP Gateway
|
|
@@ -5011,8 +5267,6 @@ For example: `--query=@json:'{"p[]":["v1","v2"]}'` leads to query: `?p[]=v1&p[]=
|
|
|
5011
5267
|
`ascli` uses a plugin mechanism.
|
|
5012
5268
|
The first level command (just after `ascli` on the command line) is the name of the concerned plugin which will execute the command.
|
|
5013
5269
|
Each plugin usually represents commands sent to a specific application.
|
|
5014
|
-
For instance, the plugin `faspex` allows operations on **Aspera Faspex**.
|
|
5015
|
-
|
|
5016
5270
|
Available plugins can be found using command:
|
|
5017
5271
|
|
|
5018
5272
|
```shell
|
|
@@ -5031,7 +5285,7 @@ ascli config plugin list
|
|
|
5031
5285
|
|
|
5032
5286
|
Most plugins will take the URL option: `url` to identify their location.
|
|
5033
5287
|
|
|
5034
|
-
REST APIs of Aspera legacy applications (Aspera Node,
|
|
5288
|
+
REST APIs of Aspera legacy applications (Aspera Node, Shares, Console, Orchestrator) use simple username/password authentication: HTTP Basic Authentication using options: `username` and `password`.
|
|
5035
5289
|
|
|
5036
5290
|
Aspera on Cloud and Faspex 5 rely on OAuth.
|
|
5037
5291
|
|
|
@@ -5257,10 +5511,9 @@ ascli config echo "@json:$(@{ k = $var; x = $true } | ConvertTo-Json -Compress)"
|
|
|
5257
5511
|
|
|
5258
5512
|
Some values provided to `ascli` (options, **Command Parameters**) are expected to be [Extended Value](#extended-value-syntax), that is, not a simple `String`, but a composite structure (`Hash`, `Array`).
|
|
5259
5513
|
|
|
5260
|
-
|
|
5261
|
-
|
|
5262
|
-
|
|
5263
|
-
The [dot-path](#dot-path-notation) can also be used and can be easier to use because it does usually not require special characters.
|
|
5514
|
+
For small structures with a few keys, the [dot-path](#dot-path-notation) `key.subkey=value` notation (using `@:` to collect positional arguments, or `--opt.key=value` directly for options) is often the most convenient: it requires no quoting and reads naturally on the command line.
|
|
5515
|
+
For larger or more complex structures (deep nesting, arrays of hashes, values copied from API documentation), the `@json:` modifier is typically a better fit.
|
|
5516
|
+
`@json:` expects a [JSON](https://www.json.org/) value; note that `"` is used to enclose a `String` in JSON, which may be difficult to specify in shells — enclose the whole argument in single quotes to avoid this.
|
|
5264
5517
|
|
|
5265
5518
|
Any option or **Command Parameter** expecting a `Hash` value accepts the special value `help` to display its schema.
|
|
5266
5519
|
See [Schema Discovery with `help`](#schema-discovery-with-help).
|
|
@@ -5788,7 +6041,9 @@ The command `aoc admin <TYPE> list` lists all entities of given type.
|
|
|
5788
6041
|
It uses paging and multiple requests if necessary.
|
|
5789
6042
|
|
|
5790
6043
|
The option `query` can be optionally used.
|
|
5791
|
-
It expects a `Hash` using [Extended Value](#extended-value-syntax) syntax
|
|
6044
|
+
It expects a `Hash` using [Extended Value](#extended-value-syntax) syntax.
|
|
6045
|
+
For a single filter key, the dot-path option form is the most direct (for example, `--query.sort=name`).
|
|
6046
|
+
For multiple keys or values copied from API documentation, `--query=@json:{...}` is more suitable.
|
|
5792
6047
|
Values are directly sent to the API call and used as a filter on server side.
|
|
5793
6048
|
|
|
5794
6049
|
The following parameters are supported:
|
|
@@ -6019,7 +6274,7 @@ ascli aoc admin user list --query.q=dummyuser --fields=id,email
|
|
|
6019
6274
|
```
|
|
6020
6275
|
|
|
6021
6276
|
```shell
|
|
6022
|
-
ascli aoc admin user list --query.q=dummyuser --fields=id --
|
|
6277
|
+
ascli aoc admin user list --query.q=dummyuser --fields=id --out.level=data --format=csv | ascli aoc admin user delete @lines:@stdin: --bulk=yes
|
|
6023
6278
|
```
|
|
6024
6279
|
|
|
6025
6280
|
```text
|
|
@@ -6149,7 +6404,7 @@ WS2ID=$(ascli aoc admin workspace list --query=@json:'{"q":"'"$WS2"'"}' --select
|
|
|
6149
6404
|
c- Extract membership information
|
|
6150
6405
|
|
|
6151
6406
|
```shell
|
|
6152
|
-
ascli aoc admin workspace_membership list --fields=manager,member_id,member_type,workspace_id --query=@json:'{"workspace_id":'"$WS1ID"'}' --format=jsonpp --
|
|
6407
|
+
ascli aoc admin workspace_membership list --fields=manager,member_id,member_type,workspace_id --query=@json:'{"workspace_id":'"$WS1ID"'}' --format=jsonpp --out.file=ws1_members.json
|
|
6153
6408
|
```
|
|
6154
6409
|
|
|
6155
6410
|
d- Convert to creation data for second workspace:
|
|
@@ -6224,7 +6479,7 @@ ascli aoc admin workspace_membership create @json:'{"workspace_id":<WORKSPACE_ID
|
|
|
6224
6479
|
- Get a user's ID
|
|
6225
6480
|
|
|
6226
6481
|
```shell
|
|
6227
|
-
ascli aoc admin user list --query=@json:'{"q":"manu.macron@example.com"}' --fields=id --format=csv --
|
|
6482
|
+
ascli aoc admin user list --query=@json:'{"q":"manu.macron@example.com"}' --fields=id --format=csv --out.level=data
|
|
6228
6483
|
```
|
|
6229
6484
|
|
|
6230
6485
|
User: <USER_ID>
|
|
@@ -6305,13 +6560,13 @@ Follow these steps to configure a new HSTS and link it to your existing Aspera o
|
|
|
6305
6560
|
This key remains constant for the lifetime of your Organization.
|
|
6306
6561
|
|
|
6307
6562
|
```shell
|
|
6308
|
-
ascli aoc admin organization show --fields=oauth_token_verification_key --
|
|
6563
|
+
ascli aoc admin organization show --fields=oauth_token_verification_key --out.secrets=yes --out.file=mypubkey.pem
|
|
6309
6564
|
```
|
|
6310
6565
|
|
|
6311
6566
|
It can also be retrieved from an existing node:
|
|
6312
6567
|
|
|
6313
6568
|
```shell
|
|
6314
|
-
ascli aoc admin node do %name:'<NODE_NAME>' v3 access_keys show self --fields=token_verification_key --
|
|
6569
|
+
ascli aoc admin node do %name:'<NODE_NAME>' v3 access_keys show self --fields=token_verification_key --out.secrets=yes --out.file=mypubkey.pem
|
|
6315
6570
|
```
|
|
6316
6571
|
|
|
6317
6572
|
- Create an Access Key on the Self-Managed HSTS
|
|
@@ -6321,7 +6576,7 @@ ascli aoc admin node do %name:'<NODE_NAME>' v3 access_keys show self --fields=to
|
|
|
6321
6576
|
> [!TIP]
|
|
6322
6577
|
> In this command, "master node credentials" allowing access key creation are used.
|
|
6323
6578
|
> The `id` and `secret` parameters are optional.
|
|
6324
|
-
> If you omit them, you must add `--
|
|
6579
|
+
> If you omit them, you must add `--out.secrets=yes` to the command.
|
|
6325
6580
|
> Record the generated secret immediately; it cannot be retrieved later, only reset.
|
|
6326
6581
|
|
|
6327
6582
|
```shell
|
|
@@ -6366,7 +6621,7 @@ ascli node access_key do self permission / create @: access_type=user access_id=
|
|
|
6366
6621
|
The following command will create and display a secret token to register a self-managed Aspera Transfer Server:
|
|
6367
6622
|
|
|
6368
6623
|
```shell
|
|
6369
|
-
ascli aoc admin client_registration_token create @json:'{"data":{"name":"laurentnode","client_subject_scopes":["alee","aejd"],"client_subject_enabled":true}}' --fields=token --
|
|
6624
|
+
ascli aoc admin client_registration_token create @json:'{"data":{"name":"laurentnode","client_subject_scopes":["alee","aejd"],"client_subject_enabled":true}}' --fields=token --out.secrets=yes
|
|
6370
6625
|
```
|
|
6371
6626
|
|
|
6372
6627
|
#### Example: Create an ATS Node
|
|
@@ -6427,7 +6682,7 @@ This is a two-steps procedure:
|
|
|
6427
6682
|
Or, alternatively:
|
|
6428
6683
|
|
|
6429
6684
|
```shell
|
|
6430
|
-
ascli aoc admin application instance list --query.aspera_app_type=packages --query.workspace_id=<WORKSPACE_ID> --fields=id --
|
|
6685
|
+
ascli aoc admin application instance list --query.aspera_app_type=packages --query.workspace_id=<WORKSPACE_ID> --fields=id --out.level=data
|
|
6431
6686
|
```
|
|
6432
6687
|
|
|
6433
6688
|
This displays the <APP_ID>.
|
|
@@ -6448,6 +6703,12 @@ See [File list](#list-of-files-for-transfers).
|
|
|
6448
6703
|
|
|
6449
6704
|
The Aspera on Cloud **Packages** app lets you assemble copies of any number of files and folders into a digital "package" and send the package to others, pretty much like a web-mail application.
|
|
6450
6705
|
|
|
6706
|
+
> [!NOTE]
|
|
6707
|
+
> All `aoc packages` commands operate in a workspace context. The workspace is inferred
|
|
6708
|
+
> automatically when a default workspace is configured in the application. If no default is
|
|
6709
|
+
> set, provide one explicitly with `--workspace=NAME`. List available workspaces with
|
|
6710
|
+
> `ascli aoc user workspaces list`.
|
|
6711
|
+
|
|
6451
6712
|
#### Send a Package
|
|
6452
6713
|
|
|
6453
6714
|
General syntax:
|
|
@@ -6518,7 +6779,7 @@ ascli aoc files browse /src_folder
|
|
|
6518
6779
|
To send a package with the file `10M.dat` from subfolder /src_folder:
|
|
6519
6780
|
|
|
6520
6781
|
```shell
|
|
6521
|
-
ascli aoc files node_info /src_folder --format=json --
|
|
6782
|
+
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:
|
|
6522
6783
|
```
|
|
6523
6784
|
|
|
6524
6785
|
#### Receive packages
|
|
@@ -6608,7 +6869,7 @@ Use command `find` to list recursively.
|
|
|
6608
6869
|
For advanced users, it is also possible to pipe node information for the package and use node operations:
|
|
6609
6870
|
|
|
6610
6871
|
```shell
|
|
6611
|
-
ascli aoc package node_info <PACKAGE_ID> / --format=json --
|
|
6872
|
+
ascli aoc package node_info <PACKAGE_ID> / --format=json --out.secrets=yes --out.level=data | ascli node -N --preset=@json:@stdin: access_key do self browse /
|
|
6612
6873
|
```
|
|
6613
6874
|
|
|
6614
6875
|
#### List packages
|
|
@@ -6653,7 +6914,7 @@ ascli aoc packages list --query=@json:'{"dropbox_name":"My Shared Inbox","archiv
|
|
|
6653
6914
|
Using shared inbox identifier: first retrieve the ID of the shared inbox, and then list packages with the appropriate filter.
|
|
6654
6915
|
|
|
6655
6916
|
```shell
|
|
6656
|
-
shared_box_id=$(ascli aoc packages shared_inboxes show --name='My Shared Inbox' --format=csv --
|
|
6917
|
+
shared_box_id=$(ascli aoc packages shared_inboxes show --name='My Shared Inbox' --format=csv --out.level=data --fields=id)
|
|
6657
6918
|
```
|
|
6658
6919
|
|
|
6659
6920
|
```shell
|
|
@@ -6666,6 +6927,10 @@ The Files application presents a **Home** folder to users in a given workspace.
|
|
|
6666
6927
|
Files located here are either user's files, or shared folders.
|
|
6667
6928
|
|
|
6668
6929
|
> [!NOTE]
|
|
6930
|
+
> All `aoc files` commands operate in a workspace context. The workspace is inferred
|
|
6931
|
+
> automatically when a default workspace is configured in the application. If no default is
|
|
6932
|
+
> set, provide one explicitly with `--workspace=NAME`. List available workspaces with
|
|
6933
|
+
> `ascli aoc user workspaces list`.
|
|
6669
6934
|
> All commands under `files` are the same as under `access_keys do self` for plugin `node`, that is, **gen4/access key** operations.
|
|
6670
6935
|
|
|
6671
6936
|
#### Download Files
|
|
@@ -6746,7 +7011,7 @@ ascli aoc files permission --workspace=<WORKSPACE_NAME> <PATH_TO_FOLDER> ...
|
|
|
6746
7011
|
|
|
6747
7012
|
> [!NOTE]
|
|
6748
7013
|
> The workspace is identified by name, and folder by path, relative to the user's home.
|
|
6749
|
-
> To use an identifier instead, one can use the percent selector, like `%id:<WS_ID>`.
|
|
7014
|
+
> To use an identifier instead, one can use the [percent selector](#percent-selector), like `%id:<WS_ID>`.
|
|
6750
7015
|
|
|
6751
7016
|
##### Admin Shared Folders
|
|
6752
7017
|
|
|
@@ -6758,7 +7023,7 @@ ascli aoc admin node do <NODE_ID> permission --workspace=<WORKSPACE_NAME> <PATH_
|
|
|
6758
7023
|
|
|
6759
7024
|
> [!TIP]
|
|
6760
7025
|
> The node is identified by identifier.
|
|
6761
|
-
> To use a name instead, one can use the percent selector, like `%name:"<NODE_NAME>"`.
|
|
7026
|
+
> To use a name instead, one can use the [percent selector](#percent-selector), like `%name:"<NODE_NAME>"`.
|
|
6762
7027
|
> The path is identifier by a path, one can specify a file ID, with `%id:123`.
|
|
6763
7028
|
> If the ID is left blank: `%id:`, then it means `*`, that is, "all".
|
|
6764
7029
|
|
|
@@ -6987,7 +7252,7 @@ Procedure to send a file from org1 to org2:
|
|
|
6987
7252
|
- Execute the following:
|
|
6988
7253
|
|
|
6989
7254
|
```shell
|
|
6990
|
-
ascli -Porg1 aoc files node_info <DEST_FOLDER> --format=json --
|
|
7255
|
+
ascli -Porg1 aoc files node_info <DEST_FOLDER> --format=json --out.level=data | ascli -Porg2 aoc files upload <SOURCE_FILE> --transfer=@json:@stdin:
|
|
6991
7256
|
```
|
|
6992
7257
|
|
|
6993
7258
|
Explanation:
|
|
@@ -6997,7 +7262,7 @@ Explanation:
|
|
|
6997
7262
|
- `aoc` uses the Aspera on Cloud plugin
|
|
6998
7263
|
- `files node_info /<DEST_FOLDER>` generates transfer information including the Node API credential and root ID, suitable for the next command
|
|
6999
7264
|
- `--format=json` formats the output as JSON (instead of the default text table)
|
|
7000
|
-
- `--
|
|
7265
|
+
- `--out.level=data` displays only the result, removing other information such as workspace name
|
|
7001
7266
|
- `|` pipes the standard output of the first command into the second one
|
|
7002
7267
|
- `-Porg2 aoc` uses the Aspera on Cloud plugin and loads credentials for `org2`
|
|
7003
7268
|
- `files upload <SOURCE_FILE>` uploads the file named `<SOURCE_FILE>` (located in `org2`) to `org1`
|
|
@@ -7040,7 +7305,7 @@ admin ats cluster list
|
|
|
7040
7305
|
admin ats cluster show --cloud=aws --region=eu-west-1
|
|
7041
7306
|
admin ats cluster show 1f412ae7-869a-445c-9c05-02ad16813be2
|
|
7042
7307
|
admin auth_providers list
|
|
7043
|
-
admin bearer_token --
|
|
7308
|
+
admin bearer_token --out.level=data
|
|
7044
7309
|
admin client list
|
|
7045
7310
|
admin client_access_key list
|
|
7046
7311
|
admin client_registration_token create @json:'{"data":{"name":"test_client_reg1","client_subject_scopes":["alee","aejd"],"client_subject_enabled":true}}'
|
|
@@ -7095,7 +7360,7 @@ automation workflow delete <id>
|
|
|
7095
7360
|
automation workflow list
|
|
7096
7361
|
automation workflow list --query.show_org_workflows=@val:true
|
|
7097
7362
|
automation workflow list --select.name=test_workflow --fields=id
|
|
7098
|
-
bearer_token --
|
|
7363
|
+
bearer_token --out.level=data
|
|
7099
7364
|
files bearer /
|
|
7100
7365
|
files bearer_token_node / --cache-tokens=no
|
|
7101
7366
|
files browse /
|
|
@@ -7127,7 +7392,7 @@ files show testdst/test_file.bin
|
|
|
7127
7392
|
files sync admin status /data/local_sync
|
|
7128
7393
|
files sync pull /testdst --to-folder=/data/local_sync @json:'{"reset":true,"transport":{"target_rate":my_bps}}'
|
|
7129
7394
|
files thumbnail my_test_folder/video_file.mpg
|
|
7130
|
-
files thumbnail my_test_folder/video_file.mpg --query
|
|
7395
|
+
files thumbnail my_test_folder/video_file.mpg --query.text=true --query.double=true
|
|
7131
7396
|
files transfer push /testsrc --to-folder=/testdst test_file.bin
|
|
7132
7397
|
files upload --to-folder=/ test_file.bin --url=my_public_link_folder_no_pass
|
|
7133
7398
|
files upload --to-folder=/testsrc test_file.bin
|
|
@@ -7142,8 +7407,8 @@ packages list
|
|
|
7142
7407
|
packages list --query=@json:'{"dropbox_name":"my_shared_inbox_name","sort":"-received_at","archived":false,"received":true,"has_content":true,"exclude_dropbox_packages":false}'
|
|
7143
7408
|
packages receive <id> --to-folder=.
|
|
7144
7409
|
packages receive <id> --to-folder=. /
|
|
7145
|
-
packages receive ALL --once-only=yes --to-folder=. --lock-port=50101 --package-folder.fld.0=name --package-folder.fld.1=id --package-folder.opt=true
|
|
7146
|
-
packages receive ALL --once-only=yes --to-folder=. --lock-port=50101 --query=@json:'{"dropbox_name":"my_shared_inbox_name","archived":false,"received":true,"has_content":true,"exclude_dropbox_packages":false,"include_draft":false}' --ts=@json:'{"resume_policy":"sparse_csum","target_rate_kbps":50000}'
|
|
7410
|
+
packages receive ALL --once-only=yes --to-folder=. --query.max=5 --lock-port=50101 --package-folder.fld.0=name --package-folder.fld.1=id --package-folder.opt=true
|
|
7411
|
+
packages receive ALL --once-only=yes --to-folder=. --query.max=5 --lock-port=50101 --query=@json:'{"dropbox_name":"my_shared_inbox_name","archived":false,"received":true,"has_content":true,"exclude_dropbox_packages":false,"include_draft":false}' --ts=@json:'{"resume_policy":"sparse_csum","target_rate_kbps":50000}'
|
|
7147
7412
|
packages receive INIT --once-only=yes --query.dropbox_name=my_shared_inbox_name
|
|
7148
7413
|
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
|
|
7149
7414
|
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
|
|
@@ -7782,7 +8047,7 @@ ascli node access_key create @json:'{"id":"<ACCESS_KEY>","secret":"<SECRET>","st
|
|
|
7782
8047
|
> [!TIP]
|
|
7783
8048
|
> The `id` and `secret` fields are optional.
|
|
7784
8049
|
> If not provided, they will be generated and returned into the result.
|
|
7785
|
-
> In that case, provide option `--
|
|
8050
|
+
> In that case, provide option `--out.secrets=yes` to get the generated secret.
|
|
7786
8051
|
|
|
7787
8052
|
Access keys support extra overriding parameters using parameter: `configuration` and sub keys `transfer` and `server`.
|
|
7788
8053
|
For example, an access key can be modified or created with the following options:
|
|
@@ -7914,7 +8179,7 @@ ascli node access_key modify %id:self @ruby:'{token_verification_key: File.read(
|
|
|
7914
8179
|
- Create a Bearer token for the user:
|
|
7915
8180
|
|
|
7916
8181
|
```shell
|
|
7917
|
-
ascli node bearer_token @file:./myorgkey.pem @json:'{"user_id":"'$my_user_id'","_validity":3600}' --
|
|
8182
|
+
ascli node bearer_token @file:./myorgkey.pem @json:'{"user_id":"'$my_user_id'","_validity":3600}' --out.file=bearer.txt
|
|
7918
8183
|
```
|
|
7919
8184
|
|
|
7920
8185
|
> [!NOTE]
|
|
@@ -8161,7 +8426,7 @@ For more information on the JWT method, refer to the section below.
|
|
|
8161
8426
|
If you have generated a private key with the wizard and lost the public key, you can retrieve the public key like this:
|
|
8162
8427
|
|
|
8163
8428
|
```shell
|
|
8164
|
-
ascli faspex5 --show-config --
|
|
8429
|
+
ascli faspex5 --show-config --out.secrets=yes --fields=private_key | ascli config pubkey @stdin: --out.secrets=yes
|
|
8165
8430
|
```
|
|
8166
8431
|
|
|
8167
8432
|
### Faspex 5 JWT authentication
|
|
@@ -8307,7 +8572,7 @@ admin smtp test my_email_external
|
|
|
8307
8572
|
admin workgroups list
|
|
8308
8573
|
bearer_token
|
|
8309
8574
|
gateway @: url=https://localhost:12346/aspera/faspex
|
|
8310
|
-
health --url=https://
|
|
8575
|
+
health --url=https://f5.example.com/path
|
|
8311
8576
|
invitation list
|
|
8312
8577
|
invitations create @: email_address=aspera.user1+u@gmail.com
|
|
8313
8578
|
packages browse <id> --query.recursive=true
|
|
@@ -8320,13 +8585,13 @@ packages list --query=@json:'{"mailbox":"inbox","status":"completed"}'
|
|
|
8320
8585
|
packages receive --box=my_shared_box_name <id> --to-folder=.
|
|
8321
8586
|
packages receive --box=my_workgroup --group-type=workgroups <id> --to-folder=.
|
|
8322
8587
|
packages receive <id> --to-folder=. --ts.content_protection_password=my_secret_here
|
|
8323
|
-
packages receive ALL --once-only=yes --to-folder=.
|
|
8588
|
+
packages receive ALL --once-only=yes --to-folder=. --query.max=5
|
|
8324
8589
|
packages receive INIT --once-only=yes
|
|
8325
8590
|
packages send --url=my_public_link_send_f5_user @json:'{"title":"test title"}' test_file.bin
|
|
8326
8591
|
packages send --url=my_public_link_send_shared_box @json:'{"title":"test title"}' test_file.bin
|
|
8327
|
-
packages send
|
|
8592
|
+
packages send @: 'title=for shared inbox' recipients.0=my_shared_box_name metadata.Options=Opt1 'metadata.TextInput=example text' END test_file.bin
|
|
8593
|
+
packages send @: 'title=test title' recipients.0.name=my_username END test_file.bin --ts.content_protection_password=my_secret_here
|
|
8328
8594
|
packages send @json:'{"title":"test title","recipients":["my_workgroup"]}' test_file.bin
|
|
8329
|
-
packages send @json:'{"title":"test title","recipients":[{"name":"my_username"}]my_meta}' test_file.bin --ts.content_protection_password=my_secret_here
|
|
8330
8595
|
packages send @json:'{"title":"test_webhook_ascli","recipients":["my_shared_box_name"]}' 'faux:///test1?1m'
|
|
8331
8596
|
packages show --box=my_shared_box_name <id>
|
|
8332
8597
|
packages show --box=my_workgroup --group-type=workgroups <id>
|
|
@@ -8334,20 +8599,21 @@ packages show <id>
|
|
|
8334
8599
|
packages status <f5_pack_send_shared> @list:,failed,completed
|
|
8335
8600
|
packages status <id>
|
|
8336
8601
|
postprocessing @json:'{"url":"https://localhost:8553/asclihook","script_folder":"/path/to/scripts","cert":".../localhost.p12","key":"changeit"}'
|
|
8337
|
-
shared browse %name:
|
|
8602
|
+
shared browse %name:my_shared_folder_name
|
|
8338
8603
|
shared list
|
|
8339
8604
|
shared_folders browse %name:my_shared_folder_name
|
|
8340
8605
|
shared_folders list
|
|
8341
8606
|
user account
|
|
8342
8607
|
user account --query.expand=true
|
|
8343
|
-
user profile modify
|
|
8608
|
+
user profile modify @: preference.rows_per_page=10
|
|
8344
8609
|
user profile show
|
|
8345
8610
|
version
|
|
8346
8611
|
```
|
|
8347
8612
|
|
|
8348
8613
|
Most commands correspond directly to REST API calls.
|
|
8349
8614
|
Parameters to commands are carried through option `query`, as [Extended Value](#extended-value-syntax), for `list`, or through **Command Parameter** for creation.
|
|
8350
|
-
|
|
8615
|
+
For a single parameter, the dot-path option form is the most direct (for example, `--query.status=completed`).
|
|
8616
|
+
For multiple parameters or when copying directly from API documentation, `@json:` is more suitable.
|
|
8351
8617
|
|
|
8352
8618
|
> [!TIP]
|
|
8353
8619
|
> The API is listed in [Faspex 5 API Reference](https://developer.ibm.com/apis/catalog?search="faspex+5") under **IBM Aspera Faspex API**.
|
|
@@ -8550,7 +8816,7 @@ Option `--once-only=yes` can be used, for "cargo-like" behavior.
|
|
|
8550
8816
|
Special package ID `INIT` initializes the persistency of already received packages when option `--once-only=yes` is used.
|
|
8551
8817
|
|
|
8552
8818
|
Special package ID `ALL` selects all packages (of the selected box).
|
|
8553
|
-
In this case, typically, only `completed` packages should be downloaded, so use option `--query=@json:'{"status":"completed"}'
|
|
8819
|
+
In this case, typically, only `completed` packages should be downloaded, so use option `--query.status=completed` (or equivalently `--query=@json:'{"status":"completed"}'`).
|
|
8554
8820
|
|
|
8555
8821
|
If a package is password protected, then the content protection password is asked interactively.
|
|
8556
8822
|
To keep the content encrypted, use option: `--ts=@json:'{"content_protection":null}'`, or provide the password instead of `null`.
|
|
@@ -8559,6 +8825,10 @@ To keep the content encrypted, use option: `--ts=@json:'{"content_protection":nu
|
|
|
8559
8825
|
|
|
8560
8826
|
### Faspex 5: List all shared inboxes and work groups
|
|
8561
8827
|
|
|
8828
|
+
> [!NOTE]
|
|
8829
|
+
> **Shared inboxes** (`faspex5 admin shared_inboxes`) are package recipients (dropboxes), accessible under the **Packages** app.
|
|
8830
|
+
> They are distinct from **shared folders** (`faspex5 shared_folders`), which are node-based storage access points accessible under the **Files** app.
|
|
8831
|
+
|
|
8562
8832
|
If you are a regular user, to list work groups you belong to:
|
|
8563
8833
|
|
|
8564
8834
|
```shell
|
|
@@ -8604,6 +8874,10 @@ ascli faspex5 admin shared create @json:'{"name":"the shared inbox","metadata_pr
|
|
|
8604
8874
|
|
|
8605
8875
|
### Faspex 5: List content in Shared folder and send package from remote source
|
|
8606
8876
|
|
|
8877
|
+
> [!NOTE]
|
|
8878
|
+
> **Shared folders** (`faspex5 shared_folders`) provide node-based storage access, accessible under the **Files** app.
|
|
8879
|
+
> They are distinct from **shared inboxes** (`faspex5 admin shared_inboxes`), which are package recipients (dropboxes) accessible under the **Packages** app.
|
|
8880
|
+
|
|
8607
8881
|
```shell
|
|
8608
8882
|
ascli faspex5 shared_folders list --fields=id,name
|
|
8609
8883
|
```
|
|
@@ -8625,7 +8899,7 @@ ascli faspex5 packages send @json:'{"title":"hello","recipients":[{"name":"_reci
|
|
|
8625
8899
|
```
|
|
8626
8900
|
|
|
8627
8901
|
> [!TIP]
|
|
8628
|
-
> The shared folder can be identified by its numerical `id` or by name using percent selector: `%<FIELD>:<VALUE>`. for example, `--shared-folder=3`
|
|
8902
|
+
> The shared folder can be identified by its numerical `id` or by name using [percent selector](#percent-selector): `%<FIELD>:<VALUE>`. for example, `--shared-folder=3`
|
|
8629
8903
|
|
|
8630
8904
|
### Faspex 5: Receive all packages (cargo)
|
|
8631
8905
|
|
|
@@ -8703,7 +8977,7 @@ ascli faspex5 admin accounts modify %name:some.user@example.com @json:'{"account
|
|
|
8703
8977
|
```
|
|
8704
8978
|
|
|
8705
8979
|
> [!TIP]
|
|
8706
|
-
> This example uses the percent selector, but the numerical ID can be used as well.
|
|
8980
|
+
> This example uses the [percent selector](#percent-selector), but the numerical ID can be used as well.
|
|
8707
8981
|
|
|
8708
8982
|
To send a password reset link to a user, use command `reset_password` on the `account`.
|
|
8709
8983
|
|
|
@@ -8792,210 +9066,6 @@ If a command is missing, then it is still possible to execute command by calling
|
|
|
8792
9066
|
curl -H "Authorization: $(ascli ascli bearer)" https://faspex5.example.com/aspera/faspex/api/v5/api_endpoint_here
|
|
8793
9067
|
```
|
|
8794
9068
|
|
|
8795
|
-
## Plugin: `faspex`: IBM Aspera Faspex v4
|
|
8796
|
-
|
|
8797
|
-
> [!WARNING]
|
|
8798
|
-
> Faspex v4 is end of support since September 30th, 2024.
|
|
8799
|
-
> So this plugin for Faspex v4 is deprecated.
|
|
8800
|
-
> If you still need to use Faspex4, then use `ascli` version 4.19.0 or earlier.
|
|
8801
|
-
|
|
8802
|
-
> [!NOTE]
|
|
8803
|
-
> For full details on Faspex API, refer to:
|
|
8804
|
-
> [Reference on Developer Site](https://developer.ibm.com/apis/catalog/?search=faspex)
|
|
8805
|
-
|
|
8806
|
-
This plugin uses APIs versions 3 Faspex v4.
|
|
8807
|
-
The `v4` command requires the use of API v4, refer to the Faspex Admin manual on how to activate.
|
|
8808
|
-
|
|
8809
|
-
### Listing Packages
|
|
8810
|
-
|
|
8811
|
-
Command: `faspex package list`
|
|
8812
|
-
|
|
8813
|
-
#### Option `box`
|
|
8814
|
-
|
|
8815
|
-
By default, it looks in box `inbox`, but the following boxes are also supported: `archive` and `sent`, selected with option `box`.
|
|
8816
|
-
|
|
8817
|
-
#### Option `recipient`
|
|
8818
|
-
|
|
8819
|
-
A user can receive a package because the recipient is:
|
|
8820
|
-
|
|
8821
|
-
- The user himself (default)
|
|
8822
|
-
- The user is member of a dropbox/workgroup: filter using option `recipient` set with value `*<name of dropbox/workgroup>`
|
|
8823
|
-
|
|
8824
|
-
#### Option `query`
|
|
8825
|
-
|
|
8826
|
-
As inboxes may be large, it is possible to use the following query parameters:
|
|
8827
|
-
|
|
8828
|
-
| Parameter | Evaluation | Description |
|
|
8829
|
-
|--------------|------------|----------------------------------------------------------------------|
|
|
8830
|
-
| `count` | API | Number of items in one API call result (default=0, equivalent to 10) |
|
|
8831
|
-
| `page` | API | ID of page in call (default=0) |
|
|
8832
|
-
| `startIndex` | API | Index of item to start (default=0) |
|
|
8833
|
-
| `max` | `ascli` | Maximum number of items |
|
|
8834
|
-
| `pmax` | `ascli` | Maximum number of pages |
|
|
8835
|
-
|
|
8836
|
-
(SQL query is `LIMIT <STARTINDEX>, <COUNT>`)
|
|
8837
|
-
|
|
8838
|
-
The API is listed in [Faspex 4 API Reference](https://developer.ibm.com/apis/catalog/?search=faspex) under **Services (API v.3)**.
|
|
8839
|
-
|
|
8840
|
-
If no parameter `max` or `pmax` is provided, then all packages will be listed in the inbox, which results in paged API calls (using parameters: `count` and `page`).
|
|
8841
|
-
By default, `count` is `0` (`10`), it can be increased to issue less HTTP calls.
|
|
8842
|
-
|
|
8843
|
-
#### Example: List packages in dropbox
|
|
8844
|
-
|
|
8845
|
-
```shell
|
|
8846
|
-
ascli faspex package list --box=inbox --recipient='*<DROPBOX>' --query=@json:'{"max":20,"pmax":2,"count":20}'
|
|
8847
|
-
```
|
|
8848
|
-
|
|
8849
|
-
List a maximum of 20 items grouped by pages of 20, with maximum 2 pages in received box (inbox) when received in dropbox `*<DROPBOX>`.
|
|
8850
|
-
|
|
8851
|
-
### Receiving a Package
|
|
8852
|
-
|
|
8853
|
-
The command is `package recv`, possible methods are:
|
|
8854
|
-
|
|
8855
|
-
- Provide a package ID with option `id`
|
|
8856
|
-
- Provide a public link with option `link`
|
|
8857
|
-
- Provide a `faspe:` URI with option `link`
|
|
8858
|
-
|
|
8859
|
-
```shell
|
|
8860
|
-
ascli faspex package recv 12345
|
|
8861
|
-
ascli faspex package recv --link=faspe://...
|
|
8862
|
-
```
|
|
8863
|
-
|
|
8864
|
-
If the package is in a specific **dropbox**/**workgroup**, add option `recipient` for both the `list` and `recv` commands.
|
|
8865
|
-
|
|
8866
|
-
```shell
|
|
8867
|
-
ascli faspex package list --recipient='*dropbox_name'
|
|
8868
|
-
ascli faspex package recv 125 --recipient='*dropbox_name'
|
|
8869
|
-
```
|
|
8870
|
-
|
|
8871
|
-
If `id` is set to `ALL`, then all packages are downloaded, and if option `once_only` is used, a persistency file is created to keep track of already downloaded packages.
|
|
8872
|
-
|
|
8873
|
-
### Sending a Package
|
|
8874
|
-
|
|
8875
|
-
The command is `faspex package send`.
|
|
8876
|
-
Package information (title, note, metadata, options) is provided in option `delivery_info`.
|
|
8877
|
-
The content of `delivery_info` is directly the contents of the `send` v3 [API of Faspex 4](https://developer.ibm.com/apis/catalog/aspera--aspera-faspex-client-sdk/API%20v.3:%20Send%20Packages).
|
|
8878
|
-
|
|
8879
|
-
Example:
|
|
8880
|
-
|
|
8881
|
-
```shell
|
|
8882
|
-
ascli faspex package send --delivery-info=@json:'{"title":"<TITLE>","recipients":["someuser@example.com"]}' /tmp/file1 /home/bar/file2
|
|
8883
|
-
```
|
|
8884
|
-
|
|
8885
|
-
If the recipient is a dropbox or workgroup: provide the name of the dropbox or workgroup preceded with `*` in the `recipients` field of the `delivery_info` option:
|
|
8886
|
-
`"recipients":["*MyDropboxName"]`
|
|
8887
|
-
|
|
8888
|
-
Additional optional parameters in mandatory option `delivery_info`:
|
|
8889
|
-
|
|
8890
|
-
- Package Note: : `"note":"note this and that"`
|
|
8891
|
-
- Package Metadata: `"metadata":{"Meta1":"Val1","Meta2":"Val2"}`
|
|
8892
|
-
|
|
8893
|
-
It is possible to send from a remote source using option `remote_source`, providing either the numerical ID, or the name of the remote source using percent selector: `%name:<NAME>`.
|
|
8894
|
-
|
|
8895
|
-
Remote source can be browsed if option `storage` is provided.
|
|
8896
|
-
`storage` is a `Hash` [Extended Value](#extended-value-syntax).
|
|
8897
|
-
The key is the storage name, as listed in `source list` command.
|
|
8898
|
-
The value is a `Hash` with the following keys:
|
|
8899
|
-
|
|
8900
|
-
- `node` is a `Hash` with keys: `url`, `username`, `password`
|
|
8901
|
-
- `path` is the sub-path inside the node, as configured in Faspex
|
|
8902
|
-
|
|
8903
|
-
### Email notification on transfer
|
|
8904
|
-
|
|
8905
|
-
Like for any transfer, a notification can be sent by email using options: `notify_to` and `notify_template`.
|
|
8906
|
-
|
|
8907
|
-
Example:
|
|
8908
|
-
|
|
8909
|
-
```shell
|
|
8910
|
-
ascli faspex package send --delivery-info=@json:'{"title":"test pkg 1","recipients":["aspera.user1@gmail.com"]}' ~/Documents/Samples/200KB.1 --notify-to=aspera.user1@gmail.com --notify-template=@ruby:'%Q{From: <%=from_name%> <<%=from_email%>>\nTo: <<%=to%>>\nSubject: Package sent: <%=ts["tags"]["aspera"]["faspex"]["metadata"]["_pkg_name"]%> files received\n\nTo user: <%=ts["tags"]["aspera"]["faspex"]["recipients"].first["email"]%>}'
|
|
8911
|
-
```
|
|
8912
|
-
|
|
8913
|
-
In this example the notification template is directly provided on command line.
|
|
8914
|
-
Package information placed in the message are directly taken from the tags in transfer spec.
|
|
8915
|
-
The template can be placed in a file using modifier: `@file:`
|
|
8916
|
-
|
|
8917
|
-
### Operations on dropbox
|
|
8918
|
-
|
|
8919
|
-
Example:
|
|
8920
|
-
|
|
8921
|
-
```shell
|
|
8922
|
-
ascli faspex v4 dropbox create @json:'{"dropbox":{"e_wg_name":"test1","e_wg_desc":"test1"}}'
|
|
8923
|
-
ascli faspex v4 dropbox list
|
|
8924
|
-
ascli faspex v4 dropbox delete 36
|
|
8925
|
-
```
|
|
8926
|
-
|
|
8927
|
-
### Remote sources
|
|
8928
|
-
|
|
8929
|
-
Faspex lacks an API to list the contents of a remote source (available in web UI).
|
|
8930
|
-
To work around this, the Node API is used, for this it is required to set option: `storage` that links a storage name to a node configuration and sub path.
|
|
8931
|
-
|
|
8932
|
-
Example:
|
|
8933
|
-
|
|
8934
|
-
```yaml
|
|
8935
|
-
my_faspex_conf:
|
|
8936
|
-
url: https://10.25.0.3/aspera/faspex
|
|
8937
|
-
username: admin
|
|
8938
|
-
password: MyUserPassword
|
|
8939
|
-
storage:
|
|
8940
|
-
my_storage:
|
|
8941
|
-
node: "@preset:my_faspex_node"
|
|
8942
|
-
path: /mydir
|
|
8943
|
-
my_faspex_node:
|
|
8944
|
-
url: https://10.25.0.3:9092
|
|
8945
|
-
username: node_faspex
|
|
8946
|
-
password: MyNodePassword
|
|
8947
|
-
```
|
|
8948
|
-
|
|
8949
|
-
In this example, a Faspex storage named `my_storage` exists in Faspex, and is located
|
|
8950
|
-
under the docroot in `/mydir` (this must be the same as configured in Faspex).
|
|
8951
|
-
The node configuration name is `my_faspex_node` here.
|
|
8952
|
-
|
|
8953
|
-
> [!NOTE]
|
|
8954
|
-
> The v4 API provides an API for nodes and shares.
|
|
8955
|
-
|
|
8956
|
-
### Automated package download (cargo)
|
|
8957
|
-
|
|
8958
|
-
It is possible to tell `ascli` to download newly received packages, much like the official cargo client, or drive.
|
|
8959
|
-
See the [same section](#receive-new-packages-only-cargo) in the Aspera on Cloud plugin:
|
|
8960
|
-
|
|
8961
|
-
```shell
|
|
8962
|
-
ascli faspex packages recv ALL --once-only=yes --lock-port=12345
|
|
8963
|
-
```
|
|
8964
|
-
|
|
8965
|
-
### Tested commands for `faspex`
|
|
8966
|
-
|
|
8967
|
-
> [!NOTE]
|
|
8968
|
-
> Add `ascli faspex` in front of the following commands:
|
|
8969
|
-
|
|
8970
|
-
```shell
|
|
8971
|
-
address_book
|
|
8972
|
-
dropbox list --recipient='*my_dbx'
|
|
8973
|
-
health
|
|
8974
|
-
login_methods
|
|
8975
|
-
me
|
|
8976
|
-
package list --query.max=5
|
|
8977
|
-
package receive <id> --recipient='*my_dbx' --to-folder=.
|
|
8978
|
-
package receive <id> --recipient='*my_wkg' --to-folder=.
|
|
8979
|
-
package receive <id> --to-folder=.
|
|
8980
|
-
package receive <id> --to-folder=. --box=sent
|
|
8981
|
-
package receive ALL --once-only=yes --to-folder=. --query.max=10
|
|
8982
|
-
package send --delivery-info=@json:'{"title":"package title","recipients":["my_email_internal","my_username"]}' test_file.bin
|
|
8983
|
-
package send --delivery-info=@json:'{"title":"package title","recipients":["my_email_internal"]}' --remote-source=%name:my_src sample_source.txt
|
|
8984
|
-
package send --delivery-info=@json:'{"title":"package title","recipients":[*my_dbx]}' test_file.bin
|
|
8985
|
-
package send --delivery-info=@json:'{"title":"package title","recipients":[*my_wkg]}' test_file.bin
|
|
8986
|
-
package send --link=https://app.example.com/send_to_dropbox_path --delivery-info.title='package title' test_file.bin
|
|
8987
|
-
package send --link=https://app.example.com/send_to_user_path --delivery-info.title='package title' test_file.bin
|
|
8988
|
-
source info %name:my_src --storage=@preset:faspex4_storage
|
|
8989
|
-
source list
|
|
8990
|
-
source node %name:my_src br / --storage=@preset:faspex4_storage
|
|
8991
|
-
v4 dmembership list
|
|
8992
|
-
v4 dropbox list
|
|
8993
|
-
v4 metadata_profile list
|
|
8994
|
-
v4 user list
|
|
8995
|
-
v4 wmembership list
|
|
8996
|
-
v4 workgroup list
|
|
8997
|
-
```
|
|
8998
|
-
|
|
8999
9069
|
## Plugin: `shares`: IBM Aspera Shares v1
|
|
9000
9070
|
|
|
9001
9071
|
Aspera Shares supports the **Node API** for the file transfer part.
|
|
@@ -9555,9 +9625,17 @@ case "$*" in *trev*) tmout=10m ;; *) tmout=30m ;; esac
|
|
|
9555
9625
|
|
|
9556
9626
|
- `trevents` : only recently uploaded files will be tested (transfer events)
|
|
9557
9627
|
- `events` : only recently uploaded files will be tested (file events: not working)
|
|
9558
|
-
- `scan` : recursively scan
|
|
9628
|
+
- `scan [path]` : generate previews for a file or recursively scan a folder. The default path is the access key's **storage root**. A file or folder can also be selected with `%id:<file_id>`.
|
|
9559
9629
|
- `test` : test using a local file
|
|
9560
9630
|
|
|
9631
|
+
Use `--filter` with `scan`, `events`, or `trevents` to select files by name. It accepts a glob string, a regular expression using `@re:`, or a Proc using `@ruby:`. For example:
|
|
9632
|
+
|
|
9633
|
+
```shell
|
|
9634
|
+
ascli preview scan /videos --filter='*.mp4'
|
|
9635
|
+
ascli preview scan %id:<file_id>
|
|
9636
|
+
ascli preview scan /videos --filter='@ruby:->(f){f["name"].end_with?(".mp4")}'
|
|
9637
|
+
```
|
|
9638
|
+
|
|
9561
9639
|
Once candidate are selected, a preview is always generated if it does not exist already, else if a preview already exist, it will be generated using one of three values for the `overwrite` option:
|
|
9562
9640
|
|
|
9563
9641
|
- `always` : preview is always generated, even if it already exists and is newer than original
|
|
@@ -9575,8 +9653,6 @@ ascli preview scan --skip-folders=@json:'["/not_here"]'
|
|
|
9575
9653
|
|
|
9576
9654
|
The option `folder_reset_cache` forces the node service to refresh folder contents using various methods.
|
|
9577
9655
|
|
|
9578
|
-
When scanning the option `query` has the same behavior as for the `node access_keys do self find` command.
|
|
9579
|
-
|
|
9580
9656
|
See the following section for details.
|
|
9581
9657
|
|
|
9582
9658
|
### Preview File types
|
|
@@ -9636,8 +9712,8 @@ Nevertheless, `ascli` may or may not have direct file system access to the acces
|
|
|
9636
9712
|
```shell
|
|
9637
9713
|
check --skip-types=office
|
|
9638
9714
|
events --once-only=yes --skip-types=office --log-level=info
|
|
9639
|
-
scan
|
|
9640
|
-
scan --skip-types=office --log-level=info --skip-
|
|
9715
|
+
scan %id:1 --skip-types=office --log-level=info --root-url=aspera: --ts.target_rate_kbps=1000000
|
|
9716
|
+
scan --skip-types=office --log-level=info --skip-folders=/special/folder
|
|
9641
9717
|
show /etc/hosts --base=test
|
|
9642
9718
|
show my_docx --base=test
|
|
9643
9719
|
show my_mpg --base=test --video-png-conv=animated
|
|
@@ -9650,21 +9726,27 @@ test my_dcm --base=test --mimemagic=yes
|
|
|
9650
9726
|
test my_jpg_unk --base=test --mimemagic=yes
|
|
9651
9727
|
test my_mpg mp4 --base=test --video-conversion=clips
|
|
9652
9728
|
test my_mpg mp4 --base=test --video-conversion=reencode
|
|
9653
|
-
test my_mxf mp4 --base=test --video-conversion=blend --query
|
|
9729
|
+
test my_mxf mp4 --base=test --video-conversion=blend --query.text=true --query.double=true
|
|
9654
9730
|
trevents --once-only=yes --skip-types=office --log-level=info
|
|
9655
9731
|
```
|
|
9656
9732
|
|
|
9657
9733
|
## Plugin: `mcp`: Model Context Protocol server
|
|
9658
9734
|
|
|
9659
9735
|
> [!WARNING]
|
|
9660
|
-
> This plugin is **experimental**.
|
|
9736
|
+
> This plugin is **experimental**.
|
|
9737
|
+
> The interface, options, and behavior may change in future releases without notice.
|
|
9661
9738
|
|
|
9662
9739
|
The `mcp` plugin starts a [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that exposes `ascli` to AI assistants and LLM-based tools.
|
|
9663
9740
|
The server registers a single tool, `execute_ascli_command`, which executes any `ascli` command in-process and returns the result as text.
|
|
9664
9741
|
|
|
9665
|
-
> [!
|
|
9666
|
-
> The `mcp`
|
|
9667
|
-
>
|
|
9742
|
+
> [!IMPORTANT]
|
|
9743
|
+
> The `mcp` and `rack` gems are required.
|
|
9744
|
+
> Check section [Installing Optional Gems](#installing-optional-gems)
|
|
9745
|
+
> Install them with the following command:
|
|
9746
|
+
|
|
9747
|
+
```shell
|
|
9748
|
+
gem install mcp rack
|
|
9749
|
+
```
|
|
9668
9750
|
|
|
9669
9751
|
### Usage
|
|
9670
9752
|
|
|
@@ -9696,7 +9778,7 @@ The `server` command accepts an optional [Hash](#extended-value-syntax) argument
|
|
|
9696
9778
|
| `max_line_bytes` | `integer` | 4194304 (4 MiB) | Maximum JSON frame size in bytes |
|
|
9697
9779
|
|
|
9698
9780
|
> [!NOTE]
|
|
9699
|
-
> **`stdio` transport and server description**
|
|
9781
|
+
> **`stdio` transport and server description** - The MCP protocol does not carry a `description` field in the `initialize` handshake.
|
|
9700
9782
|
> For `stdio` servers, AI clients (Claude Desktop, VS Code, Bob, …) cannot retrieve the description automatically.
|
|
9701
9783
|
> Add a `"description"` field directly in the client's `mcpServers` configuration to display it in the UI.
|
|
9702
9784
|
|
|
@@ -9713,7 +9795,7 @@ The `server` command accepts an optional [Hash](#extended-value-syntax) argument
|
|
|
9713
9795
|
| `max_sessions` | `integer` | - | Maximum number of concurrent sessions |
|
|
9714
9796
|
|
|
9715
9797
|
> [!NOTE]
|
|
9716
|
-
> **HTTP transport discovery endpoint**
|
|
9798
|
+
> **HTTP transport discovery endpoint** - When using `http` transport, the server exposes a `GET /` endpoint that returns a JSON object with `name`, `version`, and `description` fields.
|
|
9717
9799
|
> AI clients that support this convention (such as Bob) automatically read the description from this endpoint and display it in their MCP server list without any manual configuration.
|
|
9718
9800
|
|
|
9719
9801
|
### Examples
|
|
@@ -9738,12 +9820,60 @@ ascli mcp server @: instructions="Aspera transfer automation" protocol_version=2
|
|
|
9738
9820
|
|
|
9739
9821
|
### MCP client configuration
|
|
9740
9822
|
|
|
9741
|
-
|
|
9823
|
+
#### Streamable HTTP transport
|
|
9824
|
+
|
|
9825
|
+
Start the server in a separate terminal first:
|
|
9826
|
+
|
|
9827
|
+
```shell
|
|
9828
|
+
ascli mcp server @: transport=http port=3000
|
|
9829
|
+
```
|
|
9830
|
+
|
|
9831
|
+
Then register it in the AI client's MCP configuration file.
|
|
9832
|
+
|
|
9833
|
+
For [**IBM Bob**](https://bob.ibm.com/docs/ide/configuration/mcp/mcp-in-bob), add to `.bob/mcp.json` in your project (or `~/.bob/mcp.json` for global configuration):
|
|
9834
|
+
|
|
9835
|
+
```json
|
|
9836
|
+
{
|
|
9837
|
+
"mcpServers": {
|
|
9838
|
+
"ascli": {
|
|
9839
|
+
"type": "streamable-http",
|
|
9840
|
+
"url": "http://localhost:3000/mcp"
|
|
9841
|
+
}
|
|
9842
|
+
}
|
|
9843
|
+
}
|
|
9844
|
+
```
|
|
9845
|
+
|
|
9846
|
+
For other clients (Claude Desktop, VS Code, …):
|
|
9742
9847
|
|
|
9743
9848
|
```json
|
|
9744
9849
|
{
|
|
9745
9850
|
"mcpServers": {
|
|
9746
9851
|
"ascli": {
|
|
9852
|
+
"type": "http",
|
|
9853
|
+
"url": "http://localhost:3000/mcp"
|
|
9854
|
+
}
|
|
9855
|
+
}
|
|
9856
|
+
}
|
|
9857
|
+
```
|
|
9858
|
+
|
|
9859
|
+
> [!NOTE]
|
|
9860
|
+
> With `http` transport, the client connects to a running server process.
|
|
9861
|
+
> The server must be started and kept running independently before the AI client tries to connect.
|
|
9862
|
+
|
|
9863
|
+
#### `stdio` transport
|
|
9864
|
+
|
|
9865
|
+
The client launches `ascli` directly as a subprocess.
|
|
9866
|
+
Add the following to the AI client's MCP configuration file.
|
|
9867
|
+
|
|
9868
|
+
##### IBM Bob `stdio`
|
|
9869
|
+
|
|
9870
|
+
For [**IBM Bob**](https://bob.ibm.com/docs/ide/configuration/mcp/mcp-in-bob), add to `.bob/mcp.json` in your project (or `~/.bob/mcp.json` for global configuration):
|
|
9871
|
+
|
|
9872
|
+
```json
|
|
9873
|
+
{
|
|
9874
|
+
"mcpServers": {
|
|
9875
|
+
"ascli": {
|
|
9876
|
+
"type": "stdio",
|
|
9747
9877
|
"command": "/path/to/bin/ascli",
|
|
9748
9878
|
"args": ["mcp", "server"],
|
|
9749
9879
|
"description": "Aspera CLI MCP server"
|
|
@@ -9752,23 +9882,45 @@ To register `ascli` as an MCP server in an AI client (e.g. Claude Desktop, VS Co
|
|
|
9752
9882
|
}
|
|
9753
9883
|
```
|
|
9754
9884
|
|
|
9755
|
-
|
|
9756
|
-
|
|
9757
|
-
|
|
9758
|
-
|
|
9759
|
-
|
|
9760
|
-
|
|
9761
|
-
|
|
9762
|
-
|
|
9763
|
-
|
|
9764
|
-
|
|
9765
|
-
|
|
9766
|
-
|
|
9767
|
-
|
|
9768
|
-
|
|
9769
|
-
|
|
9770
|
-
|
|
9771
|
-
|
|
9885
|
+
For other clients (Claude Desktop, VS Code, …), the configuration is identical.
|
|
9886
|
+
|
|
9887
|
+
##### Claude Desktop `stdio`
|
|
9888
|
+
|
|
9889
|
+
Find the configuration file as specified in [Claude Desktop Documentation](https://modelcontextprotocol.io/docs/2026-07-28/develop/connect-local-servers).
|
|
9890
|
+
|
|
9891
|
+
place this section in `mcpServers`:
|
|
9892
|
+
|
|
9893
|
+
```json
|
|
9894
|
+
{
|
|
9895
|
+
"mcpServers": {
|
|
9896
|
+
"ascli": {
|
|
9897
|
+
"command": "ascli",
|
|
9898
|
+
"args": ["mcp", "server"]
|
|
9899
|
+
}
|
|
9900
|
+
},
|
|
9901
|
+
...
|
|
9902
|
+
}
|
|
9903
|
+
```
|
|
9904
|
+
|
|
9905
|
+
##### Development mode for `stdio`
|
|
9906
|
+
|
|
9907
|
+
If the `ascli` gem is not installed and you are running directly from the source tree, Ruby will not find the `lib/` directory automatically.
|
|
9908
|
+
Add the `RUBYLIB` environment variable pointing to the `lib/` directory of the project:
|
|
9909
|
+
|
|
9910
|
+
```json
|
|
9911
|
+
{
|
|
9912
|
+
"mcpServers": {
|
|
9913
|
+
"ascli": {
|
|
9914
|
+
"type": "stdio",
|
|
9915
|
+
"command": "/path/to/aspera-cli/bin/ascli",
|
|
9916
|
+
"args": ["mcp", "server"],
|
|
9917
|
+
"env": {
|
|
9918
|
+
"RUBYLIB": "/path/to/aspera-cli/lib"
|
|
9919
|
+
}
|
|
9920
|
+
}
|
|
9921
|
+
}
|
|
9922
|
+
}
|
|
9923
|
+
```
|
|
9772
9924
|
|
|
9773
9925
|
### Tested commands for `mcp`
|
|
9774
9926
|
|
|
@@ -9789,6 +9941,74 @@ It covers tool visibility, self-discovery, Hash schema introspection, option lis
|
|
|
9789
9941
|
documentation retrieval, live transfer tasks, truncation handling, error handling, and
|
|
9790
9942
|
credential safety.
|
|
9791
9943
|
|
|
9944
|
+
### MCP usage patterns for AI
|
|
9945
|
+
|
|
9946
|
+
> [!TIP]
|
|
9947
|
+
> This section is for AI assistants using the MCP server. Follow these patterns to avoid
|
|
9948
|
+
> common first-call failures and unnecessary retries.
|
|
9949
|
+
|
|
9950
|
+
#### Session bootstrap
|
|
9951
|
+
|
|
9952
|
+
Always start a session with two discovery calls before doing anything else:
|
|
9953
|
+
|
|
9954
|
+
```
|
|
9955
|
+
["config", "preset", "list"]
|
|
9956
|
+
["config", "preset", "show", "default"]
|
|
9957
|
+
```
|
|
9958
|
+
|
|
9959
|
+
The second call returns the `plugin → preset_name` mapping so you know which credentials
|
|
9960
|
+
are active for each plugin.
|
|
9961
|
+
|
|
9962
|
+
#### Command discovery
|
|
9963
|
+
|
|
9964
|
+
Always use `["config", "commands"]` to enumerate every available command and its syntax.
|
|
9965
|
+
Never guess command names from training data — names like `shared_folders` vs
|
|
9966
|
+
`shared_inboxes` are easily confused.
|
|
9967
|
+
|
|
9968
|
+
#### Schema introspection for Hash arguments
|
|
9969
|
+
|
|
9970
|
+
Whenever a command syntax shows a `<data>` argument, call `help` **before** the real call:
|
|
9971
|
+
|
|
9972
|
+
```json
|
|
9973
|
+
["<plugin>", "<cmd>", ..., "help"]
|
|
9974
|
+
```
|
|
9975
|
+
|
|
9976
|
+
This returns a table of field names, types, and descriptions. Never infer field names from
|
|
9977
|
+
server error messages.
|
|
9978
|
+
|
|
9979
|
+
#### Async transfers and cross-call status tracking
|
|
9980
|
+
|
|
9981
|
+
The `direct` agent keeps transfer state in-memory. A job started in one MCP call **cannot**
|
|
9982
|
+
be monitored in a subsequent call — the in-memory agent is gone between calls.
|
|
9983
|
+
|
|
9984
|
+
Use the `transferd` agent when you need to check transfer status in a later call:
|
|
9985
|
+
|
|
9986
|
+
```json
|
|
9987
|
+
["server", "upload", "--transfer=transferd", "--to-folder=/dst", "/local/file"]
|
|
9988
|
+
```
|
|
9989
|
+
|
|
9990
|
+
The `desktop` agent is also unaffected because it runs in an external process.
|
|
9991
|
+
|
|
9992
|
+
#### Workspace context for AoC
|
|
9993
|
+
|
|
9994
|
+
`aoc files` and `aoc packages` commands require a workspace context. If no default
|
|
9995
|
+
workspace is configured in the preset, always add `--workspace=NAME`:
|
|
9996
|
+
|
|
9997
|
+
```
|
|
9998
|
+
["aoc", "files", "ls", "/", "--workspace=MyWorkspace"]
|
|
9999
|
+
```
|
|
10000
|
+
|
|
10001
|
+
List available workspaces with `["aoc", "user", "workspaces", "list"]`.
|
|
10002
|
+
|
|
10003
|
+
#### Admin operations and privilege checks
|
|
10004
|
+
|
|
10005
|
+
Before calling any `admin` sub-command, verify that the active preset has admin rights.
|
|
10006
|
+
`access_denied` typically means the wrong preset is active, not a syntax error. Check with:
|
|
10007
|
+
|
|
10008
|
+
```
|
|
10009
|
+
["config", "preset", "show", "<preset_name>"]
|
|
10010
|
+
```
|
|
10011
|
+
|
|
9792
10012
|
## Operational Utilities
|
|
9793
10013
|
|
|
9794
10014
|
This section covers the specialized modules and utilities used to integrate `ascli` into your broader operational infrastructure.
|
|
@@ -10323,14 +10543,14 @@ This can also be used with other folder-based applications: Aspera on Cloud, Sha
|
|
|
10323
10543
|
#### Example: Unidirectional synchronization (download) from Aspera on Cloud Files
|
|
10324
10544
|
|
|
10325
10545
|
```shell
|
|
10326
|
-
ascli aoc files download . --to-folder=. --lock-port=12345 --progress-bar=no --
|
|
10546
|
+
ascli aoc files download . --to-folder=. --lock-port=12345 --progress-bar=no --out.level=data --ts=@json:'{"resume_policy":"sparse_csum","target_rate_kbps":50000,"exclude_newer_than":-8,"delete_before_transfer":true}'
|
|
10327
10547
|
```
|
|
10328
10548
|
|
|
10329
10549
|
> [!NOTE]
|
|
10330
10550
|
> Option `delete_before_transfer` will delete files locally, if they are not present on remote side.
|
|
10331
10551
|
|
|
10332
10552
|
> [!NOTE]
|
|
10333
|
-
> Options `progress` and `
|
|
10553
|
+
> Options `progress` and `--out.level` limit output for headless operation (for example, cron job)
|
|
10334
10554
|
|
|
10335
10555
|
### Health check and Nagios
|
|
10336
10556
|
|
|
@@ -10745,7 +10965,7 @@ Enjoy a coffee on me:
|
|
|
10745
10965
|
```shell
|
|
10746
10966
|
ascli config coffee
|
|
10747
10967
|
ascli config coffee --ui=text
|
|
10748
|
-
ascli config coffee --ui=text --
|
|
10968
|
+
ascli config coffee --ui=text --out.img.text=true
|
|
10749
10969
|
```
|
|
10750
10970
|
|
|
10751
10971
|
### References
|