icinga2 0.8.1.2 → 0.9.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,17 +4,27 @@
4
4
  ## <a name="add-service"></a>add services
5
5
  add_services( params )
6
6
 
7
- **this function is not operable! need help, time and/or beer**
8
-
9
7
  ### Example
10
8
  services = {
11
- 'service-heap-mem' => {
12
- 'display_name' => 'Tomcat - Heap Memory',
13
- 'check_command' => 'tomcat-heap-memory',
9
+ vars: {
10
+ display_name: 'Tomcat - Heap Memory',
11
+ check_command: 'tomcat-heap-memory'
14
12
  }
15
13
  }
16
14
 
17
- @icinga.add_services( 'foo-bar.lan', services )
15
+ @icinga.add_services( host: 'icinga2', service_name: 'ping4', vars: services )
16
+
17
+ @icinga.add_services(
18
+ host: 'icinga2',
19
+ service_name: 'ping4',
20
+ vars: {
21
+ attrs: {
22
+ check_command: 'ping4',
23
+ check_interval: 10,
24
+ retry_interval: 30
25
+ }
26
+ }
27
+ )
18
28
 
19
29
 
20
30
  ## <a name="list-services"></a>list services
@@ -33,12 +43,19 @@
33
43
 
34
44
 
35
45
  ## <a name="delete-service"></a>delete
36
- **not yet implemented**
46
+ delete_service( params )
37
47
 
38
- ## <a name="unhandled-services"></a>list unhandled_services
39
- **not yet implemented**
48
+ #### Example
49
+ @icinga.delete_service(host: 'foo', service_name: 'ping4')
50
+
51
+ @icinga.delete_service(host: 'foo', service_name: 'new_ping4', cascade: true)
40
52
 
41
53
 
54
+ ## <a name="unhandled-services"></a>list unhandled_services
55
+ unhandled_services
56
+
57
+ #### Example
58
+ @icinga.unhandled_services
42
59
 
43
60
 
44
61
  ## <a name="service-exists"></a>check if the service exists
@@ -84,13 +101,6 @@ or
84
101
  problems, problems_and_severity = @icinga.list_services_with_problems(10).values
85
102
 
86
103
 
87
- ## <a name="update-host"></a>update host
88
- update_host( hash, host )
89
- **this function is not operable! need help, time and/or beer**
90
-
91
- ### Example
92
-
93
-
94
104
  ## <a name="count-all-services"></a>count all services
95
105
  services_all
96
106
 
@@ -117,3 +127,11 @@ or
117
127
 
118
128
  ### Example
119
129
  service_severity( {'attrs' => { 'state' => 0.0, 'acknowledgement' => 0.0, 'downtime_depth' => 0.0 } } )
130
+
131
+
132
+
133
+ ## <a name=""></a>(private) update host
134
+ update_host( hash, host )
135
+
136
+ ### Example
137
+ update_host( v, host_name )
@@ -6,7 +6,7 @@
6
6
  <title>
7
7
  Top Level Namespace
8
8
 
9
- &mdash; Documentation by YARD 0.9.9
9
+ &mdash; Documentation by YARD 0.9.4
10
10
 
11
11
  </title>
12
12
 
@@ -28,7 +28,7 @@
28
28
  </head>
29
29
  <body>
30
30
  <div class="nav_wrap">
31
- <iframe id="nav" src="class_list.html?1"></iframe>
31
+ <iframe id="nav" src="class_list.html"></iframe>
32
32
  <div id="resizer"></div>
33
33
  </div>
34
34
 
@@ -59,6 +59,8 @@
59
59
  <div class="clear"></div>
60
60
  </div>
61
61
 
62
+ <iframe id="search_frame" src="class_list.html"></iframe>
63
+
62
64
  <div id="content"><h1>Top Level Namespace
63
65
 
64
66
 
@@ -82,10 +84,12 @@
82
84
  <p class="children">
83
85
 
84
86
 
85
- <strong class="modules">Modules:</strong> <span class='object_link'><a href="Icinga2.html" title="Icinga2 (module)">Icinga2</a></span>, <span class='object_link'><a href="Logging.html" title="Logging (module)">Logging</a></span>
87
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="Boolean.html" title="Boolean (module)">Boolean</a></span>, <span class='object_link'><a href="Icinga2.html" title="Icinga2 (module)">Icinga2</a></span>, <span class='object_link'><a href="Logging.html" title="Logging (module)">Logging</a></span>
86
88
 
87
89
 
88
90
 
91
+ <strong class="classes">Classes:</strong> <span class='object_link'><a href="Array.html" title="Array (class)">Array</a></span>, <span class='object_link'><a href="FalseClass.html" title="FalseClass (class)">FalseClass</a></span>, <span class='object_link'><a href="Hash.html" title="Hash (class)">Hash</a></span>, <span class='object_link'><a href="Object.html" title="Object (class)">Object</a></span>, <span class='object_link'><a href="Time.html" title="Time (class)">Time</a></span>, <span class='object_link'><a href="TrueClass.html" title="TrueClass (class)">TrueClass</a></span>
92
+
89
93
 
90
94
  </p>
91
95
 
@@ -100,9 +104,9 @@
100
104
  </div>
101
105
 
102
106
  <div id="footer">
103
- Generated on Tue Aug 22 11:29:51 2017 by
107
+ Generated on Sun Nov 12 15:48:13 2017 by
104
108
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
105
- 0.9.9 (ruby-2.3.4).
109
+ 0.9.4 (ruby-2.2.8).
106
110
  </div>
107
111
 
108
112
  </div>
@@ -52,6 +52,9 @@ unless( i.nil? )
52
52
 
53
53
  puts ''
54
54
  puts ' ============================================================= '
55
+ puts '= icinga2 available'
56
+ puts i.available?
57
+ puts ''
55
58
  puts '= icinga2 status'
56
59
  puts i.status_data
57
60
  puts ''
@@ -74,6 +77,7 @@ unless( i.nil? )
74
77
  puts format( '= uptime: %s', i.uptime )
75
78
  puts ''
76
79
 
80
+ puts ''
77
81
  puts ' ------------------------------------------------------------- '
78
82
  puts ''
79
83
  puts ' ==> HOSTS'
@@ -84,15 +88,18 @@ unless( i.nil? )
84
88
 
85
89
  p, a = i.hosts_adjusted
86
90
 
87
- puts format( '= host handled problems : %d', p )
88
- puts format( '= host down adjusted : %d', a )
91
+ puts format( '= host handled problems : %s', p )
92
+ puts format( '= host down adjusted : %s', a )
89
93
 
90
94
  puts '= host objects'
95
+
96
+ all, down, critical, unknown = i.host_problems.values
97
+
91
98
  puts format( '= count of all hosts : %d', i.hosts_all )
92
- puts format( '= hosts with problems: %d', i.hosts_problems )
93
- puts format( '= hosts are down : %d', i.hosts_down )
94
- puts format( '= hosts are critical : %d', i.hosts_critical )
95
- puts format( '= hosts are unknown : %d', i.hosts_unknown )
99
+ puts format( '= hosts with problems: %s', i.list_hosts_with_problems )
100
+ puts format( '= hosts are down : %d', down )
101
+ puts format( '= hosts are critical : %d', critical )
102
+ puts format( '= hosts are unknown : %d', unknown )
96
103
  puts format( '= count hosts w. problems: %d', i.count_hosts_with_problems )
97
104
 
98
105
  ['icinga2', 'bp-foo'].each do |h|
@@ -113,8 +120,10 @@ unless( i.nil? )
113
120
  puts ''
114
121
  puts '= list all Hosts'
115
122
  puts i.hosts
123
+ puts ''
116
124
  puts ' = delete Host'
117
125
  puts i.delete_host( host: 'foo' )
126
+ puts ''
118
127
  puts ' = add Host'
119
128
  puts i.add_host(
120
129
  host: 'foo',
@@ -156,22 +165,28 @@ unless( i.nil? )
156
165
  puts ''
157
166
  puts ' ==> SERVICES'
158
167
  puts ''
168
+ i.cib_data
159
169
  i.service_objects
160
170
 
161
- warning, critical, unknown = i.services_adjusted
162
-
171
+ all, warning, critical, unknown, pending, in_downtime, acknowledged = i.service_problems.values
163
172
  puts format( '= count of all services: %d', i.services_all )
164
- puts format( '= services critical: %d', i.services_critical)
165
- puts format( '= services warning: %d', i.services_warning)
166
- puts format( '= services unknown: %d', i.services_unknown)
173
+ puts format( '= services warning: %d', warning)
174
+ puts format( '= services critical: %d', critical)
175
+ puts format( '= services unknown: %d', unknown)
176
+ puts format( '= services in downtime: %d', in_downtime)
177
+ puts format( '= services acknowledged: %d', acknowledged)
178
+
167
179
  puts ''
168
- puts format( '= services handled warning problems: %d', i.services_handled_critical)
169
- puts format( '= services handled critical problems: %d', i.services_handled_critical)
170
- puts format( '= services handled unknown problems: %d', i.services_handled_unknown)
180
+ all, warning, critical, unknown = i.service_problems_handled.values
181
+ puts format( '= services handled warning problems: %d', warning)
182
+ puts format( '= services handled critical problems: %d', critical)
183
+ puts format( '= services handled unknown problems: %d', unknown)
171
184
  puts ''
185
+ warning, critical, unknown = i.services_adjusted.values
172
186
  puts format( '= services adjusted warning: %d', warning)
173
187
  puts format( '= services adjusted critical: %d', critical)
174
188
  puts format( '= services adjusted unknown: %d', unknown)
189
+
175
190
  puts ''
176
191
  puts '= check if service \'users\' on host \'icinga2\' exists'
177
192
  puts i.exists_service?( host: 'icinga2', service: 'users' ) ? 'true' : 'false'
@@ -195,6 +210,52 @@ unless( i.nil? )
195
210
  puts '= list all Services'
196
211
  puts i.services
197
212
  puts ''
213
+ puts '= add Service'
214
+ puts i.add_services(
215
+ host: 'icinga2',
216
+ service_name: 'new_http',
217
+ vars: {
218
+ attrs: {
219
+ check_command: 'http',
220
+ check_interval: 10,
221
+ retry_interval: 30,
222
+ vars: {
223
+ http_address: '127.0.0.1',
224
+ http_url: '/access/index',
225
+ http_port: 80
226
+ }
227
+ }
228
+ }
229
+ )
230
+ puts ''
231
+ puts '= list new named Service \'new_http\' from Host \'icinga2\''
232
+ puts i.services( host: 'icinga2', service: 'new_http' )
233
+ puts ''
234
+ puts '= modify named Service \'new_http\' from Host \'icinga2\''
235
+ puts JSON.pretty_generate i.modify_service(
236
+ service_name: 'new_http',
237
+ vars: {
238
+ attrs: {
239
+ check_interval: 60,
240
+ retry_interval: 10,
241
+ vars: {
242
+ http_url: '/access/login' ,
243
+ http_address: '10.41.80.63'
244
+ }
245
+ }
246
+ }
247
+ )
248
+ puts ''
249
+ puts '= list modified named Service \'new_http\' from Host \'icinga2\''
250
+ puts JSON.pretty_generate i.services( host: 'icinga2', service: 'new_http' )
251
+ puts ''
252
+ puts '= delete named Service \'new_http\' from Host \'icinga2\''
253
+ puts i.delete_service(
254
+ host: 'icinga2',
255
+ service_name: 'new_http',
256
+ cascade: true
257
+ )
258
+ puts ''
198
259
  puts ' ------------------------------------------------------------- '
199
260
  puts ''
200
261
 
@@ -202,7 +202,6 @@ module Icinga2
202
202
 
203
203
  end
204
204
 
205
-
206
205
  # return Icinga2 Application data
207
206
  #
208
207
  # @example
@@ -322,6 +321,22 @@ module Icinga2
322
321
  )
323
322
  end
324
323
 
324
+ # check the availability of a Icinga network connect
325
+ #
326
+ # @example
327
+ # @icinga.available?
328
+ #
329
+ # @return [Bool]
330
+ #
331
+ def available?
332
+
333
+ data = application_data
334
+
335
+ return true unless( data.nil? )
336
+
337
+ false
338
+ end
339
+
325
340
  # return Icinga2 version and revision
326
341
  #
327
342
  # @example
@@ -165,6 +165,7 @@ module Icinga2
165
165
  )
166
166
 
167
167
  data = JSON.parse( data )
168
+
168
169
  results = data.dig('results').first
169
170
 
170
171
  return { status: results.dig('code').to_i, name: results.dig('name'), message: results.dig('status') } unless( results.nil? )
@@ -177,9 +178,6 @@ module Icinga2
177
178
  results = error.dig( 'results' )
178
179
 
179
180
  if( !results.nil? )
180
-
181
- # result = result.first
182
-
183
181
  return {
184
182
  status: results.dig('code').to_i,
185
183
  name: results.dig('name'),
@@ -261,7 +259,7 @@ module Icinga2
261
259
  data = JSON.parse( data )
262
260
  results = data.dig('results').first
263
261
 
264
- return { status: results.dig('code').to_i, name: results.dig('name'), message: results.dig('status') } unless( results.nil? )
262
+ return { status: results.dig('code').to_i, message: results.dig('status') } unless( results.nil? )
265
263
 
266
264
  rescue RestClient::ExceptionWithResponse => e
267
265
 
@@ -273,7 +271,7 @@ module Icinga2
273
271
  return { status: error.dig('error').to_i, message: error.dig('status'), error: results } if( results.nil? )
274
272
 
275
273
  if( results.is_a?( Hash ) && results.count != 0 )
276
- # result = result.first
274
+
277
275
  return {
278
276
  status: results.dig('code').to_i,
279
277
  name: results.dig('name'),
@@ -370,10 +368,14 @@ module Icinga2
370
368
  message: error.dig( 'status' )
371
369
  }
372
370
  else
371
+
372
+ results = results.first if( results.is_a?(Array) )
373
+
373
374
  return {
374
375
  status: results.dig('code').to_i,
375
376
  name: results.dig('name'),
376
- message: results.dig('status')
377
+ message: results.dig('status'),
378
+ error: results.dig('errors')
377
379
  }
378
380
  end
379
381
  rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH => e
@@ -10,69 +10,204 @@ module Icinga2
10
10
  #
11
11
  # @param [Hash] params
12
12
  # @option params [String] :host
13
- # @option params [String] :services
13
+ # @option params [String] :service_name
14
+ # @option params [Array] :templates
15
+ # @option params [Hash] :vars
14
16
  #
15
- # @todo
16
- # this function is not operable
17
- # need help, time or beer
17
+ # @example
18
+ # @icinga.add_services(
19
+ # host: 'icinga2',
20
+ # service_name: 'http2',
21
+ # vars: {
22
+ # attrs: {
23
+ # check_command: 'http',
24
+ # check_interval: 10,
25
+ # retry_interval: 30,
26
+ # vars: {
27
+ # http_address: '127.0.0.1',
28
+ # http_url: '/access/index',
29
+ # http_port: 80
30
+ # }
31
+ # }
32
+ # }
33
+ # )
18
34
  #
19
35
  # @return [Hash]
36
+ # * status
37
+ # * message
20
38
  #
21
39
  def add_services( params = {} )
22
40
 
23
41
  raise ArgumentError.new('only Hash are allowed') unless( params.is_a?(Hash) )
24
42
 
25
- # TODO
26
- puts 'add_services() ToDo'
43
+ host_name = params.dig(:host)
44
+ service_name = params.dig(:service_name)
45
+ templates = params.dig(:templates) || ['generic-service']
46
+ vars = params.dig(:vars)
27
47
 
28
- host_name = params.dig(:host)
29
- services = params.dig(:services)
48
+ raise ArgumentError.new('Missing host') if( host_name.nil? )
49
+ raise ArgumentError.new('Missing service_name') if( service_name.nil? )
50
+ raise ArgumentError.new('only Array for templates are allowed') unless( templates.is_a?(Array) )
51
+ raise ArgumentError.new('Missing vars') if( vars.nil? )
52
+ raise ArgumentError.new('only Hash for vars are allowed') unless( vars.is_a?(Hash) )
53
+
54
+ # validate
55
+ # needed_values = %w[check_command check_interval retry_interval]
30
56
 
31
- services.each do |s,v|
57
+ attrs = vars.dig(:attrs)
58
+
59
+ validate_check_command = attrs.select { |k,_v| k == 'check_command'.to_sym }.size
60
+ validate_check_interval = attrs.select { |k,_v| k == 'check_interval'.to_sym }.size
61
+ validate_retry_interval = attrs.select { |k,_v| k == 'retry_interval'.to_sym }.size
62
+
63
+ raise 'Error in attrs, expected \'check_command\' but was not found' if( validate_check_command.zero? )
64
+ raise 'Error in attrs, expected \'check_interval\' but was not found' if( validate_check_interval.zero? )
65
+ raise 'Error in attrs, expected \'retry_interval\' but was not found' if( validate_retry_interval.zero? )
66
+
67
+ payload = ''
68
+
69
+ vars.each do |_s,v|
32
70
 
33
71
  payload = {
34
- 'templates' => [ 'generic-service' ],
72
+ 'templates' => templates,
35
73
  'attrs' => update_host( v, host_name )
36
74
  }
75
+ end
76
+
77
+ Network.put(
78
+ url: format( '%s/objects/services/%s!%s', @icinga_api_url_base, host_name, service_name ),
79
+ headers: @headers,
80
+ options: @options,
81
+ payload: payload
82
+ )
83
+
84
+ end
85
+
86
+ # delete a service
87
+ #
88
+ # @param [Hash] params
89
+ # @option params [String] :host host name for the service
90
+ # @option params [String] :service_name
91
+ # @option params [Bool] :cascade (false) delete service also when other objects depend on it
92
+ #
93
+ # @example
94
+ # @icinga.delete_service(host: 'foo', service_name: 'http2')
95
+ # @icinga.delete_service(host: 'foo', service_name: 'http2', cascade: true)
96
+ #
97
+ # @return [Hash] result
98
+ #
99
+ def delete_service( params )
100
+
101
+ raise ArgumentError.new('only Hash are allowed') unless( params.is_a?(Hash) )
102
+ raise ArgumentError.new('missing params') if( params.size.zero? )
37
103
 
38
- logger.debug( s )
39
- logger.debug( v.to_json )
104
+ host_name = params.dig(:host)
105
+ service_name = params.dig(:service_name)
106
+ cascade = params.dig(:cascade)
40
107
 
41
- logger.debug( JSON.pretty_generate( payload ) )
108
+ raise ArgumentError.new('Missing host') if( host_name.nil? )
109
+ raise ArgumentError.new('Missing service_name') if( service_name.nil? )
42
110
 
43
- Network.put(
44
- url: format( '%s/objects/services/%s!%s', @icinga_api_url_base, host_name, s ),
45
- headers: @headers,
46
- options: @options,
47
- payload: payload
48
- )
111
+ if( ! cascade.nil? && ( ! cascade.is_a?(TrueClass) && ! cascade.is_a?(FalseClass) ) )
112
+ raise ArgumentError.new('cascade can only be true or false')
49
113
  end
50
114
 
115
+ url = format( '%s/objects/services/%s!%s%s', @icinga_api_url_base, host_name, service_name, cascade.is_a?(TrueClass) ? '?cascade=1' : nil )
116
+
117
+ Network.delete(
118
+ url: url,
119
+ headers: @headers,
120
+ options: @options
121
+ )
122
+
51
123
  end
52
124
 
53
- # return all unhandled services
125
+ # modify an service
54
126
  #
55
127
  # @param [Hash] params
128
+ # @option params [String] :service_name
129
+ # @option params [Hash] :vars
56
130
  #
57
- # @todo
58
- # this function is not operable
59
- # need help, time or beer
131
+ # @example
132
+ # @icinga.modify_service(
133
+ # service_name: 'http2',
134
+ # vars: {
135
+ # attrs: {
136
+ # check_interval: 60,
137
+ # retry_interval: 10,
138
+ # vars: {
139
+ # http_url: '/access/login' ,
140
+ # http_address: '10.41.80.63'
141
+ # }
142
+ # }
143
+ # }
144
+ # )
60
145
  #
61
- # @return [Nil]
146
+ # @return [Hash]
147
+ # * status
148
+ # * message
62
149
  #
63
- def unhandled_services( params = {} )
150
+ def modify_service( params )
64
151
 
65
152
  raise ArgumentError.new('only Hash are allowed') unless( params.is_a?(Hash) )
153
+ raise ArgumentError.new('missing params') if( params.size.zero? )
66
154
 
67
- # TODO
68
- puts 'unhandled_services() ToDo'
155
+ templates = params.dig(:templates) || ['generic-service']
156
+ vars = params.dig(:vars)
157
+ service_name = params.dig(:service_name)
69
158
 
70
- # taken from https://blog.netways.de/2016/11/18/icinga-2-api-cheat-sheet/
71
- # 5) Anzeige aller Services die unhandled sind und weder in Downtime, noch acknowledged sind
72
- # /usr/bin/curl -k -s -u 'root:icinga' -H 'X-HTTP-Method-Override: GET' -X POST
73
- # 'https://127.0.0.1:5665/objects/services' #
74
- # -d '{ "attrs": [ "__name", "state", "downtime_depth", "acknowledgement" ], "filter": "service.state != ServiceOK && service.downtime_depth == 0.0 && service.acknowledgement == 0.0" }''' | jq
159
+ raise ArgumentError.new('Missing service_name') if( service_name.nil? )
160
+ raise ArgumentError.new('only Array for templates are allowed') unless( templates.is_a?(Array) )
161
+ raise ArgumentError.new('Missing vars') if( vars.nil? )
162
+ raise ArgumentError.new('only Hash for vars are allowed') unless( vars.is_a?(Hash) )
75
163
 
164
+ payload = {}
165
+
166
+ vars.each do |_s,v|
167
+
168
+ payload = {
169
+ 'templates' => templates,
170
+ 'attrs' => v
171
+ }
172
+ end
173
+
174
+ payload['filter'] = format( 'service.name=="%s"', service_name )
175
+
176
+ Network.post(
177
+ url: format( '%s/objects/services', @icinga_api_url_base ),
178
+ headers: @headers,
179
+ options: @options,
180
+ payload: payload
181
+ )
182
+ end
183
+
184
+ # return all unhandled services
185
+ #
186
+ # @example
187
+ # @icinga.unhandled_services
188
+ #
189
+ # @return [Hash]
190
+ #
191
+ def unhandled_services
192
+
193
+ payload = {}
194
+
195
+ filter = 'service.state != ServiceOK && service.downtime_depth == 0.0 && service.acknowledgement == 0.0'
196
+ attrs = %w[__name name state acknowledgement downtime_depth last_check]
197
+
198
+ payload['attrs'] = attrs unless attrs.nil?
199
+ payload['filter'] = filter unless filter.nil?
200
+
201
+ data = Network.api_data(
202
+ url: format( '%s/objects/services', @icinga_api_url_base ),
203
+ headers: @headers,
204
+ options: @options,
205
+ payload: payload
206
+ )
207
+
208
+ status = data.dig(:status)
209
+
210
+ data.dig('results') if( status.nil? )
76
211
  end
77
212
 
78
213
  # return services
@@ -121,7 +256,7 @@ module Icinga2
121
256
  # @option params [String] :service
122
257
  #
123
258
  # @example
124
- # @icinga.exists_service?(host: 'icinga2', service: 'users' )
259
+ # @icinga.exists_service?(host: 'icinga2', service: 'users')
125
260
  #
126
261
  # @return [Bool]
127
262
  #
@@ -308,36 +443,6 @@ module Icinga2
308
443
  }
309
444
  end
310
445
 
311
- # update host
312
- #
313
- # @param [Hash] hash
314
- # @param [String] host
315
- #
316
- # @todo
317
- # this function are not operable
318
- # need help, time or beer
319
- #
320
- # @return [Hash]
321
- #
322
- def update_host( hash, host )
323
-
324
- hash.each do |k, v|
325
-
326
- if( k == 'host' && v.is_a?( String ) )
327
- v.replace( host )
328
-
329
- elsif( v.is_a?( Hash ) )
330
- update_host( v, host )
331
-
332
- elsif( v.is_a?(Array) )
333
-
334
- v.flatten.each { |x| update_host( x, host ) if x.is_a?( Hash ) }
335
- end
336
- end
337
-
338
- hash
339
- end
340
-
341
446
  # returns a counter of all services
342
447
  #
343
448
  # @example
@@ -351,12 +456,51 @@ module Icinga2
351
456
  @services_all
352
457
  end
353
458
 
459
+ # returns data with service problems
460
+ #
461
+ # @example
462
+ # @icinga.cib_data
463
+ # all, warning, critical, unknown, pending, in_downtime, acknowledged = @icinga.service_problems.values
464
+ #
465
+ # p = @icinga.service_problems
466
+ # warning = p.dig(:warning)
467
+ #
468
+ # @return [Hash]
469
+ # * ok
470
+ # * warning
471
+ # * critical
472
+ # * unknown
473
+ # * pending
474
+ # * in_downtime
475
+ # * acknowledged
476
+ #
477
+ def service_problems
478
+
479
+ services_ok = @services_ok.nil? ? 0 : @services_ok
480
+ services_warning = @services_warning.nil? ? 0 : @services_warning
481
+ services_critical = @services_critical.nil? ? 0 : @services_critical
482
+ services_unknown = @services_unknown.nil? ? 0 : @services_unknown
483
+ services_pending = @services_pending.nil? ? 0 : @services_pending
484
+ services_in_downtime = @services_in_downtime.nil? ? 0 : @services_in_downtime
485
+ services_acknowledged = @services_acknowledged.nil? ? 0 : @services_acknowledged
486
+
487
+ {
488
+ ok: services_ok.to_i,
489
+ warning: services_critical.to_i,
490
+ critical: services_warning.to_i,
491
+ unknown: services_unknown.to_i,
492
+ pending: services_pending.to_i,
493
+ in_downtime: services_in_downtime.to_i,
494
+ acknowledged: services_acknowledged.to_i
495
+ }
496
+ end
497
+
354
498
  # returns data with service problems they be handled (acknowledged or in downtime)
355
499
  #
356
500
  # @example
357
501
  # @icinga.cib_data
358
502
  # @icinga.service_objects
359
- # all, critical, warning, unknown = @icinga.service_problems_handled.values
503
+ # all, warning, critical, unknown = @icinga.service_problems_handled.values
360
504
  #
361
505
  # p = @icinga.service_problems_handled
362
506
  # warning = p.dig(:warning)
@@ -376,8 +520,8 @@ module Icinga2
376
520
 
377
521
  {
378
522
  all: problems_all.to_i,
379
- critical: problems_critical.to_i,
380
523
  warning: problems_warning.to_i,
524
+ critical: problems_critical.to_i,
381
525
  unknown: problems_unknown.to_i
382
526
  }
383
527
 
@@ -462,5 +606,39 @@ module Icinga2
462
606
  severity
463
607
  end
464
608
 
609
+ private
610
+ # update host
611
+ #
612
+ # @param [Hash] hash
613
+ # @param [String] host
614
+ #
615
+ # @todo
616
+ # this function are not operable
617
+ # need help, time or beer
618
+ #
619
+ # @api protected
620
+ #
621
+ # @return [Hash]
622
+ #
623
+ def update_host( hash, host )
624
+
625
+ hash.each do |k, v|
626
+
627
+ if( k == 'host' && v.is_a?( String ) )
628
+ v.replace( host )
629
+
630
+ elsif( v.is_a?( Hash ) )
631
+
632
+ update_host( v, host )
633
+
634
+ elsif( v.is_a?(Array) )
635
+
636
+ v.flatten.each { |x| update_host( x, host ) if x.is_a?( Hash ) }
637
+ end
638
+ end
639
+
640
+ hash
641
+ end
642
+
465
643
  end
466
644
  end