morpheus-cli 4.1.4 → 4.1.5

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 (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