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
@@ -125,6 +125,16 @@ module Morpheus::Cli::PrintHelper
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
+
def parse_rest_exception(e, options={})
|
129
|
+
data = {}
|
130
|
+
begin
|
131
|
+
data = JSON.parse(e.response.to_s)
|
132
|
+
rescue => ex
|
133
|
+
# Morpheus::Logging::DarkPrinter.puts "Failed to parse error response as JSON: #{ex}" if Morpheus::Logging.debug?
|
134
|
+
end
|
135
|
+
return data
|
136
|
+
end
|
137
|
+
|
128
138
|
def print_dry_run(api_request, options={})
|
129
139
|
# 2nd argument used to be command_string (String)
|
130
140
|
command_string = nil
|
@@ -212,14 +222,14 @@ module Morpheus::Cli::PrintHelper
|
|
212
222
|
# curl output?
|
213
223
|
if api_request[:curl] || options[:curl]
|
214
224
|
print "\n"
|
215
|
-
puts "#{cyan}#{bold}#{dark}CURL COMMAND#{reset}
|
225
|
+
puts "#{cyan}#{bold}#{dark}CURL COMMAND#{reset}"
|
216
226
|
print format_curl_command(http_method, url, headers, payload, options)
|
217
227
|
print "\n"
|
218
228
|
return
|
219
229
|
end
|
220
230
|
|
221
231
|
print "\n"
|
222
|
-
puts "#{cyan}#{bold}#{dark}REQUEST#{reset}
|
232
|
+
puts "#{cyan}#{bold}#{dark}REQUEST#{reset}"
|
223
233
|
request_string = "#{http_method.to_s.upcase} #{url}".strip
|
224
234
|
print request_string, "\n"
|
225
235
|
print cyan
|
@@ -233,7 +243,7 @@ module Morpheus::Cli::PrintHelper
|
|
233
243
|
#payload = "(unparsable) #{payload}"
|
234
244
|
end
|
235
245
|
end
|
236
|
-
puts "#{cyan}#{bold}#{dark}JSON#{reset}
|
246
|
+
puts "#{cyan}#{bold}#{dark}JSON#{reset}"
|
237
247
|
print JSON.pretty_generate(payload)
|
238
248
|
else
|
239
249
|
print "Content-Type: #{content_type}", "\n"
|
@@ -277,7 +287,7 @@ module Morpheus::Cli::PrintHelper
|
|
277
287
|
options ||= {}
|
278
288
|
# build curl [options]
|
279
289
|
out = ""
|
280
|
-
out << "curl -X#{http_method.to_s.upcase}
|
290
|
+
out << "curl -X#{http_method.to_s.upcase} \"#{url}\""
|
281
291
|
if headers
|
282
292
|
headers.each do |k,v|
|
283
293
|
# avoid weird [:headers][:params]
|
@@ -0,0 +1,800 @@
|
|
1
|
+
# require 'yaml'
|
2
|
+
require 'time'
|
3
|
+
require 'io/console'
|
4
|
+
require 'rest_client'
|
5
|
+
require 'optparse'
|
6
|
+
require 'filesize'
|
7
|
+
require 'morpheus/cli/cli_command'
|
8
|
+
require 'morpheus/cli/mixins/provisioning_helper'
|
9
|
+
|
10
|
+
class Morpheus::Cli::MonitoringAlertsCommand
|
11
|
+
include Morpheus::Cli::CliCommand
|
12
|
+
include Morpheus::Cli::MonitoringHelper
|
13
|
+
|
14
|
+
set_command_name :'monitor-alerts'
|
15
|
+
|
16
|
+
register_subcommands :list, :get, :add, :update, :remove
|
17
|
+
|
18
|
+
set_command_hidden # hiding until 4.1.1 release
|
19
|
+
|
20
|
+
def initialize()
|
21
|
+
# @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
|
22
|
+
end
|
23
|
+
|
24
|
+
def connect(opts)
|
25
|
+
@api_client = establish_remote_appliance_connection(opts)
|
26
|
+
@monitoring_interface = @api_client.monitoring
|
27
|
+
@monitoring_alerts_interface = @api_client.monitoring.alerts
|
28
|
+
@monitoring_checks_interface = @api_client.monitoring.checks
|
29
|
+
@monitoring_groups_interface = @api_client.monitoring.groups
|
30
|
+
@monitoring_apps_interface = @api_client.monitoring.apps
|
31
|
+
@monitoring_contacts_interface = @api_client.monitoring.contacts
|
32
|
+
end
|
33
|
+
|
34
|
+
def handle(args)
|
35
|
+
handle_subcommand(args)
|
36
|
+
end
|
37
|
+
|
38
|
+
def list(args)
|
39
|
+
options = {}
|
40
|
+
params = {}
|
41
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
42
|
+
opts.banner = subcommand_usage()
|
43
|
+
build_common_options(opts, options, [:list, :last_updated, :query, :json, :csv, :yaml, :fields, :json, :dry_run, :remote])
|
44
|
+
opts.footer = "List monitoring alert rules."
|
45
|
+
end
|
46
|
+
optparse.parse!(args)
|
47
|
+
connect(options)
|
48
|
+
begin
|
49
|
+
params.merge!(parse_list_options(options))
|
50
|
+
# JD: lastUpdated 500ing, alerts don't have that property ? =o Fix it!
|
51
|
+
@monitoring_alerts_interface.setopts(options)
|
52
|
+
if options[:dry_run]
|
53
|
+
print_dry_run @monitoring_alerts_interface.dry.list(params)
|
54
|
+
return
|
55
|
+
end
|
56
|
+
|
57
|
+
json_response = @monitoring_alerts_interface.list(params)
|
58
|
+
if options[:json]
|
59
|
+
puts as_json(json_response, options, "alerts")
|
60
|
+
return 0
|
61
|
+
elsif options[:yaml]
|
62
|
+
puts as_json(json_response, options, "alerts")
|
63
|
+
return 0
|
64
|
+
elsif options[:csv]
|
65
|
+
puts records_as_csv(json_response['alerts'], options)
|
66
|
+
return 0
|
67
|
+
end
|
68
|
+
alerts = json_response['alerts']
|
69
|
+
title = "Morpheus Monitoring Alerts"
|
70
|
+
subtitles = []
|
71
|
+
subtitles += parse_list_subtitles(options)
|
72
|
+
print_h1 title, subtitles, options
|
73
|
+
if alerts.empty?
|
74
|
+
print cyan,"No alerts found.",reset,"\n"
|
75
|
+
else
|
76
|
+
print_alerts_table(alerts, options)
|
77
|
+
print_results_pagination(json_response, {:label => "alert", :n_label => "alerts"})
|
78
|
+
end
|
79
|
+
print reset,"\n"
|
80
|
+
rescue RestClient::Exception => e
|
81
|
+
print_rest_exception(e, options)
|
82
|
+
exit 1
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def get(args)
|
87
|
+
options = {}
|
88
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
89
|
+
opts.banner = subcommand_usage("[alert]")
|
90
|
+
# opts.on(nil,'--history', "Display History") do |val|
|
91
|
+
# options[:show_history] = true
|
92
|
+
# end
|
93
|
+
# opts.on(nil,'--notifications', "Display Notifications") do |val|
|
94
|
+
# options[:show_notifications] = true
|
95
|
+
# end
|
96
|
+
build_common_options(opts, options, [:json, :csv, :fields, :dry_run, :remote])
|
97
|
+
opts.footer = "Get details about a monitoring alert rule." + "\n" +
|
98
|
+
"[alert] is required. This is the name or ID of the alert rule. Supports 1-N [alert] arguments."
|
99
|
+
end
|
100
|
+
optparse.parse!(args)
|
101
|
+
if args.count < 1
|
102
|
+
raise_command_error "wrong number of arguments, expected 1-N and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
|
103
|
+
end
|
104
|
+
connect(options)
|
105
|
+
id_list = parse_id_list(args)
|
106
|
+
return run_command_for_each_arg(id_list) do |arg|
|
107
|
+
_get(arg, options)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def _get(id, options)
|
112
|
+
|
113
|
+
begin
|
114
|
+
alert = find_alert_by_name_or_id(id)
|
115
|
+
@monitoring_alerts_interface.setopts(options)
|
116
|
+
if options[:dry_run]
|
117
|
+
print_dry_run @monitoring_alerts_interface.dry.get(alert['id'])
|
118
|
+
return
|
119
|
+
end
|
120
|
+
# get by ID to sideload associated checks,groups,apps
|
121
|
+
json_response = @monitoring_alerts_interface.get(alert['id'])
|
122
|
+
alert = json_response['alert']
|
123
|
+
if options[:json]
|
124
|
+
puts as_json(json_response, options, "alert")
|
125
|
+
return 0
|
126
|
+
elsif options[:yaml]
|
127
|
+
puts as_yaml(json_response, options, "alert")
|
128
|
+
return 0
|
129
|
+
elsif options[:csv]
|
130
|
+
puts records_as_csv([json_response['alert']], options)
|
131
|
+
return 0
|
132
|
+
end
|
133
|
+
|
134
|
+
print_h1 "Alert Details"
|
135
|
+
print cyan
|
136
|
+
description_cols = {
|
137
|
+
"ID" => 'id',
|
138
|
+
"Name" => 'name',
|
139
|
+
"Min. Severity" => "minSeverity",
|
140
|
+
"Min. Duration" => lambda {|alert| alert['minDuration'] && alert['minDuration'].to_i > 0 ? "#{alert['minDuration']} minutes" : "0 (immediate)" },
|
141
|
+
"Checks" => lambda {|alert|
|
142
|
+
if alert['allChecks']
|
143
|
+
"All"
|
144
|
+
else
|
145
|
+
checks = alert['checks'] || []
|
146
|
+
# if checks.size > 3
|
147
|
+
# checks.first(3).collect {|r| r['name'] }.join(", ") + ", (#{checks.size - 3} more)"
|
148
|
+
# else
|
149
|
+
# checks.collect {|r| r['name'] }.join(", ")
|
150
|
+
# end
|
151
|
+
checks.size.to_s
|
152
|
+
end
|
153
|
+
},
|
154
|
+
"Groups" => lambda {|alert|
|
155
|
+
if alert['allGroups']
|
156
|
+
"All"
|
157
|
+
else
|
158
|
+
check_groups = alert['checkGroups'] || []
|
159
|
+
# if check_groups.size > 3
|
160
|
+
# check_groups.first(3).collect {|r| r['name'] }.join(", ") + ", (#{check_groups.size - 3} more)"
|
161
|
+
# else
|
162
|
+
# check_groups.collect {|r| r['name'] }.join(", ")
|
163
|
+
# end
|
164
|
+
check_groups.size.to_s
|
165
|
+
end
|
166
|
+
},
|
167
|
+
"Apps" => lambda {|alert|
|
168
|
+
if alert['allApps']
|
169
|
+
"All"
|
170
|
+
else
|
171
|
+
monitor_apps = alert['apps'] || []
|
172
|
+
# if monitor_apps.size > 3
|
173
|
+
# monitor_apps.first(3).collect {|r| r['name'] }.join(", ") + ", (#{monitor_apps.size - 3} more)"
|
174
|
+
# else
|
175
|
+
# monitor_apps.collect {|r| r['name'] }.join(", ")
|
176
|
+
# end
|
177
|
+
monitor_apps.size.to_s
|
178
|
+
end
|
179
|
+
},
|
180
|
+
"Contacts" => lambda {|alert|
|
181
|
+
recipients = alert['contacts'] || alert['recipients'] || []
|
182
|
+
# if recipients.size > 3
|
183
|
+
# recipients.first(3).collect {|r| r['name'] }.join(", ") + ", (#{recipients.size - 3} more)"
|
184
|
+
# else
|
185
|
+
# recipients.collect {|r| r['name'] }.join(", ")
|
186
|
+
# end
|
187
|
+
recipients.size.to_s
|
188
|
+
},
|
189
|
+
"Created" => lambda {|alert| format_local_dt(alert['dateCreated']) },
|
190
|
+
"Updated" => lambda {|alert| format_local_dt(alert['lastUpdated']) },
|
191
|
+
}
|
192
|
+
print as_description_list(alert, description_cols)
|
193
|
+
|
194
|
+
|
195
|
+
|
196
|
+
## Checks in this Alert
|
197
|
+
#checks = alert["checks"]
|
198
|
+
checks = json_response["checks"]
|
199
|
+
if checks && !checks.empty?
|
200
|
+
print_h2 "Checks"
|
201
|
+
print_checks_table(checks, options)
|
202
|
+
end
|
203
|
+
|
204
|
+
## Check Groups in this Alert
|
205
|
+
# check_groups = alert["checkGroups"]
|
206
|
+
check_groups = json_response["checkGroups"]
|
207
|
+
if check_groups && !check_groups.empty?
|
208
|
+
print_h2 "Check Groups"
|
209
|
+
print_check_groups_table(check_groups, options)
|
210
|
+
end
|
211
|
+
|
212
|
+
## Apps in this Alert
|
213
|
+
monitor_apps = alert["apps"]
|
214
|
+
monitor_apps = json_response["apps"]
|
215
|
+
if monitor_apps && !monitor_apps.empty?
|
216
|
+
print_h2 "Apps"
|
217
|
+
print_monitoring_apps_table(monitor_apps, options)
|
218
|
+
end
|
219
|
+
|
220
|
+
## Recipients in this Alert
|
221
|
+
recipients = alert['contacts'] || alert['recipients'] || []
|
222
|
+
if recipients && !recipients.empty?
|
223
|
+
print_h2 "Contacts"
|
224
|
+
columns = [
|
225
|
+
{"CONTACT ID" => lambda {|recipient| recipient['id'] } },
|
226
|
+
{"CONTACT NAME" => lambda {|recipient| recipient['name'] } },
|
227
|
+
{"METHOD" => lambda {|recipient| format_recipient_method(recipient['method'] || recipient['addressTypes']) } },
|
228
|
+
{"NOTIFY ON CHANGE" => lambda {|recipient| format_boolean(recipient['notify']) } },
|
229
|
+
{"NOTIFY ON CLOSE" => lambda {|recipient| format_boolean(recipient['close']) } }
|
230
|
+
]
|
231
|
+
print as_pretty_table(recipients, columns)
|
232
|
+
end
|
233
|
+
|
234
|
+
# show Notify events here...
|
235
|
+
|
236
|
+
print reset, "\n"
|
237
|
+
return 0
|
238
|
+
rescue RestClient::Exception => e
|
239
|
+
print_rest_exception(e, options)
|
240
|
+
exit 1
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
def add(args)
|
245
|
+
options = {}
|
246
|
+
params = {}
|
247
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
248
|
+
opts.banner = subcommand_usage("[name]")
|
249
|
+
opts.on("--name STRING", String, "Alert name") do |val|
|
250
|
+
params['name'] = val
|
251
|
+
end
|
252
|
+
opts.on('--min-severity VALUE', String, "Min. Severity. Trigger when severity level is reached. Default is critical") do |val|
|
253
|
+
params['minSeverity'] = val.to_s.downcase
|
254
|
+
end
|
255
|
+
opts.on('--min-duration MINUTES', String, "Min. Duration. Trigger after a number of minutes. Default is 0 (immediate)") do |val|
|
256
|
+
params['minDuration'] = val.to_i
|
257
|
+
end
|
258
|
+
opts.on('--all-checks [on|off]', String, "Toggle trigger for all checks.") do |val|
|
259
|
+
params['allChecks'] = val.to_s == 'on' || val.to_s == 'true' || val == '' || val.nil?
|
260
|
+
end
|
261
|
+
opts.on('--checks LIST', Array, "Checks, comma separated list of names or IDs.") do |list|
|
262
|
+
if list.size == 1 && ('[]' == list[0]) # clear array
|
263
|
+
params['checks'] = []
|
264
|
+
else
|
265
|
+
params['checks'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
|
266
|
+
end
|
267
|
+
end
|
268
|
+
opts.on('--all-groups [on|off]', String, "Toggle trigger for all check groups.") do |val|
|
269
|
+
params['allGroups'] = val.to_s == 'on' || val.to_s == 'true' || val == '' || val.nil?
|
270
|
+
end
|
271
|
+
opts.on('--groups LIST', Array, "Check Groups, comma separated list of names or IDs.") do |list|
|
272
|
+
if list.size == 1 && ('[]' == list[0]) # clear array
|
273
|
+
params['checkGroups'] = []
|
274
|
+
else
|
275
|
+
params['checkGroups'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
|
276
|
+
end
|
277
|
+
end
|
278
|
+
opts.on('--all-apps [on|off]', String, "Toggle trigger for all check groups.") do |val|
|
279
|
+
params['allApps'] = val.to_s == 'on' || val.to_s == 'true' || val == '' || val.nil?
|
280
|
+
end
|
281
|
+
opts.on('--apps LIST', Array, "Monitor Apps, comma separated list of names or IDs.") do |list|
|
282
|
+
if list.size == 1 && ('[]' == list[0]) # clear array
|
283
|
+
params['apps'] = []
|
284
|
+
else
|
285
|
+
params['apps'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
|
286
|
+
end
|
287
|
+
end
|
288
|
+
opts.on('--contacts LIST', Array, "Contacts, comma separated list of Contact names or IDs. Additional recipient settings can be passed like Contact ID:method:notifyOnClose:notifyOnChange.") do |list|
|
289
|
+
if list.size == 1 && ('[]' == list[0]) # clear array
|
290
|
+
params['contacts'] = []
|
291
|
+
else
|
292
|
+
recipient_list = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
|
293
|
+
params['contacts'] = recipient_list
|
294
|
+
end
|
295
|
+
end
|
296
|
+
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
|
297
|
+
opts.footer = "Create a monitoring alert rule." + "\n" +
|
298
|
+
"[name] is required. This is the name of the new alert rule."
|
299
|
+
end
|
300
|
+
optparse.parse!(args)
|
301
|
+
if args.count > 1
|
302
|
+
raise_command_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
|
303
|
+
end
|
304
|
+
if args[0]
|
305
|
+
params['name'] = args[0]
|
306
|
+
end
|
307
|
+
connect(options)
|
308
|
+
|
309
|
+
begin
|
310
|
+
|
311
|
+
# construct payload
|
312
|
+
payload = nil
|
313
|
+
if options[:payload]
|
314
|
+
payload = options[:payload]
|
315
|
+
else
|
316
|
+
params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
|
317
|
+
if params['name'].nil?
|
318
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Name', 'required' => true, 'description' => 'The name of this alert rule.'}], options[:options])
|
319
|
+
params['name'] = v_prompt['name']
|
320
|
+
end
|
321
|
+
if params['minSeverity'].nil?
|
322
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'minSeverity', 'type' => 'text', 'fieldLabel' => 'Min. Severity', 'required' => false, 'selectOptions' => available_severities, 'defaultValue' => 'critical', 'description' => 'Trigger when severity level is reached.'}], options[:options])
|
323
|
+
params['minSeverity'] = v_prompt['minSeverity'].to_s unless v_prompt['minSeverity'].nil?
|
324
|
+
end
|
325
|
+
if params['minDuration'].nil?
|
326
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'minDuration', 'type' => 'text', 'fieldLabel' => 'Min. Duration', 'required' => false, 'defaultValue' => '0', 'description' => 'Trigger after a number of minutes.'}], options[:options])
|
327
|
+
params['minDuration'] = v_prompt['minDuration'].to_i unless v_prompt['minDuration'].nil?
|
328
|
+
end
|
329
|
+
# All Checks?
|
330
|
+
if params['allChecks'].nil?
|
331
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'allChecks', 'type' => 'text', 'fieldLabel' => 'All Checks?', 'required' => false, 'defaultValue' => 'off', 'description' => 'Trigger for all checks.'}], options[:options])
|
332
|
+
params['allChecks'] = (['on','true'].include?(v_prompt['allChecks'].to_s)) unless v_prompt['allChecks'].nil?
|
333
|
+
end
|
334
|
+
# Checks
|
335
|
+
if params['allChecks'] == true
|
336
|
+
params.delete('checks')
|
337
|
+
else
|
338
|
+
prompt_results = prompt_for_checks(params, options, @api_client)
|
339
|
+
if prompt_results[:success]
|
340
|
+
params['checks'] = prompt_results[:data] unless prompt_results[:data].nil?
|
341
|
+
else
|
342
|
+
return 1
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
# All Check Groups?
|
347
|
+
if params['allGroups'].nil?
|
348
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'allGroups', 'type' => 'text', 'fieldLabel' => 'All Groups?', 'required' => false, 'defaultValue' => 'off', 'description' => 'Trigger for all check groups.'}], options[:options])
|
349
|
+
params['allGroups'] = (['on','true'].include?(v_prompt['allGroups'].to_s)) unless v_prompt['allGroups'].nil?
|
350
|
+
end
|
351
|
+
# Check Groups
|
352
|
+
if params['allGroups'] == true
|
353
|
+
params.delete('checkGroups')
|
354
|
+
else
|
355
|
+
prompt_results = prompt_for_check_groups(params, options, @api_client)
|
356
|
+
if prompt_results[:success]
|
357
|
+
params['checkGroups'] = prompt_results[:data] unless prompt_results[:data].nil?
|
358
|
+
else
|
359
|
+
return 1
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
# All Apps?
|
364
|
+
if params['allApps'].nil?
|
365
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'allApps', 'type' => 'text', 'fieldLabel' => 'All Apps?', 'required' => false, 'defaultValue' => 'off', 'description' => 'Trigger for all monitoring apps.'}], options[:options])
|
366
|
+
params['allApps'] = (['on','true'].include?(v_prompt['allApps'].to_s)) unless v_prompt['allApps'].nil?
|
367
|
+
end
|
368
|
+
# Apps
|
369
|
+
if params['allApps'] == true
|
370
|
+
params.delete('apps')
|
371
|
+
else
|
372
|
+
prompt_results = prompt_for_monitor_apps(params, options, @api_client)
|
373
|
+
if prompt_results[:success]
|
374
|
+
params['apps'] = prompt_results[:data] unless prompt_results[:data].nil?
|
375
|
+
else
|
376
|
+
return 1
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
# Recipients (Contacts)
|
381
|
+
recipient_list = []
|
382
|
+
contact_ids = []
|
383
|
+
|
384
|
+
if params['contacts'].nil?
|
385
|
+
still_prompting = true
|
386
|
+
while still_prompting
|
387
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'contacts', 'type' => 'text', 'fieldLabel' => 'Contacts', 'required' => false, 'description' => "Contacts, comma separated list of contact names or IDs. Additional recipient settings can be passed like Contact ID:method:notifyOnClose:notifyOnChange"}], options[:options])
|
388
|
+
unless v_prompt['contacts'].to_s.empty?
|
389
|
+
recipient_list = v_prompt['contacts'].split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
|
390
|
+
end
|
391
|
+
bad_ids = []
|
392
|
+
if recipient_list && recipient_list.size > 0
|
393
|
+
recipient_list.each do |it|
|
394
|
+
found_contact = nil
|
395
|
+
begin
|
396
|
+
parts = it.split(":").collect { |part| part.strip }
|
397
|
+
found_contact = find_contact_by_name_or_id(parts[0])
|
398
|
+
rescue SystemExit => cmdexit
|
399
|
+
end
|
400
|
+
if found_contact
|
401
|
+
contact_ids << found_contact['id']
|
402
|
+
else
|
403
|
+
bad_ids << it
|
404
|
+
end
|
405
|
+
end
|
406
|
+
end
|
407
|
+
still_prompting = bad_ids.empty? ? false : true
|
408
|
+
end
|
409
|
+
else
|
410
|
+
recipient_list = params['contacts']
|
411
|
+
bad_ids = []
|
412
|
+
if recipient_list && recipient_list.size > 0
|
413
|
+
recipient_list.each do |it|
|
414
|
+
found_contact = nil
|
415
|
+
begin
|
416
|
+
parts = it.split(":").collect { |part| part.strip }
|
417
|
+
found_contact = find_contact_by_name_or_id(parts[0])
|
418
|
+
rescue SystemExit => cmdexit
|
419
|
+
end
|
420
|
+
if found_contact
|
421
|
+
contact_ids << found_contact['id']
|
422
|
+
else
|
423
|
+
bad_ids << it
|
424
|
+
end
|
425
|
+
end
|
426
|
+
end
|
427
|
+
if !bad_ids.empty?
|
428
|
+
return 1
|
429
|
+
end
|
430
|
+
end
|
431
|
+
recipient_records = []
|
432
|
+
# parse recipient string as Contact ID:method:notifyOnClose:notifyOnChange
|
433
|
+
recipient_list.each_with_index do |it, index|
|
434
|
+
parts = it.split(":").collect { |part| part.strip }
|
435
|
+
#recipient_id = parts[0]
|
436
|
+
recipient_id = contact_ids[index]
|
437
|
+
|
438
|
+
recipient_method = parts[1] ? parts[1].to_s : "emailAddress"
|
439
|
+
recipient_notify = parts[2] ? ['on','true'].include?(parts[2].to_s.downcase) : true
|
440
|
+
recipient_close = parts[3] ? ['on','true'].include?(parts[3].to_s.downcase) : true
|
441
|
+
recipient_record = {
|
442
|
+
"id" => recipient_id,
|
443
|
+
"method" => parse_recipient_method(recipient_method),
|
444
|
+
"notify" => recipient_notify,
|
445
|
+
"close" => recipient_close
|
446
|
+
}
|
447
|
+
recipient_records << recipient_record
|
448
|
+
end
|
449
|
+
params['contacts'] = recipient_records
|
450
|
+
|
451
|
+
payload = {'alert' => params}
|
452
|
+
end
|
453
|
+
|
454
|
+
@monitoring_alerts_interface.setopts(options)
|
455
|
+
if options[:dry_run]
|
456
|
+
print_dry_run @monitoring_alerts_interface.dry.create(payload)
|
457
|
+
return
|
458
|
+
end
|
459
|
+
|
460
|
+
json_response = @monitoring_alerts_interface.create(payload)
|
461
|
+
alert = json_response['alert']
|
462
|
+
if options[:json]
|
463
|
+
puts as_json(json_response, options)
|
464
|
+
elsif !options[:quiet]
|
465
|
+
print_green_success "Created alert (#{alert['id']}) #{alert['name']}"
|
466
|
+
#_get(alert['id'], options)
|
467
|
+
end
|
468
|
+
|
469
|
+
rescue RestClient::Exception => e
|
470
|
+
print_rest_exception(e, options)
|
471
|
+
exit 1
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
def update(args)
|
476
|
+
options = {}
|
477
|
+
params = {}
|
478
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
479
|
+
opts.banner = subcommand_usage("[alert]")
|
480
|
+
opts.on("--name STRING", String, "Alert name") do |val|
|
481
|
+
params['name'] = val
|
482
|
+
end
|
483
|
+
opts.on("--name STRING", String, "Alert name") do |val|
|
484
|
+
params['name'] = val
|
485
|
+
end
|
486
|
+
opts.on('--min-severity VALUE', String, "Min. Severity. Trigger when severity level is reached. Default is critical") do |val|
|
487
|
+
params['minSeverity'] = val.to_s.downcase
|
488
|
+
end
|
489
|
+
opts.on('--min-duration MINUTES', String, "Min. Duration. Trigger after a number of minutes. Default is 0 (immediate)") do |val|
|
490
|
+
params['minDuration'] = val.to_i
|
491
|
+
end
|
492
|
+
opts.on('--all-checks [on|off]', String, "Toggle trigger for all checks.") do |val|
|
493
|
+
params['allChecks'] = val.to_s == 'on' || val.to_s == 'true' || val == '' || val.nil?
|
494
|
+
end
|
495
|
+
opts.on('--checks LIST', Array, "Checks, comma separated list of names or IDs.") do |list|
|
496
|
+
if list.size == 1 && ('[]' == list[0]) # clear array
|
497
|
+
params['checks'] = []
|
498
|
+
else
|
499
|
+
params['checks'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
|
500
|
+
end
|
501
|
+
end
|
502
|
+
opts.on('--all-groups [on|off]', String, "Toggle trigger for all check groups.") do |val|
|
503
|
+
params['allGroups'] = val.to_s == 'on' || val.to_s == 'true' || val == '' || val.nil?
|
504
|
+
end
|
505
|
+
opts.on('--groups LIST', Array, "Check Groups, comma separated list of check group ID or names.") do |list|
|
506
|
+
if list.size == 1 && ('[]' == list[0]) # clear array
|
507
|
+
params['checkGroups'] = []
|
508
|
+
else
|
509
|
+
params['checkGroups'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
|
510
|
+
end
|
511
|
+
end
|
512
|
+
opts.on('--all-apps [on|off]', String, "Toggle trigger for all check groups.") do |val|
|
513
|
+
params['allApps'] = val.to_s == 'on' || val.to_s == 'true' || val == '' || val.nil?
|
514
|
+
end
|
515
|
+
opts.on('--apps LIST', Array, "Monitor Apps, comma separated list of monitor app ID or names.") do |list|
|
516
|
+
if list.size == 1 && ('[]' == list[0]) # clear array
|
517
|
+
params['apps'] = []
|
518
|
+
else
|
519
|
+
params['apps'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
|
520
|
+
end
|
521
|
+
end
|
522
|
+
opts.on('--contacts LIST', Array, "Contacts, comma separated list of contact ID or names. Additional recipient settings can be passed like Contact ID:method:notifyOnClose:notifyOnChange") do |list|
|
523
|
+
if list.size == 1 && ('[]' == list[0]) # clear array
|
524
|
+
params['contacts'] = []
|
525
|
+
else
|
526
|
+
recipient_list = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
|
527
|
+
params['contacts'] = recipient_list
|
528
|
+
end
|
529
|
+
end
|
530
|
+
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
|
531
|
+
opts.footer = "Update a monitoring alert rule." + "\n" +
|
532
|
+
"[alert] is required. This is the name or ID of the alert rule."
|
533
|
+
end
|
534
|
+
optparse.parse!(args)
|
535
|
+
if args.count != 1
|
536
|
+
raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
|
537
|
+
end
|
538
|
+
connect(options)
|
539
|
+
|
540
|
+
begin
|
541
|
+
alert = find_alert_by_name_or_id(args[0])
|
542
|
+
|
543
|
+
# construct payload
|
544
|
+
payload = nil
|
545
|
+
if options[:payload]
|
546
|
+
payload = options[:payload]
|
547
|
+
else
|
548
|
+
params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
|
549
|
+
# if params['name'].nil?
|
550
|
+
# v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Name', 'required' => true, 'description' => 'The name of this alert rule.'}], options[:options])
|
551
|
+
# params['name'] = v_prompt['name']
|
552
|
+
# end
|
553
|
+
# if params['minSeverity'].nil?
|
554
|
+
# v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'minSeverity', 'type' => 'text', 'fieldLabel' => 'Min. Severity', 'required' => false, 'selectOptions' => available_severities, 'defaultValue' => 'critical', 'description' => 'Trigger when severity level is reached.'}], options[:options])
|
555
|
+
# params['minSeverity'] = v_prompt['minSeverity'].to_s unless v_prompt['minSeverity'].nil?
|
556
|
+
# end
|
557
|
+
# if params['minDuration'].nil?
|
558
|
+
# v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'minDuration', 'type' => 'text', 'fieldLabel' => 'Min. Duration', 'required' => false, 'defaultValue' => '0', 'description' => 'Trigger after a number of minutes.'}], options[:options])
|
559
|
+
# params['minDuration'] = v_prompt['minDuration'].to_i unless v_prompt['minDuration'].nil?
|
560
|
+
# end
|
561
|
+
# All Checks?
|
562
|
+
# if params['allChecks'].nil?
|
563
|
+
# v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'allChecks', 'type' => 'text', 'fieldLabel' => 'All Checks?', 'required' => false, 'defaultValue' => 'off', 'description' => 'Trigger for all checks.'}], options[:options])
|
564
|
+
# params['allChecks'] = (['on','true'].include?(v_prompt['allChecks'].to_s)) unless v_prompt['allChecks'].nil?
|
565
|
+
# end
|
566
|
+
# Checks
|
567
|
+
if params['checks']
|
568
|
+
prompt_results = prompt_for_checks(params, options, @api_client)
|
569
|
+
if prompt_results[:success]
|
570
|
+
params['checks'] = prompt_results[:data] unless prompt_results[:data].nil?
|
571
|
+
else
|
572
|
+
return 1
|
573
|
+
end
|
574
|
+
end
|
575
|
+
|
576
|
+
# All Check Groups?
|
577
|
+
# if params['allGroups'].nil?
|
578
|
+
# v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'allGroups', 'type' => 'text', 'fieldLabel' => 'All Groups?', 'required' => false, 'defaultValue' => 'off', 'description' => 'Trigger for all check groups.'}], options[:options])
|
579
|
+
# params['allGroups'] = (['on','true'].include?(v_prompt['allGroups'].to_s)) unless v_prompt['allGroups'].nil?
|
580
|
+
# end
|
581
|
+
# Check Groups
|
582
|
+
if params['checkGroups']
|
583
|
+
prompt_results = prompt_for_check_groups(params, options, @api_client)
|
584
|
+
if prompt_results[:success]
|
585
|
+
params['checkGroups'] = prompt_results[:data] unless prompt_results[:data].nil?
|
586
|
+
else
|
587
|
+
return 1
|
588
|
+
end
|
589
|
+
end
|
590
|
+
|
591
|
+
# All Apps?
|
592
|
+
# if params['allApps'].nil?
|
593
|
+
# v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'allApps', 'type' => 'text', 'fieldLabel' => 'All Apps?', 'required' => false, 'defaultValue' => 'off', 'description' => 'Trigger for all monitoring apps.'}], options[:options])
|
594
|
+
# params['allApps'] = (['on','true'].include?(v_prompt['allApps'].to_s)) unless v_prompt['allApps'].nil?
|
595
|
+
# end
|
596
|
+
# Apps
|
597
|
+
if params['apps']
|
598
|
+
prompt_results = prompt_for_monitor_apps(params, options, @api_client)
|
599
|
+
if prompt_results[:success]
|
600
|
+
params['apps'] = prompt_results[:data] unless prompt_results[:data].nil?
|
601
|
+
else
|
602
|
+
return 1
|
603
|
+
end
|
604
|
+
end
|
605
|
+
|
606
|
+
# Recipients (Contacts)
|
607
|
+
if params['contacts']
|
608
|
+
|
609
|
+
recipient_list = params['contacts']
|
610
|
+
contact_ids = []
|
611
|
+
bad_ids = []
|
612
|
+
if recipient_list && recipient_list.size > 0
|
613
|
+
recipient_list.each do |it|
|
614
|
+
found_contact = nil
|
615
|
+
begin
|
616
|
+
parts = it.split(":").collect { |part| part.strip }
|
617
|
+
found_contact = find_contact_by_name_or_id(parts[0])
|
618
|
+
rescue SystemExit => cmdexit
|
619
|
+
end
|
620
|
+
if found_contact
|
621
|
+
contact_ids << found_contact['id']
|
622
|
+
else
|
623
|
+
bad_ids << it
|
624
|
+
end
|
625
|
+
end
|
626
|
+
end
|
627
|
+
if !bad_ids.empty?
|
628
|
+
return 1
|
629
|
+
end
|
630
|
+
recipient_records = []
|
631
|
+
# parse recipient string as Contact ID:method:notifyOnClose:notifyOnChange
|
632
|
+
existing_recipients = alert['contacts'] || []
|
633
|
+
recipient_list.each_with_index do |it, index|
|
634
|
+
parts = it.split(":").collect { |part| part.strip }
|
635
|
+
#recipient_id = parts[0]
|
636
|
+
recipient_id = contact_ids[index]
|
637
|
+
recipient_record = {
|
638
|
+
"id" => recipient_id
|
639
|
+
}
|
640
|
+
# preserve existing values for these settings
|
641
|
+
existing_recipient = existing_recipients.find {|rec| rec['id'] == recipient_id.to_i }
|
642
|
+
if parts[1]
|
643
|
+
recipient_record["method"] = parse_recipient_method(parts[1].to_s)
|
644
|
+
elsif existing_recipient
|
645
|
+
recipient_record["method"] = existing_recipient["method"]
|
646
|
+
end
|
647
|
+
if parts[2]
|
648
|
+
recipient_record["notify"] = ['on','true'].include?(parts[2].to_s.downcase)
|
649
|
+
elsif existing_recipient
|
650
|
+
recipient_record["notify"] = existing_recipient["notify"]
|
651
|
+
end
|
652
|
+
if parts[3]
|
653
|
+
recipient_record["close"] = ['on','true'].include?(parts[3].to_s.downcase)
|
654
|
+
elsif existing_recipient
|
655
|
+
recipient_record["close"] = existing_recipient["close"]
|
656
|
+
end
|
657
|
+
recipient_records << recipient_record
|
658
|
+
end
|
659
|
+
params['contacts'] = recipient_records
|
660
|
+
end
|
661
|
+
|
662
|
+
payload = {'alert' => params}
|
663
|
+
end
|
664
|
+
|
665
|
+
if params.empty?
|
666
|
+
print_red_alert "Specify at least one option to update"
|
667
|
+
puts optparse
|
668
|
+
exit 1
|
669
|
+
end
|
670
|
+
|
671
|
+
@monitoring_alerts_interface.setopts(options)
|
672
|
+
if options[:dry_run]
|
673
|
+
print_dry_run @monitoring_alerts_interface.dry.update(alert["id"], payload)
|
674
|
+
return
|
675
|
+
end
|
676
|
+
|
677
|
+
json_response = @monitoring_alerts_interface.update(alert["id"], payload)
|
678
|
+
alert = json_response['alert']
|
679
|
+
if options[:json]
|
680
|
+
puts as_json(json_response, options)
|
681
|
+
elsif !options[:quiet]
|
682
|
+
print_green_success "Updated alert (#{alert['id']}) #{alert['name']}"
|
683
|
+
_get(alert['id'], options)
|
684
|
+
end
|
685
|
+
|
686
|
+
rescue RestClient::Exception => e
|
687
|
+
print_rest_exception(e, options)
|
688
|
+
exit 1
|
689
|
+
end
|
690
|
+
end
|
691
|
+
|
692
|
+
|
693
|
+
def remove(args)
|
694
|
+
options = {}
|
695
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
696
|
+
opts.banner = subcommand_usage("[alert]")
|
697
|
+
build_common_options(opts, options, [:auto_confirm, :quiet, :json, :dry_run, :remote])
|
698
|
+
opts.footer = "Delete a monitoring alert rule." + "\n" +
|
699
|
+
"[alert] is required. This is the name or ID of the alert rule. Supports 1-N [alert] arguments."
|
700
|
+
end
|
701
|
+
optparse.parse!(args)
|
702
|
+
if args.count < 1
|
703
|
+
raise_command_error "wrong number of arguments, expected 1-N and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
|
704
|
+
end
|
705
|
+
connect(options)
|
706
|
+
id_list = parse_id_list(args)
|
707
|
+
unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to delete #{id_list.size == 1 ? 'alert' : 'alerts'} #{anded_list(id_list)}?", options)
|
708
|
+
exit 1
|
709
|
+
end
|
710
|
+
return run_command_for_each_arg(id_list) do |arg|
|
711
|
+
_remove(arg, options)
|
712
|
+
end
|
713
|
+
end
|
714
|
+
|
715
|
+
def _remove(id, options)
|
716
|
+
|
717
|
+
begin
|
718
|
+
alert = find_alert_by_name_or_id(id)
|
719
|
+
@monitoring_alerts_interface.setopts(options)
|
720
|
+
if options[:dry_run]
|
721
|
+
print_dry_run @monitoring_alerts_interface.dry.destroy(alert['id'])
|
722
|
+
return
|
723
|
+
end
|
724
|
+
json_response = @monitoring_alerts_interface.destroy(alert['id'])
|
725
|
+
if options[:json]
|
726
|
+
puts as_json(json_response, options)
|
727
|
+
elsif !options[:quiet]
|
728
|
+
print_green_success json_response["msg"] || "Alert (#{alert['id']}) #{alert['name']} deleted"
|
729
|
+
end
|
730
|
+
rescue RestClient::Exception => e
|
731
|
+
print_rest_exception(e, options)
|
732
|
+
exit 1
|
733
|
+
end
|
734
|
+
end
|
735
|
+
|
736
|
+
private
|
737
|
+
|
738
|
+
def print_alerts_table(alerts, options={})
|
739
|
+
columns = [
|
740
|
+
{"ID" => "id" },
|
741
|
+
{"NAME" => "name" },
|
742
|
+
{"APPS" => lambda {|alert|
|
743
|
+
if alert['allApps']
|
744
|
+
"All"
|
745
|
+
else
|
746
|
+
monitor_apps = alert['apps'] || []
|
747
|
+
# if monitor_apps.size > 3
|
748
|
+
# monitor_apps.first(3).collect {|r| r['name'] }.join(", ") + ", (#{monitor_apps.size - 3} more)"
|
749
|
+
# else
|
750
|
+
# monitor_apps.collect {|r| r['name'] }.join(", ")
|
751
|
+
# end
|
752
|
+
monitor_apps.size.to_s
|
753
|
+
end
|
754
|
+
} },
|
755
|
+
{"CHECKS" => lambda {|alert|
|
756
|
+
if alert['allChecks']
|
757
|
+
"All"
|
758
|
+
else
|
759
|
+
checks = alert['checks'] || []
|
760
|
+
# if checks.size > 3
|
761
|
+
# checks.first(3).collect {|r| r['name'] }.join(", ") + ", (#{checks.size - 3} more)"
|
762
|
+
# # checks.size.to_s
|
763
|
+
# else
|
764
|
+
# checks.collect {|r| r['name'] }.join(", ")
|
765
|
+
# end
|
766
|
+
checks.size.to_s
|
767
|
+
end
|
768
|
+
} },
|
769
|
+
{"GROUPS" => lambda {|alert|
|
770
|
+
if alert['allGroups']
|
771
|
+
"All"
|
772
|
+
else
|
773
|
+
check_groups = alert['checkGroups'] || []
|
774
|
+
# if check_groups.size > 3
|
775
|
+
# check_groups.first(3).collect {|r| r['name'] }.join(", ") + ", (#{check_groups.size - 3} more)"
|
776
|
+
# else
|
777
|
+
# check_groups.collect {|r| r['name'] }.join(", ")
|
778
|
+
# end
|
779
|
+
check_groups.size.to_s
|
780
|
+
end
|
781
|
+
} },
|
782
|
+
{"MIN. SEVERITY" => "minSeverity" },
|
783
|
+
{"CONTACTS" => lambda {|alert|
|
784
|
+
recipients = alert['contacts'] || alert['recipients'] || []
|
785
|
+
# if recipients.size > 3
|
786
|
+
# recipients.first(3).collect {|r| r['name'] }.join(", ") + ", (#{recipients.size - 3} more)"
|
787
|
+
# else
|
788
|
+
# recipients.collect {|r| r['name'] }.join(", ")
|
789
|
+
# end
|
790
|
+
recipients.size.to_s
|
791
|
+
} },
|
792
|
+
]
|
793
|
+
if options[:include_fields]
|
794
|
+
columns = options[:include_fields]
|
795
|
+
end
|
796
|
+
print as_pretty_table(alerts, columns, options)
|
797
|
+
end
|
798
|
+
|
799
|
+
|
800
|
+
end
|