icinga2 0.9.0.1 → 0.9.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,6 +11,9 @@ module Icinga2
11
11
  # @param [Hash] params
12
12
  # @option params [String] :host_group hostgroup to create
13
13
  # @option params [String] :display_name the displayed name
14
+ # @option params [String] :notes
15
+ # @option params [String] :notes_url
16
+ # @option params [String] :action_url
14
17
  #
15
18
  # @example
16
19
  # @icinga.add_hostgroup(host_group: 'foo', display_name: 'FOO')
@@ -19,20 +22,36 @@ module Icinga2
19
22
  #
20
23
  def add_hostgroup( params )
21
24
 
22
- raise ArgumentError.new('only Hash are allowed') unless( params.is_a?(Hash) )
23
- raise ArgumentError.new('missing params') if( params.size.zero? )
25
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
26
+ raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
24
27
 
25
28
  host_group = params.dig(:host_group)
26
29
  display_name = params.dig(:display_name)
27
-
28
- raise ArgumentError.new('Missing host_group') if( host_group.nil? )
29
- raise ArgumentError.new('Missing display_name') if( display_name.nil? )
30
-
31
- Network.put(
30
+ notes = params.dig(:notes)
31
+ notes_url = params.dig(:notes_url)
32
+ action_url = params.dig(:action_url)
33
+
34
+ raise ArgumentError.new('Missing \'host_group\'') if( host_group.nil? )
35
+ raise ArgumentError.new('Missing \'display_name\'') if( display_name.nil? )
36
+
37
+ payload = {
38
+ 'attrs' => {
39
+ 'display_name' => display_name,
40
+ 'notes' => notes,
41
+ 'notes_url' => notes_url,
42
+ 'action_url' => action_url
43
+ }
44
+ }
45
+
46
+ # remove all empty attrs
47
+ payload.reject!{ |_k, v| v.nil? }
48
+ payload['attrs'].reject!{ |_k, v| v.nil? }
49
+
50
+ put(
32
51
  url: format('%s/objects/hostgroups/%s', @icinga_api_url_base, host_group),
33
52
  headers: @headers,
34
53
  options: @options,
35
- payload: { 'attrs' => { 'display_name' => display_name } }
54
+ payload: payload
36
55
  )
37
56
  end
38
57
 
@@ -48,14 +67,14 @@ module Icinga2
48
67
  #
49
68
  def delete_hostgroup( params )
50
69
 
51
- raise ArgumentError.new('only Hash are allowed') unless( params.is_a?(Hash) )
52
- raise ArgumentError.new('missing params') if( params.size.zero? )
70
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
71
+ raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
53
72
 
54
73
  host_group = params.dig(:host_group)
55
74
 
56
- raise ArgumentError.new('Missing host_group') if( host_group.nil? )
75
+ raise ArgumentError.new('Missing \'host_group\'') if( host_group.nil? )
57
76
 
58
- Network.delete(
77
+ delete(
59
78
  url: format('%s/objects/hostgroups/%s?cascade=1', @icinga_api_url_base, host_group),
60
79
  headers: @headers,
61
80
  options: @options
@@ -86,15 +105,11 @@ module Icinga2
86
105
  format( '%s/objects/hostgroups/%s', @icinga_api_url_base, host_group )
87
106
  end
88
107
 
89
- data = Network.api_data(
108
+ api_data(
90
109
  url: url,
91
110
  headers: @headers,
92
111
  options: @options
93
112
  )
94
-
95
- return data.dig('results') if( data.dig(:status).nil? )
96
-
97
- nil
98
113
  end
99
114
 
100
115
  # returns true if the hostgroup exists
@@ -108,15 +123,16 @@ module Icinga2
108
123
  #
109
124
  def exists_hostgroup?( host_group )
110
125
 
111
- raise ArgumentError.new('only String are allowed') unless( host_group.is_a?(String) )
112
- raise ArgumentError.new('Missing host_group') if( host_group.size.zero? )
126
+ raise ArgumentError.new(format('wrong type. \'host_group\' must be an String, given \'%s\'', host_group.class.to_s)) unless( host_group.is_a?(String) )
127
+ raise ArgumentError.new('Missing \'host_group\'') if( host_group.size.zero? )
113
128
 
114
129
  result = hostgroups(host_group: host_group)
115
- result = JSON.parse( result ) if result.is_a?( String )
130
+ result = JSON.parse( result ) if( result.is_a?(String) )
131
+ result = result.first if( result.is_a?(Array) )
116
132
 
117
- return true if !result.nil? && result.is_a?(Array)
133
+ return false if( result.is_a?(Hash) && result.dig('code') == 404 )
118
134
 
119
- false
135
+ true
120
136
  end
121
137
 
122
138
  end
@@ -8,8 +8,8 @@ module Icinga2
8
8
  # add host
9
9
  #
10
10
  # @param [Hash] params
11
- # @option params [String] :host
12
- # @option params [String] :fqdn
11
+ # @option params [String] :name
12
+ # @option params [String] :address
13
13
  # @option params [String] :display_name
14
14
  # @option params [Bool] :enable_notifications (false)
15
15
  # @option params [Integer] :max_check_attempts (3)
@@ -22,23 +22,244 @@ module Icinga2
22
22
  #
23
23
  # @example
24
24
  # param = {
25
- # host: 'foo',
26
- # fqdn: 'foo.bar.com',
25
+ # name: 'foo',
26
+ # address: 'foo.bar.com',
27
27
  # display_name: 'test node',
28
28
  # max_check_attempts: 5,
29
- # notes: 'test node'
29
+ # notes: 'test node',
30
+ # vars: {
31
+ # description: 'host foo',
32
+ # os: 'Linux',
33
+ # partitions: {
34
+ # '/' => {
35
+ # crit: '95%',
36
+ # warn: '90%'
37
+ # }
38
+ # }
39
+ # }
30
40
  # }
41
+ #
31
42
  # @icinga.add_host(param)
32
43
  #
33
44
  # @return [Hash]
34
45
  #
35
46
  def add_host( params )
36
47
 
48
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
49
+ raise ArgumentError.new('missing params') if( params.size.zero? )
50
+
51
+ action_url = params.dig(:action_url)
52
+ address = params.dig(:address)
53
+ address6 = params.dig(:address6)
54
+ check_command = params.dig(:check_command)
55
+ check_interval = params.dig(:check_interval)
56
+ check_period = params.dig(:check_period)
57
+ check_timeout = params.dig(:check_timeout)
58
+ command_endpoint = params.dig(:command_endpoint)
59
+ display_name = params.dig(:display_name)
60
+ enable_active_checks = params.dig(:enable_active_checks)
61
+ enable_event_handler = params.dig(:enable_event_handler)
62
+ enable_flapping = params.dig(:enable_flapping) || false
63
+ enable_notifications = params.dig(:enable_notifications)
64
+ enable_passive_checks = params.dig(:enable_passive_checks)
65
+ enable_perfdata = params.dig(:enable_perfdata)
66
+ event_command = params.dig(:event_command)
67
+ flapping_threshold = params.dig(:flapping_threshold)
68
+ groups = params.dig(:groups)
69
+ icon_image = params.dig(:icon_image)
70
+ icon_image_alt = params.dig(:icon_image_alt)
71
+ max_check_attempts = params.dig(:max_check_attempts)
72
+ name = params.dig(:name)
73
+ notes = params.dig(:notes)
74
+ notes_url = params.dig(:notes_url)
75
+ retry_interval = params.dig(:retry_interval)
76
+ templates = params.dig(:templates) || [ 'generic-host' ]
77
+ vars = params.dig(:vars) || {}
78
+ volatile = params.dig(:volatile)
79
+ zone = params.dig(:zone)
80
+
81
+ raise ArgumentError.new('missing name') if( name.nil? )
82
+
83
+ %w[action_url
84
+ address
85
+ address6
86
+ check_command
87
+ check_period
88
+ command_endpoint
89
+ display_name
90
+ event_command
91
+ icon_image
92
+ icon_image_alt
93
+ name
94
+ notes
95
+ notes_url
96
+ zone].each do |attr|
97
+ v = eval(attr)
98
+ raise ArgumentError.new(format('wrong type. \'%s\' must be an String, given \'%s\'', attr, v.class.to_s)) unless( v.is_a?(String) || v.nil? )
99
+ end
100
+
101
+ %w[check_interval
102
+ flapping_threshold
103
+ max_check_attempts
104
+ retry_interval].each do |attr|
105
+ v = eval(attr)
106
+ raise ArgumentError.new(format('wrong type. \'%s\' must be an Integer, given \'%s\'', attr, v.class.to_s)) unless( v.is_a?(Integer) || v.nil? )
107
+ end
108
+
109
+ %w[enable_active_checks
110
+ enable_event_handler
111
+ enable_flapping
112
+ enable_notifications
113
+ enable_passive_checks
114
+ enable_perfdata
115
+ volatile].each do |attr|
116
+ v = eval(attr)
117
+ raise ArgumentError.new(format('wrong type. \'%s\' must be True or False, given \'%s\'', attr, v.class.to_s)) unless( v.is_a?(TrueClass) || v.is_a?(FalseClass) || v.nil? )
118
+ end
119
+
120
+ %w[groups templates].each do |attr|
121
+ v = eval(attr)
122
+ raise ArgumentError.new(format('wrong type. \'%s\' must be an Array, given \'%s\'', attr, v.class.to_s)) unless( v.is_a?(Array) || v.nil? )
123
+ end
124
+
125
+ raise ArgumentError.new(format('wrong type. \'vars\' must be an Hash, given \'%s\'', v.class.to_s)) unless( vars.is_a?(Hash) )
126
+
127
+ address = Socket.gethostbyname( name ).first if( address.nil? )
128
+
129
+ payload = {
130
+ 'templates' => templates,
131
+ 'attrs' => {
132
+ 'action_url' => action_url,
133
+ 'address' => address,
134
+ 'address6' => address6,
135
+ 'check_period' => check_period,
136
+ 'check_command' => check_command,
137
+ 'check_interval' => check_interval,
138
+ 'check_timeout' => check_timeout,
139
+ 'command_endpoint' => command_endpoint,
140
+ 'display_name' => display_name,
141
+ 'enable_active_checks' => enable_active_checks,
142
+ 'enable_event_handler' => enable_event_handler,
143
+ 'enable_flapping' => enable_flapping,
144
+ 'enable_notifications' => enable_notifications,
145
+ 'enable_passive_checks' => enable_passive_checks,
146
+ 'enable_perfdata' => enable_perfdata,
147
+ 'event_command' => event_command,
148
+ 'flapping_threshold' => flapping_threshold,
149
+ 'groups' => groups,
150
+ 'icon_image' => icon_image,
151
+ 'icon_image_alt' => icon_image_alt,
152
+ 'max_check_attempts' => max_check_attempts,
153
+ 'notes' => notes,
154
+ 'notes_url' => notes_url,
155
+ 'retry_interval' => retry_interval,
156
+ 'volatile' => volatile,
157
+ 'zone' => zone
158
+ }
159
+ }
160
+
161
+ payload['attrs']['vars'] = vars unless vars.empty?
162
+
163
+ # remove all empty attrs
164
+ payload.reject!{ |_k, v| v.nil? }
165
+ payload['attrs'].reject!{ |_k, v| v.nil? }
166
+
167
+ # puts JSON.pretty_generate payload
168
+
169
+ put(
170
+ url: format( '%s/objects/hosts/%s', @icinga_api_url_base, name ),
171
+ headers: @headers,
172
+ options: @options,
173
+ payload: payload
174
+ )
175
+ end
176
+
177
+ # delete a host
178
+ #
179
+ # @param [Hash] params
180
+ # @option params [String] :name host to delete
181
+ #
182
+ # @example
183
+ # @icinga.delete_host(name: 'foo')
184
+ #
185
+ # @return [Hash] result
186
+ #
187
+ def delete_host( params )
188
+
37
189
  raise ArgumentError.new('only Hash are allowed') unless( params.is_a?(Hash) )
38
190
  raise ArgumentError.new('missing params') if( params.size.zero? )
39
191
 
40
- host = params.dig(:host)
41
- fqdn = params.dig(:fqdn)
192
+ host = params.dig(:name)
193
+
194
+ raise ArgumentError.new('Missing name') if( host.nil? )
195
+
196
+ delete(
197
+ url: format( '%s/objects/hosts/%s?cascade=1', @icinga_api_url_base, host ),
198
+ headers: @headers,
199
+ options: @options
200
+ )
201
+ end
202
+
203
+ # modify a host
204
+ #
205
+ # @param [Hash] params
206
+ # @option params [String] :name
207
+ # @option params [String] :address
208
+ # @option params [String] :display_name
209
+ # @option params [Bool] :enable_notifications (false)
210
+ # @option params [Integer] :max_check_attempts (3)
211
+ # @option params [Integer] :check_interval (60)
212
+ # @option params [Integer] :retry_interval (45)
213
+ # @option params [String] :notes
214
+ # @option params [String] :notes_url
215
+ # @option params [String] :action_url
216
+ # @option params [Hash] :vars ({})
217
+ # @option params [Bool] :merge_vars (false)
218
+ #
219
+ # @example
220
+ # param = {
221
+ # name: 'foo',
222
+ # address: 'foo.bar.com',
223
+ # display_name: 'Host for an example Problem',
224
+ # max_check_attempts: 10,
225
+ # }
226
+ #
227
+ # param = {
228
+ # name: 'foo',
229
+ # address: 'foo.bar.com',
230
+ # notes: 'an demonstration object',
231
+ # vars: {
232
+ # description: 'schould be delete ASAP',
233
+ # os: 'Linux',
234
+ # partitions: {
235
+ # '/' => {
236
+ # crit: '98%',
237
+ # warn: '95%'
238
+ # }
239
+ # }
240
+ # },
241
+ # merge_vars: true
242
+ # }
243
+ #
244
+ # param = {
245
+ # name: 'foo',
246
+ # address: 'foo.bar.com',
247
+ # vars: {
248
+ # description: 'removed all other custom vars',
249
+ # }
250
+ # }
251
+ #
252
+ # @icinga.add_host(param)
253
+ #
254
+ # @return [Hash]
255
+ #
256
+ def modify_host( params )
257
+
258
+ raise ArgumentError.new('only Hash are allowed') unless( params.is_a?(Hash) )
259
+ raise ArgumentError.new('missing params') if( params.size.zero? )
260
+
261
+ name = params.dig(:name)
262
+ address = params.dig(:address)
42
263
  display_name = params.dig(:display_name) || host
43
264
  notifications = params.dig(:enable_notifications) || false
44
265
  max_check_attempts = params.dig(:max_check_attempts) || 3
@@ -48,8 +269,9 @@ module Icinga2
48
269
  notes_url = params.dig(:notes_url)
49
270
  action_url = params.dig(:action_url)
50
271
  vars = params.dig(:vars) || {}
272
+ merge_vars = params.dig(:merge_vars) || false
51
273
 
52
- raise ArgumentError.new('Missing host') if( host.nil? )
274
+ raise ArgumentError.new('Missing host name') if( name.nil? )
53
275
  raise ArgumentError.new('only true or false for notifications are allowed') unless( notifications.is_a?(TrueClass) || notifications.is_a?(FalseClass) )
54
276
  raise ArgumentError.new('only Integer for max_check_attempts are allowed') unless( max_check_attempts.is_a?(Integer) )
55
277
  raise ArgumentError.new('only Integer for check_interval are allowed') unless( check_interval.is_a?(Integer) )
@@ -57,16 +279,27 @@ module Icinga2
57
279
  raise ArgumentError.new('only String for notes are allowed') unless( notes.is_a?(String) || notes.nil? )
58
280
  raise ArgumentError.new('only String for notes_url are allowed') unless( notes_url.is_a?(String) || notes_url.nil? )
59
281
  raise ArgumentError.new('only Hash for vars are allowed') unless( vars.is_a?(Hash) )
282
+ raise ArgumentError.new('wrong type. merge_vars must be an Boolean') unless( merge_vars.is_a?(TrueClass) || merge_vars.is_a?(FalseClass) )
283
+
284
+ # check if host exists
285
+ exists = exists_host?( name )
286
+ raise ArgumentError.new( format( 'host %s do not exists', name ) ) if( exists == false )
60
287
 
61
- if( fqdn.nil? )
62
- # build FQDN
63
- fqdn = Socket.gethostbyname( host ).first
288
+ # merge the new with the old vars
289
+ if( merge_vars == true )
290
+ current_host = hosts( name: name )
291
+ current_host_vars = current_host.first
292
+ current_host_vars = current_host_vars.dig('attrs','vars')
293
+ current_host_vars = current_host_vars.deep_string_keys
294
+
295
+ vars = vars.deep_string_keys unless( vars.empty? )
296
+ vars = current_host_vars.merge( vars )
64
297
  end
65
298
 
299
+ # POST request
66
300
  payload = {
67
- 'templates' => [ 'generic-host' ],
68
301
  'attrs' => {
69
- 'address' => fqdn,
302
+ 'address' => address,
70
303
  'display_name' => display_name,
71
304
  'max_check_attempts' => max_check_attempts.to_i,
72
305
  'check_interval' => check_interval.to_i,
@@ -80,50 +313,19 @@ module Icinga2
80
313
 
81
314
  payload['attrs']['vars'] = vars unless vars.empty?
82
315
 
83
- if( @icinga_cluster == true && !@icinga_satellite.nil? )
84
- payload['attrs']['zone'] = @icinga_satellite
85
- end
86
-
87
- # logger.debug( JSON.pretty_generate( payload ) )
88
-
89
- Network.put(
90
- url: format( '%s/objects/hosts/%s', @icinga_api_url_base, host ),
316
+ post(
317
+ url: format( '%s/objects/hosts/%s', @icinga_api_url_base, name ),
91
318
  headers: @headers,
92
319
  options: @options,
93
320
  payload: payload
94
321
  )
95
322
  end
96
323
 
97
- # delete a host
98
- #
99
- # @param [Hash] params
100
- # @option params [String] :host host to delete
101
- #
102
- # @example
103
- # @icinga.delete_host(host: 'foo')
104
- #
105
- # @return [Hash] result
106
- #
107
- def delete_host( params )
108
-
109
- raise ArgumentError.new('only Hash are allowed') unless( params.is_a?(Hash) )
110
- raise ArgumentError.new('missing params') if( params.size.zero? )
111
-
112
- host = params.dig(:host)
113
-
114
- raise ArgumentError.new('Missing host') if( host.nil? )
115
-
116
- Network.delete(
117
- url: format( '%s/objects/hosts/%s?cascade=1', @icinga_api_url_base, host ),
118
- headers: @headers,
119
- options: @options
120
- )
121
- end
122
324
 
123
325
  # return hosts
124
326
  #
125
327
  # @param [Hash] params
126
- # @option params [String] :host
328
+ # @option params [String] :name
127
329
  # @option params [String] :attrs
128
330
  # @option params [String] :filter
129
331
  # @option params [String] :joins
@@ -132,30 +334,28 @@ module Icinga2
132
334
  # @icinga.hosts
133
335
  #
134
336
  # @example to get one host
135
- # @icinga.hosts(host: 'icinga2')
337
+ # @icinga.hosts( name: 'icinga2')
136
338
  #
137
339
  # @return [Array]
138
340
  #
139
341
  def hosts( params = {} )
140
342
 
141
- host = params.dig(:host)
142
- attrs = params.dig(:attrs)
143
- filter = params.dig(:filter)
144
- joins = params.dig(:joins)
343
+ name = params.dig(:name)
344
+ # attrs = params.dig(:attrs)
345
+ # filter = params.dig(:filter)
346
+ # joins = params.dig(:joins)
145
347
 
146
- payload['attrs'] = attrs unless attrs.nil?
147
- payload['filter'] = filter unless filter.nil?
148
- payload['joins'] = joins unless joins.nil?
348
+ # payload = {}
349
+ #
350
+ # payload['attrs'] = attrs unless attrs.nil?
351
+ # payload['filter'] = filter unless filter.nil?
352
+ # payload['joins'] = joins unless joins.nil?
149
353
 
150
- data = Network.api_data(
151
- url: format( '%s/objects/hosts/%s', @icinga_api_url_base, host ),
354
+ api_data(
355
+ url: format( '%s/objects/hosts/%s', @icinga_api_url_base, name ),
152
356
  headers: @headers,
153
357
  options: @options
154
358
  )
155
-
156
- return data.dig('results') if( data.dig(:status).nil? )
157
-
158
- nil
159
359
  end
160
360
 
161
361
  # returns true if the host exists
@@ -172,12 +372,13 @@ module Icinga2
172
372
  raise ArgumentError.new('only String are allowed') unless( host_name.is_a?(String) )
173
373
  raise ArgumentError.new('Missing host_name') if( host_name.size.zero? )
174
374
 
175
- result = hosts( host: host_name )
176
- result = JSON.parse( result ) if result.is_a?( String )
375
+ result = hosts( name: host_name )
376
+ result = JSON.parse( result ) if( result.is_a?(String) )
377
+ result = result.first if( result.is_a?(Array) )
177
378
 
178
- return true if !result.nil? && result.is_a?(Array)
379
+ return false if( result.is_a?(Hash) && result.dig('code') == 404 )
179
380
 
180
- false
381
+ true
181
382
  end
182
383
 
183
384
  # returns host objects
@@ -206,7 +407,6 @@ module Icinga2
206
407
  # raise ArgumentError.new('only Array for joins are allowed') unless( joins.is_a?(Hash) )
207
408
 
208
409
  payload = {}
209
- results = nil
210
410
 
211
411
  if( attrs.nil? )
212
412
  attrs = %w[name state acknowledgement downtime_depth last_check]
@@ -216,46 +416,39 @@ module Icinga2
216
416
  payload['filter'] = filter unless filter.nil?
217
417
  payload['joins'] = joins unless joins.nil?
218
418
 
219
- data = Network.api_data(
419
+ data = api_data(
220
420
  url: format( '%s/objects/hosts', @icinga_api_url_base ),
221
421
  headers: @headers,
222
422
  options: @options,
223
423
  payload: payload
224
424
  )
225
425
 
226
- status = data.dig(:status)
227
-
228
- if( status.nil? )
229
-
230
- results = data.dig('results')
231
-
232
- unless( results.nil? )
426
+ @last_host_objects_called = Time.now.to_i
233
427
 
234
- all_hosts = results.clone
428
+ if( !data.nil? && data.is_a?(Array) )
235
429
 
236
- unless( all_hosts.nil? )
430
+ all_hosts = data.clone
237
431
 
238
- # global var for count of all hosts
239
- @hosts_all = all_hosts.size
240
- # global var for count of all host with a problem
241
- @hosts_problems = count_problems(results)
242
- # global var for count of all gost with state HOSTS_DOWN
243
- @hosts_problems_down = count_problems(results, Icinga2::HOSTS_DOWN)
244
- @hosts_problems_critical = count_problems(results, Icinga2::HOSTS_CRITICAL)
245
- @hosts_problems_unknown = count_problems(results, Icinga2::HOSTS_UNKNOWN)
432
+ unless( all_hosts.nil? )
433
+ # global var for count of all hosts
434
+ @hosts_all = all_hosts.size
435
+ # global var for count of all host with a problem
436
+ @hosts_problems = count_problems(all_hosts)
437
+ # global var for count of all gost with state HOSTS_DOWN
438
+ @hosts_problems_down = count_problems(all_hosts, Icinga2::HOSTS_DOWN)
439
+ @hosts_problems_critical = count_problems(all_hosts, Icinga2::HOSTS_CRITICAL)
440
+ @hosts_problems_unknown = count_problems(all_hosts, Icinga2::HOSTS_UNKNOWN)
246
441
 
247
- end
248
442
  end
249
443
  end
250
444
 
251
- results
445
+ data
252
446
  end
253
447
 
254
448
  # returns adjusted hosts state
449
+ # OBSOLETE
255
450
  #
256
451
  # @example
257
- # @icinga.cib_data
258
- # @icinga.host_objects
259
452
  # handled, down = @icinga.hosts_adjusted.values
260
453
  #
261
454
  # h = @icinga.hosts_adjusted
@@ -267,6 +460,12 @@ module Icinga2
267
460
  #
268
461
  def hosts_adjusted
269
462
 
463
+ puts 'function hosts_adjusted() is obsolete'
464
+ puts 'Please use host_problems()'
465
+
466
+ cib_data if((Time.now.to_i - @last_cib_data_called).to_i > @last_call_timeout)
467
+ host_objects if((Time.now.to_i - @last_host_objects_called).to_i > @last_call_timeout)
468
+
270
469
  raise ArgumentError.new('Integer for @hosts_problems_down needed') unless( @hosts_problems_down.is_a?(Integer) )
271
470
  raise ArgumentError.new('Integer for @hosts_problems_critical needed') unless( @hosts_problems_critical.is_a?(Integer) )
272
471
  raise ArgumentError.new('Integer for @hosts_problems_unknown needed') unless( @hosts_problems_unknown.is_a?(Integer) )
@@ -319,6 +518,8 @@ module Icinga2
319
518
  host_data = host_objects
320
519
  host_data = JSON.parse( host_data ) if host_data.is_a?(String)
321
520
 
521
+ # logger.debug(host_data)
522
+
322
523
  unless( host_data.nil? )
323
524
 
324
525
  host_data.each do |h,_v|
@@ -334,7 +535,7 @@ module Icinga2
334
535
  # get the count of problems
335
536
  #
336
537
  if( host_problems.count != 0 )
337
- host_problems.keys[1..max_items].each { |k,_v| host_problems_severity[k] = host_problems[k] }
538
+ host_problems.keys[1..max_items].each { |k| host_problems_severity[k] = host_problems[k] }
338
539
  end
339
540
 
340
541
  host_problems_severity
@@ -343,12 +544,12 @@ module Icinga2
343
544
  # returns a counter of all hosts
344
545
  #
345
546
  # @example
346
- # @icinga.host_objects
347
547
  # @icinga.hosts_all
348
548
  #
349
549
  # @return [Integer]
350
550
  #
351
551
  def hosts_all
552
+ host_objects if( @hosts_all.nil? || @hosts_all.zero? )
352
553
  @hosts_all
353
554
  end
354
555
 
@@ -356,7 +557,7 @@ module Icinga2
356
557
  #
357
558
  # @example
358
559
  # @icinga.host_objects
359
- # all, down, critical, unknown = @icinga.host_problems.values
560
+ # all, down, critical, unknown, handled, adjusted = @icinga.host_problems.values
360
561
  #
361
562
  # p = @icinga.host_problems
362
563
  # down = h.dig(:down)
@@ -369,16 +570,31 @@ module Icinga2
369
570
  #
370
571
  def host_problems
371
572
 
573
+ cib_data if((Time.now.to_i - @last_cib_data_called).to_i > @last_call_timeout)
574
+ host_objects if((Time.now.to_i - @last_host_objects_called).to_i > @last_call_timeout)
575
+
576
+ raise ArgumentError.new('Integer for @hosts_problems_down needed') unless( @hosts_problems_down.is_a?(Integer) )
577
+ raise ArgumentError.new('Integer for @hosts_problems_critical needed') unless( @hosts_problems_critical.is_a?(Integer) )
578
+ raise ArgumentError.new('Integer for @hosts_problems_unknown needed') unless( @hosts_problems_unknown.is_a?(Integer) )
579
+ raise ArgumentError.new('Integer for @hosts_down needed') unless( @hosts_down.is_a?(Integer) )
580
+
372
581
  problems_all = @hosts_problems.nil? ? 0 : @hosts_problems
373
582
  problems_down = @hosts_problems_down.nil? ? 0 : @hosts_problems_down
374
583
  problems_critical = @hosts_problems_critical.nil? ? 0 : @hosts_problems_critical
375
584
  problems_unknown = @hosts_problems_unknown.nil? ? 0 : @hosts_problems_unknown
376
585
 
586
+ # calculate host problems adjusted by handled problems
587
+ # count togther handled host problems
588
+ problems_handled = @hosts_problems_down + @hosts_problems_critical + @hosts_problems_unknown
589
+ problems_adjusted = @hosts_down - problems_handled
590
+
377
591
  {
378
592
  all: problems_all.to_i,
379
593
  down: problems_down.to_i,
380
594
  critical: problems_critical.to_i,
381
- unknown: problems_unknown.to_i
595
+ unknown: problems_unknown.to_i,
596
+ handled: problems_handled.to_i,
597
+ adjusted: problems_adjusted.to_i
382
598
  }
383
599
  end
384
600