morpheus-cli 3.1.2.1 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/morpheus/api/api_client.rb +6 -2
- data/lib/morpheus/api/license_interface.rb +7 -0
- data/lib/morpheus/api/monitoring_apps_interface.rb +15 -2
- data/lib/morpheus/api/{checks_interface.rb → monitoring_checks_interface.rb} +8 -21
- data/lib/morpheus/api/monitoring_groups_interface.rb +23 -2
- data/lib/morpheus/api/{incidents_interface.rb → monitoring_incidents_interface.rb} +5 -5
- data/lib/morpheus/api/monitoring_interface.rb +4 -4
- data/lib/morpheus/api/user_groups_interface.rb +65 -0
- data/lib/morpheus/cli.rb +1 -0
- data/lib/morpheus/cli/curl_command.rb +9 -7
- data/lib/morpheus/cli/dot_file.rb +11 -5
- data/lib/morpheus/cli/echo_command.rb +27 -3
- data/lib/morpheus/cli/license.rb +109 -20
- data/lib/morpheus/cli/login.rb +2 -0
- data/lib/morpheus/cli/logout.rb +2 -0
- data/lib/morpheus/cli/mixins/monitoring_helper.rb +97 -37
- data/lib/morpheus/cli/mixins/print_helper.rb +5 -2
- data/lib/morpheus/cli/monitoring_apps_command.rb +564 -9
- data/lib/morpheus/cli/monitoring_checks_command.rb +326 -93
- data/lib/morpheus/cli/monitoring_contacts_command.rb +2 -2
- data/lib/morpheus/cli/monitoring_groups_command.rb +540 -10
- data/lib/morpheus/cli/monitoring_incidents_command.rb +88 -56
- data/lib/morpheus/cli/remote.rb +6 -0
- data/lib/morpheus/cli/roles.rb +1 -1
- data/lib/morpheus/cli/set_prompt_command.rb +1 -0
- data/lib/morpheus/cli/shell.rb +17 -8
- data/lib/morpheus/cli/user_groups_command.rb +574 -0
- data/lib/morpheus/cli/users.rb +221 -115
- data/lib/morpheus/cli/version.rb +1 -1
- data/morpheus-cli.gemspec +1 -2
- metadata +11 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f32e58bc8431581ac6d29c7c8b2ff37b2f5084c2
|
4
|
+
data.tar.gz: 4f40c2a106aba9b340d3900c51bfa201b95d1ed4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58d1640fdc65dba08ca947cdcb5969899ce652073291b44801549e266be28ba203367112cabcfbc89ae0ee91933c1e1dcd684b025dc4d6246d9857291a2848f1
|
7
|
+
data.tar.gz: c5a073c80d735dee9a2a68631d8663aa9824b4fcf534ad619a8a0385935362f1f960746ba1a8d492e5a0c5ecfe005415c5117eb184d9822e7e7c2e7b7f5eba26
|
@@ -141,6 +141,10 @@ class Morpheus::APIClient
|
|
141
141
|
Morpheus::UsersInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
|
142
142
|
end
|
143
143
|
|
144
|
+
def user_groups
|
145
|
+
Morpheus::UserGroupsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
|
146
|
+
end
|
147
|
+
|
144
148
|
def logs
|
145
149
|
Morpheus::LogsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
|
146
150
|
end
|
@@ -182,12 +186,12 @@ class Morpheus::APIClient
|
|
182
186
|
end
|
183
187
|
|
184
188
|
# def checks
|
185
|
-
# # Morpheus::
|
189
|
+
# # Morpheus::MonitoringChecksInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
|
186
190
|
# monitoring.checks
|
187
191
|
# end
|
188
192
|
|
189
193
|
# def incidents
|
190
|
-
# # Morpheus::
|
194
|
+
# # Morpheus::MonitoringIncidentsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
|
191
195
|
# monitoring.incidents
|
192
196
|
# end
|
193
197
|
|
@@ -21,4 +21,11 @@ class Morpheus::LicenseInterface < Morpheus::APIClient
|
|
21
21
|
execute(method: :post, url: url, headers: headers, payload: payload.to_json)
|
22
22
|
end
|
23
23
|
|
24
|
+
def decode(key)
|
25
|
+
url = "#{@base_url}/api/license/decode"
|
26
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
27
|
+
payload = {license: key}
|
28
|
+
execute(method: :post, url: url, headers: headers, payload: payload.to_json)
|
29
|
+
end
|
30
|
+
|
24
31
|
end
|
@@ -37,11 +37,24 @@ class Morpheus::MonitoringAppsInterface < Morpheus::APIClient
|
|
37
37
|
execute(opts)
|
38
38
|
end
|
39
39
|
|
40
|
-
def destroy(id)
|
40
|
+
def destroy(id, payload={})
|
41
41
|
url = "#{@base_url}/api/monitoring/apps/#{id}"
|
42
42
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
43
|
-
opts = {method: :delete, url: url, headers: headers}
|
43
|
+
opts = {method: :delete, url: url, headers: headers, payload: payload.to_json}
|
44
44
|
execute(opts)
|
45
45
|
end
|
46
46
|
|
47
|
+
def quarantine(id, payload={})
|
48
|
+
url = "#{@base_url}/api/monitoring/apps/#{id}/quarantine"
|
49
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
50
|
+
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
51
|
+
execute(opts)
|
52
|
+
end
|
53
|
+
|
54
|
+
def statistics(id, params={})
|
55
|
+
url = "#{@base_url}/api/monitoring/apps/#{id}/statistics"
|
56
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
57
|
+
opts = {method: :get, url: url, headers: headers}
|
58
|
+
execute(opts)
|
59
|
+
end
|
47
60
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'morpheus/api/api_client'
|
2
2
|
|
3
|
-
class Morpheus::
|
3
|
+
class Morpheus::MonitoringChecksInterface < Morpheus::APIClient
|
4
4
|
def initialize(access_token, refresh_token,expires_at = nil, base_url=nil)
|
5
5
|
@access_token = access_token
|
6
6
|
@refresh_token = refresh_token
|
@@ -23,14 +23,12 @@ class Morpheus::ChecksInterface < Morpheus::APIClient
|
|
23
23
|
execute(opts)
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
# execute(opts)
|
33
|
-
# end
|
26
|
+
def create(payload)
|
27
|
+
url = "#{@base_url}/api/monitoring/checks"
|
28
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
29
|
+
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
30
|
+
execute(opts)
|
31
|
+
end
|
34
32
|
|
35
33
|
def update(id, options)
|
36
34
|
url = "#{@base_url}/api/monitoring/checks/#{id}"
|
@@ -55,10 +53,6 @@ class Morpheus::ChecksInterface < Morpheus::APIClient
|
|
55
53
|
execute(opts)
|
56
54
|
end
|
57
55
|
|
58
|
-
def mute(id, payload={})
|
59
|
-
quarantine(id, payload)
|
60
|
-
end
|
61
|
-
|
62
56
|
def history(id, params={})
|
63
57
|
url = "#{@base_url}/api/monitoring/checks/#{id}/history"
|
64
58
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
@@ -66,13 +60,6 @@ class Morpheus::ChecksInterface < Morpheus::APIClient
|
|
66
60
|
execute(opts)
|
67
61
|
end
|
68
62
|
|
69
|
-
# def notifications(id)
|
70
|
-
# url = "#{@base_url}/api/monitoring/checks/#{id}/notifications"
|
71
|
-
# headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
72
|
-
# opts = {method: :get, url: url, headers: headers}
|
73
|
-
# execute(opts)
|
74
|
-
# end
|
75
|
-
|
76
63
|
def statistics(id)
|
77
64
|
url = "#{@base_url}/api/monitoring/checks/#{id}/statistics"
|
78
65
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
@@ -93,7 +80,7 @@ class Morpheus::ChecksInterface < Morpheus::APIClient
|
|
93
80
|
opts = {method: :get, url: url, headers: headers}
|
94
81
|
execute(opts)
|
95
82
|
end
|
96
|
-
|
83
|
+
|
97
84
|
# def events(id, params={})
|
98
85
|
# # JD: maybe switch to this instead /api/monitoring/checks/#{id}/events instead?
|
99
86
|
# # url = "#{@base_url}/api/monitoring/checks/#{id}/events"
|
@@ -37,10 +37,31 @@ class Morpheus::MonitoringGroupsInterface < Morpheus::APIClient
|
|
37
37
|
execute(opts)
|
38
38
|
end
|
39
39
|
|
40
|
-
def destroy(id)
|
40
|
+
def destroy(id, payload={})
|
41
41
|
url = "#{@base_url}/api/monitoring/groups/#{id}"
|
42
42
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
43
|
-
opts = {method: :delete, url: url, headers: headers}
|
43
|
+
opts = {method: :delete, url: url, headers: headers, payload: payload.to_json}
|
44
|
+
execute(opts)
|
45
|
+
end
|
46
|
+
|
47
|
+
def quarantine(id, payload={})
|
48
|
+
url = "#{@base_url}/api/monitoring/groups/#{id}/quarantine"
|
49
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
50
|
+
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
51
|
+
execute(opts)
|
52
|
+
end
|
53
|
+
|
54
|
+
def history(id, params={})
|
55
|
+
url = "#{@base_url}/api/monitoring/groups/#{id}/history"
|
56
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
57
|
+
opts = {method: :get, url: url, headers: headers}
|
58
|
+
execute(opts)
|
59
|
+
end
|
60
|
+
|
61
|
+
def statistics(id)
|
62
|
+
url = "#{@base_url}/api/monitoring/groups/#{id}/statistics"
|
63
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
64
|
+
opts = {method: :get, url: url, headers: headers}
|
44
65
|
execute(opts)
|
45
66
|
end
|
46
67
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'morpheus/api/api_client'
|
2
2
|
|
3
|
-
class Morpheus::
|
3
|
+
class Morpheus::MonitoringIncidentsInterface < Morpheus::APIClient
|
4
4
|
def initialize(access_token, refresh_token,expires_at = nil, base_url=nil)
|
5
5
|
@access_token = access_token
|
6
6
|
@refresh_token = refresh_token
|
@@ -46,10 +46,10 @@ class Morpheus::IncidentsInterface < Morpheus::APIClient
|
|
46
46
|
execute(opts)
|
47
47
|
end
|
48
48
|
|
49
|
-
def destroy(id)
|
49
|
+
def destroy(id, payload={})
|
50
50
|
url = "#{@base_url}/api/monitoring/incidents/#{id}"
|
51
51
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
52
|
-
opts = {method: :delete, url: url, headers: headers}
|
52
|
+
opts = {method: :delete, url: url, headers: headers, payload: payload.to_json}
|
53
53
|
execute(opts)
|
54
54
|
end
|
55
55
|
|
@@ -90,11 +90,11 @@ class Morpheus::IncidentsInterface < Morpheus::APIClient
|
|
90
90
|
execute(opts)
|
91
91
|
end
|
92
92
|
|
93
|
-
def events(id)
|
93
|
+
def events(id, params={})
|
94
94
|
# JD: maybe switch to this instead /api/monitoring/incidents/#{id}/events instead?
|
95
95
|
# url = "#{@base_url}/api/monitoring/incidents/#{id}/events"
|
96
96
|
url = "#{@base_url}/api/monitoring/incident-events/#{id}"
|
97
|
-
headers = { :authorization
|
97
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
98
98
|
opts = {method: :get, url: url, headers: headers}
|
99
99
|
execute(opts)
|
100
100
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'morpheus/api/api_client'
|
2
|
-
require 'morpheus/api/
|
3
|
-
require 'morpheus/api/
|
2
|
+
require 'morpheus/api/monitoring_checks_interface'
|
3
|
+
require 'morpheus/api/monitoring_incidents_interface'
|
4
4
|
require 'morpheus/api/monitoring_contacts_interface'
|
5
5
|
require 'morpheus/api/monitoring_groups_interface'
|
6
6
|
require 'morpheus/api/monitoring_apps_interface'
|
@@ -14,11 +14,11 @@ class Morpheus::MonitoringInterface < Morpheus::APIClient
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def checks
|
17
|
-
Morpheus::
|
17
|
+
Morpheus::MonitoringChecksInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
|
18
18
|
end
|
19
19
|
|
20
20
|
def incidents
|
21
|
-
Morpheus::
|
21
|
+
Morpheus::MonitoringIncidentsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
|
22
22
|
end
|
23
23
|
|
24
24
|
def contacts
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'morpheus/api/api_client'
|
2
|
+
|
3
|
+
class Morpheus::UserGroupsInterface < Morpheus::APIClient
|
4
|
+
def initialize(access_token, refresh_token, expires_at = nil, base_url=nil)
|
5
|
+
@access_token = access_token
|
6
|
+
@refresh_token = refresh_token
|
7
|
+
@base_url = base_url
|
8
|
+
@expires_at = expires_at
|
9
|
+
end
|
10
|
+
|
11
|
+
def get(account_id, id)
|
12
|
+
raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
|
13
|
+
url = build_url(account_id, id)
|
14
|
+
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
15
|
+
opts = {method: :get, url: url, timeout: 10, headers: headers}
|
16
|
+
execute(opts)
|
17
|
+
end
|
18
|
+
|
19
|
+
def list(account_id, options={})
|
20
|
+
url = build_url(account_id)
|
21
|
+
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
22
|
+
headers[:params].merge!(options)
|
23
|
+
opts = {method: :get, url: url, timeout: 10, headers: headers}
|
24
|
+
execute(opts)
|
25
|
+
end
|
26
|
+
|
27
|
+
def create(account_id, options)
|
28
|
+
url = build_url(account_id)
|
29
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
30
|
+
payload = options
|
31
|
+
opts = {method: :post, url: url, timeout: 10, headers: headers, payload: payload.to_json}
|
32
|
+
execute(opts)
|
33
|
+
end
|
34
|
+
|
35
|
+
def update(account_id, id, options)
|
36
|
+
url = build_url(account_id, id)
|
37
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
38
|
+
payload = options
|
39
|
+
opts = {method: :put, url: url, timeout: 10, headers: headers, payload: payload.to_json}
|
40
|
+
execute(opts)
|
41
|
+
end
|
42
|
+
|
43
|
+
def destroy(account_id, id)
|
44
|
+
url = build_url(account_id, id)
|
45
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
46
|
+
opts = {method: :delete, url: url, timeout: 10, headers: headers}
|
47
|
+
execute(opts)
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def build_url(account_id=nil, user_id=nil)
|
53
|
+
url = "#{@base_url}/api"
|
54
|
+
if account_id
|
55
|
+
url += "/accounts/#{account_id}/user-groups"
|
56
|
+
else
|
57
|
+
url += "/user-groups"
|
58
|
+
end
|
59
|
+
if user_id
|
60
|
+
url += "/#{user_id}"
|
61
|
+
end
|
62
|
+
url
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
data/lib/morpheus/cli.rb
CHANGED
@@ -79,6 +79,7 @@ module Morpheus
|
|
79
79
|
load 'morpheus/cli/security_group_rules.rb'
|
80
80
|
load 'morpheus/cli/accounts.rb'
|
81
81
|
load 'morpheus/cli/users.rb'
|
82
|
+
load 'morpheus/cli/user_groups_command.rb'
|
82
83
|
load 'morpheus/cli/roles.rb'
|
83
84
|
load 'morpheus/cli/key_pairs.rb'
|
84
85
|
load 'morpheus/cli/virtual_images.rb'
|
@@ -49,12 +49,12 @@ EOT
|
|
49
49
|
curl_args.unshift "--inescure"
|
50
50
|
end
|
51
51
|
|
52
|
-
|
53
|
-
if
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
end
|
52
|
+
# @access_token = Morpheus::Cli::Credentials.new(@appliance_name, @appliance_url).load_saved_credentials()
|
53
|
+
# if !@access_token
|
54
|
+
# print yellow,"You are not currently logged in to #{display_appliance(@appliance_name, @appliance_url)}",reset,"\n"
|
55
|
+
# print yellow,"Use the 'login' command.",reset,"\n"
|
56
|
+
# return 0
|
57
|
+
# end
|
58
58
|
|
59
59
|
if !@appliance_url
|
60
60
|
raise "Unable to determine remote appliance url"
|
@@ -67,7 +67,9 @@ EOT
|
|
67
67
|
api_path = args[0].sub(/^\//, "")
|
68
68
|
url = "#{base_url}/#{api_path}"
|
69
69
|
curl_cmd = "curl \"#{url}\""
|
70
|
-
|
70
|
+
if @access_token
|
71
|
+
curl_cmd << " -H \"Authorization: Bearer #{@access_token}\""
|
72
|
+
end
|
71
73
|
if !curl_args.empty?
|
72
74
|
curl_cmd << " " + curl_args.join(' ')
|
73
75
|
end
|
@@ -55,16 +55,22 @@ class Morpheus::Cli::DotFile
|
|
55
55
|
|
56
56
|
# print "#{dark} #=> executing source file line #{line_num}: #{line}#{reset}\n" if Morpheus::Logging.debug?
|
57
57
|
|
58
|
-
#
|
59
|
-
command_list = line.strip.split(';').compact
|
58
|
+
# allow semicolons inside arguments too..
|
59
|
+
#command_list = line.strip.split(';').compact
|
60
|
+
command_list = line.split(/(;)(?=(?:[^"']|["|'][^"']*")*$)/).reject {|it| it.to_s.strip.empty? || it.to_s.strip == ";" }
|
60
61
|
command_list.each do |input|
|
61
62
|
input = input.strip
|
62
63
|
if input.empty?
|
63
64
|
next
|
64
65
|
end
|
65
|
-
argv =
|
66
|
-
|
67
|
-
|
66
|
+
argv = nil
|
67
|
+
begin
|
68
|
+
argv = Shellwords.shellsplit(input)
|
69
|
+
rescue => err
|
70
|
+
cmd_result = false
|
71
|
+
puts "#{red} Unparsable source file: #{@filename} line: #{line_num} '#{input}' #{reset} - #{err}"
|
72
|
+
end
|
73
|
+
if argv[0] && Morpheus::Cli::CliRegistry.has_command?(argv[0]) || Morpheus::Cli::CliRegistry.has_alias?(argv[0])
|
68
74
|
#log_history_command(input)
|
69
75
|
cmd_result = nil
|
70
76
|
begin
|
@@ -1,13 +1,33 @@
|
|
1
|
-
require 'optparse'
|
2
1
|
require 'morpheus/cli/cli_command'
|
2
|
+
require 'term/ansicolor'
|
3
3
|
require 'json'
|
4
4
|
|
5
|
-
# This is for use in dotfile scripts
|
6
|
-
|
5
|
+
# This is for use in dotfile scripts for printing
|
6
|
+
# It is also responsible for maintaining a map of variables
|
7
|
+
# that are also used in custom shell prompts.
|
8
|
+
class Morpheus::Cli::Echo
|
7
9
|
include Morpheus::Cli::CliCommand
|
8
10
|
set_command_name :echo
|
9
11
|
set_command_hidden
|
10
12
|
|
13
|
+
unless defined?(DEFAULT_VARIABLE_MAP)
|
14
|
+
DEFAULT_VARIABLE_MAP = {'%cyan' => Term::ANSIColor.cyan, '%magenta' => Term::ANSIColor.magenta, '%red' => Term::ANSIColor.red, '%green' => Term::ANSIColor.green, '%yellow' => Term::ANSIColor.yellow, '%dark' => Term::ANSIColor.dark, '%reset' => Term::ANSIColor.reset}
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.variable_map
|
18
|
+
@output_variable_map ||= recalculate_variable_map()
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.recalculate_variable_map()
|
22
|
+
var_map = {}
|
23
|
+
var_map.merge!(DEFAULT_VARIABLE_MAP)
|
24
|
+
appliance = ::Morpheus::Cli::Remote.load_active_remote()
|
25
|
+
if appliance
|
26
|
+
var_map.merge!({'%remote' => appliance[:name], '%remote_url' => appliance[:host], '%username' => appliance[:username]})
|
27
|
+
end
|
28
|
+
@output_variable_map = var_map
|
29
|
+
end
|
30
|
+
|
11
31
|
def handle(args)
|
12
32
|
append_newline = true
|
13
33
|
options = {}
|
@@ -21,6 +41,10 @@ class Morpheus::Cli::EchoCommand
|
|
21
41
|
optparse.parse!(args)
|
22
42
|
out = ""
|
23
43
|
out << args.join(' ')
|
44
|
+
|
45
|
+
self.class.variable_map.each do |k, v|
|
46
|
+
out.gsub!(k.to_s, v.to_s)
|
47
|
+
end
|
24
48
|
if append_newline
|
25
49
|
out << "\n"
|
26
50
|
end
|
data/lib/morpheus/cli/license.rb
CHANGED
@@ -7,7 +7,7 @@ require 'morpheus/cli/cli_command'
|
|
7
7
|
class Morpheus::Cli::License
|
8
8
|
include Morpheus::Cli::CliCommand
|
9
9
|
|
10
|
-
register_subcommands :get, :apply
|
10
|
+
register_subcommands :get, :apply, :decode
|
11
11
|
alias_subcommand :details, :get
|
12
12
|
|
13
13
|
def initialize()
|
@@ -26,7 +26,7 @@ class Morpheus::Cli::License
|
|
26
26
|
|
27
27
|
def get(args)
|
28
28
|
options = {}
|
29
|
-
optparse = OptionParser.new do|opts|
|
29
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
30
30
|
opts.banner = subcommand_usage()
|
31
31
|
build_common_options(opts, options, [:json, :dry_run, :remote])
|
32
32
|
end
|
@@ -37,26 +37,38 @@ class Morpheus::Cli::License
|
|
37
37
|
print_dry_run @license_interface.dry.get()
|
38
38
|
return
|
39
39
|
end
|
40
|
-
|
40
|
+
json_result = @license_interface.get()
|
41
|
+
license = json_result['license']
|
42
|
+
used_memory = json_result['licenseUsedMemory']
|
41
43
|
if options[:json]
|
42
|
-
puts JSON.pretty_generate(
|
44
|
+
puts JSON.pretty_generate(json_result)
|
43
45
|
else
|
44
|
-
if license
|
45
|
-
|
46
|
-
|
46
|
+
if license.nil?
|
47
|
+
puts_error "No license currently applied to the appliance."
|
48
|
+
return 1
|
47
49
|
else
|
48
50
|
print_h1 "License"
|
49
|
-
max_memory =
|
50
|
-
max_storage =
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
51
|
+
max_memory = "Unlimited"
|
52
|
+
max_storage = "Unlimited"
|
53
|
+
max_memory = Filesize.from("#{license['maxMemory']} B").pretty if license['maxMemory'].to_i != 0
|
54
|
+
max_storage = Filesize.from("#{license['maxStorage']} B").pretty if license['maxStorage'].to_i != 0
|
55
|
+
used_memory = Filesize.from("#{used_memory} B").pretty if used_memory.to_i != 0
|
56
|
+
print cyan
|
57
|
+
description_cols = {
|
58
|
+
"Account" => 'accountName',
|
59
|
+
"Product Tier" => lambda {|it| format_product_tier(it) },
|
60
|
+
"Start Date" => lambda {|it| format_local_dt(it['startDate']) },
|
61
|
+
"End Date" => lambda {|it| format_local_dt(it['endDate']) },
|
62
|
+
"Memory" => lambda {|it| "#{used_memory} / #{max_memory}" },
|
63
|
+
"Max Storage" => lambda {|it| "#{max_storage}" },
|
64
|
+
"Max Instances" => lambda {|it| it["maxInstances"].to_i == 0 ? 'Unlimited' : it["maxInstances"] },
|
65
|
+
"Hard Limit" => lambda {|it| it[""] == false ? 'Yes' : 'No' },
|
66
|
+
}
|
67
|
+
print_description_list(description_cols, license)
|
68
|
+
print reset,"\n"
|
57
69
|
end
|
58
|
-
print reset,"\n"
|
59
70
|
end
|
71
|
+
return 0
|
60
72
|
rescue RestClient::Exception => e
|
61
73
|
print_rest_exception(e, options)
|
62
74
|
return false
|
@@ -66,7 +78,7 @@ class Morpheus::Cli::License
|
|
66
78
|
def apply(args)
|
67
79
|
options = {}
|
68
80
|
account_name = nil
|
69
|
-
optparse = OptionParser.new do|opts|
|
81
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
70
82
|
opts.banner = subcommand_usage("[key]")
|
71
83
|
build_common_options(opts, options, [:json, :dry_run, :remote])
|
72
84
|
end
|
@@ -81,18 +93,95 @@ class Morpheus::Cli::License
|
|
81
93
|
end
|
82
94
|
if options[:dry_run]
|
83
95
|
print_dry_run @license_interface.dry.apply(key)
|
96
|
+
return 0
|
97
|
+
end
|
98
|
+
json_result = @license_interface.apply(key)
|
99
|
+
license = json_result['license']
|
100
|
+
if options[:json]
|
101
|
+
puts JSON.pretty_generate(json_result)
|
102
|
+
else
|
103
|
+
print_green_success "License applied successfully!"
|
104
|
+
# get([]) # show it
|
105
|
+
end
|
106
|
+
return 0
|
107
|
+
rescue RestClient::Exception => e
|
108
|
+
print_rest_exception(e, options)
|
109
|
+
return false
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def decode(args)
|
114
|
+
options = {}
|
115
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
116
|
+
opts.banner = subcommand_usage("[key]")
|
117
|
+
build_common_options(opts, options, [:json, :dry_run, :remote])
|
118
|
+
opts.footer = "Decode a license key."
|
119
|
+
end
|
120
|
+
optparse.parse!(args)
|
121
|
+
connect(options)
|
122
|
+
key = nil
|
123
|
+
if args[0]
|
124
|
+
key = args[0]
|
125
|
+
else
|
126
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'licenseKey', 'fieldLabel' => 'License Key', 'type' => 'text', 'required' => true}], options[:options])
|
127
|
+
key = v_prompt['licenseKey'] || ''
|
128
|
+
end
|
129
|
+
begin
|
130
|
+
if options[:dry_run]
|
131
|
+
print_dry_run @license_interface.dry.decode(key)
|
84
132
|
return
|
85
133
|
end
|
86
|
-
|
134
|
+
json_result = @license_interface.decode(key)
|
135
|
+
license = json_result['license']
|
87
136
|
if options[:json]
|
88
|
-
puts JSON.pretty_generate(
|
137
|
+
puts JSON.pretty_generate(json_result)
|
89
138
|
else
|
90
|
-
|
139
|
+
if license.nil?
|
140
|
+
puts_error "Unable to decode license."
|
141
|
+
puts_error json_results['msg'] if json_results['msg']
|
142
|
+
return 1
|
143
|
+
else
|
144
|
+
print_h1 "License"
|
145
|
+
max_memory = "Unlimited"
|
146
|
+
max_storage = "Unlimited"
|
147
|
+
max_memory = Filesize.from("#{license['maxMemory']} B").pretty if license['maxMemory'].to_i != 0
|
148
|
+
max_storage = Filesize.from("#{license['maxStorage']} B").pretty if license['maxStorage'].to_i != 0
|
149
|
+
print cyan
|
150
|
+
description_cols = {
|
151
|
+
"Account" => 'accountName',
|
152
|
+
"Product Tier" => lambda {|it| format_product_tier(it) },
|
153
|
+
"Start Date" => lambda {|it| format_local_dt(it['startDate']) },
|
154
|
+
"End Date" => lambda {|it| format_local_dt(it['endDate']) },
|
155
|
+
"Max Memory" => lambda {|it| max_memory },
|
156
|
+
"Max Storage" => lambda {|it| max_storage },
|
157
|
+
"Max Instances" => lambda {|it| it["maxInstances"].to_i == 0 ? 'Unlimited' : it["maxInstances"] },
|
158
|
+
"Hard Limit" => lambda {|it| it[""] == false ? 'Yes' : 'No' },
|
159
|
+
}
|
160
|
+
print_description_list(description_cols, license)
|
161
|
+
print reset,"\n"
|
162
|
+
end
|
91
163
|
end
|
164
|
+
return 0
|
92
165
|
rescue RestClient::Exception => e
|
93
166
|
print_rest_exception(e, options)
|
94
167
|
return false
|
95
168
|
end
|
96
169
|
end
|
97
170
|
|
171
|
+
def format_product_tier(license)
|
172
|
+
product_tier = license['productTier'] || 'capacity'
|
173
|
+
if product_tier == 'capacity'
|
174
|
+
'Capacity'
|
175
|
+
elsif product_tier == 'essentials'
|
176
|
+
'Essentials'
|
177
|
+
elsif product_tier == 'pro'
|
178
|
+
'Pro'
|
179
|
+
elsif product_tier == 'enterprise'
|
180
|
+
'Enterprise'
|
181
|
+
elsif product_tier == 'msp'
|
182
|
+
'Service Provider'
|
183
|
+
else
|
184
|
+
product_tier.to_s.capitalize
|
185
|
+
end
|
186
|
+
end
|
98
187
|
end
|