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