aspera-cli 4.7.0 → 4.8.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
- checksums.yaml.gz.sig +1 -0
- data/README.md +844 -861
- data/bin/ascli +20 -1
- data/bin/asession +37 -34
- data/docs/test_env.conf +11 -3
- data/examples/aoc.rb +13 -12
- data/examples/dascli +26 -0
- data/examples/faspex4.rb +34 -29
- data/examples/transfer.rb +30 -29
- data/lib/aspera/aoc.rb +151 -143
- data/lib/aspera/ascmd.rb +56 -45
- data/lib/aspera/ats_api.rb +6 -5
- data/lib/aspera/cli/basic_auth_plugin.rb +18 -16
- data/lib/aspera/cli/extended_value.rb +32 -30
- data/lib/aspera/cli/formater.rb +103 -111
- data/lib/aspera/cli/info.rb +2 -1
- data/lib/aspera/cli/listener/line_dump.rb +1 -0
- data/lib/aspera/cli/listener/logger.rb +1 -0
- data/lib/aspera/cli/listener/progress.rb +13 -12
- data/lib/aspera/cli/listener/progress_multi.rb +21 -20
- data/lib/aspera/cli/main.rb +106 -89
- data/lib/aspera/cli/manager.rb +96 -85
- data/lib/aspera/cli/plugin.rb +50 -32
- data/lib/aspera/cli/plugins/alee.rb +6 -5
- data/lib/aspera/cli/plugins/aoc.rb +521 -426
- data/lib/aspera/cli/plugins/ats.rb +84 -83
- data/lib/aspera/cli/plugins/bss.rb +30 -27
- data/lib/aspera/cli/plugins/config.rb +483 -397
- data/lib/aspera/cli/plugins/console.rb +17 -15
- data/lib/aspera/cli/plugins/cos.rb +26 -35
- data/lib/aspera/cli/plugins/faspex.rb +201 -168
- data/lib/aspera/cli/plugins/faspex5.rb +109 -74
- data/lib/aspera/cli/plugins/node.rb +378 -189
- data/lib/aspera/cli/plugins/orchestrator.rb +71 -65
- data/lib/aspera/cli/plugins/preview.rb +131 -122
- data/lib/aspera/cli/plugins/server.rb +94 -93
- data/lib/aspera/cli/plugins/shares.rb +42 -28
- data/lib/aspera/cli/plugins/sync.rb +15 -14
- data/lib/aspera/cli/transfer_agent.rb +56 -52
- data/lib/aspera/cli/version.rb +2 -1
- data/lib/aspera/colors.rb +29 -28
- data/lib/aspera/command_line_builder.rb +50 -43
- data/lib/aspera/cos_node.rb +64 -38
- data/lib/aspera/data_repository.rb +1 -0
- data/lib/aspera/environment.rb +18 -8
- data/lib/aspera/fasp/agent_base.rb +26 -23
- data/lib/aspera/fasp/agent_connect.rb +35 -30
- data/lib/aspera/fasp/agent_direct.rb +68 -60
- data/lib/aspera/fasp/agent_httpgw.rb +71 -64
- data/lib/aspera/fasp/agent_node.rb +24 -23
- data/lib/aspera/fasp/agent_trsdk.rb +19 -20
- data/lib/aspera/fasp/error.rb +2 -1
- data/lib/aspera/fasp/error_info.rb +79 -68
- data/lib/aspera/fasp/installation.rb +122 -114
- data/lib/aspera/fasp/listener.rb +1 -0
- data/lib/aspera/fasp/parameters.rb +44 -41
- data/lib/aspera/fasp/resume_policy.rb +14 -11
- data/lib/aspera/fasp/transfer_spec.rb +6 -5
- data/lib/aspera/fasp/uri.rb +25 -24
- data/lib/aspera/faspex_gw.rb +83 -72
- data/lib/aspera/hash_ext.rb +10 -12
- data/lib/aspera/id_generator.rb +8 -7
- data/lib/aspera/keychain/encrypted_hash.rb +60 -45
- data/lib/aspera/keychain/macos_security.rb +26 -24
- data/lib/aspera/log.rb +34 -38
- data/lib/aspera/nagios.rb +14 -13
- data/lib/aspera/node.rb +19 -19
- data/lib/aspera/oauth.rb +121 -101
- data/lib/aspera/open_application.rb +6 -5
- data/lib/aspera/persistency_action_once.rb +9 -8
- data/lib/aspera/persistency_folder.rb +10 -9
- data/lib/aspera/preview/file_types.rb +261 -266
- data/lib/aspera/preview/generator.rb +74 -73
- data/lib/aspera/preview/image_error.png +0 -0
- data/lib/aspera/preview/options.rb +7 -6
- data/lib/aspera/preview/utils.rb +30 -33
- data/lib/aspera/preview/video_error.png +0 -0
- data/lib/aspera/proxy_auto_config.rb +25 -23
- data/lib/aspera/rest.rb +73 -74
- data/lib/aspera/rest_call_error.rb +1 -0
- data/lib/aspera/rest_error_analyzer.rb +11 -9
- data/lib/aspera/rest_errors_aspera.rb +5 -4
- data/lib/aspera/secret_hider.rb +68 -0
- data/lib/aspera/ssh.rb +12 -10
- data/lib/aspera/sync.rb +49 -47
- data/lib/aspera/temp_file_manager.rb +7 -5
- data/lib/aspera/timer_limiter.rb +9 -8
- data/lib/aspera/uri_reader.rb +11 -14
- data/lib/aspera/web_auth.rb +17 -15
- data.tar.gz.sig +0 -0
- metadata +117 -34
- metadata.gz.sig +2 -0
- data/bin/dascli +0 -13
data/lib/aspera/ascmd.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'aspera/log'
|
3
4
|
|
4
5
|
module Aspera
|
@@ -8,7 +9,7 @@ module Aspera
|
|
8
9
|
# Note: "ls" can take filters: as_ls -f *.txt -f *.bin /
|
9
10
|
class AsCmd
|
10
11
|
# list of supported actions
|
11
|
-
OPERATIONS=[
|
12
|
+
OPERATIONS = %i[ls rm mv du info mkdir cp df md5sum].freeze
|
12
13
|
|
13
14
|
# @param command_executor [Object] provides the "execute" method, taking a command to execute, and stdin to feed to it, typically: ssh or local
|
14
15
|
def initialize(command_executor)
|
@@ -21,37 +22,38 @@ module Aspera
|
|
21
22
|
# @return result of command, type depends on command (bool, array, hash)
|
22
23
|
def execute_single(action_sym,args=nil)
|
23
24
|
# concatenate arguments, enclose in double quotes, protect backslash and double quotes, add "as_" command and as_exit
|
24
|
-
stdin_input=(args||[]).map{|v| '"' + v.gsub(/["\\]/n) {|s| '\\' + s } + '"'}.unshift('as_'+action_sym.to_s).join(' ')+"\nas_exit\n"
|
25
|
+
stdin_input = (args || []).map{|v| '"' + v.gsub(/["\\]/n) {|s| '\\' + s } + '"'}.unshift('as_' + action_sym.to_s).join(' ') + "\nas_exit\n"
|
25
26
|
# execute, get binary output
|
26
|
-
bytebuffer
|
27
|
+
bytebuffer = @command_executor.execute('ascmd',stdin_input).unpack('C*')
|
27
28
|
# get hash or table result
|
28
|
-
result=self.class.parse(bytebuffer,:result)
|
29
|
+
result = self.class.parse(bytebuffer,:result)
|
29
30
|
raise 'ERROR: unparsed bytes remaining' unless bytebuffer.empty?
|
30
31
|
# get and delete info,always present in results
|
31
|
-
system_info=result[:info]
|
32
|
+
system_info = result[:info]
|
32
33
|
result.delete(:info)
|
33
34
|
# make single file result like a folder
|
34
|
-
if result.has_key?(:file);result[:dir]=[result[:file]];result.delete(:file);end
|
35
|
+
if result.has_key?(:file);result[:dir] = [result[:file]];result.delete(:file);end
|
35
36
|
# add type field for stats
|
36
37
|
if result.has_key?(:dir)
|
37
38
|
result[:dir].each do |file|
|
38
39
|
if file.has_key?(:smode)
|
39
40
|
# Converts the first character of the file mode (see 'man ls') into a type.
|
40
|
-
file[:type]=case file[:smode][0,1];when 'd' then:directory;when '-' then:file;when 'l' then:link;else;:other;end
|
41
|
+
file[:type] = case file[:smode][0,1];when 'd' then:directory;when '-' then:file;when 'l' then:link;else;:other;end
|
41
42
|
end
|
42
43
|
end
|
43
44
|
end
|
44
45
|
# for info, second overrides first, so restore it
|
45
|
-
case result.keys.length;when 0 then result=system_info;when 1 then result=result[result.keys.first];else raise 'error';end
|
46
|
+
case result.keys.length;when 0 then result = system_info;when 1 then result = result[result.keys.first];else raise 'error';end
|
46
47
|
# raise error as exception
|
47
|
-
raise Error.new(result[:errno],result[:errstr],action_sym,args) if
|
48
|
+
raise Error.new(result[:errno],result[:errstr],action_sym,args) if
|
49
|
+
result.is_a?(Hash) && (result.keys.sort == TYPES_DESCR[:error][:fields].map{|i|i[:name]}.sort)
|
48
50
|
return result
|
49
51
|
end # execute_single
|
50
52
|
|
51
53
|
# This exception is raised when +ascmd+ returns an error.
|
52
54
|
class Error < StandardError
|
53
55
|
attr_reader :errno, :errstr, :command, :args
|
54
|
-
def initialize(errno,errstr,cmd,args);super();@errno=errno;@errstr=errstr;@command=cmd;@args=args;end
|
56
|
+
def initialize(errno,errstr,cmd,args);super();@errno = errno;@errstr = errstr;@command = cmd;@args = args;end
|
55
57
|
|
56
58
|
def message; "ascmd: (#{errno}) #{errstr}"; end
|
57
59
|
|
@@ -60,22 +62,31 @@ module Aspera
|
|
60
62
|
|
61
63
|
# description of result structures (see ascmdtypes.h). Base types are big endian
|
62
64
|
# key = name of type
|
63
|
-
TYPES_DESCR={
|
65
|
+
TYPES_DESCR = {
|
64
66
|
result: {decode: :field_list,
|
65
|
-
fields: [{name: :file,is_a: :stat},{name: :dir,is_a: :stat,special: :substruct},{name: :size,is_a: :size},{name: :error,is_a: :error},
|
66
|
-
|
67
|
+
fields: [{name: :file,is_a: :stat},{name: :dir,is_a: :stat,special: :substruct},{name: :size,is_a: :size},{name: :error,is_a: :error},
|
68
|
+
{name: :info,is_a: :info},{name: :success,is_a: nil,special: :return_true},{name: :exit,is_a: nil},
|
69
|
+
{name: :df,is_a: :mnt,special: :restart_on_first},{name: :md5sum,is_a: :md5sum}]},
|
67
70
|
stat: {decode: :field_list,
|
68
|
-
fields: [{name: :name,is_a: :zstr},{name: :size,is_a: :int64},{name: :mode,is_a: :int32,check: nil},{name: :zmode,is_a: :zstr},
|
69
|
-
|
71
|
+
fields: [{name: :name,is_a: :zstr},{name: :size,is_a: :int64},{name: :mode,is_a: :int32,check: nil},{name: :zmode,is_a: :zstr},
|
72
|
+
{name: :uid,is_a: :int32,check: nil},{name: :zuid,is_a: :zstr},{name: :gid,is_a: :int32,check: nil},{name: :zgid,is_a: :zstr},
|
73
|
+
{name: :ctime,is_a: :epoch},{name: :zctime,is_a: :zstr},{name: :mtime,is_a: :epoch},{name: :zmtime,is_a: :zstr},
|
74
|
+
{name: :atime,is_a: :epoch},{name: :zatime,is_a: :zstr},{name: :symlink,is_a: :zstr},{name: :errno,is_a: :int32},
|
75
|
+
{name: :errstr,is_a: :zstr}]},
|
70
76
|
info: {decode: :field_list,
|
71
|
-
fields: [{name: :platform,is_a: :zstr},{name: :version,is_a: :zstr},{name: :lang,is_a: :zstr},{name: :territory,is_a: :zstr},
|
72
|
-
|
77
|
+
fields: [{name: :platform,is_a: :zstr},{name: :version,is_a: :zstr},{name: :lang,is_a: :zstr},{name: :territory,is_a: :zstr},
|
78
|
+
{name: :codeset,is_a: :zstr},{name: :lc_ctype,is_a: :zstr},{name: :lc_numeric,is_a: :zstr},{name: :lc_time,is_a: :zstr},
|
79
|
+
{name: :lc_all,is_a: :zstr},{name: :dev,is_a: :zstr,special: :multiple},{name: :browse_caps,is_a: :zstr},
|
80
|
+
{name: :protocol,is_a: :zstr}]},
|
73
81
|
size: {decode: :field_list,
|
74
|
-
fields: [{name: :size,is_a: :int64},{name: :fcount,is_a: :int32},{name: :dcount,is_a: :int32},{name: :failed_fcount,is_a: :int32},
|
75
|
-
|
82
|
+
fields: [{name: :size,is_a: :int64},{name: :fcount,is_a: :int32},{name: :dcount,is_a: :int32},{name: :failed_fcount,is_a: :int32},
|
83
|
+
{name: :failed_dcount,is_a: :int32}]},
|
84
|
+
error: {decode: :field_list,
|
85
|
+
fields: [{name: :errno,is_a: :int32},{name: :errstr,is_a: :zstr}]},
|
76
86
|
mnt: {decode: :field_list,
|
77
|
-
fields: [{name: :fs,is_a: :zstr},{name: :dir,is_a: :zstr},{name: :is_a,is_a: :zstr},{name: :total,is_a: :int64},
|
78
|
-
|
87
|
+
fields: [{name: :fs,is_a: :zstr},{name: :dir,is_a: :zstr},{name: :is_a,is_a: :zstr},{name: :total,is_a: :int64},
|
88
|
+
{name: :used,is_a: :int64},{name: :free,is_a: :int64},{name: :fcount,is_a: :int64},{name: :errno,is_a: :int32},
|
89
|
+
{name: :errstr,is_a: :zstr}]},
|
79
90
|
md5sum: {decode: :field_list,fields: [{name: :md5sum,is_a: :zstr}]},
|
80
91
|
int8: {decode: :base,unpack: 'C',size: 1},
|
81
92
|
int32: {decode: :base,unpack: 'L>',size: 4},
|
@@ -86,14 +97,14 @@ fields: [{name: :fs,is_a: :zstr},{name: :dir,is_a: :zstr},{name: :is_a,is_a: :zs
|
|
86
97
|
}.freeze
|
87
98
|
|
88
99
|
# protocol enum start at one, but array index start at zero
|
89
|
-
ENUM_START=1
|
100
|
+
ENUM_START = 1
|
90
101
|
|
91
102
|
private_constant :TYPES_DESCR,:ENUM_START
|
92
103
|
|
93
104
|
class << self
|
94
105
|
# get description of structure's field, @param struct_name, @param typed_buffer provides field name
|
95
106
|
def field_description(struct_name,typed_buffer)
|
96
|
-
result=TYPES_DESCR[struct_name][:fields][typed_buffer[:btype]-ENUM_START]
|
107
|
+
result = TYPES_DESCR[struct_name][:fields][typed_buffer[:btype] - ENUM_START]
|
97
108
|
raise "Unrecognized field for #{struct_name}: #{typed_buffer[:btype]}\n#{typed_buffer[:buffer]}" if result.nil?
|
98
109
|
return result
|
99
110
|
end
|
@@ -102,28 +113,28 @@ fields: [{name: :fs,is_a: :zstr},{name: :dir,is_a: :zstr},{name: :is_a,is_a: :zs
|
|
102
113
|
# @return a decoded type.
|
103
114
|
# :base : value, :buffer_list : an array of {btype,buffer}, :field_list : a hash, or array
|
104
115
|
def parse(buffer,type_name,indent_level=nil)
|
105
|
-
indent_level=(indent_level
|
106
|
-
type_descr=TYPES_DESCR[type_name]
|
116
|
+
indent_level = (indent_level || -1) + 1
|
117
|
+
type_descr = TYPES_DESCR[type_name]
|
107
118
|
raise "Unexpected type #{type_name}" if type_descr.nil?
|
108
|
-
Log.log.debug("#{' .'*indent_level}parse:#{type_name}:#{type_descr[:decode]}:#{buffer[0,16]}...".red)
|
109
|
-
result=nil
|
119
|
+
Log.log.debug("#{' .' * indent_level}parse:#{type_name}:#{type_descr[:decode]}:#{buffer[0,16]}...".red)
|
120
|
+
result = nil
|
110
121
|
case type_descr[:decode]
|
111
122
|
when :base
|
112
|
-
num_bytes=type_name.eql?(:zstr) ? buffer.length : type_descr[:size]
|
123
|
+
num_bytes = type_name.eql?(:zstr) ? buffer.length : type_descr[:size]
|
113
124
|
raise 'ERROR:not enough bytes' if buffer.length < num_bytes
|
114
|
-
byte_array=buffer.shift(num_bytes);byte_array=[byte_array] unless byte_array.is_a?(Array)
|
115
|
-
result=byte_array.pack('C*').unpack1(type_descr[:unpack])
|
116
|
-
Log.log.debug("#{' .'*indent_level}-> base:#{byte_array} -> #{result}")
|
117
|
-
result=Time.at(result) if type_name.eql?(:epoch)
|
125
|
+
byte_array = buffer.shift(num_bytes);byte_array = [byte_array] unless byte_array.is_a?(Array)
|
126
|
+
result = byte_array.pack('C*').unpack1(type_descr[:unpack])
|
127
|
+
Log.log.debug("#{' .' * indent_level}-> base:#{byte_array} -> #{result}")
|
128
|
+
result = Time.at(result) if type_name.eql?(:epoch)
|
118
129
|
when :buffer_list
|
119
130
|
result = []
|
120
131
|
while !buffer.empty?
|
121
|
-
btype=parse(buffer,:int8,indent_level)
|
122
|
-
length=parse(buffer,:int32,indent_level)
|
132
|
+
btype = parse(buffer,:int8,indent_level)
|
133
|
+
length = parse(buffer,:int32,indent_level)
|
123
134
|
raise 'ERROR:not enough bytes' if buffer.length < length
|
124
|
-
value=buffer.shift(length)
|
135
|
+
value = buffer.shift(length)
|
125
136
|
result.push({btype: btype,buffer: value})
|
126
|
-
Log.log.debug("#{' .'*indent_level}:buffer_list[#{result.length-1}] #{result.last}")
|
137
|
+
Log.log.debug("#{' .' * indent_level}:buffer_list[#{result.length - 1}] #{result.last}")
|
127
138
|
end
|
128
139
|
when :field_list
|
129
140
|
# by default the result is one struct
|
@@ -131,24 +142,24 @@ fields: [{name: :fs,is_a: :zstr},{name: :dir,is_a: :zstr},{name: :is_a,is_a: :zs
|
|
131
142
|
# get individual binary fields
|
132
143
|
parse(buffer,:blist,indent_level).each do |typed_buffer|
|
133
144
|
# what type of field is it ?
|
134
|
-
field_info=field_description(type_name,typed_buffer)
|
135
|
-
Log.log.debug("#{' .'*indent_level}+ field(special=#{field_info[:special]})=#{field_info[:name]}".green)
|
145
|
+
field_info = field_description(type_name,typed_buffer)
|
146
|
+
Log.log.debug("#{' .' * indent_level}+ field(special=#{field_info[:special]})=#{field_info[:name]}".green)
|
136
147
|
case field_info[:special]
|
137
148
|
when nil
|
138
|
-
result[field_info[:name]]=parse(typed_buffer[:buffer],field_info[:is_a],indent_level)
|
149
|
+
result[field_info[:name]] = parse(typed_buffer[:buffer],field_info[:is_a],indent_level)
|
139
150
|
when :return_true
|
140
|
-
result[field_info[:name]]=true
|
151
|
+
result[field_info[:name]] = true
|
141
152
|
when :substruct
|
142
|
-
result[field_info[:name]]=parse(typed_buffer[:buffer],:blist,indent_level).map{|r|parse(r[:buffer],field_info[:is_a],indent_level)}
|
153
|
+
result[field_info[:name]] = parse(typed_buffer[:buffer],:blist,indent_level).map{|r|parse(r[:buffer],field_info[:is_a],indent_level)}
|
143
154
|
when :multiple
|
144
|
-
result[field_info[:name]]||=[]
|
155
|
+
result[field_info[:name]] ||= []
|
145
156
|
result[field_info[:name]].push(parse(typed_buffer[:buffer],field_info[:is_a],indent_level))
|
146
157
|
when :restart_on_first
|
147
|
-
fl=result[field_info[:name]]=[]
|
158
|
+
fl = result[field_info[:name]] = []
|
148
159
|
parse(typed_buffer[:buffer],:blist,indent_level).map do |tb|
|
149
160
|
fl.push({}) if tb[:btype].eql?(ENUM_START)
|
150
|
-
fi=field_description(field_info[:is_a],tb)
|
151
|
-
fl.last[fi[:name]]=parse(tb[:buffer],fi[:is_a],indent_level)
|
161
|
+
fi = field_description(field_info[:is_a],tb)
|
162
|
+
fl.last[fi[:name]] = parse(tb[:buffer],fi[:is_a],indent_level)
|
152
163
|
end
|
153
164
|
end
|
154
165
|
end
|
data/lib/aspera/ats_api.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'aspera/log'
|
3
4
|
require 'aspera/rest'
|
4
5
|
|
@@ -6,23 +7,23 @@ module Aspera
|
|
6
7
|
class AtsApi < Rest
|
7
8
|
# currently supported clouds
|
8
9
|
# Note to Aspera: shall be an API call
|
9
|
-
CLOUD_NAME={
|
10
|
+
CLOUD_NAME = {
|
10
11
|
aws: 'Amazon Web Services',
|
11
12
|
azure: 'Microsoft Azure',
|
12
13
|
google: 'Google Cloud',
|
13
14
|
limelight: 'Limelight',
|
14
15
|
rackspace: 'Rackspace',
|
15
16
|
softlayer: 'IBM Cloud'
|
16
|
-
}
|
17
|
+
}.freeze
|
17
18
|
|
18
19
|
private_constant :CLOUD_NAME
|
19
20
|
|
20
21
|
def self.base_url;'https://ats.aspera.io';end
|
21
22
|
|
22
23
|
def initialize
|
23
|
-
super({base_url: AtsApi.base_url+'/pub/v1'})
|
24
|
+
super({base_url: AtsApi.base_url + '/pub/v1'})
|
24
25
|
# cache of server data
|
25
|
-
@all_servers_cache=nil
|
26
|
+
@all_servers_cache = nil
|
26
27
|
end
|
27
28
|
|
28
29
|
def cloud_names;CLOUD_NAME;end
|
@@ -31,7 +32,7 @@ module Aspera
|
|
31
32
|
# NOTE to Aspera: an API shall be created to retrieve all servers at once
|
32
33
|
def all_servers
|
33
34
|
if @all_servers_cache.nil?
|
34
|
-
@all_servers_cache=[]
|
35
|
+
@all_servers_cache = []
|
35
36
|
CLOUD_NAME.keys.each do |name|
|
36
37
|
read("servers/#{name.to_s.upcase}")[:data].each do |i|
|
37
38
|
@all_servers_cache.push(i)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'aspera/rest'
|
3
4
|
require 'aspera/cli/plugin'
|
4
5
|
|
@@ -6,30 +7,31 @@ module Aspera
|
|
6
7
|
module Cli
|
7
8
|
# base class for applications supporting basic authentication
|
8
9
|
class BasicAuthPlugin < Plugin
|
10
|
+
class << self
|
11
|
+
def register_options(env)
|
12
|
+
env[:options].add_opt_simple(:url,'URL of application, e.g. https://org.asperafiles.com')
|
13
|
+
env[:options].add_opt_simple(:username,'username to log in')
|
14
|
+
env[:options].add_opt_simple(:password,"user's password")
|
15
|
+
env[:options].parse_options!
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
9
19
|
def initialize(env)
|
10
20
|
super(env)
|
11
21
|
return if env[:skip_basic_auth_options]
|
12
|
-
|
13
|
-
options.add_opt_simple(:username,'username to log in')
|
14
|
-
options.add_opt_simple(:password,"user's password")
|
15
|
-
options.parse_options!
|
16
|
-
end
|
17
|
-
ACTIONS=[]
|
18
|
-
|
19
|
-
def execute_action
|
20
|
-
raise 'do not execute action on this generic plugin'
|
22
|
+
self.class.register_options(env)
|
21
23
|
end
|
22
24
|
|
23
25
|
# returns a Rest object with basic auth
|
24
26
|
def basic_auth_api(subpath=nil)
|
25
|
-
api_url=options.get_option(:url
|
26
|
-
api_url=api_url+'/'+subpath unless subpath.nil?
|
27
|
+
api_url = options.get_option(:url,is_type: :mandatory)
|
28
|
+
api_url = api_url + '/' + subpath unless subpath.nil?
|
27
29
|
return Rest.new({
|
28
|
-
base_url:
|
29
|
-
auth:
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
base_url: api_url,
|
31
|
+
auth: {
|
32
|
+
type: :basic,
|
33
|
+
username: options.get_option(:username,is_type: :mandatory),
|
34
|
+
password: options.get_option(:password,is_type: :mandatory)
|
33
35
|
}})
|
34
36
|
end
|
35
37
|
end # BasicAuthPlugin
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'aspera/cli/plugins/config'
|
3
4
|
require 'aspera/uri_reader'
|
5
|
+
require 'aspera/environment'
|
4
6
|
require 'json'
|
5
7
|
require 'base64'
|
6
8
|
require 'zlib'
|
@@ -13,18 +15,18 @@ module Aspera
|
|
13
15
|
class ExtendedValue
|
14
16
|
include Singleton
|
15
17
|
|
16
|
-
class<<self
|
18
|
+
class << self
|
17
19
|
# decode comma separated table text
|
18
|
-
def
|
19
|
-
col_titles=nil
|
20
|
-
hasharray=[]
|
20
|
+
def decode_csvt(value)
|
21
|
+
col_titles = nil
|
22
|
+
hasharray = []
|
21
23
|
CSV.parse(value).each do |values|
|
22
24
|
next if values.empty?
|
23
25
|
if col_titles.nil?
|
24
|
-
col_titles=values
|
26
|
+
col_titles = values
|
25
27
|
else
|
26
|
-
entry={}
|
27
|
-
col_titles.each{|title|entry[title]=values.shift}
|
28
|
+
entry = {}
|
29
|
+
col_titles.each{|title|entry[title] = values.shift}
|
28
30
|
hasharray.push(entry)
|
29
31
|
end
|
30
32
|
end
|
@@ -35,23 +37,23 @@ module Aspera
|
|
35
37
|
private
|
36
38
|
|
37
39
|
def initialize
|
38
|
-
@handlers={
|
40
|
+
@handlers = {
|
39
41
|
decoder: {
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
42
|
+
base64: lambda{|v|Base64.decode64(v)},
|
43
|
+
json: lambda{|v|JSON.parse(v)},
|
44
|
+
zlib: lambda{|v|Zlib::Inflate.inflate(v)},
|
45
|
+
ruby: lambda{|v|Environment.secure_eval(v)},
|
46
|
+
csvt: lambda{|v|ExtendedValue.decode_csvt(v)},
|
47
|
+
lines: lambda{|v|v.split("\n")},
|
48
|
+
list: lambda{|v|v[1..-1].split(v[0])}
|
47
49
|
},
|
48
|
-
reader:
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
50
|
+
reader: {
|
51
|
+
val: lambda{|v|v},
|
52
|
+
file: lambda{|v|File.read(File.expand_path(v))},
|
53
|
+
path: lambda{|v|File.expand_path(v)},
|
54
|
+
env: lambda{|v|ENV[v]},
|
55
|
+
uri: lambda{|v|UriReader.read(v)},
|
56
|
+
stdin: lambda{|v|raise 'no value allowed for stdin' unless v.empty?;$stdin.read}
|
55
57
|
}
|
56
58
|
# other handlers can be set using set_handler, e.g. preset is reader in config plugin
|
57
59
|
}
|
@@ -66,8 +68,8 @@ module Aspera
|
|
66
68
|
def set_handler(name,type,method)
|
67
69
|
Log.log.debug("setting #{type} handler for #{name}")
|
68
70
|
raise 'name must be Symbol' unless name.is_a?(Symbol)
|
69
|
-
raise "type #{type} must be one of #{@handlers.keys}" unless @handlers.
|
70
|
-
@handlers[type][name]=method
|
71
|
+
raise "type #{type} must be one of #{@handlers.keys}" unless @handlers.key?(type)
|
72
|
+
@handlers[type][name] = method
|
71
73
|
end
|
72
74
|
|
73
75
|
# parse an option value if it is a String using supported extended value modifiers
|
@@ -75,20 +77,20 @@ module Aspera
|
|
75
77
|
def evaluate(value)
|
76
78
|
return value if !value.is_a?(String)
|
77
79
|
# first determine decoders, in reversed order
|
78
|
-
decoders_reversed=[]
|
79
|
-
while (m=value.match(/^@([^:]+):(.*)/)) && @handlers[:decoder].include?(m[1].to_sym)
|
80
|
+
decoders_reversed = []
|
81
|
+
while (m = value.match(/^@([^:]+):(.*)/)) && @handlers[:decoder].include?(m[1].to_sym)
|
80
82
|
decoders_reversed.unshift(m[1].to_sym)
|
81
|
-
value=m[2]
|
83
|
+
value = m[2]
|
82
84
|
end
|
83
85
|
# then read value
|
84
86
|
@handlers[:reader].each do |reader,method|
|
85
|
-
if (m=value.match(/^@#{reader}:(.*)/))
|
86
|
-
value=method.call(m[1])
|
87
|
+
if (m = value.match(/^@#{reader}:(.*)/))
|
88
|
+
value = method.call(m[1])
|
87
89
|
break
|
88
90
|
end
|
89
91
|
end
|
90
92
|
decoders_reversed.each do |decoder|
|
91
|
-
value
|
93
|
+
value = @handlers[:decoder][decoder].call(value)
|
92
94
|
end
|
93
95
|
return value
|
94
96
|
end # parse
|