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.
- checksums.yaml +4 -4
- data/lib/morpheus.rb +5 -0
- data/lib/morpheus/api.rb +2 -2
- data/lib/morpheus/api/api_client.rb +47 -12
- data/lib/morpheus/api/appliance_settings_interface.rb +30 -0
- data/lib/morpheus/api/auth_interface.rb +14 -10
- data/lib/morpheus/api/clouds_interface.rb +7 -0
- data/lib/morpheus/api/clusters_interface.rb +17 -5
- data/lib/morpheus/api/custom_instance_types_interface.rb +2 -3
- data/lib/morpheus/api/deployments_interface.rb +7 -0
- data/lib/morpheus/api/execute_schedules_interface.rb +2 -3
- data/lib/morpheus/api/groups_interface.rb +7 -0
- data/lib/morpheus/api/license_interface.rb +9 -2
- data/lib/morpheus/api/load_balancers_interface.rb +7 -0
- data/lib/morpheus/api/logs_interface.rb +11 -2
- data/lib/morpheus/api/monitoring_alerts_interface.rb +45 -0
- data/lib/morpheus/api/monitoring_checks_interface.rb +2 -2
- data/lib/morpheus/api/monitoring_interface.rb +13 -8
- data/lib/morpheus/api/power_schedules_interface.rb +2 -3
- data/lib/morpheus/api/servers_interface.rb +5 -2
- data/lib/morpheus/api/setup_interface.rb +25 -7
- data/lib/morpheus/api/task_sets_interface.rb +7 -1
- data/lib/morpheus/api/tasks_interface.rb +7 -0
- data/lib/morpheus/api/virtual_images_interface.rb +2 -3
- data/lib/morpheus/api/whitelabel_settings_interface.rb +60 -0
- data/lib/morpheus/cli.rb +18 -14
- data/lib/morpheus/cli/access_token_command.rb +18 -2
- data/lib/morpheus/cli/appliance_settings_command.rb +303 -0
- data/lib/morpheus/cli/apps.rb +4 -3
- data/lib/morpheus/cli/archives_command.rb +0 -21
- data/lib/morpheus/cli/blueprints_command.rb +2 -2
- data/lib/morpheus/cli/cli_command.rb +32 -8
- data/lib/morpheus/cli/clouds.rb +6 -11
- data/lib/morpheus/cli/clusters.rb +346 -117
- data/lib/morpheus/cli/command_error.rb +4 -0
- data/lib/morpheus/cli/commands/standard/man_command.rb +1 -1
- data/lib/morpheus/cli/containers_command.rb +2 -1
- data/lib/morpheus/cli/credentials.rb +49 -4
- data/lib/morpheus/cli/deployments.rb +2 -2
- data/lib/morpheus/cli/dot_file.rb +2 -2
- data/lib/morpheus/cli/error_handler.rb +6 -3
- data/lib/morpheus/cli/execute_schedules_command.rb +1 -1
- data/lib/morpheus/cli/groups.rb +4 -4
- data/lib/morpheus/cli/hosts.rb +3 -2
- data/lib/morpheus/cli/image_builder_command.rb +0 -21
- data/lib/morpheus/cli/instances.rb +17 -4
- data/lib/morpheus/cli/library_container_types_command.rb +1 -1
- data/lib/morpheus/cli/library_layouts_command.rb +1 -1
- data/lib/morpheus/cli/library_upgrades_command.rb +1 -1
- data/lib/morpheus/cli/license.rb +185 -72
- data/lib/morpheus/cli/load_balancers.rb +4 -4
- data/lib/morpheus/cli/login.rb +4 -0
- data/lib/morpheus/cli/logs_command.rb +132 -0
- data/lib/morpheus/cli/mixins/infrastructure_helper.rb +2 -2
- data/lib/morpheus/cli/mixins/logs_helper.rb +65 -0
- data/lib/morpheus/cli/mixins/monitoring_helper.rb +410 -28
- data/lib/morpheus/cli/mixins/print_helper.rb +14 -4
- data/lib/morpheus/cli/monitoring_alerts_command.rb +800 -0
- data/lib/morpheus/cli/monitoring_apps_command.rb +85 -28
- data/lib/morpheus/cli/monitoring_checks_command.rb +60 -27
- data/lib/morpheus/cli/monitoring_contacts_command.rb +54 -79
- data/lib/morpheus/cli/monitoring_groups_command.rb +62 -23
- data/lib/morpheus/cli/monitoring_incidents_command.rb +91 -70
- data/lib/morpheus/cli/network_pools_command.rb +39 -23
- data/lib/morpheus/cli/power_schedules_command.rb +1 -1
- data/lib/morpheus/cli/remote.rb +834 -275
- data/lib/morpheus/cli/roles.rb +100 -38
- data/lib/morpheus/cli/tasks.rb +1 -1
- data/lib/morpheus/cli/user_settings_command.rb +20 -12
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/virtual_images.rb +1 -1
- data/lib/morpheus/cli/whitelabel_settings_command.rb +546 -0
- data/lib/morpheus/cli/whoami.rb +1 -1
- data/lib/morpheus/cli/workflows.rb +2 -2
- data/lib/morpheus/terminal.rb +22 -8
- 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
|
29
|
-
Morpheus::
|
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(
|
19
|
+
def list(params={})
|
20
20
|
url = "#{@base_url}/api/power-schedules"
|
21
|
-
headers = { params:
|
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(
|
26
|
-
|
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
|
-
|
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={}
|
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
|
32
|
+
execute(method: :get, url: url, headers: headers)
|
33
33
|
end
|
34
34
|
|
35
|
-
def init(payload={}
|
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
|
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(
|
36
|
+
def list(params={})
|
37
37
|
url = "#{@base_url}/api/virtual-images"
|
38
|
-
headers = { params:
|
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
|
data/lib/morpheus/cli.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require 'morpheus/cli/version'
|
2
2
|
require 'morpheus/cli/command_error'
|
3
|
-
require
|
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
|
-
|
15
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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(
|
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
|