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.
- checksums.yaml +4 -4
- data/README.md +2095 -1503
- data/bin/ascli +2 -1
- data/bin/asession +4 -5
- data/docs/test_env.conf +3 -0
- data/examples/aoc.rb +4 -3
- data/examples/faspex4.rb +25 -25
- data/examples/proxy.pac +1 -1
- data/examples/transfer.rb +17 -17
- data/lib/aspera/aoc.rb +238 -185
- data/lib/aspera/ascmd.rb +93 -83
- 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 +142 -108
- 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 +18 -21
- data/lib/aspera/cli/main.rb +173 -149
- data/lib/aspera/cli/manager.rb +163 -168
- data/lib/aspera/cli/plugin.rb +43 -31
- data/lib/aspera/cli/plugins/alee.rb +6 -6
- data/lib/aspera/cli/plugins/aoc.rb +405 -370
- data/lib/aspera/cli/plugins/ats.rb +86 -79
- data/lib/aspera/cli/plugins/bss.rb +14 -16
- data/lib/aspera/cli/plugins/config.rb +580 -362
- 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 +201 -158
- data/lib/aspera/cli/plugins/faspex5.rb +80 -57
- data/lib/aspera/cli/plugins/node.rb +183 -166
- data/lib/aspera/cli/plugins/orchestrator.rb +71 -67
- 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 +35 -19
- data/lib/aspera/cli/plugins/sync.rb +20 -22
- data/lib/aspera/cli/transfer_agent.rb +76 -113
- 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/{manager.rb → agent_base.rb} +28 -25
- data/lib/aspera/fasp/{connect.rb → agent_connect.rb} +52 -43
- data/lib/aspera/fasp/{local.rb → agent_direct.rb} +58 -72
- data/lib/aspera/fasp/{http_gw.rb → agent_httpgw.rb} +37 -43
- data/lib/aspera/fasp/{node.rb → agent_node.rb} +35 -16
- data/lib/aspera/fasp/agent_trsdk.rb +104 -0
- data/lib/aspera/fasp/error.rb +2 -1
- data/lib/aspera/fasp/error_info.rb +68 -52
- data/lib/aspera/fasp/installation.rb +152 -124
- data/lib/aspera/fasp/listener.rb +1 -0
- data/lib/aspera/fasp/parameters.rb +87 -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 -89
- data/lib/aspera/hash_ext.rb +4 -3
- data/lib/aspera/id_generator.rb +8 -7
- data/lib/aspera/keychain/encrypted_hash.rb +121 -0
- data/lib/aspera/keychain/macos_security.rb +90 -0
- data/lib/aspera/log.rb +55 -37
- data/lib/aspera/nagios.rb +13 -12
- data/lib/aspera/node.rb +30 -25
- 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 +154 -135
- 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 +116 -29
- data/docs/Makefile +0 -66
- data/docs/README.erb.md +0 -3973
- data/docs/README.md +0 -13
- data/docs/diagrams.txt +0 -49
- data/docs/doc_tools.rb +0 -58
- data/lib/aspera/api_detector.rb +0 -60
- data/lib/aspera/cli/plugins/shares2.rb +0 -114
- 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/
|
|
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,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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
24
|
+
# def initialize(env)
|
|
25
|
+
# super(env)
|
|
26
|
+
# end
|
|
27
|
+
|
|
28
|
+
ACTIONS=[:repository,:admin]
|
|
13
29
|
|
|
14
30
|
def execute_action
|
|
15
|
-
command=
|
|
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=
|
|
35
|
+
command=options.get_next_command(Node::COMMON_ACTIONS)
|
|
20
36
|
case command
|
|
21
|
-
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)
|
|
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=
|
|
42
|
+
command=options.get_next_command([:user,:share])
|
|
27
43
|
case command
|
|
28
44
|
when :user
|
|
29
|
-
command=
|
|
45
|
+
command=options.get_next_command([:list,:id])
|
|
30
46
|
case command
|
|
31
47
|
when :list
|
|
32
|
-
return {:
|
|
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=
|
|
35
|
-
command=
|
|
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 {:
|
|
54
|
+
return {type: :single_object,data: api_shares_admin.read("data/users/#{res_id}/app_authorizations")[:data]}
|
|
39
55
|
when :share
|
|
40
|
-
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 {:
|
|
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=
|
|
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 {:
|
|
67
|
+
return {type: :object_list,data: all_shares,fields: ['id','name','status','status_message']}
|
|
52
68
|
when :name
|
|
53
|
-
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 "
|
|
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
|
-
|
|
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
|