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.
- checksums.yaml +4 -4
- data/README.md +427 -300
- data/bin/ascli +2 -1
- data/bin/asession +1 -0
- data/docs/test_env.conf +2 -0
- data/examples/aoc.rb +4 -3
- data/examples/faspex4.rb +21 -19
- data/examples/proxy.pac +1 -1
- data/examples/transfer.rb +15 -15
- data/lib/aspera/aoc.rb +135 -124
- data/lib/aspera/ascmd.rb +85 -75
- data/lib/aspera/ats_api.rb +11 -10
- data/lib/aspera/cli/basic_auth_plugin.rb +13 -14
- data/lib/aspera/cli/extended_value.rb +42 -33
- data/lib/aspera/cli/formater.rb +138 -111
- data/lib/aspera/cli/info.rb +17 -0
- data/lib/aspera/cli/listener/line_dump.rb +3 -2
- data/lib/aspera/cli/listener/logger.rb +2 -1
- data/lib/aspera/cli/listener/progress.rb +16 -18
- data/lib/aspera/cli/listener/progress_multi.rb +13 -16
- data/lib/aspera/cli/main.rb +122 -130
- data/lib/aspera/cli/manager.rb +146 -154
- data/lib/aspera/cli/plugin.rb +38 -34
- data/lib/aspera/cli/plugins/alee.rb +6 -6
- data/lib/aspera/cli/plugins/aoc.rb +273 -276
- data/lib/aspera/cli/plugins/ats.rb +82 -76
- data/lib/aspera/cli/plugins/bss.rb +14 -16
- data/lib/aspera/cli/plugins/config.rb +350 -306
- data/lib/aspera/cli/plugins/console.rb +23 -19
- data/lib/aspera/cli/plugins/cos.rb +18 -18
- data/lib/aspera/cli/plugins/faspex.rb +180 -159
- data/lib/aspera/cli/plugins/faspex5.rb +64 -54
- data/lib/aspera/cli/plugins/node.rb +147 -140
- data/lib/aspera/cli/plugins/orchestrator.rb +68 -66
- data/lib/aspera/cli/plugins/preview.rb +92 -96
- data/lib/aspera/cli/plugins/server.rb +79 -75
- data/lib/aspera/cli/plugins/shares.rb +23 -24
- data/lib/aspera/cli/plugins/sync.rb +20 -22
- data/lib/aspera/cli/transfer_agent.rb +40 -39
- data/lib/aspera/cli/version.rb +2 -1
- data/lib/aspera/colors.rb +35 -27
- data/lib/aspera/command_line_builder.rb +48 -34
- data/lib/aspera/cos_node.rb +29 -21
- data/lib/aspera/data_repository.rb +3 -2
- data/lib/aspera/environment.rb +50 -45
- data/lib/aspera/fasp/agent_base.rb +22 -20
- data/lib/aspera/fasp/agent_connect.rb +13 -11
- data/lib/aspera/fasp/agent_direct.rb +48 -59
- data/lib/aspera/fasp/agent_httpgw.rb +33 -39
- data/lib/aspera/fasp/agent_node.rb +15 -13
- data/lib/aspera/fasp/agent_trsdk.rb +12 -14
- data/lib/aspera/fasp/error.rb +2 -1
- data/lib/aspera/fasp/error_info.rb +68 -52
- data/lib/aspera/fasp/installation.rb +106 -94
- data/lib/aspera/fasp/listener.rb +1 -0
- data/lib/aspera/fasp/parameters.rb +83 -92
- data/lib/aspera/fasp/parameters.yaml +305 -249
- data/lib/aspera/fasp/resume_policy.rb +11 -14
- data/lib/aspera/fasp/transfer_spec.rb +26 -0
- data/lib/aspera/fasp/uri.rb +22 -21
- data/lib/aspera/faspex_gw.rb +55 -90
- data/lib/aspera/hash_ext.rb +4 -3
- data/lib/aspera/id_generator.rb +8 -7
- data/lib/aspera/keychain/encrypted_hash.rb +17 -16
- data/lib/aspera/keychain/macos_security.rb +6 -10
- data/lib/aspera/log.rb +25 -20
- data/lib/aspera/nagios.rb +13 -12
- data/lib/aspera/node.rb +30 -22
- data/lib/aspera/oauth.rb +175 -226
- data/lib/aspera/open_application.rb +4 -3
- data/lib/aspera/persistency_action_once.rb +6 -6
- data/lib/aspera/persistency_folder.rb +5 -9
- data/lib/aspera/preview/file_types.rb +6 -5
- data/lib/aspera/preview/generator.rb +25 -24
- data/lib/aspera/preview/options.rb +16 -14
- data/lib/aspera/preview/utils.rb +98 -98
- data/lib/aspera/{proxy_auto_config.erb.js → proxy_auto_config.js} +23 -31
- data/lib/aspera/proxy_auto_config.rb +111 -20
- data/lib/aspera/rest.rb +115 -113
- data/lib/aspera/rest_call_error.rb +2 -2
- data/lib/aspera/rest_error_analyzer.rb +23 -25
- data/lib/aspera/rest_errors_aspera.rb +15 -14
- data/lib/aspera/ssh.rb +12 -10
- data/lib/aspera/sync.rb +42 -41
- data/lib/aspera/temp_file_manager.rb +18 -14
- data/lib/aspera/timer_limiter.rb +2 -1
- data/lib/aspera/uri_reader.rb +7 -5
- data/lib/aspera/web_auth.rb +79 -76
- metadata +64 -21
- data/docs/Makefile +0 -65
- data/docs/README.erb.md +0 -4424
- data/docs/README.md +0 -13
- data/docs/diagrams.txt +0 -49
- data/docs/doc_tools.rb +0 -58
- data/lib/aspera/cli/plugins/shares2.rb +0 -114
- 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/
|
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,
|
15
|
-
|
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
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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.
|
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
|
-
|
40
|
-
|
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
|
-
|
46
|
-
next unless
|
47
|
-
|
48
|
+
items=line.split(r)
|
49
|
+
next unless items.length.eql?(2)
|
50
|
+
state={'process'=>items.first,'state'=>items.last}
|
48
51
|
# console
|
49
|
-
|
52
|
+
state['state'].gsub!(/\.+$/,'')
|
50
53
|
# console
|
51
|
-
|
54
|
+
state['process'].gsub!(/^.+::/,'')
|
52
55
|
# faspex
|
53
|
-
|
56
|
+
state['process'].gsub!(/^Faspex /,'')
|
54
57
|
# faspex
|
55
|
-
|
56
|
-
|
58
|
+
state['process'].gsub!(/ Background/,'')
|
59
|
+
state['process'].gsub!(/serving orchestrator on port /,'')
|
57
60
|
# console
|
58
|
-
r=/\s+/ if
|
61
|
+
r=/\s+/ if state['process'].eql?('Console')
|
59
62
|
# orchestrator
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
end
|
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(
|
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 '
|
75
|
-
|
76
|
-
|
77
|
-
|
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']=
|
80
|
-
ssh_options=
|
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=
|
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=
|
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)
|
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
|
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=
|
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=
|
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(
|
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=
|
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.
|
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=
|
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
|
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=
|
182
|
+
prefix=options.get_option(:cmd_prefix,:optional)
|
180
183
|
if !prefix.nil?
|
181
184
|
realcmd="#{prefix}#{realcmd}"
|
182
185
|
end
|
183
|
-
args =
|
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 {:
|
190
|
+
return {type: :object_list,data: asctl_parse(result)}
|
188
191
|
when :configurator
|
189
192
|
lines=result.split("\n")
|
190
|
-
|
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(
|
197
|
-
data=line.split(',').map{|i|i.gsub(/^"/,'').gsub(/"$/,'')}.map{|i|case i;when'AS_NULL'
|
198
|
-
Log.log.debug(
|
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 {:
|
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(
|
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(
|
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=
|
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
|
224
|
-
when :mv
|
225
|
-
when :cp
|
226
|
-
when :rm
|
227
|
-
when :ls
|
228
|
-
when :info
|
229
|
-
when :df
|
230
|
-
when :du
|
231
|
-
when :md5sum
|
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
|
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
|
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')
|
16
|
-
return {:
|
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
|
-
|
27
|
-
end
|
24
|
+
# def initialize(env)
|
25
|
+
# super(env)
|
26
|
+
# end
|
28
27
|
|
29
|
-
ACTIONS=[
|
28
|
+
ACTIONS=[:repository,:admin]
|
30
29
|
|
31
30
|
def execute_action
|
32
|
-
command=
|
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=
|
35
|
+
command=options.get_next_command(Node::COMMON_ACTIONS)
|
37
36
|
case command
|
38
|
-
when *Node::COMMON_ACTIONS
|
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=
|
42
|
+
command=options.get_next_command([:user,:share])
|
44
43
|
case command
|
45
44
|
when :user
|
46
|
-
command=
|
45
|
+
command=options.get_next_command([:list,:id])
|
47
46
|
case command
|
48
47
|
when :list
|
49
|
-
return {:
|
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=
|
52
|
-
command=
|
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 {:
|
54
|
+
return {type: :single_object,data: api_shares_admin.read("data/users/#{res_id}/app_authorizations")[:data]}
|
56
55
|
when :share
|
57
|
-
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 {:
|
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=
|
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 {:
|
67
|
+
return {type: :object_list,data: all_shares,fields: ['id','name','status','status_message']}
|
69
68
|
when :name
|
70
|
-
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 "
|
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
|
-
|
14
|
-
|
15
|
-
|
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=[
|
20
|
+
ACTIONS=[:start, :admin]
|
19
21
|
|
20
22
|
def execute_action
|
21
|
-
command=
|
23
|
+
command=options.get_next_command(ACTIONS)
|
22
24
|
case command
|
23
25
|
when :start
|
24
|
-
env_args=Aspera::Sync.new(
|
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
|
31
|
-
when false
|
32
|
-
when nil
|
33
|
-
else raise
|
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=
|
37
|
-
n=
|
38
|
+
p=options.get_option(:parameters,:mandatory)
|
39
|
+
n=options.get_option(:session_name,:optional)
|
38
40
|
cmdline=['asyncadmin','--quiet']
|
39
|
-
|
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=
|
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").
|
56
|
-
return {:
|
57
|
-
else raise
|
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
|
57
|
+
else raise 'error'
|
60
58
|
end # command
|
61
59
|
end # execute_action
|
62
60
|
end # Sync
|