aspera-cli 4.9.0 → 4.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/BUGS.md +20 -0
  4. data/CHANGELOG.md +509 -0
  5. data/CONTRIBUTING.md +118 -0
  6. data/README.md +1241 -916
  7. data/bin/ascli +4 -4
  8. data/bin/asession +11 -11
  9. data/docs/test_env.conf +32 -21
  10. data/examples/aoc.rb +4 -4
  11. data/examples/dascli +16 -9
  12. data/examples/faspex4.rb +8 -8
  13. data/examples/node.rb +12 -12
  14. data/examples/server.rb +10 -10
  15. data/lib/aspera/aoc.rb +273 -266
  16. data/lib/aspera/ascmd.rb +56 -54
  17. data/lib/aspera/ats_api.rb +4 -4
  18. data/lib/aspera/cli/basic_auth_plugin.rb +15 -12
  19. data/lib/aspera/cli/extended_value.rb +5 -5
  20. data/lib/aspera/cli/formater.rb +64 -64
  21. data/lib/aspera/cli/info.rb +2 -2
  22. data/lib/aspera/cli/listener/line_dump.rb +1 -1
  23. data/lib/aspera/cli/listener/logger.rb +1 -1
  24. data/lib/aspera/cli/listener/progress.rb +5 -6
  25. data/lib/aspera/cli/listener/progress_multi.rb +14 -19
  26. data/lib/aspera/cli/main.rb +66 -67
  27. data/lib/aspera/cli/manager.rb +112 -110
  28. data/lib/aspera/cli/plugin.rb +57 -36
  29. data/lib/aspera/cli/plugins/alee.rb +4 -4
  30. data/lib/aspera/cli/plugins/aoc.rb +309 -670
  31. data/lib/aspera/cli/plugins/ats.rb +44 -46
  32. data/lib/aspera/cli/plugins/bss.rb +10 -10
  33. data/lib/aspera/cli/plugins/config.rb +497 -378
  34. data/lib/aspera/cli/plugins/console.rb +12 -12
  35. data/lib/aspera/cli/plugins/cos.rb +18 -20
  36. data/lib/aspera/cli/plugins/faspex.rb +112 -114
  37. data/lib/aspera/cli/plugins/faspex5.rb +71 -46
  38. data/lib/aspera/cli/plugins/node.rb +379 -283
  39. data/lib/aspera/cli/plugins/orchestrator.rb +46 -46
  40. data/lib/aspera/cli/plugins/preview.rb +122 -114
  41. data/lib/aspera/cli/plugins/server.rb +137 -83
  42. data/lib/aspera/cli/plugins/shares.rb +30 -29
  43. data/lib/aspera/cli/plugins/sync.rb +13 -33
  44. data/lib/aspera/cli/transfer_agent.rb +60 -59
  45. data/lib/aspera/cli/version.rb +1 -1
  46. data/lib/aspera/colors.rb +3 -3
  47. data/lib/aspera/command_line_builder.rb +27 -27
  48. data/lib/aspera/cos_node.rb +22 -20
  49. data/lib/aspera/data_repository.rb +1 -1
  50. data/lib/aspera/environment.rb +35 -15
  51. data/lib/aspera/fasp/agent_base.rb +15 -15
  52. data/lib/aspera/fasp/agent_connect.rb +23 -21
  53. data/lib/aspera/fasp/agent_direct.rb +66 -64
  54. data/lib/aspera/fasp/agent_httpgw.rb +141 -78
  55. data/lib/aspera/fasp/agent_node.rb +23 -21
  56. data/lib/aspera/fasp/agent_trsdk.rb +20 -20
  57. data/lib/aspera/fasp/error.rb +3 -2
  58. data/lib/aspera/fasp/error_info.rb +11 -8
  59. data/lib/aspera/fasp/installation.rb +79 -79
  60. data/lib/aspera/fasp/listener.rb +1 -1
  61. data/lib/aspera/fasp/parameters.rb +86 -71
  62. data/lib/aspera/fasp/parameters.yaml +7 -4
  63. data/lib/aspera/fasp/resume_policy.rb +8 -8
  64. data/lib/aspera/fasp/transfer_spec.rb +35 -2
  65. data/lib/aspera/fasp/uri.rb +7 -7
  66. data/lib/aspera/faspex_gw.rb +7 -5
  67. data/lib/aspera/hash_ext.rb +3 -3
  68. data/lib/aspera/id_generator.rb +5 -5
  69. data/lib/aspera/keychain/encrypted_hash.rb +38 -105
  70. data/lib/aspera/keychain/macos_security.rb +128 -57
  71. data/lib/aspera/log.rb +7 -7
  72. data/lib/aspera/nagios.rb +19 -18
  73. data/lib/aspera/node.rb +209 -35
  74. data/lib/aspera/oauth.rb +37 -36
  75. data/lib/aspera/open_application.rb +19 -11
  76. data/lib/aspera/persistency_action_once.rb +4 -4
  77. data/lib/aspera/persistency_folder.rb +16 -15
  78. data/lib/aspera/preview/file_types.rb +8 -8
  79. data/lib/aspera/preview/generator.rb +67 -67
  80. data/lib/aspera/preview/utils.rb +27 -27
  81. data/lib/aspera/proxy_auto_config.js +41 -41
  82. data/lib/aspera/proxy_auto_config.rb +21 -14
  83. data/lib/aspera/rest.rb +72 -67
  84. data/lib/aspera/rest_call_error.rb +2 -1
  85. data/lib/aspera/rest_error_analyzer.rb +18 -17
  86. data/lib/aspera/rest_errors_aspera.rb +16 -16
  87. data/lib/aspera/secret_hider.rb +15 -13
  88. data/lib/aspera/ssh.rb +11 -10
  89. data/lib/aspera/sync.rb +158 -44
  90. data/lib/aspera/temp_file_manager.rb +2 -2
  91. data/lib/aspera/uri_reader.rb +4 -4
  92. data/lib/aspera/web_auth.rb +14 -13
  93. data.tar.gz.sig +0 -0
  94. metadata +11 -36
  95. metadata.gz.sig +0 -0
@@ -1,98 +1,150 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'aspera/cli/basic_auth_plugin'
4
+ require 'aspera/cli/plugins/sync'
4
5
  require 'aspera/ascmd'
5
6
  require 'aspera/fasp/transfer_spec'
6
7
  require 'aspera/ssh'
7
8
  require 'aspera/nagios'
8
9
  require 'tempfile'
10
+ require 'open3'
9
11
 
10
12
  module Aspera
11
13
  module Cli
12
14
  module Plugins
13
15
  # implement basic remote access with FASP/SSH
14
- class Server < BasicAuthPlugin
16
+ class Server < Aspera::Cli::BasicAuthPlugin
17
+ SSH_SCHEME = 'ssh'
18
+ URI_SCHEMES = %w[https local].push(SSH_SCHEME).freeze
19
+ ASCMD_ALIASES = {
20
+ browse: :ls,
21
+ delete: :rm,
22
+ rename: :mv
23
+ }.freeze
24
+ TRANSFER_COMMANDS = %i[sync upload download].freeze
25
+
26
+ private_constant :SSH_SCHEME, :URI_SCHEMES, :ASCMD_ALIASES, :TRANSFER_COMMANDS
27
+
15
28
  class LocalExecutor
16
- def execute(cmd,_input=nil)
17
- Log.log.debug("Executing: #{cmd}")
18
- %x(#{cmd.join(' ')})
29
+ def execute(cmd, line)
30
+ # concatenate arguments, enclose in double quotes
31
+ cmd = cmd.map{|v|%Q("#{v}")}.join(' ') if cmd.is_a?(Array)
32
+ Log.log.debug{"Executing: #{cmd} with '#{line}'"}
33
+ stdout_str, stderr_str, status = Open3.capture3(cmd, stdin_data: line, binmode: true)
34
+ Log.log.debug(">> #{status} -> #{stderr_str}")
35
+ raise "command #{cmd} failed with code #{status.exitstatus} #{stderr_str}" unless status.success?
36
+ return stdout_str
19
37
  end
20
38
  end
21
39
 
22
40
  def initialize(env)
23
41
  super(env)
24
- options.add_opt_simple(:ssh_keys,'SSH key path list (Array or single)')
25
- options.add_opt_simple(:ssh_options,'SSH options (Hash)')
26
- options.set_option(:ssh_keys,[])
27
- options.set_option(:ssh_options,{})
42
+ options.add_opt_simple(:ssh_keys, 'SSH key path list (Array or single)')
43
+ options.add_opt_simple(:ssh_options, 'SSH options (Hash)')
28
44
  options.parse_options!
45
+ @ssh_opts = nil
29
46
  end
30
47
 
31
- def key_symb_to_str_list(source)
32
- return source.map(&:stringify_keys)
33
- end
34
-
35
- ACTIONS = %i[health download upload browse delete rename].concat(Aspera::AsCmd::OPERATIONS).freeze
36
-
37
- def execute_action
38
- server_uri = URI.parse(options.get_option(:url,is_type: :mandatory))
39
- Log.log.debug("URI : #{server_uri}, port=#{server_uri.port}, scheme:#{server_uri.scheme}")
40
- server_transfer_spec = {'remote_host' => server_uri.hostname}
41
- shell_executor = nil
42
- case server_uri.scheme
43
- when 'local'
44
- shell_executor = LocalExecutor.new
45
- when 'https'
46
- raise 'ERROR: transfer spec with token required' unless transfer.option_transfer_spec['token'].is_a?(String)
48
+ # Read command line options
49
+ # @return [Hash] transfer specification
50
+ def options_to_base_transfer_spec
51
+ url = options.get_option(:url, is_type: :mandatory)
52
+ server_transfer_spec = {}
53
+ server_uri = URI.parse(url)
54
+ Log.log.debug{"URI : #{server_uri}, port=#{server_uri.port}, scheme:#{server_uri.scheme}"}
55
+ server_transfer_spec['remote_host'] = server_uri.hostname
56
+ unless URI_SCHEMES.include?(server_uri.scheme)
57
+ Log.log.warn{"Scheme [#{server_uri.scheme}] not supported in #{url}, use one of: #{URI_SCHEMES.join(', ')}. Defaulting to #{SSH_SCHEME}."}
58
+ server_uri.scheme = SSH_SCHEME
59
+ end
60
+ if server_uri.scheme.eql?('local')
61
+ # Using local execution (mostly for testing)
62
+ return server_transfer_spec
63
+ elsif transfer.option_transfer_spec['token'].is_a?(String) && server_uri.scheme.eql?('https')
47
64
  server_transfer_spec['wss_enabled'] = true
48
65
  server_transfer_spec['wss_port'] = server_uri.port
49
- else # when 'ssh'
50
- Log.log.error("Scheme #{server_uri.scheme} not supported. Assuming SSH.") if !server_uri.scheme.eql?('ssh')
51
- if options.get_option(:username).nil?
52
- options.set_option(:username,Aspera::Fasp::TransferSpec::ACCESS_KEY_TRANSFER_USER)
53
- Log.log.info("Using default transfer user: #{Aspera::Fasp::TransferSpec::ACCESS_KEY_TRANSFER_USER}")
54
- end
55
- server_transfer_spec['remote_user'] = options.get_option(:username,is_type: :mandatory)
56
- ssh_options = options.get_option(:ssh_options)
57
- raise 'expecting a Hash for ssh_options' unless ssh_options.is_a?(Hash)
58
- ssh_options = ssh_options.symbolize_keys
59
- if !server_uri.port.nil?
60
- ssh_options[:port] = server_uri.port
61
- server_transfer_spec['ssh_port'] = server_uri.port
62
- end
63
- cred_set = false
64
- password = options.get_option(:password)
65
- if !password.nil?
66
- ssh_options[:password] = password
67
- server_transfer_spec['remote_password'] = password
68
- cred_set = true
69
- end
70
- ssh_keys = options.get_option(:ssh_keys)
71
- if !ssh_keys.nil?
72
- raise 'expecting single value or array for ssh_keys' unless ssh_keys.is_a?(Array) || ssh_keys.is_a?(String)
73
- ssh_keys = [ssh_keys] if ssh_keys.is_a?(String)
74
- ssh_keys.map!{|p|File.expand_path(p)}
75
- Log.log.debug("ssh keys=#{ssh_keys}")
76
- if !ssh_keys.empty?
77
- ssh_options[:keys] = ssh_keys
78
- server_transfer_spec['EX_ssh_key_paths'] = ssh_keys
79
- ssh_keys.each do |k|
80
- Log.log.warn("no such key file: #{k}") unless File.exist?(k)
81
- end
82
- cred_set = true
66
+ # Using WSS
67
+ return server_transfer_spec
68
+ end
69
+ if !server_uri.scheme.eql?(SSH_SCHEME)
70
+ Log.log.warn('URL scheme is https but no token was provided in transfer spec.')
71
+ 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")
72
+ assumed_url = "#{SSH_SCHEME}://#{server_transfer_spec['remote_host']}:#{Aspera::Fasp::TransferSpec::SSH_PORT}"
73
+ Log.log.warn{"Assuming proper URL is: #{assumed_url}"}
74
+ server_uri = URI.parse(assumed_url)
75
+ end
76
+ # Scheme is SSH
77
+ if options.get_option(:username).nil?
78
+ options.set_option(:username, Aspera::Fasp::TransferSpec::ACCESS_KEY_TRANSFER_USER)
79
+ Log.log.info{"No username provided: Assuming default transfer user: #{Aspera::Fasp::TransferSpec::ACCESS_KEY_TRANSFER_USER}"}
80
+ end
81
+ server_transfer_spec['remote_user'] = options.get_option(:username, is_type: :mandatory)
82
+ ssh_args = options.get_option(:ssh_options)
83
+ ssh_args = {} if ssh_args.nil?
84
+ raise 'expecting a Hash for ssh_options' unless ssh_args.is_a?(Hash)
85
+ @ssh_opts = ssh_args.symbolize_keys
86
+ if !server_uri.port.nil?
87
+ @ssh_opts[:port] = server_uri.port
88
+ server_transfer_spec['ssh_port'] = server_uri.port
89
+ end
90
+ cred_set = false
91
+ password = options.get_option(:password)
92
+ if !password.nil?
93
+ @ssh_opts[:password] = password
94
+ server_transfer_spec['remote_password'] = password
95
+ cred_set = true
96
+ end
97
+ ssh_key_list = options.get_option(:ssh_keys)
98
+ if !ssh_key_list.nil?
99
+ raise 'Expecting single value or array for ssh_keys' unless ssh_key_list.is_a?(Array) || ssh_key_list.is_a?(String)
100
+ ssh_key_list = [ssh_key_list] if ssh_key_list.is_a?(String)
101
+ ssh_key_list.map!{|p|File.expand_path(p)}
102
+ Log.log.debug{"SSH keys=#{ssh_key_list}"}
103
+ if !ssh_key_list.empty?
104
+ @ssh_opts[:keys] = ssh_key_list
105
+ server_transfer_spec['EX_ssh_key_paths'] = ssh_key_list
106
+ ssh_key_list.each do |k|
107
+ Log.log.warn{"No such key file: #{k}"} unless File.exist?(k)
83
108
  end
109
+ cred_set = true
84
110
  end
85
- # if user provided transfer spec has a token, we will use by pass keys
86
- cred_set = true if transfer.option_transfer_spec['token'].is_a?(String)
87
- raise 'either password, key , or transfer spec token must be provided' if !cred_set
88
- shell_executor = Ssh.new(server_transfer_spec['remote_host'],server_transfer_spec['remote_user'],ssh_options)
89
111
  end
112
+ # if user provided transfer spec has a token, we will use bypass keys
113
+ cred_set = true if transfer.option_transfer_spec['token'].is_a?(String)
114
+ raise 'Either password, key , or transfer spec token must be provided' if !cred_set
115
+ return server_transfer_spec
116
+ end
117
+
118
+ def execute_transfer(command, transfer_spec)
119
+ case command
120
+ when :upload, :download
121
+ Fasp::TransferSpec.action_to_direction(transfer_spec, command)
122
+ return Main.result_transfer(transfer.start(transfer_spec))
123
+ when :sync
124
+ sync_plugin = Sync.new(@agents, transfer_spec: transfer_spec)
125
+ return sync_plugin.execute_action
126
+ end
127
+ end
90
128
 
91
- # get command and set aliases
92
- command = options.get_next_command(ACTIONS)
93
- command = :ls if command.eql?(:browse)
94
- command = :rm if command.eql?(:delete)
95
- command = :mv if command.eql?(:rename)
129
+ # actions without ascmd
130
+ BASE_ACTIONS = %i[health].concat(TRANSFER_COMMANDS).freeze
131
+ # all actions
132
+ ACTIONS = [].concat(BASE_ACTIONS, Aspera::AsCmd::OPERATIONS, ASCMD_ALIASES.keys).freeze
133
+
134
+ def execute_action
135
+ server_transfer_spec = options_to_base_transfer_spec
136
+ ascmd_executor = if !@ssh_opts.nil?
137
+ Ssh.new(server_transfer_spec['remote_host'], server_transfer_spec['remote_user'], @ssh_opts)
138
+ elsif server_transfer_spec.key?('wss_enabled')
139
+ nil
140
+ else
141
+ LocalExecutor.new
142
+ end
143
+ # the set of available commands depends on SSH executor availability (i.e. no WSS)
144
+ available_commands = ascmd_executor.nil? ? BASE_ACTIONS : ACTIONS
145
+ # get command and translate aliases
146
+ command = options.get_next_command(available_commands)
147
+ command = ASCMD_ALIASES[command] if ASCMD_ALIASES.key?(command)
96
148
  case command
97
149
  when :health
98
150
  nagios = Nagios.new
@@ -107,35 +159,37 @@ module Aspera
107
159
  'direction' => 'send',
108
160
  'cookie' => 'aspera.sync', # hide in console
109
161
  'resume_policy' => 'none',
110
- 'paths' => [{'source' => filepath,'destination' => '.fasping'}]
162
+ 'paths' => [{'source' => filepath, 'destination' => '.fasping'}]
111
163
  })
112
- statuses = transfer.start(probe_ts,{src: :direct})
164
+ statuses = transfer.start(probe_ts)
113
165
  file.unlink
114
166
  if TransferAgent.session_status(statuses).eql?(:success)
115
- nagios.add_ok('transfer','ok')
167
+ nagios.add_ok('transfer', 'ok')
116
168
  else
117
- nagios.add_critical('transfer',statuses.reject{|i|i.eql?(:success)}.first.to_s)
169
+ nagios.add_critical('transfer', statuses.reject{|i|i.eql?(:success)}.first.to_s)
118
170
  end
119
171
  else raise 'ERROR'
120
172
  end
121
173
  return nagios.result
122
- when :upload
123
- return Main.result_transfer(transfer.start(server_transfer_spec.merge('direction' => Fasp::TransferSpec::DIRECTION_SEND),{src: :direct}))
124
- when :download
125
- return Main.result_transfer(transfer.start(server_transfer_spec.merge('direction' => Fasp::TransferSpec::DIRECTION_RECEIVE),{src: :direct}))
174
+ when *TRANSFER_COMMANDS
175
+ return execute_transfer(command, server_transfer_spec)
126
176
  when *Aspera::AsCmd::OPERATIONS
127
- args = options.get_next_argument('ascmd command arguments',expected: :multiple,mandatory: false)
128
- ascmd = Aspera::AsCmd.new(shell_executor)
177
+ args = options.get_next_argument('ascmd command arguments', expected: :multiple, mandatory: false)
178
+ ascmd = Aspera::AsCmd.new(ascmd_executor)
129
179
  begin
130
- result = ascmd.send(:execute_single,command,args)
180
+ result = ascmd.send(:execute_single, command, args)
131
181
  case command
132
- when :mkdir,:mv,:cp,:rm then return Main.result_success
133
- when :ls then return {type: :object_list,data: key_symb_to_str_list(result),fields: %w[zmode zuid zgid size mtime name]}
134
- when :df then return {type: :object_list,data: key_symb_to_str_list(result)}
135
- when :du,:md5sum,:info then return {type: :single_object,data: result.stringify_keys}
182
+ when :mkdir, :mv, :cp, :rm
183
+ return Main.result_success
184
+ when :ls
185
+ return {type: :object_list, data: result.map(&:stringify_keys), fields: %w[zmode zuid zgid size mtime name]}
186
+ when :df
187
+ return {type: :object_list, data: result.map(&:stringify_keys)}
188
+ when :du, :md5sum, :info
189
+ return {type: :single_object, data: result.stringify_keys}
136
190
  end
137
191
  rescue Aspera::AsCmd::Error => e
138
- raise CliBadArgument,e.extended_message
192
+ raise CliBadArgument, e.extended_message
139
193
  end
140
194
  else raise 'internal error: unexpected action'
141
195
  end
@@ -5,13 +5,14 @@ require 'aspera/cli/plugins/node'
5
5
  module Aspera
6
6
  module Cli
7
7
  module Plugins
8
- class Shares < BasicAuthPlugin
8
+ class Shares < Aspera::Cli::BasicAuthPlugin
9
9
  class << self
10
10
  def detect(base_url)
11
11
  api = Rest.new({base_url: base_url})
12
12
  # Shares
13
13
  begin
14
14
  # shall fail: shares requires auth, but we check error message
15
+ # TODO: use ping instead ?
15
16
  api.read('node_api/app')
16
17
  rescue RestCallError => e
17
18
  if e.response.code.to_s.eql?('401') && e.response.body.eql?('{"error":{"user_message":"API user authentication failed"}}')
@@ -26,8 +27,8 @@ module Aspera
26
27
  # super(env)
27
28
  # end
28
29
 
29
- SAML_IMPORT_MANDATORY=%w[id name_id].freeze
30
- SAML_IMPORT_ALLOWED=[SAML_IMPORT_MANDATORY,%w[email given_name surname]].flatten.freeze
30
+ SAML_IMPORT_MANDATORY = %w[id name_id].freeze
31
+ SAML_IMPORT_ALLOWED = %w[email given_name surname].concat(SAML_IMPORT_MANDATORY).freeze
31
32
 
32
33
  ACTIONS = %i[health repository admin].freeze
33
34
 
@@ -37,23 +38,23 @@ module Aspera
37
38
  when :health
38
39
  nagios = Nagios.new
39
40
  begin
40
- Rest.
41
- new(base_url: options.get_option(:url,is_type: :mandatory)+'/node_api').
42
- call(
41
+ Rest
42
+ .new(base_url: options.get_option(:url, is_type: :mandatory) + '/node_api')
43
+ .call(
43
44
  operation: 'GET',
44
45
  subpath: 'ping',
45
46
  headers: {'content-type': 'application/json'},
46
47
  return_error: true)
47
- nagios.add_ok('shares api','accessible')
48
+ nagios.add_ok('shares api', 'accessible')
48
49
  rescue StandardError => e
49
- nagios.add_critical('node api',e.to_s)
50
+ nagios.add_critical('node api', e.to_s)
50
51
  end
51
52
  return nagios.result
52
53
  when :repository
53
54
  api_shares_node = basic_auth_api('node_api')
54
- command = options.get_next_command(Node::COMMON_ACTIONS)
55
+ command = options.get_next_command(Node::COMMANDS_SHARES)
55
56
  case command
56
- when *Node::COMMON_ACTIONS then Node.new(@agents.merge(skip_basic_auth_options: true,node_api: api_shares_node)).execute_action(command)
57
+ when *Node::COMMANDS_SHARES then Node.new(@agents.merge(skip_basic_auth_options: true, node_api: api_shares_node)).execute_action(command)
57
58
  else raise "INTERNAL ERROR, unknown command: [#{command}]"
58
59
  end
59
60
  when :admin
@@ -65,30 +66,30 @@ module Aspera
65
66
  user_id = instance_identifier if %i[app_authorizations share_permissions].include?(command)
66
67
  case command
67
68
  when :list
68
- return {type: :object_list,data: api_shares_admin.read('data/users')[:data],fields: %w[id username email directory_user urn]}
69
+ return {type: :object_list, data: api_shares_admin.read('data/users')[:data], fields: %w[id username email directory_user urn]}
69
70
  when :app_authorizations
70
- return {type: :single_object,data: api_shares_admin.read("data/users/#{user_id}/app_authorizations")[:data]}
71
+ return {type: :single_object, data: api_shares_admin.read("data/users/#{user_id}/app_authorizations")[:data]}
71
72
  when :share_permissions
72
- #share_name = options.get_next_argument('share name')
73
- #all_shares = api_shares_admin.read('data/shares')[:data]
74
- #share_id = all_shares.find{|s| s['name'].eql?(share_name)}['id']
75
- return {type: :object_list,data: api_shares_admin.read("data/users/#{user_id}/share_permissions")[:data]}
73
+ # share_name = options.get_next_argument('share name')
74
+ # all_shares = api_shares_admin.read('data/shares')[:data]
75
+ # share_id = all_shares.find{|s| s['name'].eql?(share_name)}['id']
76
+ return {type: :object_list, data: api_shares_admin.read("data/users/#{user_id}/share_permissions")[:data]}
76
77
  when :saml_import
77
- parameters = options.get_option(:value)
78
- return do_bulk_operation(parameters,'created') do |user_params|
79
- user_params=user_params.transform_keys{|k|k.gsub(/\s+/,'_').downcase}
78
+ parameters = options.get_option(:value, is_type: :mandatory)
79
+ return do_bulk_operation(parameters, 'created') do |user_params|
80
+ user_params = user_params.transform_keys{|k|k.gsub(/\s+/, '_').downcase}
80
81
  raise 'expecting Hash' unless user_params.is_a?(Hash)
81
82
  SAML_IMPORT_MANDATORY.each{|p|raise "missing mandatory field: #{p}" if user_params[p].nil?}
82
- user_params.keys.each do |p|
83
+ user_params.each_key do |p|
83
84
  raise "unsupported field: #{p}, use: #{SAML_IMPORT_ALLOWED.join(',')}" unless SAML_IMPORT_ALLOWED.include?(p)
84
85
  end
85
- api_shares_admin.create('data/saml_users/import',user_params)[:data]
86
+ api_shares_admin.create('data/saml_users/import', user_params)[:data]
86
87
  end
87
88
  when :ldap_import
88
89
  parameters = options.get_option(:value)
89
- return do_bulk_operation(parameters,'created') do |user_name|
90
- raise 'expecting string (user name), have #{user_params.class}' unless user_params.is_a?(String)
91
- api_shares_admin.create('data/ldap_users',{'user'=>user_name})[:data]
90
+ return do_bulk_operation(parameters, 'created') do |user_name|
91
+ raise "expecting string (user name), have #{user_name.class}" unless user_name.is_a?(String)
92
+ api_shares_admin.create('data/ldap_users', {'user'=>user_name})[:data]
92
93
  end
93
94
  end
94
95
  when :share
@@ -97,12 +98,12 @@ module Aspera
97
98
  all_shares = api_shares_admin.read('data/shares')[:data]
98
99
  case command
99
100
  when :list
100
- return {type: :object_list,data: all_shares,fields: %w[id name status status_message]}
101
+ return {type: :object_list, data: all_shares, fields: %w[id name status status_message]}
101
102
  when :user_permissions
102
- #share_name = options.get_next_argument('share name')
103
- #share_id = all_shares.find{|s| s['name'].eql?(share_name)}['id']
104
- #raise "NOT IMPLEMENTED: #{share_name} #{share_id}"
105
- return {type: :object_list,data: api_shares_admin.read("data/shares/#{share_id}/user_permissions")[:data]}
103
+ # share_name = options.get_next_argument('share name')
104
+ # share_id = all_shares.find{|s| s['name'].eql?(share_name)}['id']
105
+ # raise "NOT IMPLEMENTED: #{share_name} #{share_id}"
106
+ return {type: :object_list, data: api_shares_admin.read("data/shares/#{share_id}/user_permissions")[:data]}
106
107
  end
107
108
  end
108
109
  end
@@ -9,13 +9,16 @@ require 'open3'
9
9
  module Aspera
10
10
  module Cli
11
11
  module Plugins
12
- # list and download connect client versions, select FASP implementation
13
- class Sync < Plugin
14
- def initialize(env)
12
+ # Execute Aspera Sync
13
+ class Sync < Aspera::Cli::Plugin
14
+ def initialize(env, transfer_spec: nil)
15
15
  super(env)
16
- options.add_opt_simple(:parameters,'extended value for session set definition')
17
- options.add_opt_simple(:session_name,'name of session to use for admin commands, by default first one')
16
+ options.add_opt_simple(:sync_info, 'Information for sync instance and sessions (Hash)')
17
+ options.add_opt_simple(:sync_session, 'Name of session to use for admin commands. default: first in parameters')
18
18
  options.parse_options!
19
+ return if env[:man_only]
20
+ @params = options.get_option(:sync_info, is_type: :mandatory)
21
+ Aspera::Sync.update_parameters_with_transfer_spec(@params, transfer_spec) unless transfer_spec.nil?
19
22
  end
20
23
 
21
24
  ACTIONS = %i[start admin].freeze
@@ -24,38 +27,15 @@ module Aspera
24
27
  command = options.get_next_command(ACTIONS)
25
28
  case command
26
29
  when :start
27
- env_args = Aspera::Sync.new(options.get_option(:parameters,is_type: :mandatory)).compute_args
28
- async_bin = 'async'
29
- Log.log.debug("execute: #{env_args[:env].map{|k,v| "#{k}=\"#{v}\""}.join(' ')} \"#{async_bin}\" \"#{env_args[:args].join('" "')}\"")
30
- res = system(env_args[:env],[async_bin,async_bin],*env_args[:args])
31
- Log.log.debug("result=#{res}")
32
- case res
33
- when true then return Main.result_success
34
- when false then raise "failed: #{$CHILD_STATUS}"
35
- when nil then return Main.result_status("not started: #{$CHILD_STATUS}")
36
- else raise 'internal error: unspecified case'
37
- end
30
+ Aspera::Sync.new(@params).start
31
+ return Main.result_success
38
32
  when :admin
39
- p = options.get_option(:parameters,is_type: :mandatory)
40
- n = options.get_option(:session_name)
41
- cmdline = ['asyncadmin','--quiet']
42
- session = n.nil? ? p['sessions'].first : p['sessions'].find{|s|s['name'].eql?(n)}
43
- cmdline.push('--name=' + session['name'])
44
- if session.has_key?('local_db_dir')
45
- cmdline.push('--local-db-dir=' + session['local_db_dir'])
46
- else
47
- cmdline.push('--local-dir=' + session['local_dir'])
48
- end
33
+ sync_admin = Aspera::SyncAdmin.new(@params, options.get_option(:sync_session))
49
34
  command2 = options.get_next_command([:status])
50
35
  case command2
51
36
  when :status
52
- stdout, stderr, status = Open3.capture3(*cmdline)
53
- Log.log.debug("status=#{status}, stderr=#{stderr}")
54
- items = stdout.split("\n").each_with_object({}){|l,m|i = l.split(/: */);m[i.first.lstrip] = i.last.lstrip;}
55
- return {type: :single_object,data: items}
56
- else raise 'error'
57
- end # command
58
- else raise 'error'
37
+ return {type: :single_object, data: sync_admin.status}
38
+ end # command2
59
39
  end # command
60
40
  end # execute_action
61
41
  end # Sync