aspera-cli 4.6.0 → 4.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +427 -300
  3. data/bin/ascli +2 -1
  4. data/bin/asession +1 -0
  5. data/docs/test_env.conf +2 -0
  6. data/examples/aoc.rb +4 -3
  7. data/examples/faspex4.rb +21 -19
  8. data/examples/proxy.pac +1 -1
  9. data/examples/transfer.rb +15 -15
  10. data/lib/aspera/aoc.rb +135 -124
  11. data/lib/aspera/ascmd.rb +85 -75
  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 +138 -111
  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 +13 -16
  21. data/lib/aspera/cli/main.rb +122 -130
  22. data/lib/aspera/cli/manager.rb +146 -154
  23. data/lib/aspera/cli/plugin.rb +38 -34
  24. data/lib/aspera/cli/plugins/alee.rb +6 -6
  25. data/lib/aspera/cli/plugins/aoc.rb +273 -276
  26. data/lib/aspera/cli/plugins/ats.rb +82 -76
  27. data/lib/aspera/cli/plugins/bss.rb +14 -16
  28. data/lib/aspera/cli/plugins/config.rb +350 -306
  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 +180 -159
  32. data/lib/aspera/cli/plugins/faspex5.rb +64 -54
  33. data/lib/aspera/cli/plugins/node.rb +147 -140
  34. data/lib/aspera/cli/plugins/orchestrator.rb +68 -66
  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 +23 -24
  38. data/lib/aspera/cli/plugins/sync.rb +20 -22
  39. data/lib/aspera/cli/transfer_agent.rb +40 -39
  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/agent_base.rb +22 -20
  47. data/lib/aspera/fasp/agent_connect.rb +13 -11
  48. data/lib/aspera/fasp/agent_direct.rb +48 -59
  49. data/lib/aspera/fasp/agent_httpgw.rb +33 -39
  50. data/lib/aspera/fasp/agent_node.rb +15 -13
  51. data/lib/aspera/fasp/agent_trsdk.rb +12 -14
  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 +106 -94
  55. data/lib/aspera/fasp/listener.rb +1 -0
  56. data/lib/aspera/fasp/parameters.rb +83 -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 -90
  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 +17 -16
  65. data/lib/aspera/keychain/macos_security.rb +6 -10
  66. data/lib/aspera/log.rb +25 -20
  67. data/lib/aspera/nagios.rb +13 -12
  68. data/lib/aspera/node.rb +30 -22
  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 +115 -113
  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 +64 -21
  90. data/docs/Makefile +0 -65
  91. data/docs/README.erb.md +0 -4424
  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/cli/plugins/shares2.rb +0 -114
  96. data/lib/aspera/fasp/default.rb +0 -17
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'aspera/cli/basic_auth_plugin'
2
3
  require 'aspera/persistency_action_once'
3
4
  require 'aspera/id_generator'
@@ -9,9 +10,9 @@ module Aspera
9
10
  class Faspex5 < BasicAuthPlugin
10
11
  class << self
11
12
  def detect(base_url)
12
- api=Rest.new({:base_url=>base_url})
13
+ api=Rest.new({base_url: base_url})
13
14
  result=api.read('api/v5/configuration/ping')
14
- if result[:http].code.start_with?('2') and result[:http].body.strip.empty?
15
+ if result[:http].code.start_with?('2') && result[:http].body.strip.empty?
15
16
  return {version: '5'}
16
17
  end
17
18
  return nil
@@ -19,94 +20,87 @@ module Aspera
19
20
  end
20
21
 
21
22
  VAL_ALL='ALL'
22
- private_constant :VAL_ALL
23
+ TRANSFER_CONNECT='connect'
24
+ private_constant :VAL_ALL,:TRANSFER_CONNECT
23
25
 
24
26
  def initialize(env)
25
27
  super(env)
26
28
  options.add_opt_simple(:client_id,'OAuth client identifier')
27
29
  options.add_opt_simple(:client_secret,'OAuth client secret')
28
30
  options.add_opt_simple(:redirect_uri,'OAuth redirect URI')
29
- options.add_opt_list(:auth,Oauth.auth_types.clone.push(:boot),'OAuth type of authentication')
31
+ options.add_opt_list(:auth,[Oauth::STD_AUTH_TYPES,:boot].flatten,'OAuth type of authentication')
30
32
  options.add_opt_simple(:private_key,'Oauth RSA private key PEM value for JWT (prefix file path with @val:@file:)')
31
33
  options.set_option(:auth,:jwt)
32
34
  options.parse_options!
33
35
  end
34
36
 
35
37
  def set_api
36
- @faxpex5_api_base_url=options.get_option(:url,:mandatory)
37
- faxpex5_api_v5_url="#{@faxpex5_api_base_url}/api/v5"
38
- faxpex5_api_auth_url="#{@faxpex5_api_base_url}/auth"
38
+ faxpex5_api_base_url=options.get_option(:url,:mandatory)
39
+ faxpex5_api_v5_url="#{faxpex5_api_base_url}/api/v5"
40
+ @faxpex5_api_auth_url="#{faxpex5_api_base_url}/auth"
39
41
  case options.get_option(:auth,:mandatory)
40
42
  when :boot
41
43
  # the password here is the token copied directly from browser in developer mode
42
44
  @api_v5=Rest.new({
43
- :base_url => faxpex5_api_v5_url,
44
- :headers => {'Authorization'=>options.get_option(:password,:mandatory)},
45
+ base_url: faxpex5_api_v5_url,
46
+ headers: {'Authorization'=>options.get_option(:password,:mandatory)}
45
47
  })
46
48
  when :web
47
49
  # opens a browser and ask user to auth using web
48
50
  @api_v5=Rest.new({
49
- :base_url => faxpex5_api_v5_url,
50
- :auth => {
51
- :type => :oauth2,
52
- :base_url => faxpex5_api_auth_url,
53
- :grant => :web,
54
- :state => SecureRandom.uuid,
55
- :client_id => options.get_option(:client_id,:mandatory),
56
- :redirect_uri => options.get_option(:redirect_uri,:mandatory),
51
+ base_url: faxpex5_api_v5_url,
52
+ auth: {
53
+ type: :oauth2,
54
+ base_url: @faxpex5_api_auth_url,
55
+ crtype: :web,
56
+ client_id: options.get_option(:client_id,:mandatory),
57
+ web: {redirect_uri: options.get_option(:redirect_uri,:mandatory)}
57
58
  }})
58
59
  when :jwt
59
- # currently Faspex 5 beta 4 only supports non-user based apis (e.g. jobs)
60
60
  app_client_id=options.get_option(:client_id,:mandatory)
61
61
  @api_v5=Rest.new({
62
- :base_url => faxpex5_api_v5_url,
63
- :auth => {
64
- :type => :oauth2,
65
- :base_url => faxpex5_api_auth_url,
66
- :grant => :jwt,
67
- :f5_username => options.get_option(:username,:mandatory),
68
- :f5_password => options.get_option(:password,:mandatory),
69
- :client_id => app_client_id,
70
- :client_secret => options.get_option(:client_secret,:mandatory),
71
- :jwt_subject => "client:#{app_client_id}", # TODO Mmmm
72
- :jwt_audience => app_client_id, # TODO Mmmm
73
- :jwt_private_key_obj => OpenSSL::PKey::RSA.new(options.get_option(:private_key,:mandatory)),
74
- :jwt_headers => {typ: 'JWT'}
62
+ base_url: faxpex5_api_v5_url,
63
+ auth: {
64
+ type: :oauth2,
65
+ base_url: @faxpex5_api_auth_url,
66
+ crtype: :jwt,
67
+ client_id: app_client_id,
68
+ jwt: {
69
+ payload: {
70
+ iss: app_client_id, # issuer
71
+ aud: app_client_id, # audience TODO: ???
72
+ sub: "user:#{options.get_option(:username,:mandatory)}" # subject also "client:#{app_client_id}" + auth user/pass
73
+ },
74
+ #auth: {type: :basic, options.get_option(:username,:mandatory), options.get_option(:password,:mandatory),
75
+ private_key_obj: OpenSSL::PKey::RSA.new(options.get_option(:private_key,:mandatory)),
76
+ headers: {typ: 'JWT'}
77
+ }
75
78
  }})
76
79
  end
77
80
  end
78
81
 
79
- ACTIONS=[ :node, :package, :auth_client, :jobs ]
82
+ ACTIONS=[:package, :admin].freeze
80
83
 
81
- #
82
84
  def execute_action
83
85
  set_api
84
86
  command=options.get_next_command(ACTIONS)
85
87
  case command
86
- when :auth_client
87
- api_auth=Rest.new(@api_v5.params.merge({base_url: "#{@faxpex5_api_base_url}/auth"}))
88
- return self.entity_action(api_auth,'oauth_clients',nil,:id,nil,true)
89
- when :node
90
- return self.entity_action(@api_v5,'nodes',nil,:id,nil,true)
91
- when :jobs
92
- # to test JWT
93
- return self.entity_action(@api_v5,'jobs',nil,:id,nil,true)
94
88
  when :package
95
89
  command=options.get_next_command([:list,:show,:send,:receive])
96
90
  case command
97
91
  when :list
98
92
  parameters=options.get_option(:value,:optional)
99
- return {:type => :object_list, :data=>@api_v5.read('packages',parameters)[:data]['packages']}
93
+ return {type: :object_list, data: @api_v5.read('packages',parameters)[:data]['packages'], fields: %w[id title release_date total_bytes total_files created_time state]}
100
94
  when :show
101
95
  id=instance_identifier()
102
- return {:type => :single_object, :data=>@api_v5.read("packages/#{id}")[:data]}
96
+ return {type: :single_object, data: @api_v5.read("packages/#{id}")[:data]}
103
97
  when :send
104
98
  parameters=options.get_option(:value,:mandatory)
105
99
  raise CliBadArgument,'value must be hash, refer to API' unless parameters.is_a?(Hash)
106
100
  package=@api_v5.create('packages',parameters)[:data]
107
- transfer_spec=@api_v5.create("packages/#{package['id']}/transfer_spec/upload",{transfer_type: 'Connect'})[:data]
101
+ transfer_spec=@api_v5.create("packages/#{package['id']}/transfer_spec/upload",{transfer_type: TRANSFER_CONNECT})[:data]
108
102
  transfer_spec.delete('authentication')
109
- return Main.result_transfer(self.transfer.start(transfer_spec,{:src=>:node_gen3}))
103
+ return Main.result_transfer(transfer.start(transfer_spec,{src: :node_gen3}))
110
104
  when :receive
111
105
  pkg_type='received'
112
106
  pack_id=instance_identifier()
@@ -126,24 +120,40 @@ module Aspera
126
120
  parameters||={'type'=>'received','subtype'=>'mypackages','limit'=>1000}
127
121
  raise CliBadArgument,'value filter must be Hash (API GET)' unless parameters.is_a?(Hash)
128
122
  package_ids=@api_v5.read('packages',parameters)[:data]['packages'].map{|p|p['id']}
129
- package_ids.select!{|i|!skip_ids_data.include?(i)}
123
+ package_ids.reject!{|i|skip_ids_data.include?(i)}
130
124
  end
131
125
  result_transfer=[]
132
- package_ids.each do |id|
126
+ package_ids.each do |pkgid|
133
127
  # TODO: allow from sent as well ?
134
- transfer_spec=@api_v5.create("packages/#{id}/transfer_spec/download",{transfer_type: 'Connect', type: pkg_type})[:data]
128
+ transfer_spec=@api_v5.create("packages/#{pkgid}/transfer_spec/download",{transfer_type: TRANSFER_CONNECT, type: pkg_type})[:data]
135
129
  transfer_spec.delete('authentication')
136
- statuses=self.transfer.start(transfer_spec,{:src=>:node_gen3})
137
- result_transfer.push({'package'=>id,Main::STATUS_FIELD=>statuses})
130
+ statuses=transfer.start(transfer_spec,{src: :node_gen3})
131
+ result_transfer.push({'package'=>pkgid,Main::STATUS_FIELD=>statuses})
138
132
  # skip only if all sessions completed
139
- skip_ids_data.push(id) if TransferAgent.session_status(statuses).eql?(:success)
133
+ skip_ids_data.push(pkgid) if TransferAgent.session_status(statuses).eql?(:success)
140
134
  end
141
135
  skip_ids_persistency.save unless skip_ids_persistency.nil?
142
136
  return Main.result_transfer_multiple(result_transfer)
137
+ end # case package
138
+ when :admin
139
+ case options.get_next_command([:resource])
140
+ when :resource
141
+ res_type=options.get_next_command([:accounts, :contacts, :jobs, :workgroups, :shared_inboxes, :nodes, :oauth_clients, :registrations, :saml_configs])
142
+ res_path=res_type.to_s
143
+ display_fields=
144
+ case res_type
145
+ when :accounts then [:all_but,'user_profile_data_attributes']
146
+ when :oauth_clients then [:all_but,'public_key']
147
+ end
148
+ adm_api=@api_v5
149
+ if res_type.eql?(:oauth_clients)
150
+ adm_api=Rest.new(@api_v5.params.merge({base_url: @faxpex5_api_auth_url}))
151
+ end
152
+ return entity_action(adm_api,res_path,use_subkey: true, display_fields: display_fields)
143
153
  end
144
- end
145
- end
146
- end
154
+ end # case command
155
+ end # action
156
+ end # Faspex5
147
157
  end # Plugins
148
158
  end # Cli
149
159
  end # Aspera