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