aspera-cli 4.6.0 → 4.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +427 -300
  3. data/bin/ascli +2 -1
  4. data/bin/asession +1 -0
  5. data/docs/test_env.conf +2 -0
  6. data/examples/aoc.rb +4 -3
  7. data/examples/faspex4.rb +21 -19
  8. data/examples/proxy.pac +1 -1
  9. data/examples/transfer.rb +15 -15
  10. data/lib/aspera/aoc.rb +135 -124
  11. data/lib/aspera/ascmd.rb +85 -75
  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 +138 -111
  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 +13 -16
  21. data/lib/aspera/cli/main.rb +122 -130
  22. data/lib/aspera/cli/manager.rb +146 -154
  23. data/lib/aspera/cli/plugin.rb +38 -34
  24. data/lib/aspera/cli/plugins/alee.rb +6 -6
  25. data/lib/aspera/cli/plugins/aoc.rb +273 -276
  26. data/lib/aspera/cli/plugins/ats.rb +82 -76
  27. data/lib/aspera/cli/plugins/bss.rb +14 -16
  28. data/lib/aspera/cli/plugins/config.rb +350 -306
  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 +180 -159
  32. data/lib/aspera/cli/plugins/faspex5.rb +64 -54
  33. data/lib/aspera/cli/plugins/node.rb +147 -140
  34. data/lib/aspera/cli/plugins/orchestrator.rb +68 -66
  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 +23 -24
  38. data/lib/aspera/cli/plugins/sync.rb +20 -22
  39. data/lib/aspera/cli/transfer_agent.rb +40 -39
  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/agent_base.rb +22 -20
  47. data/lib/aspera/fasp/agent_connect.rb +13 -11
  48. data/lib/aspera/fasp/agent_direct.rb +48 -59
  49. data/lib/aspera/fasp/agent_httpgw.rb +33 -39
  50. data/lib/aspera/fasp/agent_node.rb +15 -13
  51. data/lib/aspera/fasp/agent_trsdk.rb +12 -14
  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 +106 -94
  55. data/lib/aspera/fasp/listener.rb +1 -0
  56. data/lib/aspera/fasp/parameters.rb +83 -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 -90
  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 +17 -16
  65. data/lib/aspera/keychain/macos_security.rb +6 -10
  66. data/lib/aspera/log.rb +25 -20
  67. data/lib/aspera/nagios.rb +13 -12
  68. data/lib/aspera/node.rb +30 -22
  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 +115 -113
  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 +64 -21
  90. data/docs/Makefile +0 -65
  91. data/docs/README.erb.md +0 -4424
  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/cli/plugins/shares2.rb +0 -114
  96. data/lib/aspera/fasp/default.rb +0 -17
@@ -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/fasp/default'
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::Fasp::Default::ACCESS_KEY_TRANSFER_USER)
77
- Log.log.info("Using default transfer user: #{Aspera::Fasp::Default::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,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'aspera/cli/plugins/node'
2
3
 
3
4
  module Aspera
@@ -6,70 +7,68 @@ module Aspera
6
7
  class Shares < BasicAuthPlugin
7
8
  class << self
8
9
  def detect(base_url)
9
- api=Rest.new({:base_url=>base_url})
10
+ api=Rest.new({base_url: base_url})
10
11
  # Shares
11
12
  begin
12
13
  # shall fail: shares requires auth, but we check error message
13
14
  api.read('node_api/app')
14
15
  rescue RestCallError => e
15
- if e.response.code.to_s.eql?('401') and e.response.body.eql?('{"error":{"user_message":"API user authentication failed"}}')
16
- return {:version=>'unknown'}
16
+ if e.response.code.to_s.eql?('401') && e.response.body.eql?('{"error":{"user_message":"API user authentication failed"}}')
17
+ return {version: 'unknown'}
17
18
  end
18
- rescue
19
19
  end
20
20
  nil
21
21
  end
22
22
  end
23
23
 
24
- def initialize(env)
25
- super(env)
26
- #self.options.parse_options!
27
- end
24
+ # def initialize(env)
25
+ # super(env)
26
+ # end
28
27
 
29
- ACTIONS=[ :repository,:admin ]
28
+ ACTIONS=[:repository,:admin]
30
29
 
31
30
  def execute_action
32
- command=self.options.get_next_command(ACTIONS)
31
+ command=options.get_next_command(ACTIONS)
33
32
  case command
34
33
  when :repository
35
34
  api_shares_node=basic_auth_api('node_api')
36
- command=self.options.get_next_command(Node::COMMON_ACTIONS)
35
+ command=options.get_next_command(Node::COMMON_ACTIONS)
37
36
  case command
38
- 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)
39
38
  else raise "INTERNAL ERROR, unknown command: [#{command}]"
40
39
  end
41
40
  when :admin
42
41
  api_shares_admin=basic_auth_api('api/v1')
43
- command=self.options.get_next_command([:user,:share])
42
+ command=options.get_next_command([:user,:share])
44
43
  case command
45
44
  when :user
46
- command=self.options.get_next_command([:list,:id])
45
+ command=options.get_next_command([:list,:id])
47
46
  case command
48
47
  when :list
49
- 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']}
50
49
  when :id
51
- res_id=self.options.get_next_argument('user id')
52
- 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])
53
52
  case command
54
53
  when :app_authorizations
55
- 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]}
56
55
  when :share
57
- share_name=self.options.get_next_argument('share name')
56
+ share_name=options.get_next_argument('share name')
58
57
  all_shares=api_shares_admin.read('data/shares')[:data]
59
58
  share_id=all_shares.select{|s| s['name'].eql?(share_name)}.first['id']
60
- 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]}
61
60
  end
62
61
  end
63
62
  when :share
64
- command=self.options.get_next_command([:list,:name])
63
+ command=options.get_next_command([:list,:name])
65
64
  all_shares=api_shares_admin.read('data/shares')[:data]
66
65
  case command
67
66
  when :list
68
- 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']}
69
68
  when :name
70
- share_name=self.options.get_next_argument('share name')
69
+ share_name=options.get_next_argument('share name')
71
70
  share_id=all_shares.select{|s| s['name'].eql?(share_name)}.first['id']
72
- raise "TODO"
71
+ raise "NOT IMPLEMENTED: #{share_name} #{share_id}"
73
72
  end
74
73
  end
75
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