morpheus-cli 4.1.4 → 4.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/lib/morpheus.rb +5 -0
  3. data/lib/morpheus/api.rb +2 -2
  4. data/lib/morpheus/api/api_client.rb +47 -12
  5. data/lib/morpheus/api/appliance_settings_interface.rb +30 -0
  6. data/lib/morpheus/api/auth_interface.rb +14 -10
  7. data/lib/morpheus/api/clouds_interface.rb +7 -0
  8. data/lib/morpheus/api/clusters_interface.rb +17 -5
  9. data/lib/morpheus/api/custom_instance_types_interface.rb +2 -3
  10. data/lib/morpheus/api/deployments_interface.rb +7 -0
  11. data/lib/morpheus/api/execute_schedules_interface.rb +2 -3
  12. data/lib/morpheus/api/groups_interface.rb +7 -0
  13. data/lib/morpheus/api/license_interface.rb +9 -2
  14. data/lib/morpheus/api/load_balancers_interface.rb +7 -0
  15. data/lib/morpheus/api/logs_interface.rb +11 -2
  16. data/lib/morpheus/api/monitoring_alerts_interface.rb +45 -0
  17. data/lib/morpheus/api/monitoring_checks_interface.rb +2 -2
  18. data/lib/morpheus/api/monitoring_interface.rb +13 -8
  19. data/lib/morpheus/api/power_schedules_interface.rb +2 -3
  20. data/lib/morpheus/api/servers_interface.rb +5 -2
  21. data/lib/morpheus/api/setup_interface.rb +25 -7
  22. data/lib/morpheus/api/task_sets_interface.rb +7 -1
  23. data/lib/morpheus/api/tasks_interface.rb +7 -0
  24. data/lib/morpheus/api/virtual_images_interface.rb +2 -3
  25. data/lib/morpheus/api/whitelabel_settings_interface.rb +60 -0
  26. data/lib/morpheus/cli.rb +18 -14
  27. data/lib/morpheus/cli/access_token_command.rb +18 -2
  28. data/lib/morpheus/cli/appliance_settings_command.rb +303 -0
  29. data/lib/morpheus/cli/apps.rb +4 -3
  30. data/lib/morpheus/cli/archives_command.rb +0 -21
  31. data/lib/morpheus/cli/blueprints_command.rb +2 -2
  32. data/lib/morpheus/cli/cli_command.rb +32 -8
  33. data/lib/morpheus/cli/clouds.rb +6 -11
  34. data/lib/morpheus/cli/clusters.rb +346 -117
  35. data/lib/morpheus/cli/command_error.rb +4 -0
  36. data/lib/morpheus/cli/commands/standard/man_command.rb +1 -1
  37. data/lib/morpheus/cli/containers_command.rb +2 -1
  38. data/lib/morpheus/cli/credentials.rb +49 -4
  39. data/lib/morpheus/cli/deployments.rb +2 -2
  40. data/lib/morpheus/cli/dot_file.rb +2 -2
  41. data/lib/morpheus/cli/error_handler.rb +6 -3
  42. data/lib/morpheus/cli/execute_schedules_command.rb +1 -1
  43. data/lib/morpheus/cli/groups.rb +4 -4
  44. data/lib/morpheus/cli/hosts.rb +3 -2
  45. data/lib/morpheus/cli/image_builder_command.rb +0 -21
  46. data/lib/morpheus/cli/instances.rb +17 -4
  47. data/lib/morpheus/cli/library_container_types_command.rb +1 -1
  48. data/lib/morpheus/cli/library_layouts_command.rb +1 -1
  49. data/lib/morpheus/cli/library_upgrades_command.rb +1 -1
  50. data/lib/morpheus/cli/license.rb +185 -72
  51. data/lib/morpheus/cli/load_balancers.rb +4 -4
  52. data/lib/morpheus/cli/login.rb +4 -0
  53. data/lib/morpheus/cli/logs_command.rb +132 -0
  54. data/lib/morpheus/cli/mixins/infrastructure_helper.rb +2 -2
  55. data/lib/morpheus/cli/mixins/logs_helper.rb +65 -0
  56. data/lib/morpheus/cli/mixins/monitoring_helper.rb +410 -28
  57. data/lib/morpheus/cli/mixins/print_helper.rb +14 -4
  58. data/lib/morpheus/cli/monitoring_alerts_command.rb +800 -0
  59. data/lib/morpheus/cli/monitoring_apps_command.rb +85 -28
  60. data/lib/morpheus/cli/monitoring_checks_command.rb +60 -27
  61. data/lib/morpheus/cli/monitoring_contacts_command.rb +54 -79
  62. data/lib/morpheus/cli/monitoring_groups_command.rb +62 -23
  63. data/lib/morpheus/cli/monitoring_incidents_command.rb +91 -70
  64. data/lib/morpheus/cli/network_pools_command.rb +39 -23
  65. data/lib/morpheus/cli/power_schedules_command.rb +1 -1
  66. data/lib/morpheus/cli/remote.rb +834 -275
  67. data/lib/morpheus/cli/roles.rb +100 -38
  68. data/lib/morpheus/cli/tasks.rb +1 -1
  69. data/lib/morpheus/cli/user_settings_command.rb +20 -12
  70. data/lib/morpheus/cli/version.rb +1 -1
  71. data/lib/morpheus/cli/virtual_images.rb +1 -1
  72. data/lib/morpheus/cli/whitelabel_settings_command.rb +546 -0
  73. data/lib/morpheus/cli/whoami.rb +1 -1
  74. data/lib/morpheus/cli/workflows.rb +2 -2
  75. data/lib/morpheus/terminal.rb +22 -8
  76. metadata +11 -2
@@ -1,9 +1,10 @@
1
1
  require 'morpheus/api/api_client'
2
2
  require 'morpheus/api/monitoring_checks_interface'
3
- require 'morpheus/api/monitoring_incidents_interface'
4
- require 'morpheus/api/monitoring_contacts_interface'
5
3
  require 'morpheus/api/monitoring_groups_interface'
6
4
  require 'morpheus/api/monitoring_apps_interface'
5
+ require 'morpheus/api/monitoring_incidents_interface'
6
+ require 'morpheus/api/monitoring_contacts_interface'
7
+ require 'morpheus/api/monitoring_alerts_interface'
7
8
 
8
9
  class Morpheus::MonitoringInterface < Morpheus::APIClient
9
10
  def initialize(access_token, refresh_token,expires_at = nil, base_url=nil)
@@ -17,6 +18,14 @@ class Morpheus::MonitoringInterface < Morpheus::APIClient
17
18
  Morpheus::MonitoringChecksInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
18
19
  end
19
20
 
21
+ def groups
22
+ Morpheus::MonitoringGroupsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
23
+ end
24
+
25
+ def apps
26
+ Morpheus::MonitoringAppsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
27
+ end
28
+
20
29
  def incidents
21
30
  Morpheus::MonitoringIncidentsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
22
31
  end
@@ -25,12 +34,8 @@ class Morpheus::MonitoringInterface < Morpheus::APIClient
25
34
  Morpheus::MonitoringContactsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
26
35
  end
27
36
 
28
- def groups
29
- Morpheus::MonitoringGroupsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
30
- end
31
-
32
- def apps
33
- Morpheus::MonitoringAppsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
37
+ def alerts
38
+ Morpheus::MonitoringAlertsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
34
39
  end
35
40
 
36
41
  end
@@ -16,10 +16,9 @@ class Morpheus::PowerSchedulesInterface < Morpheus::APIClient
16
16
  execute(opts)
17
17
  end
18
18
 
19
- def list(options={})
19
+ def list(params={})
20
20
  url = "#{@base_url}/api/power-schedules"
21
- headers = { params: {}, authorization: "Bearer #{@access_token}" }
22
- headers[:params].merge!(options)
21
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
23
22
  opts = {method: :get, url: url, timeout: 10, headers: headers}
24
23
  execute(opts)
25
24
  end
@@ -22,8 +22,11 @@ class Morpheus::ServersInterface < Morpheus::APIClient
22
22
  execute(opts)
23
23
  end
24
24
 
25
- def list(options={})
26
- get(options)
25
+ def list(params={})
26
+ url = "#{@base_url}/api/servers"
27
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
28
+ opts = {method: :get, url: url, headers: headers}
29
+ execute(opts)
27
30
  end
28
31
 
29
32
  def create(options)
@@ -8,9 +8,9 @@ class Morpheus::SetupInterface < Morpheus::APIClient
8
8
  # @expires_at = expires_at
9
9
  # end
10
10
 
11
- def initialize(base_url)
12
- @base_url = base_url
13
- end
11
+ # def initialize(base_url)
12
+ # @base_url = base_url
13
+ # end
14
14
 
15
15
  # no JSON here, just a 200 OK 'NOTHING TO SEE HERE'
16
16
  def ping(params={}, timeout=5)
@@ -26,16 +26,34 @@ class Morpheus::SetupInterface < Morpheus::APIClient
26
26
  execute(method: :get, url: url, headers: headers, timeout: timeout)
27
27
  end
28
28
 
29
- def get(params={}, timeout=30)
29
+ def get(params={})
30
30
  url = "#{@base_url}/api/setup"
31
31
  headers = {:params => params, 'Content-Type' => 'application/json' }
32
- execute(method: :get, url: url, headers: headers, timeout: timeout)
32
+ execute(method: :get, url: url, headers: headers)
33
33
  end
34
34
 
35
- def init(payload={}, timeout=60)
35
+ def init(payload={})
36
36
  url = "#{@base_url}/api/setup/init"
37
37
  headers = { 'Content-Type' => 'application/json' }
38
- execute(method: :post, url: url, headers: headers, payload: payload.to_json, timeout: timeout)
38
+ execute(method: :post, url: url, headers: headers, payload: payload.to_json)
39
+ end
40
+
41
+ def hub_register(payload={})
42
+ url = "#{@base_url}/api/setup/hub-register"
43
+ headers = { 'Content-Type' => 'application/json' }
44
+ execute(method: :post, url: url, headers: headers, payload: payload.to_json)
45
+ end
46
+
47
+ def hub_login(payload={})
48
+ url = "#{@base_url}/api/setup/hub-login"
49
+ headers = { 'Content-Type' => 'application/json' }
50
+ execute(method: :post, url: url, headers: headers, payload: payload.to_json)
51
+ end
52
+
53
+ def teardown(params={})
54
+ url = "#{@base_url}/api/setup/teardown"
55
+ headers = { :params => params, :authorization => "Bearer #{@access_token}" }
56
+ execute(method: :delete, url: url, headers: headers)
39
57
  end
40
58
 
41
59
  end
@@ -8,6 +8,13 @@ class Morpheus::TaskSetsInterface < Morpheus::APIClient
8
8
  @expires_at = expires_at
9
9
  end
10
10
 
11
+ def list(params={})
12
+ url = "#{@base_url}/api/task-sets"
13
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
14
+ opts = {method: :get, url: url, headers: headers}
15
+ execute(opts)
16
+ end
17
+
11
18
  def get(options=nil)
12
19
  url = "#{@base_url}/api/task-sets"
13
20
  headers = { params: {}, authorization: "Bearer #{@access_token}" }
@@ -21,7 +28,6 @@ class Morpheus::TaskSetsInterface < Morpheus::APIClient
21
28
  execute(method: :get, url: url, headers: headers)
22
29
  end
23
30
 
24
-
25
31
  def create(options)
26
32
  url = "#{@base_url}/api/task-sets"
27
33
  headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
@@ -22,6 +22,13 @@ class Morpheus::TasksInterface < Morpheus::APIClient
22
22
  execute(method: :get, url: url, headers: headers)
23
23
  end
24
24
 
25
+ def list(params={})
26
+ url = "#{@base_url}/api/tasks"
27
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
28
+ opts = {method: :get, url: url, headers: headers}
29
+ execute(opts)
30
+ end
31
+
25
32
  def get(options=nil)
26
33
  url = "#{@base_url}/api/tasks"
27
34
  headers = { params: {}, authorization: "Bearer #{@access_token}" }
@@ -33,10 +33,9 @@ class Morpheus::VirtualImagesInterface < Morpheus::APIClient
33
33
  execute(method: :get, url: url, headers: headers)
34
34
  end
35
35
 
36
- def list(options=nil)
36
+ def list(params={})
37
37
  url = "#{@base_url}/api/virtual-images"
38
- headers = { params: {}, authorization: "Bearer #{@access_token}" }
39
- headers[:params].merge!(options)
38
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
40
39
  execute(method: :get, url: url, headers: headers)
41
40
  end
42
41
 
@@ -0,0 +1,60 @@
1
+ require 'morpheus/api/api_client'
2
+
3
+ class Morpheus::WhitelabelSettingsInterface < Morpheus::APIClient
4
+ def initialize(access_token, refresh_token,expires_at = nil, base_url=nil, api='whitelabel-settings')
5
+ @access_token = access_token
6
+ @refresh_token = refresh_token
7
+ @base_url = base_url
8
+ @api_url = "#{base_url}/api/#{api}"
9
+ @expires_at = expires_at
10
+ end
11
+
12
+ def get(params={})
13
+ url = @api_url
14
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
15
+ execute(method: :get, url: url, headers: headers)
16
+ end
17
+
18
+ def update(payload, params={})
19
+ url = @api_url
20
+ headers = { params: params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
21
+ execute(method: :put, url: url, headers: headers, payload: payload.to_json)
22
+ end
23
+
24
+ def update_images(payload, params={})
25
+ url = "#{@api_url}/images"
26
+ headers = { params: params, :authorization => "Bearer #{@access_token}" }
27
+ payload[:multipart] = true
28
+ execute(method: :post, url: url, headers: headers, payload: payload)
29
+ end
30
+
31
+ def reset_image(image_type, params={})
32
+ url = "#{@api_url}/images/#{image_type}"
33
+ headers = { params: params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
34
+ execute(method: :delete, url: url, headers: headers)
35
+ end
36
+
37
+ def download_image(image_type, outfile, params={})
38
+ url = "#{@api_url}/images/#{image_type}"
39
+ headers = { params: params, :authorization => "Bearer #{@access_token}" }
40
+ opts = {method: :get, url: url, headers: headers, timeout: 172800}
41
+
42
+ if @dry_run
43
+ return opts
44
+ end
45
+
46
+ http_response = nil
47
+ File.open(outfile, 'w') {|f|
48
+ block = proc { |response|
49
+ response.read_body do |chunk|
50
+ # writing to #{outfile} ..."
51
+ f.write chunk
52
+ end
53
+ }
54
+ opts[:block_response] = block
55
+ http_response = Morpheus::RestClient.execute(opts)
56
+ }
57
+ http_response
58
+ end
59
+
60
+ end
@@ -1,6 +1,6 @@
1
- require "morpheus/cli/version"
1
+ require 'morpheus/cli/version'
2
2
  require 'morpheus/cli/command_error'
3
- require "morpheus/rest_client"
3
+ require 'morpheus/rest_client'
4
4
  require 'morpheus/formatters'
5
5
  require 'morpheus/logging'
6
6
  require 'term/ansicolor'
@@ -9,20 +9,20 @@ Dir[File.dirname(__FILE__) + "/ext/*.rb"].each {|file| require file }
9
9
 
10
10
  module Morpheus
11
11
  module Cli
12
-
13
- # the home directory, where morpheus-cli stores things
14
- def self.home_directory=(fn)
15
- @@home_directory = fn
12
+
13
+ # get the home directory, where morpheus-cli stores things
14
+ # The default is $MORPHEUS_CLI_HOME or $HOME/.morpheus
15
+ unless defined?(@@home_directory)
16
+ @@home_directory = ENV['MORPHEUS_CLI_HOME'] || File.join(Dir.home, ".morpheus")
16
17
  end
17
-
18
+
18
19
  def self.home_directory
19
- if @@home_directory
20
- @@home_directory
21
- elsif ENV['MORPHEUS_CLI_HOME']
22
- @@home_directory = ENV['MORPHEUS_CLI_HOME']
23
- else
24
- @@home_directory = File.join(Dir.home, ".morpheus")
25
- end
20
+ @@home_directory
21
+ end
22
+
23
+ # set the home directory
24
+ def self.home_directory=(fn)
25
+ @@home_directory = fn
26
26
  end
27
27
 
28
28
  # check if this is a Windows environment.
@@ -73,6 +73,7 @@ module Morpheus
73
73
  load 'morpheus/cli/logout.rb'
74
74
  load 'morpheus/cli/whoami.rb'
75
75
  # load 'morpheus/cli/auth_command.rb'
76
+ load 'morpheus/cli/appliance_settings_command.rb'
76
77
  load 'morpheus/cli/access_token_command.rb'
77
78
  load 'morpheus/cli/user_settings_command.rb'
78
79
  load 'morpheus/cli/dashboard_command.rb'
@@ -122,8 +123,10 @@ module Morpheus
122
123
  load 'morpheus/cli/monitoring_incidents_command.rb'
123
124
  load 'morpheus/cli/monitoring_checks_command.rb'
124
125
  load 'morpheus/cli/monitoring_contacts_command.rb'
126
+ load 'morpheus/cli/monitoring_alerts_command.rb'
125
127
  load 'morpheus/cli/monitoring_groups_command.rb'
126
128
  load 'morpheus/cli/monitoring_apps_command.rb'
129
+ load 'morpheus/cli/logs_command.rb'
127
130
  load 'morpheus/cli/policies_command.rb'
128
131
  load 'morpheus/cli/networks_command.rb'
129
132
  load 'morpheus/cli/network_groups_command.rb'
@@ -145,6 +148,7 @@ module Morpheus
145
148
  load 'morpheus/cli/packages_command.rb'
146
149
  load 'morpheus/cli/reports_command.rb'
147
150
  load 'morpheus/cli/environments_command.rb'
151
+ load 'morpheus/cli/whitelabel_settings_command.rb'
148
152
  load 'morpheus/cli/wiki_command.rb'
149
153
 
150
154
  # Your new commands go here...
@@ -39,6 +39,7 @@ class Morpheus::Cli::AccessTokenCommand
39
39
  end
40
40
  return 1
41
41
  end
42
+ return 0
42
43
  end
43
44
 
44
45
  def handle(args)
@@ -124,9 +125,24 @@ class Morpheus::Cli::AccessTokenCommand
124
125
  raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
125
126
  end
126
127
 
127
- connect(options)
128
+ connect_result = connect(options)
129
+ return connect_result if (connect_result.is_a?(Numeric) && connect_result != 0)
130
+ # if @wallet.nil? || @wallet['access_token'].nil?
131
+ # unless options[:quiet]
132
+ # print_error yellow,"You are not currently logged in to #{display_appliance(@appliance_name, @appliance_url)}",reset,"\n"
133
+ # print_error yellow,"Use the 'login' command.",reset,"\n"
134
+ # end
135
+ # return 1
136
+ # end
137
+ if @wallet['refresh_token'].nil?
138
+ unless options[:quiet]
139
+ print_error yellow,"No refresh token found for appliance #{display_appliance(@appliance_name, @appliance_url)}",reset,"\n"
140
+ print_error yellow,"Use the 'login' command.",reset,"\n"
141
+ end
142
+ return 1
143
+ end
128
144
  if options[:dry_run]
129
- print_dry_run Morpheus::AuthInterface.new(@appliance_url).setopts(options).use_refresh_token(@wallet['refresh_token'])
145
+ print_dry_run Morpheus::AuthInterface.new({url:@appliance_url}).setopts(options).use_refresh_token(@wallet['refresh_token'])
130
146
  return 0
131
147
  end
132
148
  unless options[:quiet]
@@ -0,0 +1,303 @@
1
+ require 'morpheus/cli/cli_command'
2
+
3
+ class Morpheus::Cli::ApplianceSettingsCommand
4
+ include Morpheus::Cli::CliCommand
5
+ include Morpheus::Cli::AccountsHelper
6
+
7
+ set_command_name :'appliance-settings'
8
+
9
+ register_subcommands :get, :update
10
+
11
+ set_default_subcommand :get
12
+
13
+ set_command_hidden # hiding until 4.2 release
14
+
15
+ def connect(opts)
16
+ @api_client = establish_remote_appliance_connection(opts)
17
+ @appliance_settings_interface = @api_client.appliance_settings
18
+ @roles_interface = @api_client.roles
19
+ end
20
+
21
+ def handle(args)
22
+ handle_subcommand(args)
23
+ end
24
+
25
+ def get(args)
26
+ options = {}
27
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
28
+ opts.banner = subcommand_usage()
29
+ build_common_options(opts, options, [:query, :json, :yaml, :csv, :fields, :dry_run, :remote])
30
+ opts.footer = "Get appliance settings."
31
+ end
32
+ optparse.parse!(args)
33
+ connect(options)
34
+ if args.count != 0
35
+ raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args}\n#{optparse}"
36
+ return 1
37
+ end
38
+
39
+ begin
40
+ @appliance_settings_interface.setopts(options)
41
+
42
+ if options[:dry_run]
43
+ print_dry_run @appliance_settings_interface.dry.get()
44
+ return
45
+ end
46
+ json_response = @appliance_settings_interface.get()
47
+ if options[:json]
48
+ puts as_json(json_response, options, "applianceSettings")
49
+ return 0
50
+ elsif options[:yaml]
51
+ puts as_yaml(json_response, options, "applianceSettings")
52
+ return 0
53
+ elsif options[:csv]
54
+ puts records_as_csv([json_response['applianceSettings']], options)
55
+ return 0
56
+ end
57
+
58
+ appliance_settings = json_response['applianceSettings']
59
+
60
+ print_h1 "Appliance Settings"
61
+ print cyan
62
+ description_cols = {
63
+ "Appliance URL" => lambda {|it| it['applianceUrl'] },
64
+ "Internal Appliance URL (PXE)" => lambda {|it| it['internalApplianceUrl'] },
65
+ "API Allowed Origins" => lambda {|it| it['apiAllowedOrigins'] },
66
+ # Tenant Management Settings
67
+ "Registration Enabled" => lambda {|it| format_boolean(it['registrationEnabled']) },
68
+ "Default Tenant Role" => lambda {|it| it['defaultRoleId'] },
69
+ "Default User Role" => lambda {|it| it['defaultUserRoleId'] },
70
+ "Docker Privileged Mode" => lambda {|it| format_boolean(it['dockerPrivilegedMode']) },
71
+ # User Management Settings
72
+ "Expire Password After" => lambda {|it| it['expirePwdDays'] == 0 ? 'Disabled' : it['expirePwdDays'] + ' Days' },
73
+ "Disable User After Attempts" => lambda {|it| it['disableAfterAttempts'] == 0 ? 'Disabled' : it['disableAfterAttempts']},
74
+ "Disable User if Inactive For" => lambda {|it| it['disableAfterDaysInactive'] == 0 ? 'Disabled' : it['disableAfterDaysInactive'] + ' Days' },
75
+ "Send warning email before deactivating" => lambda {|it| it['warnUserDaysBefore'] == 0 ? 'Disabled' : it['warnUserDaysBefore'] + ' Days' },
76
+ # Email Settings
77
+ "SMTP From Address" => lambda {|it| it['smtpMailFrom'] },
78
+ "SMTP Server" => lambda {|it| it['smtpServer'] },
79
+ "SMTP Port" => lambda {|it| it['smtpPort'] },
80
+ "SMTP SSL Enabled" => lambda {|it| format_boolean(it['smtpSSL']) },
81
+ "SMTP TLS Encryption" => lambda {|it| format_boolean(it['smtpTLS']) },
82
+ "SMTP User" => lambda {|it| it['smtpUser'] },
83
+ "SMTP Password" => lambda {|it| it['smtpPassword'] },
84
+ # Proxy Settings
85
+ "Proxy Host" => lambda {|it| it['proxyHost'] },
86
+ "Proxy Port" => lambda {|it| it['proxyPort'] },
87
+ "Proxy User" => lambda {|it| it['proxyUser'] },
88
+ "Proxy Password" => lambda {|it| it['proxyPassword'] },
89
+ "Proxy Domain" => lambda {|it| it['proxyDomain'] },
90
+ "Proxy Workstation" => lambda {|it| it['proxyWorkstation'] },
91
+ # Currency Settings
92
+ "Currency Provider" => lambda {|it| it['currencyProvider'] },
93
+ "Currency Provider API Key" => lambda {|it| it['currencyKey'] },
94
+ }
95
+ print_description_list(description_cols, appliance_settings)
96
+
97
+ enabled_zone_types = appliance_settings['enabledZoneTypes']
98
+
99
+ if enabled_zone_types.nil? || enabled_zone_types.empty?
100
+ print_h2 "Enabled Clouds"
101
+ print cyan
102
+ print yellow "No Clouds Enabled"
103
+ else
104
+ print_h2 "Enabled Clouds"
105
+ print cyan
106
+ print enabled_zone_types.collect {|it| it['name']}.join(', ')
107
+ end
108
+ print reset "\n"
109
+ return 0
110
+ rescue RestClient::Exception => e
111
+ print_rest_exception(e, options)
112
+ return 1
113
+ end
114
+ end
115
+
116
+ def update(args)
117
+ options = {}
118
+ params = {}
119
+
120
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
121
+ opts.banner = opts.banner = subcommand_usage()
122
+ opts.on("--appliance-url STRING", String, "Appliance URL") do |val|
123
+ params['applianceUrl'] = val == 'null' ? nil : val
124
+ end
125
+ opts.on("--internal-appliance-url STRING", String, "Internal appliance URL (PXE)") do |val|
126
+ params['internalApplianceUrl'] = val == 'null' ? nil : val
127
+ end
128
+ opts.on("--api-allowed-origins STRING", String, "API allowed origins") do |val|
129
+ params['corsAllowed'] = val == 'null' ? nil : val
130
+ end
131
+ opts.on("--registration-enabled [on|off]", ['on','off'], "Tenant registration enabled") do |val|
132
+ params['registrationEnabled'] = ['true','on'].include?(val.to_s.strip)
133
+ end
134
+ opts.on("--default-tenant-role ROLE", String, "Default tenant role authority or ID") do |val|
135
+ options[:defaultTenantRole] = val == 'null' ? nil : val
136
+ end
137
+ opts.on("--default-user-role ROLE", String, "Default user role authority or ID") do |val|
138
+ options[:defaultUserRole] = val == 'null' ? nil : val
139
+ end
140
+ opts.on("--docker-privileged-mode [on|off]", ['on','off'], "Docker privileged mode") do |val|
141
+ params['dockerPrivilegedMode'] = ['true','on'].include?(val.to_s.strip)
142
+ end
143
+ opts.on("--expire-pwd-days NUMBER", Integer, "Expire password after specified days. Set to 0 to disable this feature") do |val|
144
+ params['expirePwdDays'] = val.to_i
145
+ end
146
+ opts.on("--disable-after-attempts NUMBER", Integer, "Disable user after attempts. Set to 0 to disable this feature") do |val|
147
+ params['disableAfterAttempts'] = val.to_i
148
+ end
149
+ opts.on("--disable-after-days-inactive NUMBER", Integer, "Disable user if inactive for specified days. Set to 0 to disable this feature") do |val|
150
+ params['disableAfterDaysInactive'] = val.to_i
151
+ end
152
+ opts.on("--warn-user-days-before NUMBER", Integer, "Send warning email before deactivating. Set to 0 to disable this feature") do |val|
153
+ params['warnUserDaysBefore'] = val.to_i
154
+ end
155
+ opts.on("--smtp-from-email STRING", String, "From email address") do |val|
156
+ params['smtpMailFrom'] = val == 'null' ? nil : val
157
+ end
158
+ opts.on("--smtp-server STRING", String, "SMTP server / host") do |val|
159
+ params['smtpServer'] = val == 'null' ? nil : val
160
+ end
161
+ opts.on("--smtp-port NUMBER", String, "SMTP port") do |val|
162
+ params['smtpPort'] = val == 'null' ? nil : val.to_i
163
+ end
164
+ opts.on("--smtp-ssl [on|off]", ['on','off'], "Use SSL for SMTP connections") do |val|
165
+ params['smtpSSL'] = ['true','on'].include?(val.to_s.strip)
166
+ end
167
+ opts.on("--smtp-tls [on|off]", ['on','off'], "Use TLS for SMTP connections") do |val|
168
+ params['smtpTLS'] = ['true','on'].include?(val.to_s.strip)
169
+ end
170
+ opts.on("--smtp-user STRING", String, "SMTP user") do |val|
171
+ params['smtpUser'] = val == 'null' ? nil : val
172
+ end
173
+ opts.on("--smtp-password STRING", String, "SMTP password") do |val|
174
+ params['smtpPassword'] = val == 'null' ? nil : val
175
+ end
176
+ opts.on("--proxy-host STRING", String, "Proxy host") do |val|
177
+ params['proxyHost'] = val == 'null' ? nil : val
178
+ end
179
+ opts.on("--proxy-port NUMBER", String, "Proxy port") do |val|
180
+ params['proxyPort'] = val == 'null' ? nil : val.to_i
181
+ end
182
+ opts.on("--proxy-user STRING", String, "Proxy user") do |val|
183
+ params['proxyUser'] = val == 'null' ? nil : val
184
+ end
185
+ opts.on("--proxy-password STRING", String, "Proxy password") do |val|
186
+ params['proxyPassword'] = val == 'null' ? nil : val
187
+ end
188
+ opts.on("--proxy-domain STRING", String, "Proxy domain") do |val|
189
+ params['proxyDomain'] = val == 'null' ? nil : val
190
+ end
191
+ opts.on("--proxy-workstation STRING", String, "Proxy workstation") do |val|
192
+ params['proxyWorkstation'] = val == 'null' ? nil : val
193
+ end
194
+ opts.on("--currency-provider STRING", String, "Currency provider") do |val|
195
+ params['currencyProvider'] = val == 'null' ? nil : val
196
+ end
197
+ opts.on("--currency-key STRING", String, "Currency provider API key") do |val|
198
+ params['currencyKey'] = val == 'null' ? nil : val
199
+ end
200
+ opts.on("--enable-all-clouds", "Set all cloud types enabled status on, can be used in conjunction with --disable-clouds") do
201
+ params['enableAllZoneTypes'] = true
202
+ end
203
+ opts.on("--enable-clouds LIST", Array, "List of cloud types to set enabled status on, each item can be either name or ID") do |list|
204
+ options[:enableZoneTypes] = list
205
+ end
206
+ opts.on("--disable-clouds LIST", Array, "List of cloud types to set enabled status off, each item can be either name or ID") do |list|
207
+ options[:disableZoneTypes] = list
208
+ end
209
+ opts.on("--disable-all-clouds", "Set all cloud types enabled status off, can be used in conjunction with --enable-clouds options") do
210
+ params['disableAllZoneTypes'] = true
211
+ end
212
+ build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
213
+ end
214
+
215
+ optparse.parse!(args)
216
+ connect(options)
217
+ if args.count != 0
218
+ raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args}\n#{optparse}"
219
+ return 1
220
+ end
221
+
222
+ begin
223
+ payload = parse_payload(options)
224
+
225
+ if !payload
226
+ available_zone_types = @appliance_settings_interface.cloud_types['zoneTypes']
227
+
228
+ if options[:enableZoneTypes]
229
+ params['enableZoneTypes'] = options[:enableZoneTypes].collect do |zone_type_id|
230
+ zone_type = available_zone_types.find { |it| it['id'] == zone_type_id || it['id'].to_s == zone_type_id || it['name'] == zone_type_id }
231
+ if zone_type.nil?
232
+ print_red_alert "Cloud type #{zone_type_id} not found"
233
+ exit 1
234
+ end
235
+ zone_type['id']
236
+ end
237
+ end
238
+ if options[:disableZoneTypes]
239
+ params['disableZoneTypes'] = options[:disableZoneTypes].collect do |zone_type_id|
240
+ zone_type = available_zone_types.find { |it| it['id'] == zone_type_id || it['id'].to_s == zone_type_id || it['name'] == zone_type_id }
241
+ if zone_type.nil?
242
+ print_red_alert "Cloud type #{zone_type_id} not found"
243
+ exit 1
244
+ end
245
+ zone_type['id']
246
+ end
247
+ end
248
+
249
+ if options[:defaultTenantRole]
250
+ role = find_role_by_name_or_id(nil, options[:defaultTenantRole])
251
+ if role.nil?
252
+ exit 1
253
+ end
254
+ params['defaultRoleId'] = role['id']
255
+ end
256
+
257
+ if options[:defaultUserRole]
258
+ role = find_role_by_name_or_id(nil, options[:defaultUserRole])
259
+ if role.nil?
260
+ print_red_alert "Default user role #{options[:defaultUserRole]} not found"
261
+ exit 1
262
+ end
263
+ params['defaultUserRoleId'] = role['id']
264
+ end
265
+
266
+ if params['currencyProvider']
267
+ currency_providers = @api_client.options.options_for_source('currencyProviders')['data']
268
+ currency_provider = currency_providers.find {|it| it['name'] == params['currencyProvider'] || it['value'] == params['currencyProvider']}
269
+
270
+ if currency_provider.nil?
271
+ print_red_alert "Invalid currency provider #{params['currencyProvider']}, valid options: #{currency_providers.collect {|it| it['value']}.join('|')}"
272
+ exit 1
273
+ end
274
+ end
275
+
276
+ payload = {'applianceSettings' => params}
277
+ end
278
+
279
+ @appliance_settings_interface.setopts(options)
280
+ if options[:dry_run]
281
+ print_dry_run @appliance_settings_interface.dry.update(payload)
282
+ return
283
+ end
284
+ json_response = @appliance_settings_interface.update(payload)
285
+
286
+ if options[:json]
287
+ puts as_json(json_response, options)
288
+ elsif !options[:quiet]
289
+ if json_response['success']
290
+ print_green_success "Updated appliance settings"
291
+ get([] + (options[:remote] ? ["-r",options[:remote]] : []))
292
+ else
293
+ print_red_alert "Error updating appliance settings: #{json_response['msg'] || json_response['errors']}"
294
+ end
295
+ end
296
+ return 0
297
+
298
+ rescue RestClient::Exception => e
299
+ print_rest_exception(e, options)
300
+ exit 1
301
+ end
302
+ end
303
+ end