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.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +310 -21
  4. data/CONTRIBUTING.md +99 -14
  5. data/TODO.md +50 -0
  6. data/bin/ascli +3 -3
  7. data/docs/README.md +10977 -0
  8. data/docs/test-mcp-with-ai.md +202 -0
  9. data/lib/aspera/agent/base.rb +29 -7
  10. data/lib/aspera/agent/connect.rb +58 -21
  11. data/lib/aspera/agent/desktop.rb +53 -18
  12. data/lib/aspera/agent/direct.rb +71 -40
  13. data/lib/aspera/agent/factory.rb +3 -3
  14. data/lib/aspera/agent/httpgw.rb +55 -14
  15. data/lib/aspera/agent/node.rb +34 -2
  16. data/lib/aspera/agent/transferd.rb +48 -12
  17. data/lib/aspera/api/alee.rb +1 -1
  18. data/lib/aspera/api/aoc.rb +42 -44
  19. data/lib/aspera/api/cos_node.rb +10 -9
  20. data/lib/aspera/api/faspex.rb +16 -15
  21. data/lib/aspera/api/httpgw.rb +23 -23
  22. data/lib/aspera/api/node.rb +51 -70
  23. data/lib/aspera/api/queries/bss_subscription_account.graphql +18 -0
  24. data/lib/aspera/api/queries/bss_subscription_usage.graphql +18 -0
  25. data/lib/aspera/ascmd.rb +32 -30
  26. data/lib/aspera/ascp/installation.rb +75 -69
  27. data/lib/aspera/ascp/management.rb +7 -8
  28. data/lib/aspera/assert.rb +12 -13
  29. data/lib/aspera/cli/ascp_actions.rb +155 -0
  30. data/lib/aspera/cli/async_transfer_store.rb +125 -0
  31. data/lib/aspera/cli/bootstrapper.rb +197 -0
  32. data/lib/aspera/cli/command_registry.rb +145 -0
  33. data/lib/aspera/cli/command_spec.rb +141 -0
  34. data/lib/aspera/cli/context.rb +19 -6
  35. data/lib/aspera/cli/error.rb +16 -0
  36. data/lib/aspera/cli/extended_value.rb +27 -26
  37. data/lib/aspera/cli/formatter.rb +95 -59
  38. data/lib/aspera/cli/gem_checker.rb +65 -0
  39. data/lib/aspera/cli/hints.rb +3 -3
  40. data/lib/aspera/cli/http.rb +74 -30
  41. data/lib/aspera/cli/info.rb +2 -0
  42. data/lib/aspera/cli/mailer.rb +97 -0
  43. data/lib/aspera/cli/mcp_tool.rb +225 -0
  44. data/lib/aspera/cli/option_declarator.rb +77 -0
  45. data/lib/aspera/cli/options.schema.yaml +634 -7
  46. data/lib/aspera/cli/parser.rb +1217 -0
  47. data/lib/aspera/cli/plugins/alee.rb +20 -22
  48. data/lib/aspera/cli/plugins/aoc.rb +1178 -881
  49. data/lib/aspera/cli/plugins/ats.rb +205 -162
  50. data/lib/aspera/cli/plugins/base.rb +703 -175
  51. data/lib/aspera/cli/plugins/basic_auth.rb +7 -9
  52. data/lib/aspera/cli/plugins/config.rb +434 -757
  53. data/lib/aspera/cli/plugins/console.rb +107 -65
  54. data/lib/aspera/cli/plugins/cos.rb +46 -33
  55. data/lib/aspera/cli/plugins/factory.rb +6 -6
  56. data/lib/aspera/cli/plugins/faspex5.rb +627 -388
  57. data/lib/aspera/cli/plugins/faspio.rb +54 -51
  58. data/lib/aspera/cli/plugins/httpgw.rb +18 -25
  59. data/lib/aspera/cli/plugins/mcp.rb +279 -0
  60. data/lib/aspera/cli/plugins/node.rb +988 -840
  61. data/lib/aspera/cli/plugins/oauth.rb +7 -10
  62. data/lib/aspera/cli/plugins/orchestrator.rb +112 -135
  63. data/lib/aspera/cli/plugins/preview.rb +195 -157
  64. data/lib/aspera/cli/plugins/server.rb +141 -91
  65. data/lib/aspera/cli/plugins/shares.rb +343 -110
  66. data/lib/aspera/cli/preset_actions.rb +159 -0
  67. data/lib/aspera/cli/preset_manager.rb +82 -39
  68. data/lib/aspera/cli/result.rb +78 -26
  69. data/lib/aspera/cli/runner.rb +323 -153
  70. data/lib/aspera/cli/secret_finder.rb +40 -0
  71. data/lib/aspera/cli/special_values.rb +1 -0
  72. data/lib/aspera/cli/sync_actions.rb +89 -64
  73. data/lib/aspera/cli/terminal_formatter.rb +3 -3
  74. data/lib/aspera/cli/transfer_actions.rb +90 -0
  75. data/lib/aspera/cli/transfer_agent.rb +129 -64
  76. data/lib/aspera/cli/transfer_progress.rb +9 -9
  77. data/lib/aspera/cli/vault_manager.rb +79 -0
  78. data/lib/aspera/cli/version.rb +1 -1
  79. data/lib/aspera/cli/wizard.rb +28 -30
  80. data/lib/aspera/colors.rb +3 -3
  81. data/lib/aspera/command_line_builder.rb +34 -34
  82. data/lib/aspera/command_line_converter.rb +1 -1
  83. data/lib/aspera/coverage.rb +1 -2
  84. data/lib/aspera/data_repository.rb +2 -1
  85. data/lib/aspera/dot_container.rb +12 -12
  86. data/lib/aspera/environment.rb +30 -23
  87. data/lib/aspera/exec_spec.rb +13 -0
  88. data/lib/aspera/faspex_gw.rb +5 -5
  89. data/lib/aspera/faspex_postproc.rb +16 -10
  90. data/lib/aspera/graphql.rb +37 -0
  91. data/lib/aspera/hash_ext.rb +8 -2
  92. data/lib/aspera/json_rpc/client.rb +62 -0
  93. data/lib/aspera/json_rpc/version.rb +7 -0
  94. data/lib/aspera/keychain/base.rb +10 -3
  95. data/lib/aspera/keychain/encrypted_hash.rb +92 -17
  96. data/lib/aspera/keychain/factory.rb +20 -8
  97. data/lib/aspera/keychain/hashicorp_vault.rb +1 -1
  98. data/lib/aspera/keychain/macos_security.rb +23 -25
  99. data/lib/aspera/keychain/one_password_api.rb +86 -0
  100. data/lib/aspera/keychain/one_password_base.rb +34 -0
  101. data/lib/aspera/keychain/one_password_cli.rb +98 -0
  102. data/lib/aspera/link_header.rb +82 -0
  103. data/lib/aspera/log.rb +29 -15
  104. data/lib/aspera/markdown.rb +90 -7
  105. data/lib/aspera/nagios.rb +8 -8
  106. data/lib/aspera/node_simulator.rb +35 -27
  107. data/lib/aspera/oauth/base.rb +9 -10
  108. data/lib/aspera/oauth/boot.rb +5 -5
  109. data/lib/aspera/oauth/factory.rb +12 -10
  110. data/lib/aspera/oauth/jwt.rb +9 -11
  111. data/lib/aspera/oauth/web.rb +6 -6
  112. data/lib/aspera/persistency_action_once.rb +12 -12
  113. data/lib/aspera/persistency_folder.rb +18 -11
  114. data/lib/aspera/preview/file_types.rb +5 -5
  115. data/lib/aspera/preview/generator.rb +52 -49
  116. data/lib/aspera/preview/options.rb +3 -2
  117. data/lib/aspera/preview/terminal.rb +5 -5
  118. data/lib/aspera/preview/utils.rb +66 -19
  119. data/lib/aspera/products/connect.rb +2 -2
  120. data/lib/aspera/products/desktop.rb +1 -1
  121. data/lib/aspera/products/other.rb +3 -3
  122. data/lib/aspera/products/transferd.rb +4 -4
  123. data/lib/aspera/proxy_auto_config.rb +15 -14
  124. data/lib/aspera/rest.rb +159 -151
  125. data/lib/aspera/rest_error_analyzer.rb +6 -6
  126. data/lib/aspera/rest_errors_aspera.rb +0 -10
  127. data/lib/aspera/rest_list.rb +11 -10
  128. data/lib/aspera/schema/IBM Aspera Node API-4.4.6.yaml +6232 -0
  129. data/lib/aspera/schema/IBM Aspera faspio Gateway API-1.0.0.yaml +249 -0
  130. data/lib/aspera/schema/IBM Aspera on Cloud API-0.2.6-enhanced.yaml +1853 -510
  131. data/lib/aspera/schema/IBM_Aspera_Shares.yaml +4653 -0
  132. data/lib/aspera/schema/documentation.rb +65 -28
  133. data/lib/aspera/schema/reader.rb +136 -13
  134. data/lib/aspera/schema/registry.rb +60 -8
  135. data/lib/aspera/secret_hider.rb +12 -7
  136. data/lib/aspera/ssh.rb +64 -31
  137. data/lib/aspera/ssl.rb +5 -5
  138. data/lib/aspera/sync/conf.schema.yaml +2 -2
  139. data/lib/aspera/sync/database.rb +2 -2
  140. data/lib/aspera/sync/operations.rb +22 -25
  141. data/lib/aspera/temp_file_manager.rb +25 -5
  142. data/lib/aspera/timer_limiter.rb +1 -1
  143. data/lib/aspera/transfer/faux_file.rb +24 -11
  144. data/lib/aspera/transfer/parameters.rb +36 -34
  145. data/lib/aspera/transfer/result.rb +74 -0
  146. data/lib/aspera/transfer/resumer.rb +10 -10
  147. data/lib/aspera/transfer/spec.rb +18 -1
  148. data/lib/aspera/transfer/spec.schema.yaml +12 -3
  149. data/lib/aspera/uri_reader.rb +52 -15
  150. data/lib/aspera/web_auth.rb +8 -7
  151. data/lib/aspera/web_server_simple.rb +15 -12
  152. data/lib/aspera/yaml.rb +5 -4
  153. data.tar.gz.sig +0 -0
  154. metadata +34 -6
  155. metadata.gz.sig +0 -0
  156. data/lib/aspera/cli/manager.rb +0 -766
  157. data/lib/aspera/cli/plugins/faspex.rb +0 -539
  158. data/lib/aspera/json_rpc.rb +0 -52
  159. 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, :ASCMD_ALIASES, :TRANSFER_COMMANDS
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
- options.declare(:ssh_keys, 'SSH key path list', allowed: Allowed::TYPES_STRING_ARRAY)
91
- options.declare(:passphrase, 'SSH private key passphrase')
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.log.debug{"SSH keys=#{ssh_key_list}"}
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
- def execute_transfer(command, transfer_spec)
173
- case command
174
- when :upload, :download
175
- transfer_spec['direction'] = Transfer::Spec.transfer_type_to_direction(command)
176
- return Runner.result_transfer(transfer.start(transfer_spec))
177
- when :sync
178
- # lets ignore the arguments provided by execute_sync_action, we just give the transfer spec
179
- return execute_sync_action{transfer_spec}
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
- # actions without ascmd
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
- def execute_action
189
- server_transfer_spec = options_to_base_transfer_spec
190
- ascmd_executor = case @connection_type
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 then nil
193
- when :ssh then Ssh.new(server_transfer_spec['remote_host'], server_transfer_spec['remote_user'], @ssh_opts)
194
- else Aspera.error_unexpected_value(@connection_type){'connection type'}
195
- end
196
- # the set of available commands depends on SSH executor availability (i.e. no WSS)
197
- available_commands = ascmd_executor.nil? ? BASE_ACTIONS : ACTIONS
198
- # get command and translate aliases
199
- command = options.get_next_command(available_commands)
200
- command = ASCMD_ALIASES[command] if ASCMD_ALIASES.key?(command)
201
- case command
202
- when :health
203
- nagios = Nagios.new
204
- command_nagios = options.get_next_command(%i[transfer])
205
- case command_nagios
206
- when :transfer
207
- probe_ts = server_transfer_spec.merge({
208
- 'direction' => 'send',
209
- 'cookie' => 'aspera.sync', # hide in console
210
- 'resume_policy' => 'none',
211
- 'paths' => [{'source' => 'faux:///pingfile?1k', 'destination' => '.fasping'}]
212
- })
213
- statuses = transfer.start(probe_ts)
214
- if TransferAgent.session_status(statuses).eql?(:success)
215
- nagios.add_ok('transfer', 'ok')
216
- else
217
- nagios.add_critical('transfer', statuses.reject{ |i| i.eql?(:success)}.first.to_s)
218
- end
219
- else Aspera.error_unexpected_value(command_nagios)
220
- end
221
- Result::ObjectList.new(nagios.status_list)
222
- when *TRANSFER_COMMANDS
223
- return execute_transfer(command, server_transfer_spec)
224
- when *AsCmd::OPERATIONS
225
- command_arguments = options.get_next_argument('ascmd command arguments', multiple: true, mandatory: false)
226
- ascmd = AsCmd.new(ascmd_executor)
227
- begin
228
- result = ascmd.execute_single(command, command_arguments)
229
- case command
230
- when :mkdir, :mv, :cp, :rm
231
- return Result::Success.new
232
- when :ls
233
- return Result::ObjectList.new(result.map(&:stringify_keys), fields: %w[zmode zuid zgid size mtime name])
234
- when :df
235
- return Result::ObjectList.new(result.map(&:stringify_keys))
236
- when :du, :md5sum, :info
237
- return Result::SingleObject.new(result.stringify_keys)
238
- end
239
- rescue AsCmd::Error => e
240
- raise Cli::BadArgument, e.extended_message
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