aspera-cli 4.0.0 → 4.1.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.
@@ -7,10 +7,12 @@ require 'aspera/aoc'
7
7
  require 'aspera/proxy_auto_config'
8
8
  require 'aspera/uri_reader'
9
9
  require 'aspera/rest'
10
+ require 'aspera/persistency_action_once'
10
11
  require 'xmlsimple'
11
12
  require 'base64'
12
13
  require 'net/smtp'
13
14
  require 'open3'
15
+ require 'date'
14
16
 
15
17
  module Aspera
16
18
  module Cli
@@ -41,17 +43,19 @@ module Aspera
41
43
  AOC_COMMAND_CURRENT=AOC_COMMAND_V3
42
44
  CONNECT_WEB_URL = 'https://d3gcli72yxqn2z.cloudfront.net/connect'
43
45
  CONNECT_VERSIONS = 'connectversions.js'
46
+ TRANSFER_SDK_ARCHIVE_URL = 'https://ibm.biz/aspera_sdk'
44
47
  DEMO='demo'
48
+ AOC_PATH_API_CLIENTS='admin/api-clients'
45
49
  def option_preset; nil; end
46
50
 
47
51
  def option_preset=(value)
48
52
  self.options.add_option_preset(preset_by_name(value))
49
53
  end
50
54
 
51
- private_constant :ASPERA_HOME_FOLDER_NAME,:DEFAULT_CONFIG_FILENAME,:CONF_PRESET_CONFIG,:CONF_PRESET_VERSION,:CONF_PRESET_DEFAULT,:PROGRAM_NAME_V1,:PROGRAM_NAME_V2,:DEFAULT_REDIRECT,:ASPERA_PLUGINS_FOLDERNAME,:RUBY_FILE_EXT,:AOC_COMMAND_V1,:AOC_COMMAND_V2,:AOC_COMMAND_V3,:AOC_COMMAND_CURRENT,:DEMO
55
+ private_constant :DEFAULT_CONFIG_FILENAME,:CONF_PRESET_CONFIG,:CONF_PRESET_VERSION,:CONF_PRESET_DEFAULT,:PROGRAM_NAME_V1,:PROGRAM_NAME_V2,:DEFAULT_REDIRECT,:ASPERA_PLUGINS_FOLDERNAME,:RUBY_FILE_EXT,:AOC_COMMAND_V1,:AOC_COMMAND_V2,:AOC_COMMAND_V3,:AOC_COMMAND_CURRENT,:DEMO,:TRANSFER_SDK_ARCHIVE_URL,:AOC_PATH_API_CLIENTS
52
56
  attr_accessor :option_ak_secret,:option_secrets
53
57
 
54
- def initialize(env,tool_name,help_url,version)
58
+ def initialize(env,tool_name,help_url,version,main_folder)
55
59
  super(env)
56
60
  @option_ak_secret=nil
57
61
  @option_secrets={}
@@ -63,19 +67,11 @@ module Aspera
63
67
  @program_version=version
64
68
  @tool_name=tool_name
65
69
  @help_url=help_url
66
- tool_main_env_var="#{tool_name.upcase}_HOME"
67
- if ENV.has_key?(tool_main_env_var)
68
- @main_folder=ENV[tool_main_env_var]
69
- else
70
- user_home_folder=Dir.home
71
- raise CliError,"Home folder does not exist: #{user_home_folder}. Check your user environment or use #{tool_main_env_var}." unless Dir.exist?(user_home_folder)
72
- @main_folder=File.join(user_home_folder,ASPERA_HOME_FOLDER_NAME,tool_name)
73
- end
70
+ @main_folder=main_folder
74
71
  @conf_file_default=File.join(@main_folder,DEFAULT_CONFIG_FILENAME)
75
72
  @option_config_file=@conf_file_default
76
73
  Log.log.debug("#{tool_name} folder: #{@main_folder}")
77
74
  # set folder for FASP SDK
78
- Fasp::Installation.instance.folder=File.join(@main_folder,'sdk')
79
75
  add_plugin_lookup_folder(File.join(@main_folder,ASPERA_PLUGINS_FOLDERNAME))
80
76
  add_plugin_lookup_folder(self.class.gem_plugins_folder)
81
77
  # do file parameter first
@@ -105,11 +101,18 @@ module Aspera
105
101
  self.options.add_opt_simple(:default,"set as default configuration for specified plugin")
106
102
  self.options.add_opt_simple(:secret,"access key secret for node")
107
103
  self.options.add_opt_simple(:secrets,"access key secret for node")
104
+ self.options.add_opt_simple(:sdk_url,"URL to get SDK")
105
+ self.options.add_opt_simple(:sdk_folder,"SDK folder location")
108
106
  self.options.add_opt_boolean(:test_mode,"skip user validation in wizard mode")
107
+ self.options.add_opt_simple(:version_check_days,Integer,"period to check neew version in days (zero to disable)")
109
108
  self.options.set_option(:use_generic_client,true)
110
109
  self.options.set_option(:test_mode,false)
110
+ self.options.set_option(:version_check_days,7)
111
+ self.options.set_option(:sdk_url,TRANSFER_SDK_ARCHIVE_URL)
112
+ self.options.set_option(:sdk_folder,File.join(@main_folder,'sdk'))
111
113
  self.options.parse_options!
112
114
  raise CliBadArgument,"secrets shall be Hash" unless @option_secrets.is_a?(Hash)
115
+ Fasp::Installation.instance.folder=self.options.get_option(:sdk_folder,:mandatory)
113
116
  end
114
117
 
115
118
  def get_secret(id=nil,mandatory=true)
@@ -122,6 +125,48 @@ module Aspera
122
125
  return @option_secrets
123
126
  end
124
127
 
128
+ def check_gem_version
129
+ this_gem_name=File.basename(File.dirname(self.class.gem_root)).gsub(/-[0-9].*$/,'')
130
+ latest_version=begin
131
+ Rest.new(base_url: "https://rubygems.org/api/v1").read("versions/#{this_gem_name}/latest.json")[:data]['version']
132
+ rescue
133
+ nil
134
+ end
135
+ return {name: this_gem_name,current: Aspera::Cli::VERSION, latest: latest_version, need_update: Gem::Version.new(Aspera::Cli::VERSION) < Gem::Version.new(latest_version)}
136
+ end
137
+
138
+ def periodic_check_newer_gem_version
139
+ # get verification period
140
+ delay_days=options.get_option(:version_check_days,:mandatory)
141
+ Log.log.info("check days: #{delay_days}")
142
+ # check only if not zero day
143
+ if !delay_days.eql?(0)
144
+ # get last date from persistency
145
+ last_check_array=[]
146
+ check_date_persist=PersistencyActionOnce.new(
147
+ manager: persistency,
148
+ data: last_check_array,
149
+ ids: ['version_last_check'])
150
+ # get persisted date or nil
151
+ last_check_date = begin
152
+ Date.strptime(last_check_array.first, "%Y/%m/%d")
153
+ rescue
154
+ nil
155
+ end
156
+ current_date=Date.today
157
+ Log.log.info("last check: #{last_check_date.class}")
158
+ if last_check_date.nil? or (current_date - last_check_date) > delay_days
159
+ Log.log.info("days elapsed #{last_check_date.is_a?(Date) ? current_date - last_check_date : last_check_date.class.name}")
160
+ last_check_array[0]=current_date.strftime("%Y/%m/%d")
161
+ check_date_persist.save
162
+ check_data=check_gem_version
163
+ if check_data[:need_update]
164
+ Log.log.warn("A new version is available: #{check_data[:latest]}. You have #{check_data[:current]}. Upgrade with: gem update #{check_data[:nname]}")
165
+ end
166
+ end
167
+ end
168
+ end
169
+
125
170
  # retrieve structure from cloud (CDN) with all versions available
126
171
  def connect_versions
127
172
  if @connect_versions.nil?
@@ -452,8 +497,10 @@ module Aspera
452
497
  end
453
498
  # read PATHs from ascp directly, and pvcl modules as well
454
499
  Open3.popen3(Fasp::Installation.instance.path(:ascp),'-DDL-') do |stdin, stdout, stderr, thread|
500
+ last_line=''
455
501
  while line=stderr.gets do
456
502
  line.chomp!
503
+ last_line=line
457
504
  case line
458
505
  when %r{^DBG Path ([^ ]+) (dir|file) +: (.*)$};data[$1]=$3
459
506
  when %r{^DBG Added module group:"([^"]+)" name:"([^"]+)", version:"([^"]+)" interface:"([^"]+)"$};data[$2]=$4
@@ -462,6 +509,9 @@ module Aspera
462
509
  when %r{^LOG Initializing FASP version ([^,]+),};data['ascp_version']=$1
463
510
  end
464
511
  end
512
+ if !thread.value.exitstatus.eql?(1) and !data.has_key?('root')
513
+ raise last_line
514
+ end
465
515
  end
466
516
  data['keypass']=Fasp::Installation.instance.bypass_pass
467
517
  return {:type=>:single_object, :data=>data}
@@ -478,13 +528,13 @@ module Aspera
478
528
  return {:type=>:status, :data=>"saved to default global preset #{preset_name}"}
479
529
  end
480
530
  when :install
481
- v=Fasp::Installation.instance.install_sdk
531
+ v=Fasp::Installation.instance.install_sdk(self.options.get_option(:sdk_url,:mandatory))
482
532
  return {:type=>:status, :data=>"Installed version #{v}"}
483
533
  end
484
534
  raise "unexpected case: #{command}"
485
535
  end
486
536
 
487
- ACTIONS=[:gem_path, :genkey,:plugins,:flush_tokens,:list,:overview,:open,:echo,:id,:documentation,:wizard,:export_to_cli,:detect,:coffee,:ascp,:email_test,:smtp_settings,:proxy_check,:folder,:file]
537
+ ACTIONS=[:gem_path, :genkey,:plugins,:flush_tokens,:list,:overview,:open,:echo,:id,:documentation,:wizard,:export_to_cli,:detect,:coffee,:ascp,:email_test,:smtp_settings,:proxy_check,:folder,:file,:check_update]
488
538
 
489
539
  # "config" plugin
490
540
  def execute_action
@@ -562,7 +612,9 @@ module Aspera
562
612
  return Main.result_status("updated: #{config_name}")
563
613
  end
564
614
  when :documentation
565
- OpenApplication.instance.uri(@help_url)
615
+ section=options.get_next_argument('private key file path',:single,:optional)
616
+ section='#'+section unless section.nil?
617
+ OpenApplication.instance.uri("#{@help_url}#{section}")
566
618
  return Main.result_nothing
567
619
  when :open
568
620
  OpenApplication.instance.uri("#{@option_config_file}") #file://
@@ -587,7 +639,6 @@ module Aspera
587
639
  return {:type=>:object_list,:data=>self.class.flatten_all_config(@config_presets)}
588
640
  when :wizard
589
641
  self.options.ask_missing_mandatory=true
590
- #self.options.set_option(:interactive,:yes)
591
642
  # register url option
592
643
  BasicAuthPlugin.new(@agents.merge(skip_option_header: true))
593
644
  instance_url=self.options.get_option(:url,:mandatory)
@@ -624,12 +675,13 @@ module Aspera
624
675
  end
625
676
  self.format.display_status("#{private_key_path}")
626
677
  pub_key_pem=OpenSSL::PKey::RSA.new(File.read(private_key_path)).public_key.to_s
627
- # define options
678
+ # declare command line options for AoC
628
679
  require 'aspera/cli/plugins/aoc'
629
680
  # make username mandatory for jwt, this triggers interactive input
630
681
  self.options.get_option(:username,:mandatory)
631
- # instanciate AoC plugin
682
+ # instanciate AoC plugin, so that command line options are known
632
683
  files_plugin=self.class.plugin_new(AOC_COMMAND_CURRENT,@agents.merge({skip_basic_auth_options: true, private_key_path: private_key_path}))
684
+ aoc_api=files_plugin.api_aoc
633
685
  auto_set_pub_key=false
634
686
  auto_set_jwt=false
635
687
  use_browser_authentication=false
@@ -656,29 +708,28 @@ module Aspera
656
708
  self.format.display_status("Once created or identified,")
657
709
  self.format.display_status("Please enter:".red)
658
710
  end
659
- OpenApplication.instance.uri(instance_url+"/admin/org/integrations")
711
+ OpenApplication.instance.uri("#{instance_url}/#{AOC_PATH_API_CLIENTS}")
660
712
  self.options.get_option(:client_id,:mandatory)
661
713
  self.options.get_option(:client_secret,:mandatory)
662
714
  use_browser_authentication=true
663
715
  end
664
716
  if use_browser_authentication
665
717
  self.format.display_status("We will use web authentication to bootstrap.")
666
- self.options.set_option(:auth,:web)
667
- self.options.set_option(:redirect_uri,DEFAULT_REDIRECT)
668
718
  auto_set_pub_key=true
669
719
  auto_set_jwt=true
670
- self.options.set_option(:scope,AoC::SCOPE_FILES_ADMIN)
720
+ @api_aoc.oauth.params[:auth]=:web
721
+ @api_aoc.oauth.params[:redirect_uri]=DEFAULT_REDIRECT
722
+ @api_aoc.oauth.params[:scope]=AoC::SCOPE_FILES_ADMIN
671
723
  end
672
- files_plugin.update_aoc_api
673
- myself=files_plugin.api_aoc.read('self')[:data]
724
+ myself=aoc_api.read('self')[:data]
674
725
  if auto_set_pub_key
675
- raise CliError,"public key is already set in profile (use --override=yes)" unless myself['public_key'].empty? or option_override
676
- self.format.display_status("Updating profile with new key")
677
- files_plugin.api_aoc.update("users/#{myself['id']}",{'public_key'=>pub_key_pem})
726
+ raise CliError,'public key is already set in profile (use --override=yes)' unless myself['public_key'].empty? or option_override
727
+ self.format.display_status('Updating profile with new key')
728
+ aoc_api.update("users/#{myself['id']}",{'public_key'=>pub_key_pem})
678
729
  end
679
730
  if auto_set_jwt
680
731
  self.format.display_status("Enabling JWT for client")
681
- files_plugin.api_aoc.update("clients/#{self.options.get_option(:client_id)}",{'jwt_grant_enabled'=>true,'explicit_authorization_required'=>false})
732
+ aoc_api.update("clients/#{self.options.get_option(:client_id)}",{'jwt_grant_enabled'=>true,'explicit_authorization_required'=>false})
682
733
  end
683
734
  self.format.display_status("creating new config preset: #{aspera_preset_name}")
684
735
  @config_presets[aspera_preset_name]={
@@ -764,6 +815,8 @@ module Aspera
764
815
  pac_url=self.options.get_option(:fpac,:mandatory)
765
816
  server_url=self.options.get_next_argument("server url")
766
817
  return Main.result_status(Aspera::ProxyAutoConfig.new(UriReader.read(pac_url)).get_proxy(server_url))
818
+ when :check_update
819
+ return {:type=>:single_object, :data=>check_gem_version}
767
820
  else raise "error"
768
821
  end
769
822
  end
@@ -14,13 +14,13 @@ module Aspera
14
14
  self.options.parse_options!
15
15
  end
16
16
 
17
- ACTIONS=[:transfer,:nagios_check]
17
+ ACTIONS=[:transfer,:health]
18
18
 
19
19
  def execute_action
20
20
  api_console=basic_auth_api('api')
21
21
  command=self.options.get_next_command(ACTIONS)
22
22
  case command
23
- when :nagios_check
23
+ when :health
24
24
  nagios=Nagios.new
25
25
  begin
26
26
  api_console.read('ssh_keys')
@@ -52,7 +52,7 @@ module Aspera
52
52
 
53
53
  # get faspe: URI from entry in xml, and fix problems..
54
54
  def self.get_fasp_uri_from_entry(entry)
55
- raise CliBadArgument, 'package is empty' unless entry.has_key?('link')
55
+ raise CliBadArgument, 'package has no link (deleted?)' unless entry.has_key?('link')
56
56
  result=entry['link'].select{|e| e['rel'].eql?('package')}.first['href']
57
57
  # tags in the end of URL is not well % encoded... there are "=" that should be %3D
58
58
  # TODO: enter ticket to Faspex ?
@@ -101,19 +101,26 @@ module Aspera
101
101
  return @api_v4
102
102
  end
103
103
 
104
- ACTIONS=[ :nagios_check,:package, :source, :me, :dropbox, :v4, :address_book, :login_methods ]
104
+ ACTIONS=[ :health,:package, :source, :me, :dropbox, :v4, :address_book, :login_methods ]
105
105
 
106
106
  # we match recv command on atom feed on this field
107
107
  PACKAGE_MATCH_FIELD='package_id'
108
108
 
109
109
  def mailbox_all_entries
110
- mailbox=self.options.get_option(:box,:mandatory).to_s
110
+ my_user_name=self.options.get_option(:username,:mandatory)
111
+ mailbox=self.options.get_option(:box,:mandatory)
111
112
  all_inbox_xml=api_v3.call({:operation=>'GET',:subpath=>"#{mailbox}.atom",:headers=>{'Accept'=>'application/xml'}})[:http].body
112
113
  all_inbox_data=XmlSimple.xml_in(all_inbox_xml, {'ForceArray' => true})
113
114
  Log.dump(:all_inbox_data,all_inbox_data)
114
115
  result=all_inbox_data.has_key?('entry') ? all_inbox_data['entry'] : []
115
116
  result.each do |e|
116
- e[PACKAGE_MATCH_FIELD]=e['to'].first['recipient_delivery_id'].first
117
+ case mailbox
118
+ when :inbox,:archive
119
+ recipient=e['to'].select{|i|i['name'].first.eql?(my_user_name)}.first
120
+ e[PACKAGE_MATCH_FIELD]=recipient.nil? ? 'n/a' : recipient['recipient_delivery_id'].first
121
+ when :sent
122
+ e[PACKAGE_MATCH_FIELD]=e['delivery_id'].first
123
+ end
117
124
  end
118
125
  # remove dropbox packages
119
126
  result.select!{|p|p['metadata'].first['field'].select{|j|j['name'].eql?('_dropbox_name')}.empty? rescue false}
@@ -155,7 +162,7 @@ module Aspera
155
162
  def execute_action
156
163
  command=self.options.get_next_command(ACTIONS)
157
164
  case command
158
- when :nagios_check
165
+ when :health
159
166
  nagios=Nagios.new
160
167
  begin
161
168
  api_v3.read('me')
@@ -241,7 +248,7 @@ module Aspera
241
248
  # TODO: delivery id is the right one if package was receive by group
242
249
  endpoint=case self.options.get_option(:box,:mandatory)
243
250
  when :inbox,:archive;'received'
244
- when :sent;'sent'
251
+ when :sent; 'sent'
245
252
  end
246
253
  entry_xml=api_v3.call({:operation=>'GET',:subpath=>"#{endpoint}/#{delivid}",:headers=>{'Accept'=>'application/xml'}})[:http].body
247
254
  package_entry=XmlSimple.xml_in(entry_xml, {'ForceArray' => true})
@@ -1,5 +1,6 @@
1
1
  require 'aspera/cli/basic_auth_plugin'
2
2
  require 'aspera/persistency_action_once'
3
+ require 'securerandom'
3
4
 
4
5
  module Aspera
5
6
  module Cli
@@ -8,74 +9,129 @@ module Aspera
8
9
  VAL_ALL='ALL'
9
10
  def initialize(env)
10
11
  super(env)
11
- #self.options.add_opt_simple(:delivery_info,'package delivery information (extended value)')
12
- #self.options.parse_options!
12
+ options.add_opt_simple(:client_id,'API client identifier in application')
13
+ options.add_opt_simple(:client_secret,'API client secret in application')
14
+ options.add_opt_simple(:redirect_uri,'API client redirect URI')
15
+ options.add_opt_list(:auth,Oauth.auth_types.clone.push(:boot),'type of Oauth authentication')
16
+ options.add_opt_simple(:private_key,'RSA private key PEM value for JWT (prefix file path with @val:@file:)')
17
+ options.set_option(:auth,:jwt)
18
+ options.parse_options!
13
19
  end
14
- ACTIONS=[ :node, :package ]
20
+ ACTIONS=[ :node, :package, :auth_client ]
15
21
 
16
- # http://apie-next-ui-shell-dev.mybluemix.net/explorer/catalog/aspera/product/ibm-aspera/api/faspex5-api/spec/openapi
22
+ def set_api
23
+ faxpex5_api_base_url=options.get_option(:url,:mandatory)
24
+ faxpex5_api_v5_url="#{faxpex5_api_base_url}/api/v5"
25
+ faxpex5_api_auth_url="#{faxpex5_api_base_url}/auth"
26
+ case options.get_option(:auth,:mandatory)
27
+ when :web
28
+ @api_v5=Rest.new({
29
+ :base_url => faxpex5_api_v5_url,
30
+ :auth => {
31
+ :type => :oauth2,
32
+ :base_url => faxpex5_api_auth_url,
33
+ :grant => :web,
34
+ :state => SecureRandom.uuid,
35
+ :client_id => options.get_option(:client_id,:mandatory),
36
+ :redirect_uri => options.get_option(:redirect_uri,:mandatory),
37
+ #:token_field =>'auth_token',
38
+ #:path_token => 'token',
39
+ #:path_authorize => 'authorize',
40
+ #:userpass_body => {name: faxpex5_username,password: faxpex5_password}
41
+ }})
42
+ when :boot
43
+ @api_v5=Rest.new({
44
+ :base_url => faxpex5_api_v5_url,
45
+ :headers => {'Authorization'=>options.get_option(:password,:mandatory)},
46
+ })
47
+ when :jwt
48
+ #raise "JWT to be implemented"
49
+ @api_v5=Rest.new({
50
+ :base_url => faxpex5_api_base_url,
51
+ :auth => {
52
+ :type => :oauth2,
53
+ :base_url => faxpex5_api_auth_url,
54
+ :grant => :jwt,
55
+ :client_id => options.get_option(:client_id,:mandatory),
56
+ :client_secret => options.get_option(:client_secret,:mandatory),
57
+ #:redirect_uri => options.get_option(:redirect_uri,:mandatory),
58
+ :jwt_subject => "client:#{options.get_option(:client_id,:mandatory)}", # TODO Mmmm
59
+ :jwt_private_key_obj => OpenSSL::PKey::RSA.new(options.get_option(:private_key,:mandatory)),
60
+ :jwt_audience =>options.get_option(:client_id,:mandatory), # TODO Mmmm
61
+ #:token_field =>'auth_token',
62
+ #:path_token => 'authenticate',
63
+ #:path_authorize => :unused,
64
+ #:userpass_body => {name: options.get_option(:username,:mandatory),password: options.get_option(:password,:mandatory)}
65
+ }})
66
+ # former version
67
+ # # get parameters
68
+ # faxpex5_username=options.get_option(:username,:mandatory)
69
+ # faxpex5_password=options.get_option(:password,:mandatory)
70
+ # # create object for REST calls to Shares2
71
+ # @api_v5=Rest.new({
72
+ # :base_url => faxpex5_api_base_url,
73
+ # :auth => {
74
+ # :type => :oauth2,
75
+ # :base_url => faxpex5_api_base_url,
76
+ # :grant => :body_data,
77
+ # :token_field =>'auth_token',
78
+ # :path_token => 'authenticate',
79
+ # :path_authorize => :unused,
80
+ # :userpass_body => {name: faxpex5_username,password: faxpex5_password}
81
+ # }})
82
+ end
83
+ end
84
+
85
+ #
17
86
  def execute_action
18
- # get parameters
19
- faxpex5_api_base_url=self.options.get_option(:url,:mandatory)
20
- faxpex5_username=self.options.get_option(:username,:mandatory)
21
- faxpex5_password=self.options.get_option(:password,:mandatory)
22
- faxpex5_api_base_url+='/api/v5'
23
- # create object for REST calls to Shares2
24
- api_v5=Rest.new({
25
- :base_url => faxpex5_api_base_url,
26
- :auth => {
27
- :type => :oauth2,
28
- :base_url => faxpex5_api_base_url,
29
- :grant => :body_data,
30
- :token_field =>'auth_token',
31
- :path_token => 'authenticate',
32
- :path_authorize => :unused,
33
- :userpass_body => {name: faxpex5_username,password: faxpex5_password}
34
- }})
35
- command=self.options.get_next_command(ACTIONS)
87
+ set_api
88
+ command=options.get_next_command(ACTIONS)
36
89
  case command
90
+ when :auth_client
91
+ api_auth=Rest.new(@api_v5.params.merge({base_url: @api_v5.params[:base_url].gsub(/api\/v5$/,'auth')}))
92
+ return self.entity_action(api_auth,'oauth_clients',nil,:id,nil,true)
37
93
  when :node
38
- return self.entity_action(api_v5,'nodes',nil,:id,nil,true)
94
+ return self.entity_action(@api_v5,'nodes',nil,:id,nil,true)
39
95
  when :package
40
- command=self.options.get_next_command([:list,:show,:send,:receive])
96
+ command=options.get_next_command([:list,:show,:send,:receive])
41
97
  case command
42
98
  when :list
43
- parameters=self.options.get_option(:value,:optional)
44
- return {:type => :object_list, :data=>api_v5.read('packages',parameters)[:data]['packages']}
99
+ parameters=options.get_option(:value,:optional)
100
+ return {:type => :object_list, :data=>@api_v5.read('packages',parameters)[:data]['packages']}
45
101
  when :show
46
- id=self.options.get_option(:id,:mandatory)
47
- return {:type => :single_object, :data=>api_v5.read("packages/#{id}")[:data]}
102
+ id=options.get_option(:id,:mandatory)
103
+ return {:type => :single_object, :data=>@api_v5.read("packages/#{id}")[:data]}
48
104
  when :send
49
- parameters=self.options.get_option(:value,:mandatory)
105
+ parameters=options.get_option(:value,:mandatory)
50
106
  raise CliBadArgument,'package value must be hash, refer to API' unless parameters.is_a?(Hash)
51
- package=api_v5.create('packages',parameters)[:data]
52
- transfer_spec=api_v5.create("packages/#{package['id']}/transfer_spec/upload",{transfer_type: 'Connect'})[:data]
107
+ package=@api_v5.create('packages',parameters)[:data]
108
+ transfer_spec=@api_v5.create("packages/#{package['id']}/transfer_spec/upload",{transfer_type: 'Connect'})[:data]
53
109
  transfer_spec.delete('authentication')
54
110
  return Main.result_transfer(self.transfer.start(transfer_spec,{:src=>:node_gen3}))
55
111
  when :receive
56
112
  pkg_type='received'
57
- pack_id=self.options.get_option(:id,:mandatory)
113
+ pack_id=options.get_option(:id,:mandatory)
58
114
  package_ids=[pack_id]
59
115
  skip_ids_data=[]
60
116
  skip_ids_persistency=nil
61
- if self.options.get_option(:once_only,:mandatory)
117
+ if options.get_option(:once_only,:mandatory)
62
118
  skip_ids_persistency=PersistencyActionOnce.new(
63
119
  manager: @agents[:persistency],
64
120
  data: skip_ids_data,
65
- ids: ['faspex_recv',self.options.get_option(:url,:mandatory),self.options.get_option(:username,:mandatory),pkg_type])
121
+ ids: ['faspex_recv',options.get_option(:url,:mandatory),options.get_option(:username,:mandatory),pkg_type])
66
122
  end
67
123
  if pack_id.eql?(VAL_ALL)
68
124
  # todo: if packages have same name, they will overwrite
69
- parameters=self.options.get_option(:value,:optional)
125
+ parameters=options.get_option(:value,:optional)
70
126
  parameters||={"type"=>"received","subtype"=>"mypackages","limit"=>1000}
71
127
  raise CliBadArgument,'value filter must be hash (API GET)' unless parameters.is_a?(Hash)
72
- package_ids=api_v5.read('packages',parameters)[:data]['packages'].map{|p|p['id']}
128
+ package_ids=@api_v5.read('packages',parameters)[:data]['packages'].map{|p|p['id']}
73
129
  package_ids.select!{|i|!skip_ids_data.include?(i)}
74
130
  end
75
131
  result_transfer=[]
76
132
  package_ids.each do |id|
77
133
  # TODO: allow from sent as well ?
78
- transfer_spec=api_v5.create("packages/#{id}/transfer_spec/download",{transfer_type: 'Connect', type: pkg_type})[:data]
134
+ transfer_spec=@api_v5.create("packages/#{id}/transfer_spec/download",{transfer_type: 'Connect', type: pkg_type})[:data]
79
135
  transfer_spec.delete('authentication')
80
136
  statuses=self.transfer.start(transfer_spec,{:src=>:node_gen3})
81
137
  result_transfer.push({'package'=>id,'status'=>statuses.map{|i|i.to_s}.join(',')})