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.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -0
  3. data/README.md +844 -861
  4. data/bin/ascli +20 -1
  5. data/bin/asession +37 -34
  6. data/docs/test_env.conf +11 -3
  7. data/examples/aoc.rb +13 -12
  8. data/examples/dascli +26 -0
  9. data/examples/faspex4.rb +34 -29
  10. data/examples/transfer.rb +30 -29
  11. data/lib/aspera/aoc.rb +151 -143
  12. data/lib/aspera/ascmd.rb +56 -45
  13. data/lib/aspera/ats_api.rb +6 -5
  14. data/lib/aspera/cli/basic_auth_plugin.rb +18 -16
  15. data/lib/aspera/cli/extended_value.rb +32 -30
  16. data/lib/aspera/cli/formater.rb +103 -111
  17. data/lib/aspera/cli/info.rb +2 -1
  18. data/lib/aspera/cli/listener/line_dump.rb +1 -0
  19. data/lib/aspera/cli/listener/logger.rb +1 -0
  20. data/lib/aspera/cli/listener/progress.rb +13 -12
  21. data/lib/aspera/cli/listener/progress_multi.rb +21 -20
  22. data/lib/aspera/cli/main.rb +106 -89
  23. data/lib/aspera/cli/manager.rb +96 -85
  24. data/lib/aspera/cli/plugin.rb +50 -32
  25. data/lib/aspera/cli/plugins/alee.rb +6 -5
  26. data/lib/aspera/cli/plugins/aoc.rb +521 -426
  27. data/lib/aspera/cli/plugins/ats.rb +84 -83
  28. data/lib/aspera/cli/plugins/bss.rb +30 -27
  29. data/lib/aspera/cli/plugins/config.rb +483 -397
  30. data/lib/aspera/cli/plugins/console.rb +17 -15
  31. data/lib/aspera/cli/plugins/cos.rb +26 -35
  32. data/lib/aspera/cli/plugins/faspex.rb +201 -168
  33. data/lib/aspera/cli/plugins/faspex5.rb +109 -74
  34. data/lib/aspera/cli/plugins/node.rb +378 -189
  35. data/lib/aspera/cli/plugins/orchestrator.rb +71 -65
  36. data/lib/aspera/cli/plugins/preview.rb +131 -122
  37. data/lib/aspera/cli/plugins/server.rb +94 -93
  38. data/lib/aspera/cli/plugins/shares.rb +42 -28
  39. data/lib/aspera/cli/plugins/sync.rb +15 -14
  40. data/lib/aspera/cli/transfer_agent.rb +56 -52
  41. data/lib/aspera/cli/version.rb +2 -1
  42. data/lib/aspera/colors.rb +29 -28
  43. data/lib/aspera/command_line_builder.rb +50 -43
  44. data/lib/aspera/cos_node.rb +64 -38
  45. data/lib/aspera/data_repository.rb +1 -0
  46. data/lib/aspera/environment.rb +18 -8
  47. data/lib/aspera/fasp/agent_base.rb +26 -23
  48. data/lib/aspera/fasp/agent_connect.rb +35 -30
  49. data/lib/aspera/fasp/agent_direct.rb +68 -60
  50. data/lib/aspera/fasp/agent_httpgw.rb +71 -64
  51. data/lib/aspera/fasp/agent_node.rb +24 -23
  52. data/lib/aspera/fasp/agent_trsdk.rb +19 -20
  53. data/lib/aspera/fasp/error.rb +2 -1
  54. data/lib/aspera/fasp/error_info.rb +79 -68
  55. data/lib/aspera/fasp/installation.rb +122 -114
  56. data/lib/aspera/fasp/listener.rb +1 -0
  57. data/lib/aspera/fasp/parameters.rb +44 -41
  58. data/lib/aspera/fasp/resume_policy.rb +14 -11
  59. data/lib/aspera/fasp/transfer_spec.rb +6 -5
  60. data/lib/aspera/fasp/uri.rb +25 -24
  61. data/lib/aspera/faspex_gw.rb +83 -72
  62. data/lib/aspera/hash_ext.rb +10 -12
  63. data/lib/aspera/id_generator.rb +8 -7
  64. data/lib/aspera/keychain/encrypted_hash.rb +60 -45
  65. data/lib/aspera/keychain/macos_security.rb +26 -24
  66. data/lib/aspera/log.rb +34 -38
  67. data/lib/aspera/nagios.rb +14 -13
  68. data/lib/aspera/node.rb +19 -19
  69. data/lib/aspera/oauth.rb +121 -101
  70. data/lib/aspera/open_application.rb +6 -5
  71. data/lib/aspera/persistency_action_once.rb +9 -8
  72. data/lib/aspera/persistency_folder.rb +10 -9
  73. data/lib/aspera/preview/file_types.rb +261 -266
  74. data/lib/aspera/preview/generator.rb +74 -73
  75. data/lib/aspera/preview/image_error.png +0 -0
  76. data/lib/aspera/preview/options.rb +7 -6
  77. data/lib/aspera/preview/utils.rb +30 -33
  78. data/lib/aspera/preview/video_error.png +0 -0
  79. data/lib/aspera/proxy_auto_config.rb +25 -23
  80. data/lib/aspera/rest.rb +73 -74
  81. data/lib/aspera/rest_call_error.rb +1 -0
  82. data/lib/aspera/rest_error_analyzer.rb +11 -9
  83. data/lib/aspera/rest_errors_aspera.rb +5 -4
  84. data/lib/aspera/secret_hider.rb +68 -0
  85. data/lib/aspera/ssh.rb +12 -10
  86. data/lib/aspera/sync.rb +49 -47
  87. data/lib/aspera/temp_file_manager.rb +7 -5
  88. data/lib/aspera/timer_limiter.rb +9 -8
  89. data/lib/aspera/uri_reader.rb +11 -14
  90. data/lib/aspera/web_auth.rb +17 -15
  91. data.tar.gz.sig +0 -0
  92. metadata +117 -34
  93. metadata.gz.sig +2 -0
  94. 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=[:ls,:rm,:mv,:du,:info,:mkdir,:cp,:df,:md5sum].freeze
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=@command_executor.execute('ascmd',stdin_input).unpack('C*')
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 result.is_a?(Hash) && (result.keys.sort == TYPES_DESCR[:error][:fields].map{|i|i[:name]}.sort)
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},{name: :info,is_a: :info},
66
- {name: :success,is_a: nil,special: :return_true},{name: :exit,is_a: nil},{name: :df,is_a: :mnt,special: :restart_on_first},{name: :md5sum,is_a: :md5sum}]},
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},{name: :uid,is_a: :int32,check: nil},
69
- {name: :zuid,is_a: :zstr},{name: :gid,is_a: :int32,check: nil},{name: :zgid,is_a: :zstr},{name: :ctime,is_a: :epoch},{name: :zctime,is_a: :zstr},{name: :mtime,is_a: :epoch},{name: :zmtime,is_a: :zstr},{name: :atime,is_a: :epoch},{name: :zatime,is_a: :zstr},{name: :symlink,is_a: :zstr},{name: :errno,is_a: :int32},{name: :errstr,is_a: :zstr}]},
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},{name: :codeset,is_a: :zstr},
72
- {name: :lc_ctype,is_a: :zstr},{name: :lc_numeric,is_a: :zstr},{name: :lc_time,is_a: :zstr},{name: :lc_all,is_a: :zstr},{name: :dev,is_a: :zstr,special: :multiple},{name: :browse_caps,is_a: :zstr},{name: :protocol,is_a: :zstr}]},
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},{name: :failed_dcount,is_a: :int32}]},
75
- error: {decode: :field_list,fields: [{name: :errno,is_a: :int32},{name: :errstr,is_a: :zstr}]},
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},{name: :used,is_a: :int64},{name: :free,is_a: :int64},
78
- {name: :fcount,is_a: :int64},{name: :errno,is_a: :int32},{name: :errstr,is_a: :zstr}]},
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||-1)+1
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
@@ -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
- options.add_opt_simple(:url,'URL of application, e.g. https://org.asperafiles.com')
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,:mandatory)
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: api_url,
29
- auth: {
30
- type: :basic,
31
- username: options.get_option(:username,:mandatory),
32
- password: options.get_option(:password,:mandatory)
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 self.decode_csvt(value)
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
- base64: lambda{|v|Base64.decode64(v)},
41
- json: lambda{|v|JSON.parse(v)},
42
- zlib: lambda{|v|Zlib::Inflate.inflate(v)},
43
- ruby: lambda{|v|eval(v)},
44
- csvt: lambda{|v|ExtendedValue.decode_csvt(v)},
45
- lines: lambda{|v|v.split("\n")},
46
- list: lambda{|v|v[1..-1].split(v[0])}
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
- val: lambda{|v|v},
50
- file: lambda{|v|File.read(File.expand_path(v))},
51
- path: lambda{|v|File.expand_path(v)},
52
- env: lambda{|v|ENV[v]},
53
- uri: lambda{|v|UriReader.read(v)},
54
- stdin: lambda{|v|raise 'no value allowed for stdin' unless v.empty?;$stdin.read}
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.keys.include?(type)
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=@handlers[:decoder][decoder].call(value)
93
+ value = @handlers[:decoder][decoder].call(value)
92
94
  end
93
95
  return value
94
96
  end # parse