aspera-cli 4.4.0 → 4.7.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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2095 -1503
  3. data/bin/ascli +2 -1
  4. data/bin/asession +4 -5
  5. data/docs/test_env.conf +3 -0
  6. data/examples/aoc.rb +4 -3
  7. data/examples/faspex4.rb +25 -25
  8. data/examples/proxy.pac +1 -1
  9. data/examples/transfer.rb +17 -17
  10. data/lib/aspera/aoc.rb +238 -185
  11. data/lib/aspera/ascmd.rb +93 -83
  12. data/lib/aspera/ats_api.rb +11 -10
  13. data/lib/aspera/cli/basic_auth_plugin.rb +13 -14
  14. data/lib/aspera/cli/extended_value.rb +42 -33
  15. data/lib/aspera/cli/formater.rb +142 -108
  16. data/lib/aspera/cli/info.rb +17 -0
  17. data/lib/aspera/cli/listener/line_dump.rb +3 -2
  18. data/lib/aspera/cli/listener/logger.rb +2 -1
  19. data/lib/aspera/cli/listener/progress.rb +16 -18
  20. data/lib/aspera/cli/listener/progress_multi.rb +18 -21
  21. data/lib/aspera/cli/main.rb +173 -149
  22. data/lib/aspera/cli/manager.rb +163 -168
  23. data/lib/aspera/cli/plugin.rb +43 -31
  24. data/lib/aspera/cli/plugins/alee.rb +6 -6
  25. data/lib/aspera/cli/plugins/aoc.rb +405 -370
  26. data/lib/aspera/cli/plugins/ats.rb +86 -79
  27. data/lib/aspera/cli/plugins/bss.rb +14 -16
  28. data/lib/aspera/cli/plugins/config.rb +580 -362
  29. data/lib/aspera/cli/plugins/console.rb +23 -19
  30. data/lib/aspera/cli/plugins/cos.rb +18 -18
  31. data/lib/aspera/cli/plugins/faspex.rb +201 -158
  32. data/lib/aspera/cli/plugins/faspex5.rb +80 -57
  33. data/lib/aspera/cli/plugins/node.rb +183 -166
  34. data/lib/aspera/cli/plugins/orchestrator.rb +71 -67
  35. data/lib/aspera/cli/plugins/preview.rb +92 -96
  36. data/lib/aspera/cli/plugins/server.rb +79 -75
  37. data/lib/aspera/cli/plugins/shares.rb +35 -19
  38. data/lib/aspera/cli/plugins/sync.rb +20 -22
  39. data/lib/aspera/cli/transfer_agent.rb +76 -113
  40. data/lib/aspera/cli/version.rb +2 -1
  41. data/lib/aspera/colors.rb +35 -27
  42. data/lib/aspera/command_line_builder.rb +48 -34
  43. data/lib/aspera/cos_node.rb +29 -21
  44. data/lib/aspera/data_repository.rb +3 -2
  45. data/lib/aspera/environment.rb +50 -45
  46. data/lib/aspera/fasp/{manager.rb → agent_base.rb} +28 -25
  47. data/lib/aspera/fasp/{connect.rb → agent_connect.rb} +52 -43
  48. data/lib/aspera/fasp/{local.rb → agent_direct.rb} +58 -72
  49. data/lib/aspera/fasp/{http_gw.rb → agent_httpgw.rb} +37 -43
  50. data/lib/aspera/fasp/{node.rb → agent_node.rb} +35 -16
  51. data/lib/aspera/fasp/agent_trsdk.rb +104 -0
  52. data/lib/aspera/fasp/error.rb +2 -1
  53. data/lib/aspera/fasp/error_info.rb +68 -52
  54. data/lib/aspera/fasp/installation.rb +152 -124
  55. data/lib/aspera/fasp/listener.rb +1 -0
  56. data/lib/aspera/fasp/parameters.rb +87 -92
  57. data/lib/aspera/fasp/parameters.yaml +305 -249
  58. data/lib/aspera/fasp/resume_policy.rb +11 -14
  59. data/lib/aspera/fasp/transfer_spec.rb +26 -0
  60. data/lib/aspera/fasp/uri.rb +22 -21
  61. data/lib/aspera/faspex_gw.rb +55 -89
  62. data/lib/aspera/hash_ext.rb +4 -3
  63. data/lib/aspera/id_generator.rb +8 -7
  64. data/lib/aspera/keychain/encrypted_hash.rb +121 -0
  65. data/lib/aspera/keychain/macos_security.rb +90 -0
  66. data/lib/aspera/log.rb +55 -37
  67. data/lib/aspera/nagios.rb +13 -12
  68. data/lib/aspera/node.rb +30 -25
  69. data/lib/aspera/oauth.rb +175 -226
  70. data/lib/aspera/open_application.rb +4 -3
  71. data/lib/aspera/persistency_action_once.rb +6 -6
  72. data/lib/aspera/persistency_folder.rb +5 -9
  73. data/lib/aspera/preview/file_types.rb +6 -5
  74. data/lib/aspera/preview/generator.rb +25 -24
  75. data/lib/aspera/preview/options.rb +16 -14
  76. data/lib/aspera/preview/utils.rb +98 -98
  77. data/lib/aspera/{proxy_auto_config.erb.js → proxy_auto_config.js} +23 -31
  78. data/lib/aspera/proxy_auto_config.rb +111 -20
  79. data/lib/aspera/rest.rb +154 -135
  80. data/lib/aspera/rest_call_error.rb +2 -2
  81. data/lib/aspera/rest_error_analyzer.rb +23 -25
  82. data/lib/aspera/rest_errors_aspera.rb +15 -14
  83. data/lib/aspera/ssh.rb +12 -10
  84. data/lib/aspera/sync.rb +42 -41
  85. data/lib/aspera/temp_file_manager.rb +18 -14
  86. data/lib/aspera/timer_limiter.rb +2 -1
  87. data/lib/aspera/uri_reader.rb +7 -5
  88. data/lib/aspera/web_auth.rb +79 -76
  89. metadata +116 -29
  90. data/docs/Makefile +0 -66
  91. data/docs/README.erb.md +0 -3973
  92. data/docs/README.md +0 -13
  93. data/docs/diagrams.txt +0 -49
  94. data/docs/doc_tools.rb +0 -58
  95. data/lib/aspera/api_detector.rb +0 -60
  96. data/lib/aspera/cli/plugins/shares2.rb +0 -114
  97. data/lib/aspera/secrets.rb +0 -20
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  require 'aspera/cli/basic_auth_plugin'
2
3
  require 'aspera/ascmd'
3
- require 'aspera/node'
4
+ require 'aspera/fasp/transfer_spec'
4
5
  require 'aspera/ssh'
5
6
  require 'aspera/nagios'
6
7
  require 'tempfile'
@@ -11,23 +12,23 @@ module Aspera
11
12
  # implement basic remote access with FASP/SSH
12
13
  class Server < BasicAuthPlugin
13
14
  class LocalExecutor
14
- def execute(cmd,input=nil)
15
- `#{cmd}`
15
+ def execute(cmd,_input=nil)
16
+ %x(#{cmd})
16
17
  end
17
18
  end
18
19
 
19
20
  def initialize(env)
20
21
  super(env)
21
- self.options.add_opt_simple(:ssh_keys,'ssh key path list (Array or single)')
22
- self.options.add_opt_simple(:ssh_options,'ssh options (Hash)')
23
- self.options.add_opt_simple(:cmd_prefix,'prefix to add for as cmd execution, e.g. sudo or /opt/aspera/bin ')
24
- self.options.set_option(:ssh_keys,[])
25
- self.options.set_option(:ssh_options,{})
26
- self.options.parse_options!
22
+ options.add_opt_simple(:ssh_keys,'ssh key path list (Array or single)')
23
+ options.add_opt_simple(:ssh_options,'ssh options (Hash)')
24
+ options.add_opt_simple(:cmd_prefix,'prefix to add for as cmd execution, e.g. sudo or /opt/aspera/bin ')
25
+ options.set_option(:ssh_keys,[])
26
+ options.set_option(:ssh_options,{})
27
+ options.parse_options!
27
28
  end
28
29
 
29
30
  def key_symb_to_str_single(source)
30
- return source.inject({}){|memo,(k,v)| memo[k.to_s] = v; memo}
31
+ return source.each_with_object({}){|(k,v),memo| memo[k.to_s] = v; }
31
32
  end
32
33
 
33
34
  def key_symb_to_str_list(source)
@@ -35,64 +36,76 @@ module Aspera
35
36
  end
36
37
 
37
38
  def asctl_parse(text)
39
+ # normal separator
38
40
  r=/:\s*/
39
- return text.split("\n").map do |line|
40
- # console
41
+ result=[]
42
+ text.split("\n").each do |line|
43
+ # console: missing space
41
44
  line.gsub!(/(SessionDataCollector)/,'\1 ')
42
45
  # orchestrator
43
46
  line.gsub!(/ with pid:.*/,'')
44
47
  line.gsub!(/ is /,': ')
45
- x=line.split(r)
46
- next unless x.length.eql?(2)
47
- y={'process'=>x.first,'state'=>x.last}
48
+ items=line.split(r)
49
+ next unless items.length.eql?(2)
50
+ state={'process'=>items.first,'state'=>items.last}
48
51
  # console
49
- y['state'].gsub!(/\.+$/,'')
52
+ state['state'].gsub!(/\.+$/,'')
50
53
  # console
51
- y['process'].gsub!(/^.+::/,'')
54
+ state['process'].gsub!(/^.+::/,'')
52
55
  # faspex
53
- y['process'].gsub!(/^Faspex /,'')
56
+ state['process'].gsub!(/^Faspex /,'')
54
57
  # faspex
55
- y['process'].gsub!(/ Background/,'')
56
- y['process'].gsub!(/serving orchestrator on port /,'')
58
+ state['process'].gsub!(/ Background/,'')
59
+ state['process'].gsub!(/serving orchestrator on port /,'')
57
60
  # console
58
- r=/\s+/ if y['process'].eql?('Console')
61
+ r=/\s+/ if state['process'].eql?('Console')
59
62
  # orchestrator
60
- y['process'].gsub!(/^ -> /,'')
61
- y['process'].gsub!(/ Process/,'')
62
- y
63
- end.select{|i|!i.nil?}
63
+ state['process'].gsub!(/^ -> /,'')
64
+ state['process'].gsub!(/ Process/,'')
65
+ result.push(state)
66
+ end
67
+ return result
64
68
  end
65
69
 
66
70
  ACTIONS=[:health,:nodeadmin,:userdata,:configurator,:ctl,:download,:upload,:browse,:delete,:rename].concat(Aspera::AsCmd::OPERATIONS)
67
71
 
68
72
  def execute_action
69
- server_uri=URI.parse(self.options.get_option(:url,:mandatory))
73
+ server_uri=URI.parse(options.get_option(:url,:mandatory))
70
74
  Log.log.debug("URI : #{server_uri}, port=#{server_uri.port}, scheme:#{server_uri.scheme}")
71
75
  server_transfer_spec={'remote_host'=>server_uri.hostname}
72
76
  shell_executor=nil
73
77
  case server_uri.scheme
74
- when 'ssh'
75
- if self.options.get_option(:username,:optional).nil?
76
- self.options.set_option(:username,Aspera::Node::ACCESS_KEY_TRANSFER_USER)
77
- Log.log.info("Using default transfer user: #{Aspera::Node::ACCESS_KEY_TRANSFER_USER}")
78
+ when 'local'
79
+ shell_executor=LocalExecutor.new
80
+ when 'https'
81
+ raise 'ERROR: transfer spec with token required' unless transfer.option_transfer_spec['token'].is_a?(String)
82
+ server_transfer_spec.merge!({
83
+ 'wss_enabled'=>true,
84
+ 'wss_port' =>server_uri.port
85
+ })
86
+ else # when 'ssh'
87
+ Log.log.error("Scheme #{server_uri.scheme} not supported. Assuming SSH.") if !server_uri.scheme.eql?('ssh')
88
+ if options.get_option(:username,:optional).nil?
89
+ options.set_option(:username,Aspera::Fasp::TransferSpec::ACCESS_KEY_TRANSFER_USER)
90
+ Log.log.info("Using default transfer user: #{Aspera::Fasp::TransferSpec::ACCESS_KEY_TRANSFER_USER}")
78
91
  end
79
- server_transfer_spec['remote_user']=self.options.get_option(:username,:mandatory)
80
- ssh_options=self.options.get_option(:ssh_options,:optional)
92
+ server_transfer_spec['remote_user']=options.get_option(:username,:mandatory)
93
+ ssh_options=options.get_option(:ssh_options,:optional)
81
94
  raise 'expecting a Hash for ssh_options' unless ssh_options.is_a?(Hash)
82
95
  if !server_uri.port.nil?
83
96
  ssh_options[:port]=server_uri.port
84
97
  server_transfer_spec['ssh_port']=server_uri.port
85
98
  end
86
99
  cred_set=false
87
- password=self.options.get_option(:password,:optional)
100
+ password=options.get_option(:password,:optional)
88
101
  if !password.nil?
89
102
  ssh_options[:password]=password
90
103
  server_transfer_spec['remote_password']=password
91
104
  cred_set=true
92
105
  end
93
- ssh_keys=self.options.get_option(:ssh_keys,:optional)
106
+ ssh_keys=options.get_option(:ssh_keys,:optional)
94
107
  if !ssh_keys.nil?
95
- raise 'expecting single value or array for ssh_keys' unless ssh_keys.is_a?(Array) or ssh_keys.is_a?(String)
108
+ raise 'expecting single value or array for ssh_keys' unless ssh_keys.is_a?(Array) || ssh_keys.is_a?(String)
96
109
  ssh_keys=[ssh_keys] if ssh_keys.is_a?(String)
97
110
  ssh_keys.map!{|p|File.expand_path(p)}
98
111
  Log.log.debug("ssh keys=#{ssh_keys}")
@@ -106,30 +119,20 @@ module Aspera
106
119
  end
107
120
  end
108
121
  # if user provided transfer spec has a token, we will use by pass keys
109
- cred_set=true if self.transfer.option_transfer_spec['token'].is_a?(String)
122
+ cred_set=true if transfer.option_transfer_spec['token'].is_a?(String)
110
123
  raise 'either password, key , or transfer spec token must be provided' if !cred_set
111
124
  shell_executor=Ssh.new(server_transfer_spec['remote_host'],server_transfer_spec['remote_user'],ssh_options)
112
- when 'https'
113
- raise "ERROR: transfer spec with token required" unless self.transfer.option_transfer_spec['token'].is_a?(String)
114
- server_transfer_spec.merge!({
115
- 'wss_enabled'=>true,
116
- 'wss_port' =>server_uri.port
117
- })
118
- when 'local'
119
- shell_executor=LocalExecutor.new
120
- else
121
- raise CliError,'Only ssh scheme is supported in url' if !server_uri.scheme.eql?('ssh')
122
125
  end
123
126
 
124
127
  # get command and set aliases
125
- command=self.options.get_next_command(ACTIONS)
128
+ command=options.get_next_command(ACTIONS)
126
129
  command=:ls if command.eql?(:browse)
127
130
  command=:rm if command.eql?(:delete)
128
131
  command=:mv if command.eql?(:rename)
129
132
  case command
130
133
  when :health
131
134
  nagios=Nagios.new
132
- command_nagios=self.options.get_next_command([ :app_services, :transfer, :asctlstatus ])
135
+ command_nagios=options.get_next_command([:app_services, :transfer, :asctlstatus])
133
136
  case command_nagios
134
137
  when :app_services
135
138
  # will not work with aspshell, requires Linux/bash
@@ -143,7 +146,7 @@ module Aspera
143
146
  when :transfer
144
147
  file = Tempfile.new('transfer_test')
145
148
  filepath=file.path
146
- file.write("This is a test file for transfer test")
149
+ file.write('This is a test file for transfer test')
147
150
  file.close
148
151
  probe_ts=server_transfer_spec.merge({
149
152
  'direction' => 'send',
@@ -151,18 +154,18 @@ module Aspera
151
154
  'resume_policy' => 'none',
152
155
  'paths' => [{'source'=>filepath,'destination'=>'.fasping'}]
153
156
  })
154
- statuses=self.transfer.start(probe_ts,{:src=>:direct})
157
+ statuses=transfer.start(probe_ts,{src: :direct})
155
158
  file.unlink
156
159
  if TransferAgent.session_status(statuses).eql?(:success)
157
160
  nagios.add_ok('transfer','ok')
158
161
  else
159
- nagios.add_critical('transfer',statuses.select{|i|!i.eql?(:success)}.first.to_s)
162
+ nagios.add_critical('transfer',statuses.reject{|i|i.eql?(:success)}.first.to_s)
160
163
  end
161
164
  when :asctlstatus
162
165
  realcmd='asctl'
163
- prefix=self.options.get_option(:cmd_prefix,:optional)
166
+ prefix=options.get_option(:cmd_prefix,:optional)
164
167
  realcmd="#{prefix}#{realcmd} all:status" unless prefix.nil?
165
- result=shell_executor.execute(realcmd.split(' '))
168
+ result=shell_executor.execute(realcmd.split)
166
169
  data=asctl_parse(result)
167
170
  data.each do |i|
168
171
  if i['state'].eql?('running')
@@ -171,31 +174,32 @@ module Aspera
171
174
  nagios.add_critical(i['process'],i['state'])
172
175
  end
173
176
  end
174
- else raise "ERROR"
177
+ else raise 'ERROR'
175
178
  end
176
179
  return nagios.result
177
180
  when :nodeadmin,:userdata,:configurator,:ctl
178
181
  realcmd='as'+command.to_s
179
- prefix=self.options.get_option(:cmd_prefix,:optional)
182
+ prefix=options.get_option(:cmd_prefix,:optional)
180
183
  if !prefix.nil?
181
184
  realcmd="#{prefix}#{realcmd}"
182
185
  end
183
- args = self.options.get_next_argument("#{realcmd} arguments",:multiple)
186
+ args = options.get_next_argument("#{realcmd} arguments",:multiple)
184
187
  result=shell_executor.execute(args.unshift(realcmd))
185
188
  case command
186
189
  when :ctl
187
- return {:type=>:object_list,:data=>asctl_parse(result)}#
190
+ return {type: :object_list,data: asctl_parse(result)}
188
191
  when :configurator
189
192
  lines=result.split("\n")
190
- Log.log.debug(`type asconfigurator`)
193
+ # not windows
194
+ Log.log.debug(%x(type asconfigurator))
191
195
  result=lines
192
196
  if lines.first.eql?('success')
193
197
  lines.shift
194
198
  result={}
195
199
  lines.each do |line|
196
- Log.log.debug("#{line}")
197
- data=line.split(',').map{|i|i.gsub(/^"/,'').gsub(/"$/,'')}.map{|i|case i;when'AS_NULL';nil;when'true';true;when'false';false;else i;end}
198
- Log.log.debug("#{data}")
200
+ Log.log.debug(line.to_s)
201
+ data=line.split(',').map{|i|i.gsub(/^"/,'').gsub(/"$/,'')}.map{|i|case i;when 'AS_NULL' then nil;when 'true' then true;when 'false' then false;else i;end}
202
+ Log.log.debug(data.to_s)
199
203
  section=data.shift
200
204
  datapart=result[section]||={}
201
205
  if section.eql?('user')
@@ -206,34 +210,34 @@ module Aspera
206
210
  datapart['default']=data.pop
207
211
  datapart['value']=data.pop
208
212
  end
209
- return {:type=>:single_object,:data=>result,:fields=>['section','name','value','default'],:option_expand_last=>true}
213
+ return {type: :single_object,data: result,fields: ['section','name','value','default'],option_expand_last: true}
210
214
  end
211
215
  end
212
216
  return Main.result_status(result)
213
217
  when :upload
214
- return Main.result_transfer(self.transfer.start(server_transfer_spec.merge('direction'=>'send'),{:src=>:direct}))
218
+ return Main.result_transfer(transfer.start(server_transfer_spec.merge('direction'=>Fasp::TransferSpec::DIRECTION_SEND),{src: :direct}))
215
219
  when :download
216
- return Main.result_transfer(self.transfer.start(server_transfer_spec.merge('direction'=>'receive'),{:src=>:direct}))
220
+ return Main.result_transfer(transfer.start(server_transfer_spec.merge('direction'=>Fasp::TransferSpec::DIRECTION_RECEIVE),{src: :direct}))
217
221
  when *Aspera::AsCmd::OPERATIONS
218
- args=self.options.get_next_argument('ascmd command arguments',:multiple,:optional)
222
+ args=options.get_next_argument('ascmd command arguments',:multiple,:optional)
219
223
  ascmd=Aspera::AsCmd.new(shell_executor)
220
224
  begin
221
225
  result=ascmd.send(:execute_single,command,args)
222
226
  case command
223
- when :mkdir; return Main.result_success
224
- when :mv; return Main.result_success
225
- when :cp; return Main.result_success
226
- when :rm; return Main.result_success
227
- when :ls; return {:type=>:object_list,:data=>key_symb_to_str_list(result),:fields=>['zmode','zuid','zgid','size','mtime','name']}
228
- when :info; return {:type=>:single_object,:data=>key_symb_to_str_single(result)}
229
- when :df; return {:type=>:object_list,:data=>key_symb_to_str_list(result)}
230
- when :du; return {:type=>:single_object,:data=>key_symb_to_str_single(result)}
231
- when :md5sum; return {:type=>:single_object,:data=>key_symb_to_str_single(result)}
227
+ when :mkdir then return Main.result_success
228
+ when :mv then return Main.result_success
229
+ when :cp then return Main.result_success
230
+ when :rm then return Main.result_success
231
+ when :ls then return {type: :object_list,data: key_symb_to_str_list(result),fields: ['zmode','zuid','zgid','size','mtime','name']}
232
+ when :info then return {type: :single_object,data: key_symb_to_str_single(result)}
233
+ when :df then return {type: :object_list,data: key_symb_to_str_list(result)}
234
+ when :du then return {type: :single_object,data: key_symb_to_str_single(result)}
235
+ when :md5sum then return {type: :single_object,data: key_symb_to_str_single(result)}
232
236
  end
233
237
  rescue Aspera::AsCmd::Error => e
234
238
  raise CliBadArgument,e.extended_message
235
239
  end
236
- else raise "internal error: unexpected action"
240
+ else raise 'internal error: unexpected action'
237
241
  end
238
242
  end # execute_action
239
243
  end # Server
@@ -1,58 +1,74 @@
1
+ # frozen_string_literal: true
1
2
  require 'aspera/cli/plugins/node'
2
3
 
3
4
  module Aspera
4
5
  module Cli
5
6
  module Plugins
6
7
  class Shares < BasicAuthPlugin
7
- def initialize(env)
8
- super(env)
9
- #self.options.parse_options!
8
+ class << self
9
+ def detect(base_url)
10
+ api=Rest.new({base_url: base_url})
11
+ # Shares
12
+ begin
13
+ # shall fail: shares requires auth, but we check error message
14
+ api.read('node_api/app')
15
+ rescue RestCallError => e
16
+ if e.response.code.to_s.eql?('401') && e.response.body.eql?('{"error":{"user_message":"API user authentication failed"}}')
17
+ return {version: 'unknown'}
18
+ end
19
+ end
20
+ nil
21
+ end
10
22
  end
11
23
 
12
- ACTIONS=[ :repository,:admin ]
24
+ # def initialize(env)
25
+ # super(env)
26
+ # end
27
+
28
+ ACTIONS=[:repository,:admin]
13
29
 
14
30
  def execute_action
15
- command=self.options.get_next_command(ACTIONS)
31
+ command=options.get_next_command(ACTIONS)
16
32
  case command
17
33
  when :repository
18
34
  api_shares_node=basic_auth_api('node_api')
19
- command=self.options.get_next_command(Node::COMMON_ACTIONS)
35
+ command=options.get_next_command(Node::COMMON_ACTIONS)
20
36
  case command
21
- when *Node::COMMON_ACTIONS; Node.new(@agents.merge(skip_basic_auth_options: true,node_api: api_shares_node)).execute_action(command)
37
+ when *Node::COMMON_ACTIONS then Node.new(@agents.merge(skip_basic_auth_options: true,node_api: api_shares_node)).execute_action(command)
22
38
  else raise "INTERNAL ERROR, unknown command: [#{command}]"
23
39
  end
24
40
  when :admin
25
41
  api_shares_admin=basic_auth_api('api/v1')
26
- command=self.options.get_next_command([:user,:share])
42
+ command=options.get_next_command([:user,:share])
27
43
  case command
28
44
  when :user
29
- command=self.options.get_next_command([:list,:id])
45
+ command=options.get_next_command([:list,:id])
30
46
  case command
31
47
  when :list
32
- return {:type=>:object_list,:data=>api_shares_admin.read('data/users')[:data],:fields=>['username','email','directory_user','urn']}
48
+ return {type: :object_list,data: api_shares_admin.read('data/users')[:data],fields: ['username','email','directory_user','urn']}
33
49
  when :id
34
- res_id=self.options.get_next_argument('user id')
35
- command=self.options.get_next_command([:app_authorizations,:authorize_share])
50
+ res_id=options.get_next_argument('user id')
51
+ command=options.get_next_command([:app_authorizations,:authorize_share])
36
52
  case command
37
53
  when :app_authorizations
38
- return {:type=>:single_object,:data=>api_shares_admin.read("data/users/#{res_id}/app_authorizations")[:data]}
54
+ return {type: :single_object,data: api_shares_admin.read("data/users/#{res_id}/app_authorizations")[:data]}
39
55
  when :share
40
- share_name=self.options.get_next_argument('share name')
56
+ share_name=options.get_next_argument('share name')
41
57
  all_shares=api_shares_admin.read('data/shares')[:data]
42
58
  share_id=all_shares.select{|s| s['name'].eql?(share_name)}.first['id']
43
- return {:type=>:single_object,:data=>api_shares_admin.create("data/shares/#{share_id}/user_permissions")[:data]}
59
+ return {type: :single_object,data: api_shares_admin.create("data/shares/#{share_id}/user_permissions")[:data]}
44
60
  end
45
61
  end
46
62
  when :share
47
- command=self.options.get_next_command([:list,:name])
63
+ command=options.get_next_command([:list,:name])
48
64
  all_shares=api_shares_admin.read('data/shares')[:data]
49
65
  case command
50
66
  when :list
51
- return {:type=>:object_list,:data=>all_shares,:fields=>['id','name','status','status_message']}
67
+ return {type: :object_list,data: all_shares,fields: ['id','name','status','status_message']}
52
68
  when :name
53
- share_name=self.options.get_next_argument('share name')
69
+ share_name=options.get_next_argument('share name')
54
70
  share_id=all_shares.select{|s| s['name'].eql?(share_name)}.first['id']
55
- raise "TODO"
71
+ raise "NOT IMPLEMENTED: #{share_name} #{share_id}"
56
72
  end
57
73
  end
58
74
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+ require 'English'
1
3
  require 'aspera/cli/plugin'
2
4
  require 'aspera/sync'
3
5
  require 'aspera/log'
@@ -10,53 +12,49 @@ module Aspera
10
12
  class Sync < Plugin
11
13
  def initialize(env)
12
14
  super(env)
13
- self.options.add_opt_simple(:parameters,"extended value for session set definition")
14
- self.options.add_opt_simple(:session_name,"name of session to use for admin commands, by default first one")
15
- self.options.parse_options!
15
+ options.add_opt_simple(:parameters,'extended value for session set definition')
16
+ options.add_opt_simple(:session_name,'name of session to use for admin commands, by default first one')
17
+ options.parse_options!
16
18
  end
17
19
 
18
- ACTIONS=[ :start, :admin ]
20
+ ACTIONS=[:start, :admin]
19
21
 
20
22
  def execute_action
21
- command=self.options.get_next_command(ACTIONS)
23
+ command=options.get_next_command(ACTIONS)
22
24
  case command
23
25
  when :start
24
- env_args=Aspera::Sync.new(self.options.get_option(:parameters,:mandatory)).compute_args
26
+ env_args=Aspera::Sync.new(options.get_option(:parameters,:mandatory)).compute_args
25
27
  async_bin='async'
26
28
  Log.log.debug("execute: #{env_args[:env].map{|k,v| "#{k}=\"#{v}\""}.join(' ')} \"#{async_bin}\" \"#{env_args[:args].join('" "')}\"")
27
29
  res=system(env_args[:env],[async_bin,async_bin],*env_args[:args])
28
30
  Log.log.debug("result=#{res}")
29
31
  case res
30
- when true; return Main.result_success
31
- when false; raise "failed: #{$?}"
32
- when nil; return Main.result_status("not started: #{$?}")
33
- else raise "internal error: unspecified case"
32
+ when true then return Main.result_success
33
+ when false then raise "failed: #{$CHILD_STATUS}"
34
+ when nil then return Main.result_status("not started: #{$CHILD_STATUS}")
35
+ else raise 'internal error: unspecified case'
34
36
  end
35
37
  when :admin
36
- p=self.options.get_option(:parameters,:mandatory)
37
- n=self.options.get_option(:session_name,:optional)
38
+ p=options.get_option(:parameters,:mandatory)
39
+ n=options.get_option(:session_name,:optional)
38
40
  cmdline=['asyncadmin','--quiet']
39
- if n.nil?
40
- session=p['sessions'].first
41
- else
42
- session=p['sessions'].select{|s|s['name'].eql?(n)}.first
43
- end
41
+ session=n.nil? ? p['sessions'].first : p['sessions'].select{|s|s['name'].eql?(n)}.first
44
42
  cmdline.push('--name='+session['name'])
45
43
  if session.has_key?('local_db_dir')
46
44
  cmdline.push('--local-db-dir='+session['local_db_dir'])
47
45
  else
48
46
  cmdline.push('--local-dir='+session['local_dir'])
49
47
  end
50
- command2=self.options.get_next_command([:status])
48
+ command2=options.get_next_command([:status])
51
49
  case command2
52
50
  when :status
53
51
  stdout, stderr, status = Open3.capture3(*cmdline)
54
52
  Log.log.debug("status=#{status}, stderr=#{stderr}")
55
- items=stdout.split("\n").inject({}){|m,l|i=l.split(/: */);m[i.first.lstrip]=i.last.lstrip;m}
56
- return {:type=>:single_object,:data=>items}
57
- else raise "error"
53
+ items=stdout.split("\n").each_with_object({}){|l,m|i=l.split(/: */);m[i.first.lstrip]=i.last.lstrip;}
54
+ return {type: :single_object,data: items}
55
+ else raise 'error'
58
56
  end # command
59
- else raise "error"
57
+ else raise 'error'
60
58
  end # command
61
59
  end # execute_action
62
60
  end # Sync