aspera-cli 4.26.2 → 4.27.1
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 +310 -21
- data/CONTRIBUTING.md +99 -14
- data/TODO.md +50 -0
- data/bin/ascli +3 -3
- data/docs/README.md +10977 -0
- data/docs/test-mcp-with-ai.md +202 -0
- data/lib/aspera/agent/base.rb +29 -7
- data/lib/aspera/agent/connect.rb +58 -21
- data/lib/aspera/agent/desktop.rb +53 -18
- data/lib/aspera/agent/direct.rb +71 -40
- data/lib/aspera/agent/factory.rb +3 -3
- data/lib/aspera/agent/httpgw.rb +55 -14
- data/lib/aspera/agent/node.rb +34 -2
- data/lib/aspera/agent/transferd.rb +48 -12
- data/lib/aspera/api/alee.rb +1 -1
- data/lib/aspera/api/aoc.rb +42 -44
- data/lib/aspera/api/cos_node.rb +10 -9
- data/lib/aspera/api/faspex.rb +16 -15
- data/lib/aspera/api/httpgw.rb +23 -23
- data/lib/aspera/api/node.rb +51 -70
- data/lib/aspera/api/queries/bss_subscription_account.graphql +18 -0
- data/lib/aspera/api/queries/bss_subscription_usage.graphql +18 -0
- data/lib/aspera/ascmd.rb +32 -30
- data/lib/aspera/ascp/installation.rb +75 -69
- data/lib/aspera/ascp/management.rb +7 -8
- data/lib/aspera/assert.rb +12 -13
- data/lib/aspera/cli/ascp_actions.rb +155 -0
- data/lib/aspera/cli/async_transfer_store.rb +125 -0
- data/lib/aspera/cli/bootstrapper.rb +197 -0
- data/lib/aspera/cli/command_registry.rb +145 -0
- data/lib/aspera/cli/command_spec.rb +141 -0
- data/lib/aspera/cli/context.rb +19 -6
- data/lib/aspera/cli/error.rb +16 -0
- data/lib/aspera/cli/extended_value.rb +27 -26
- data/lib/aspera/cli/formatter.rb +95 -59
- data/lib/aspera/cli/gem_checker.rb +65 -0
- data/lib/aspera/cli/hints.rb +3 -3
- data/lib/aspera/cli/http.rb +74 -30
- data/lib/aspera/cli/info.rb +2 -0
- data/lib/aspera/cli/mailer.rb +97 -0
- data/lib/aspera/cli/mcp_tool.rb +225 -0
- data/lib/aspera/cli/option_declarator.rb +77 -0
- data/lib/aspera/cli/options.schema.yaml +634 -7
- data/lib/aspera/cli/parser.rb +1217 -0
- data/lib/aspera/cli/plugins/alee.rb +20 -22
- data/lib/aspera/cli/plugins/aoc.rb +1178 -881
- data/lib/aspera/cli/plugins/ats.rb +205 -162
- data/lib/aspera/cli/plugins/base.rb +703 -175
- data/lib/aspera/cli/plugins/basic_auth.rb +7 -9
- data/lib/aspera/cli/plugins/config.rb +434 -757
- data/lib/aspera/cli/plugins/console.rb +107 -65
- data/lib/aspera/cli/plugins/cos.rb +46 -33
- data/lib/aspera/cli/plugins/factory.rb +6 -6
- data/lib/aspera/cli/plugins/faspex5.rb +627 -388
- data/lib/aspera/cli/plugins/faspio.rb +54 -51
- data/lib/aspera/cli/plugins/httpgw.rb +18 -25
- data/lib/aspera/cli/plugins/mcp.rb +279 -0
- data/lib/aspera/cli/plugins/node.rb +988 -840
- data/lib/aspera/cli/plugins/oauth.rb +7 -10
- data/lib/aspera/cli/plugins/orchestrator.rb +112 -135
- data/lib/aspera/cli/plugins/preview.rb +195 -157
- data/lib/aspera/cli/plugins/server.rb +141 -91
- data/lib/aspera/cli/plugins/shares.rb +343 -110
- data/lib/aspera/cli/preset_actions.rb +159 -0
- data/lib/aspera/cli/preset_manager.rb +82 -39
- data/lib/aspera/cli/result.rb +78 -26
- data/lib/aspera/cli/runner.rb +323 -153
- data/lib/aspera/cli/secret_finder.rb +40 -0
- data/lib/aspera/cli/special_values.rb +1 -0
- data/lib/aspera/cli/sync_actions.rb +89 -64
- data/lib/aspera/cli/terminal_formatter.rb +3 -3
- data/lib/aspera/cli/transfer_actions.rb +90 -0
- data/lib/aspera/cli/transfer_agent.rb +129 -64
- data/lib/aspera/cli/transfer_progress.rb +9 -9
- data/lib/aspera/cli/vault_manager.rb +79 -0
- data/lib/aspera/cli/version.rb +1 -1
- data/lib/aspera/cli/wizard.rb +28 -30
- data/lib/aspera/colors.rb +3 -3
- data/lib/aspera/command_line_builder.rb +34 -34
- data/lib/aspera/command_line_converter.rb +1 -1
- data/lib/aspera/coverage.rb +1 -2
- data/lib/aspera/data_repository.rb +2 -1
- data/lib/aspera/dot_container.rb +12 -12
- data/lib/aspera/environment.rb +30 -23
- data/lib/aspera/exec_spec.rb +13 -0
- data/lib/aspera/faspex_gw.rb +5 -5
- data/lib/aspera/faspex_postproc.rb +16 -10
- data/lib/aspera/graphql.rb +37 -0
- data/lib/aspera/hash_ext.rb +8 -2
- data/lib/aspera/json_rpc/client.rb +62 -0
- data/lib/aspera/json_rpc/version.rb +7 -0
- data/lib/aspera/keychain/base.rb +10 -3
- data/lib/aspera/keychain/encrypted_hash.rb +92 -17
- data/lib/aspera/keychain/factory.rb +20 -8
- 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 +82 -0
- data/lib/aspera/log.rb +29 -15
- data/lib/aspera/markdown.rb +90 -7
- data/lib/aspera/nagios.rb +8 -8
- data/lib/aspera/node_simulator.rb +35 -27
- data/lib/aspera/oauth/base.rb +9 -10
- data/lib/aspera/oauth/boot.rb +5 -5
- data/lib/aspera/oauth/factory.rb +12 -10
- data/lib/aspera/oauth/jwt.rb +9 -11
- data/lib/aspera/oauth/web.rb +6 -6
- data/lib/aspera/persistency_action_once.rb +12 -12
- data/lib/aspera/persistency_folder.rb +18 -11
- data/lib/aspera/preview/file_types.rb +5 -5
- data/lib/aspera/preview/generator.rb +52 -49
- data/lib/aspera/preview/options.rb +3 -2
- data/lib/aspera/preview/terminal.rb +5 -5
- data/lib/aspera/preview/utils.rb +66 -19
- data/lib/aspera/products/connect.rb +2 -2
- data/lib/aspera/products/desktop.rb +1 -1
- data/lib/aspera/products/other.rb +3 -3
- data/lib/aspera/products/transferd.rb +4 -4
- data/lib/aspera/proxy_auto_config.rb +15 -14
- data/lib/aspera/rest.rb +159 -151
- data/lib/aspera/rest_error_analyzer.rb +6 -6
- data/lib/aspera/rest_errors_aspera.rb +0 -10
- data/lib/aspera/rest_list.rb +11 -10
- 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 +1853 -510
- data/lib/aspera/schema/IBM_Aspera_Shares.yaml +4653 -0
- data/lib/aspera/schema/documentation.rb +65 -28
- data/lib/aspera/schema/reader.rb +136 -13
- data/lib/aspera/schema/registry.rb +60 -8
- data/lib/aspera/secret_hider.rb +12 -7
- data/lib/aspera/ssh.rb +64 -31
- data/lib/aspera/ssl.rb +5 -5
- data/lib/aspera/sync/conf.schema.yaml +2 -2
- data/lib/aspera/sync/database.rb +2 -2
- data/lib/aspera/sync/operations.rb +22 -25
- data/lib/aspera/temp_file_manager.rb +25 -5
- data/lib/aspera/timer_limiter.rb +1 -1
- data/lib/aspera/transfer/faux_file.rb +24 -11
- data/lib/aspera/transfer/parameters.rb +36 -34
- data/lib/aspera/transfer/result.rb +74 -0
- data/lib/aspera/transfer/resumer.rb +10 -10
- data/lib/aspera/transfer/spec.rb +18 -1
- data/lib/aspera/transfer/spec.schema.yaml +12 -3
- data/lib/aspera/uri_reader.rb +52 -15
- data/lib/aspera/web_auth.rb +8 -7
- data/lib/aspera/web_server_simple.rb +15 -12
- data/lib/aspera/yaml.rb +5 -4
- data.tar.gz.sig +0 -0
- metadata +34 -6
- metadata.gz.sig +0 -0
- data/lib/aspera/cli/manager.rb +0 -766
- data/lib/aspera/cli/plugins/faspex.rb +0 -539
- data/lib/aspera/json_rpc.rb +0 -52
- data/lib/aspera/transfer/uri.rb +0 -56
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
# cspell:ignore ascmd zmode zuid zgid fasping
|
|
4
4
|
require 'aspera/cli/plugins/basic_auth'
|
|
5
5
|
require 'aspera/cli/sync_actions'
|
|
6
|
+
require 'aspera/transfer/result'
|
|
6
7
|
require 'aspera/transfer/spec'
|
|
7
8
|
require 'aspera/ascmd'
|
|
8
9
|
require 'aspera/ssh'
|
|
@@ -21,26 +22,17 @@ module Aspera
|
|
|
21
22
|
LOCAL_SCHEME = 'local'
|
|
22
23
|
HTTPS_SCHEME = 'https'
|
|
23
24
|
URI_SCHEMES = [SSH_SCHEME, LOCAL_SCHEME, HTTPS_SCHEME].freeze
|
|
24
|
-
ASCMD_ALIASES = {
|
|
25
|
-
browse: :ls,
|
|
26
|
-
delete: :rm,
|
|
27
|
-
rename: :mv
|
|
28
|
-
}.freeze
|
|
29
|
-
TRANSFER_COMMANDS = %i[sync upload download].freeze
|
|
30
25
|
|
|
31
|
-
private_constant :SSH_SCHEME, :URI_SCHEMES
|
|
26
|
+
private_constant :SSH_SCHEME, :URI_SCHEMES
|
|
32
27
|
|
|
33
28
|
class LocalExecutor
|
|
34
29
|
def execute(ascmd_path, input:)
|
|
35
30
|
Environment.secure_execute(ascmd_path, mode: :capture, stdin_data: input, binmode: true, exception: false).first
|
|
36
31
|
end
|
|
37
32
|
end
|
|
33
|
+
application_name 'HSTS Fasp/SSH'
|
|
38
34
|
|
|
39
35
|
class << self
|
|
40
|
-
def application_name
|
|
41
|
-
'HSTS Fasp/SSH'
|
|
42
|
-
end
|
|
43
|
-
|
|
44
36
|
# @return [Hash,NilClass]
|
|
45
37
|
def detect(address_or_url)
|
|
46
38
|
urls = if address_or_url.match?(%r{^[a-z]{1,6}://})
|
|
@@ -55,7 +47,7 @@ module Aspera
|
|
|
55
47
|
error = nil
|
|
56
48
|
urls.each do |base_url|
|
|
57
49
|
server_uri = URI.parse(base_url)
|
|
58
|
-
Log.log.debug{"URI=#{server_uri}, host=#{server_uri.hostname}, port=#{server_uri.port}, scheme=#{server_uri.scheme}"}
|
|
50
|
+
Log.log.debug { "URI=#{server_uri}, host=#{server_uri.hostname}, port=#{server_uri.port}, scheme=#{server_uri.scheme}" }
|
|
59
51
|
next unless server_uri.scheme.eql?(SSH_SCHEME)
|
|
60
52
|
socket = TCPSocket.new(server_uri.hostname, server_uri.port)
|
|
61
53
|
socket.puts('SSH-2.0-Ascli_0.0')
|
|
@@ -63,7 +55,7 @@ module Aspera
|
|
|
63
55
|
return {version: version.gsub(/^SSH-2.0-/, ''), url: base_url} if version.match?(/^SSH-2.0-/)
|
|
64
56
|
rescue StandardError => e
|
|
65
57
|
error = e
|
|
66
|
-
Log.log.debug{"detect error: #{e}"}
|
|
58
|
+
Log.log.debug { "detect error: #{e}" }
|
|
67
59
|
end
|
|
68
60
|
raise error if error
|
|
69
61
|
return
|
|
@@ -87,10 +79,8 @@ module Aspera
|
|
|
87
79
|
def initialize(**_)
|
|
88
80
|
super
|
|
89
81
|
@connection_type = :ssh
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
options.declare(:ssh_options, 'SSH options', allowed: Hash, default: {})
|
|
93
|
-
SyncActions.declare_options(options)
|
|
82
|
+
@ascmd_executor = nil
|
|
83
|
+
@server_transfer_spec = nil
|
|
94
84
|
options.parse_options!
|
|
95
85
|
@ssh_opts = options.get_option(:ssh_options).symbolize_keys
|
|
96
86
|
end
|
|
@@ -101,10 +91,10 @@ module Aspera
|
|
|
101
91
|
url = options.get_option(:url, mandatory: true)
|
|
102
92
|
server_transfer_spec = {}
|
|
103
93
|
server_uri = URI.parse(url)
|
|
104
|
-
Log.log.debug{"URI=#{server_uri}, host=#{server_uri.hostname}, port=#{server_uri.port}, scheme=#{server_uri.scheme}"}
|
|
94
|
+
Log.log.debug { "URI=#{server_uri}, host=#{server_uri.hostname}, port=#{server_uri.port}, scheme=#{server_uri.scheme}" }
|
|
105
95
|
server_transfer_spec['remote_host'] = server_uri.hostname
|
|
106
96
|
unless URI_SCHEMES.include?(server_uri.scheme)
|
|
107
|
-
Log.log.warn{"Scheme [#{server_uri.scheme}] not supported in #{url}, use one of: #{URI_SCHEMES.join(', ')}. Defaulting to #{SSH_SCHEME}."}
|
|
97
|
+
Log.log.warn { "Scheme [#{server_uri.scheme}] not supported in #{url}, use one of: #{URI_SCHEMES.join(', ')}. Defaulting to #{SSH_SCHEME}." }
|
|
108
98
|
server_uri.scheme = SSH_SCHEME
|
|
109
99
|
end
|
|
110
100
|
if server_uri.scheme.eql?(LOCAL_SCHEME)
|
|
@@ -125,13 +115,13 @@ module Aspera
|
|
|
125
115
|
Log.log.warn('URL scheme is https but no token was provided in transfer spec.')
|
|
126
116
|
Log.log.warn("If you want to access the server, not using WSS for session, then use a URL with scheme \"#{SSH_SCHEME}\" and proper SSH port")
|
|
127
117
|
assumed_url = "#{SSH_SCHEME}://#{server_transfer_spec['remote_host']}:#{Transfer::Spec::SSH_PORT}"
|
|
128
|
-
Log.log.warn{"Assuming proper URL is: #{assumed_url}"}
|
|
118
|
+
Log.log.warn { "Assuming proper URL is: #{assumed_url}" }
|
|
129
119
|
server_uri = URI.parse(assumed_url)
|
|
130
120
|
end
|
|
131
121
|
# Scheme is SSH
|
|
132
122
|
if options.get_option(:username).nil?
|
|
133
123
|
options.set_option(:username, Transfer::Spec::ACCESS_KEY_TRANSFER_USER)
|
|
134
|
-
Log.log.info{"No username provided: Assuming default transfer user: #{Transfer::Spec::ACCESS_KEY_TRANSFER_USER}"}
|
|
124
|
+
Log.log.info { "No username provided: Assuming default transfer user: #{Transfer::Spec::ACCESS_KEY_TRANSFER_USER}" }
|
|
135
125
|
end
|
|
136
126
|
server_transfer_spec['remote_user'] = options.get_option(:username, mandatory: true)
|
|
137
127
|
if !server_uri.port.nil?
|
|
@@ -147,14 +137,14 @@ module Aspera
|
|
|
147
137
|
end
|
|
148
138
|
ssh_key_list = options.get_option(:ssh_keys)
|
|
149
139
|
if !ssh_key_list.nil?
|
|
150
|
-
Aspera.assert_array_all(ssh_key_list, String){'ssh_keys'}
|
|
151
|
-
ssh_key_list.map!{ |p| File.expand_path(p)}
|
|
152
|
-
Log.
|
|
140
|
+
Aspera.assert_array_all(ssh_key_list, String) { 'ssh_keys' }
|
|
141
|
+
ssh_key_list.map! { |p| File.expand_path(p) }
|
|
142
|
+
Log.dump(:ssh_keys, ssh_key_list)
|
|
153
143
|
if !ssh_key_list.empty?
|
|
154
144
|
@ssh_opts[:keys] = ssh_key_list
|
|
155
145
|
# PEM as per RFC 7468
|
|
156
146
|
server_transfer_spec['ssh_private_key'] = File.read(ssh_key_list.first).strip
|
|
157
|
-
Log.log.warn{'Using only first SSH key for transfers'} unless ssh_key_list.length.eql?(1)
|
|
147
|
+
Log.log.warn { 'Using only first SSH key for transfers' } unless ssh_key_list.length.eql?(1)
|
|
158
148
|
cred_set = true
|
|
159
149
|
end
|
|
160
150
|
end
|
|
@@ -169,77 +159,137 @@ module Aspera
|
|
|
169
159
|
return server_transfer_spec
|
|
170
160
|
end
|
|
171
161
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
162
|
+
Sync::Operations::DIRECTIONS.each do |dir|
|
|
163
|
+
define_method(:"action_sync_#{dir}") { |path:, sync_info: {}, **| run_sync_transfer(dir, path: path, sync_info: sync_info) { @server_transfer_spec } }
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# --- DSL ---
|
|
167
|
+
|
|
168
|
+
option :ssh_keys, description: 'SSH key path list', allowed: Type::STRING_ARRAY
|
|
169
|
+
option :passphrase, description: 'SSH private key passphrase'
|
|
170
|
+
option :ssh_options, description: 'SSH options', allowed: Hash
|
|
171
|
+
|
|
172
|
+
# root_setup runs once before any command argument is consumed, populating
|
|
173
|
+
# @server_transfer_spec and @ascmd_executor so that condition methods work.
|
|
174
|
+
root_setup :setup_server
|
|
175
|
+
|
|
176
|
+
command :health, description: 'Check transfer health'
|
|
177
|
+
command(:upload, description: 'Upload files to server', transfer_paths: :send, action: lambda do
|
|
178
|
+
@server_transfer_spec['direction'] = Transfer::Spec.transfer_type_to_direction(:upload)
|
|
179
|
+
Runner.result_transfer(transfer.start(@server_transfer_spec))
|
|
180
|
+
end)
|
|
181
|
+
command(
|
|
182
|
+
:download,
|
|
183
|
+
description: 'Download files from server',
|
|
184
|
+
transfer_paths: :receive,
|
|
185
|
+
action: lambda do
|
|
186
|
+
@server_transfer_spec['direction'] = Transfer::Spec.transfer_type_to_direction(:download)
|
|
187
|
+
Runner.result_transfer(transfer.start(@server_transfer_spec))
|
|
188
|
+
end
|
|
189
|
+
)
|
|
190
|
+
command :sync, description: 'Synchronize files with server'
|
|
191
|
+
commands_under :sync do
|
|
192
|
+
Sync::Operations::DIRECTIONS.each do |dir|
|
|
193
|
+
command dir, description: "#{dir.capitalize}-sync with server", transfer_paths: :send, arguments: SyncActions::PATH_AND_INFO_ARGS
|
|
180
194
|
end
|
|
195
|
+
command :admin, description: 'Manage sync database (admin operations)'
|
|
196
|
+
SyncActions.register_sync_admin_commands(self, :admin)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
commands_under :health do
|
|
200
|
+
command :transfer, description: 'Check FASP transfer health'
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# AsCmd operations (available only when SSH/local - not WSS)
|
|
204
|
+
ASCMD_ARGS = [{name: :command_arguments, multiple: true, mandatory: false, default: nil}].freeze
|
|
205
|
+
private_constant :ASCMD_ARGS
|
|
206
|
+
|
|
207
|
+
command :ls, description: 'List files', condition: :ascmd_available?, aliases: [:browse], arguments: ASCMD_ARGS
|
|
208
|
+
command :rm, description: 'Delete files', condition: :ascmd_available?, aliases: [:delete], arguments: ASCMD_ARGS
|
|
209
|
+
command :mv, description: 'Rename/move files', condition: :ascmd_available?, aliases: [:rename], arguments: ASCMD_ARGS
|
|
210
|
+
command :cp, description: 'Copy files', condition: :ascmd_available?, arguments: ASCMD_ARGS
|
|
211
|
+
command :mkdir, description: 'Create directory', condition: :ascmd_available?, arguments: ASCMD_ARGS
|
|
212
|
+
command :df, description: 'Show disk usage', condition: :ascmd_available?, arguments: ASCMD_ARGS
|
|
213
|
+
command :du, description: 'Show file sizes', condition: :ascmd_available?, arguments: ASCMD_ARGS
|
|
214
|
+
command :md5sum, description: 'Compute MD5 checksums', condition: :ascmd_available?, arguments: ASCMD_ARGS
|
|
215
|
+
command :info, description: 'Show server system information', condition: :ascmd_available?, arguments: ASCMD_ARGS
|
|
216
|
+
|
|
217
|
+
# Generate ascmd handlers - convention: action_<op>
|
|
218
|
+
%i[rm mv cp mkdir].each do |op|
|
|
219
|
+
define_action_method([op]) do |command_arguments:, **|
|
|
220
|
+
execute_ascmd(op, command_arguments) { Result::Success.new }
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
%i[du md5sum info].each do |op|
|
|
225
|
+
define_action_method([op]) do |command_arguments:, **|
|
|
226
|
+
execute_ascmd(op, command_arguments) { |r| Result::SingleObject.new(r.stringify_keys) }
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# --- conditions ---
|
|
231
|
+
|
|
232
|
+
def ascmd_available?
|
|
233
|
+
!@ascmd_executor.nil?
|
|
181
234
|
end
|
|
182
235
|
|
|
183
|
-
#
|
|
184
|
-
BASE_ACTIONS = %i[health].concat(TRANSFER_COMMANDS).freeze
|
|
185
|
-
# all actions
|
|
186
|
-
ACTIONS = [BASE_ACTIONS, AsCmd::OPERATIONS, ASCMD_ALIASES.keys].flatten.freeze
|
|
236
|
+
# --- setup ---
|
|
187
237
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
238
|
+
# Build the transfer spec and ascmd executor from CLI options.
|
|
239
|
+
# Stores results in instance variables; returns empty context hash.
|
|
240
|
+
def setup_server(**)
|
|
241
|
+
@server_transfer_spec = options_to_base_transfer_spec
|
|
242
|
+
@ascmd_executor = case @connection_type
|
|
191
243
|
when :local then LocalExecutor.new
|
|
192
|
-
when :wss
|
|
193
|
-
when :ssh
|
|
194
|
-
else Aspera.error_unexpected_value(@connection_type){'connection type'}
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
end
|
|
242
|
-
else Aspera.error_unreachable_line
|
|
244
|
+
when :wss then nil
|
|
245
|
+
when :ssh then Ssh.new(@server_transfer_spec['remote_host'], @server_transfer_spec['remote_user'], @ssh_opts)
|
|
246
|
+
else Aspera.error_unexpected_value(@connection_type) { 'connection type' }
|
|
247
|
+
end
|
|
248
|
+
{}
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# --- health ---
|
|
252
|
+
|
|
253
|
+
def action_health_transfer
|
|
254
|
+
nagios = Nagios.new
|
|
255
|
+
probe_ts = @server_transfer_spec.merge({
|
|
256
|
+
'direction' => 'send',
|
|
257
|
+
'cookie' => 'aspera.sync', # hide in console
|
|
258
|
+
'resume_policy' => 'none',
|
|
259
|
+
'paths' => [{'source' => 'faux:///pingfile?1k', 'destination' => '.fasping'}]
|
|
260
|
+
})
|
|
261
|
+
statuses = transfer.start(probe_ts)
|
|
262
|
+
if statuses.is_a?(Transfer::Result::Success)
|
|
263
|
+
nagios.add_ok('transfer', 'ok')
|
|
264
|
+
else
|
|
265
|
+
nagios.add_critical('transfer', statuses.is_a?(Transfer::Result::Error) ? statuses.exception.message : statuses.to_s)
|
|
266
|
+
end
|
|
267
|
+
Result::ObjectList.new(nagios.status_list)
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
# --- ascmd handlers ---
|
|
271
|
+
|
|
272
|
+
def action_ls(command_arguments:, **)
|
|
273
|
+
execute_ascmd(:ls, command_arguments) do |result|
|
|
274
|
+
Result::ObjectList.new(result.map(&:stringify_keys), fields: %w[zmode zuid zgid size mtime name])
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def action_df(command_arguments:, **)
|
|
279
|
+
execute_ascmd(:df, command_arguments) do |result|
|
|
280
|
+
Result::ObjectList.new(result.map(&:stringify_keys))
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
private
|
|
285
|
+
|
|
286
|
+
def execute_ascmd(op, command_arguments)
|
|
287
|
+
ascmd = AsCmd.new(@ascmd_executor)
|
|
288
|
+
begin
|
|
289
|
+
result = ascmd.execute_single(op, command_arguments)
|
|
290
|
+
yield(result)
|
|
291
|
+
rescue AsCmd::Error => e
|
|
292
|
+
raise Cli::BadArgument, e.extended_message
|
|
243
293
|
end
|
|
244
294
|
end
|
|
245
295
|
end
|