icinga2 0.5.2

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.
@@ -0,0 +1,307 @@
1
+
2
+ module Icinga2
3
+
4
+ module Hosts
5
+
6
+ def addHost( params = {} )
7
+
8
+ name = params.dig(:name)
9
+ fqdn = params.dig(:fqdn)
10
+ displayName = params.dig(:display_name) || name
11
+ notifications = params.dig(:enable_notifications) || false
12
+ maxCheckAttempts = params.dig(:max_check_attempts) || 3
13
+ checkInterval = params.dig(:check_interval) || 60
14
+ retryInterval = params.dig(:retry_interval) || 45
15
+ notes = params.dig(:notes)
16
+ notesUrl = params.dig(:notes_url)
17
+ actionUrl = params.dig(:action_url)
18
+ vars = params.dig(:vars) || {}
19
+
20
+ if( name == nil )
21
+
22
+ return {
23
+ :status => 404,
24
+ :message => 'missing host name'
25
+ }
26
+ end
27
+
28
+ if( fqdn == nil )
29
+ # build FQDN
30
+ fqdn = Socket.gethostbyname( name ).first
31
+ end
32
+
33
+ payload = {
34
+ "templates" => [ "generic-host" ],
35
+ "attrs" => {
36
+ "address" => fqdn,
37
+ "display_name" => displayName,
38
+ "max_check_attempts" => maxCheckAttempts.to_i,
39
+ "check_interval" => checkInterval.to_i,
40
+ "retry_interval" => retryInterval.to_i,
41
+ "enable_notifications" => notifications,
42
+ "action_url" => actionUrl,
43
+ "notes" => notes,
44
+ "notes_url" => notesUrl
45
+ }
46
+ }
47
+
48
+ if( ! vars.empty? )
49
+ payload['attrs']['vars'] = vars
50
+ end
51
+
52
+ if( @icingaCluster == true && @icingaSatellite != nil )
53
+ payload['attrs']['zone'] = @icingaSatellite
54
+ end
55
+
56
+ logger.debug( JSON.pretty_generate( payload ) )
57
+
58
+ result = Network.put( {
59
+ :host => name,
60
+ :url => sprintf( '%s/v1/objects/hosts/%s', @icingaApiUrlBase, name ),
61
+ :headers => @headers,
62
+ :options => @options,
63
+ :payload => payload
64
+ } )
65
+
66
+ return JSON.pretty_generate( result )
67
+
68
+ end
69
+
70
+
71
+ def deleteHost( params = {} )
72
+
73
+ name = params.dig(:name)
74
+
75
+ if( name == nil )
76
+
77
+ return {
78
+ :status => 404,
79
+ :message => 'missing host name'
80
+ }
81
+ end
82
+
83
+ result = Network.delete( {
84
+ :host => name,
85
+ :url => sprintf( '%s/v1/objects/hosts/%s?cascade=1', @icingaApiUrlBase, name ),
86
+ :headers => @headers,
87
+ :options => @options
88
+ } )
89
+
90
+ return JSON.pretty_generate( result )
91
+
92
+ end
93
+
94
+
95
+ def listHosts( params = {} )
96
+
97
+ name = params.dig(:name)
98
+ attrs = params.dig(:attrs)
99
+ filter = params.dig(:filter)
100
+ joins = params.dig(:joins)
101
+
102
+ if( attrs != nil )
103
+ payload['attrs'] = attrs
104
+ end
105
+
106
+ if( filter != nil )
107
+ payload['filter'] = filter
108
+ end
109
+
110
+ if( joins != nil )
111
+ payload['joins'] = joins
112
+ end
113
+
114
+ result = Network.get( {
115
+ :host => name,
116
+ :url => sprintf( '%s/v1/objects/hosts/%s', @icingaApiUrlBase, name ),
117
+ :headers => @headers,
118
+ :options => @options
119
+ } )
120
+
121
+ return JSON.pretty_generate( result )
122
+
123
+ end
124
+
125
+
126
+ def existsHost?( name )
127
+
128
+ result = self.listHosts( { :name => name } )
129
+
130
+ if( result.is_a?( String ) )
131
+ result = JSON.parse( result )
132
+ end
133
+
134
+ status = result.dig('status')
135
+
136
+ if( status != nil && status == 200 )
137
+ return true
138
+ end
139
+
140
+ return false
141
+
142
+ end
143
+
144
+
145
+ def hostObjects( params = {} )
146
+
147
+ attrs = params.dig(:attrs)
148
+ filter = params.dig(:filter)
149
+ joins = params.dig(:joins)
150
+ payload = {}
151
+
152
+ if( attrs == nil )
153
+ attrs = ['name','state','acknowledgement','downtime_depth','last_check']
154
+ end
155
+
156
+ if( attrs != nil )
157
+ payload['attrs'] = attrs
158
+ end
159
+
160
+ if( filter != nil )
161
+ payload['filter'] = filter
162
+ end
163
+
164
+ if( joins != nil )
165
+ payload['joins'] = joins
166
+ end
167
+
168
+ result = Network.get( {
169
+ :host => nil,
170
+ :url => sprintf( '%s/v1/objects/hosts', @icingaApiUrlBase ),
171
+ :headers => @headers,
172
+ :options => @options,
173
+ :payload => payload
174
+ } )
175
+
176
+ return JSON.pretty_generate( result )
177
+
178
+ end
179
+
180
+
181
+ def hostProblems()
182
+
183
+ data = self.hostObjects()
184
+ problems = 0
185
+
186
+ if( data.is_a?(String) )
187
+ data = JSON.parse(data)
188
+ end
189
+
190
+ nodes = data.dig('nodes')
191
+
192
+ nodes.each do |n|
193
+
194
+ attrs = n.last.dig('attrs')
195
+
196
+ state = attrs.dig('state') || 0
197
+ downtimeDepth = attrs.dig('downtime_depth') || 0
198
+ acknowledgement = attrs.dig('acknowledgement') || 0
199
+
200
+ if( state != 0 && downtimeDepth == 0 && acknowledgement == 0 )
201
+ problems += 1
202
+ end
203
+
204
+ end
205
+
206
+ return problems
207
+
208
+ end
209
+
210
+
211
+ def problemHosts( max_items = 5 )
212
+
213
+ count = 0
214
+ @hostProblems = {}
215
+ @hostProblemsSeverity = {}
216
+
217
+ hostData = self.hostObjects()
218
+
219
+ if( hostData.is_a?(String) )
220
+
221
+ hostData = JSON.parse( hostData )
222
+ end
223
+
224
+ # logger.debug( hostData )
225
+
226
+ hostData = hostData.dig('nodes')
227
+
228
+ hostData.each do |host,v|
229
+
230
+ name = v.dig('name')
231
+ state = v.dig('attrs','state')
232
+
233
+ if( state == 0 )
234
+ next
235
+ end
236
+
237
+ @hostProblems[name] = self.hostSeverity(v)
238
+ end
239
+
240
+ # get the count of problems
241
+ #
242
+ @hostProblems.keys[1..max_items].each { |k,v| @hostProblemsSeverity[k] = @hostProblems[k] }
243
+
244
+ # @hostProblems.each do |k,v|
245
+ #
246
+ # if( count >= max_items )
247
+ # break
248
+ # end
249
+ #
250
+ # @hostProblemsSeverity[k] = v
251
+ #
252
+ # count += 1
253
+ # end
254
+
255
+ return @hostProblemsSeverity
256
+
257
+ end
258
+
259
+ # stolen from Icinga Web 2
260
+ # ./modules/monitoring/library/Monitoring/Backend/Ido/Query/ServicestatusQuery.php
261
+ #
262
+ def hostSeverity( host )
263
+
264
+ attrs = host["attrs"]
265
+
266
+ severity = 0
267
+
268
+ if (attrs["state"] == 0)
269
+ if (getObjectHasBeenChecked(host))
270
+ severity += 16
271
+ end
272
+
273
+ if (attrs["acknowledgement"] != 0)
274
+ severity += 2
275
+ elsif (attrs["downtime_depth"] > 0)
276
+ severity += 1
277
+ else
278
+ severity += 4
279
+ end
280
+ else
281
+ if (getObjectHasBeenChecked(host))
282
+ severity += 16
283
+ elsif (attrs["state"] == 1)
284
+ severity += 32
285
+ elsif (attrs["state"] == 2)
286
+ severity += 64
287
+ else
288
+ severity += 256
289
+ end
290
+
291
+ if (attrs["acknowledgement"] != 0)
292
+ severity += 2
293
+ elsif (attrs["downtime_depth"] > 0)
294
+ severity += 1
295
+ else
296
+ severity += 4
297
+ end
298
+ end
299
+
300
+ return severity
301
+
302
+ end
303
+
304
+
305
+ end
306
+
307
+ end
@@ -0,0 +1,397 @@
1
+ module Icinga2
2
+
3
+ module Network
4
+
5
+ def self.get( params = {} )
6
+
7
+ host = params.dig(:host)
8
+ url = params.dig(:url)
9
+ headers = params.dig(:headers)
10
+ options = params.dig(:options)
11
+ payload = params.dig(:payload) || {}
12
+ result = {}
13
+
14
+ if( payload.count >= 1 )
15
+
16
+ return self.get2( params )
17
+ end
18
+
19
+
20
+ headers.delete( 'X-HTTP-Method-Override' )
21
+
22
+ result = {}
23
+
24
+ restClient = RestClient::Resource.new(
25
+ URI.encode( url ),
26
+ options
27
+ )
28
+
29
+ begin
30
+
31
+ data = restClient.get( headers )
32
+ results = JSON.parse( data.body )
33
+ results = results.dig('results')
34
+
35
+ result[:status] = 200
36
+ result[:data] ||={}
37
+
38
+ results.each do |r|
39
+
40
+ # puts JSON.pretty_generate r
41
+ # name = r.dig('name')
42
+ attrs = r.dig('attrs')
43
+
44
+ if( attrs != nil )
45
+
46
+ result[:data][attrs['name']] = {
47
+ :name => attrs['name'],
48
+ :display_name => attrs['display_name'],
49
+ :type => attrs['type']
50
+ }
51
+ else
52
+ result = r
53
+ end
54
+
55
+ end
56
+
57
+ rescue RestClient::ExceptionWithResponse => e
58
+
59
+ error = e.response ? e.response : nil
60
+
61
+ error = JSON.parse( error )
62
+
63
+ result = {
64
+ :status => error['error'].to_i,
65
+ :name => host,
66
+ :message => error['status']
67
+ }
68
+ rescue Errno::ECONNREFUSED => e
69
+
70
+ $stderr.puts "Server refusing connection; retrying in 5s..."
71
+
72
+ end
73
+
74
+ return result
75
+
76
+ end
77
+
78
+
79
+ def self.get2( params = {} )
80
+
81
+ host = params.dig(:host)
82
+ url = params.dig(:url)
83
+ headers = params.dig(:headers)
84
+ options = params.dig(:options)
85
+ payload = params.dig(:payload) || {}
86
+ result = {}
87
+
88
+ headers['X-HTTP-Method-Override'] = 'GET'
89
+
90
+ restClient = RestClient::Resource.new(
91
+ URI.encode( url ),
92
+ options
93
+ )
94
+
95
+ begin
96
+
97
+ response = restClient.post(
98
+ JSON.generate( payload ),
99
+ headers
100
+ )
101
+
102
+ responseCode = response.code
103
+ responseBody = response.body
104
+
105
+ node = Hash.new()
106
+
107
+ data = JSON.parse( responseBody )
108
+
109
+ results = data.dig('results')
110
+
111
+ if( results != nil )
112
+
113
+ results.each do |r|
114
+
115
+ node[r.dig('name')] = r
116
+ end
117
+
118
+ result = {
119
+ :status => responseCode,
120
+ :nodes => node
121
+ }
122
+ end
123
+
124
+ rescue RestClient::ExceptionWithResponse => e
125
+
126
+ error = e.response ? e.response : nil
127
+ error = JSON.parse( error )
128
+
129
+ result = {
130
+ :status => error['error'].to_i,
131
+ :name => host,
132
+ :message => error['status']
133
+ }
134
+ rescue Errno::ECONNREFUSED => e
135
+
136
+ $stderr.puts "Server refusing connection; retrying in 5s..."
137
+
138
+ end
139
+
140
+ return result
141
+
142
+ end
143
+
144
+
145
+
146
+ def self.post( params = {} )
147
+
148
+ host = params.dig(:host)
149
+ url = params.dig(:url)
150
+ headers = params.dig(:headers)
151
+ options = params.dig(:options)
152
+ payload = params.dig(:payload)
153
+
154
+ headers['X-HTTP-Method-Override'] = 'POST'
155
+
156
+ result = {}
157
+
158
+ restClient = RestClient::Resource.new(
159
+ URI.encode( url ),
160
+ options
161
+ )
162
+
163
+ begin
164
+
165
+ data = restClient.post(
166
+ JSON.generate( payload ),
167
+ headers
168
+ )
169
+
170
+ data = JSON.parse( data )
171
+ results = data.dig('results').first
172
+
173
+ if( results != nil )
174
+
175
+ result = {
176
+ :status => results.dig('code').to_i,
177
+ :name => results.dig('name'),
178
+ :message => results.dig('status')
179
+ }
180
+
181
+ end
182
+
183
+ rescue RestClient::ExceptionWithResponse => e
184
+
185
+ error = e.response ? e.response : nil
186
+
187
+ if( error.is_a?( String ) )
188
+ error = JSON.parse( error )
189
+ end
190
+
191
+ $stderr.puts( JSON.pretty_generate( error ) )
192
+
193
+ results = error.dig( 'results' )
194
+
195
+ if( results != nil )
196
+
197
+ result = result.first
198
+
199
+ result = {
200
+ :status => results.dig('code').to_i,
201
+ :name => results.dig('name'),
202
+ :message => results.dig('status'),
203
+ :error => results.dig('errors')
204
+ }
205
+
206
+ else
207
+
208
+ result = {
209
+ :status => error.dig( 'error' ).to_i,
210
+ :message => error.dig( 'status' )
211
+ }
212
+
213
+ end
214
+
215
+ rescue Errno::ECONNREFUSED => e
216
+
217
+ $stderr.puts "Server refusing connection; retrying in 5s..."
218
+
219
+ rescue => e
220
+
221
+ $stderr.puts e
222
+
223
+ end
224
+
225
+ return result
226
+
227
+
228
+
229
+ end
230
+
231
+
232
+ def self.put( params = {} )
233
+
234
+ host = params.dig(:host)
235
+ url = params.dig(:url)
236
+ headers = params.dig(:headers)
237
+ options = params.dig(:options)
238
+ payload = params.dig(:payload)
239
+
240
+ headers['X-HTTP-Method-Override'] = 'PUT'
241
+
242
+ result = {}
243
+
244
+ restClient = RestClient::Resource.new(
245
+ URI.encode( url ),
246
+ options
247
+ )
248
+
249
+ begin
250
+
251
+ data = restClient.put(
252
+ JSON.generate( payload ),
253
+ headers
254
+ )
255
+
256
+ data = JSON.parse( data )
257
+ results = data.dig('results').first
258
+
259
+ if( results != nil )
260
+
261
+ result = {
262
+ :status => results.dig('code').to_i,
263
+ :name => results.dig('name'),
264
+ :message => results.dig('status')
265
+ }
266
+
267
+ end
268
+
269
+ rescue RestClient::ExceptionWithResponse => e
270
+
271
+ error = e.response ? e.response : nil
272
+
273
+ if( error.is_a?( String ) )
274
+ error = JSON.parse( error )
275
+ end
276
+
277
+ results = error.dig( 'results' )
278
+
279
+ if( results != nil )
280
+
281
+ if( result.is_a?( Hash ) && result.count() != 0 )
282
+
283
+ result = result.first
284
+
285
+ result = {
286
+ :status => results.dig('code').to_i,
287
+ :name => results.dig('name'),
288
+ :message => results.dig('status'),
289
+ :error => results.dig('errors')
290
+ }
291
+
292
+ else
293
+
294
+ result = {
295
+ :status => 204,
296
+ :name => host,
297
+ :message => 'unknown result'
298
+ }
299
+ end
300
+
301
+ else
302
+
303
+ result = {
304
+ :status => error.dig( 'error' ).to_i,
305
+ :message => error.dig( 'status' )
306
+ }
307
+
308
+ end
309
+
310
+ rescue Errno::ECONNREFUSED => e
311
+
312
+ $stderr.puts "Server refusing connection; retrying in 5s..."
313
+
314
+ end
315
+
316
+ return result
317
+
318
+ end
319
+
320
+
321
+ def self.delete( params = {} )
322
+
323
+ host = params.dig(:host) || nil
324
+ url = params.dig(:url) || nil
325
+ headers = params.dig(:headers) || nil
326
+ options = params.dig(:options) || nil
327
+ payload = params.dig(:payload) || nil
328
+
329
+ headers['X-HTTP-Method-Override'] = 'DELETE'
330
+
331
+ result = {}
332
+
333
+ restClient = RestClient::Resource.new(
334
+ URI.encode( url ),
335
+ options
336
+ )
337
+
338
+ begin
339
+ data = restClient.get( headers )
340
+
341
+ if( data )
342
+
343
+ data = JSON.parse( data ) #.body )
344
+ results = data.dig('results').first
345
+
346
+ if( results != nil )
347
+
348
+ result = {
349
+ :status => results.dig('code').to_i,
350
+ :name => results.dig('name'),
351
+ :message => results.dig('status')
352
+ }
353
+
354
+ end
355
+ end
356
+
357
+ rescue RestClient::ExceptionWithResponse => e
358
+
359
+ error = e.response ? e.response : nil
360
+
361
+ if( error.is_a?( String ) )
362
+ error = JSON.parse( error )
363
+ end
364
+
365
+ results = error.dig('results')
366
+
367
+ if( results != nil )
368
+
369
+ result = {
370
+ :status => results.dig('code').to_i,
371
+ :name => results.dig('name'),
372
+ :message => results.dig('status')
373
+ }
374
+
375
+ else
376
+
377
+ result = {
378
+ :status => error.dig( 'error' ).to_i,
379
+ # :name => results.dig('name'),
380
+ :message => error.dig( 'status' )
381
+ }
382
+
383
+ end
384
+ rescue Errno::ECONNREFUSED => e
385
+
386
+ $stderr.puts "Server refusing connection; retrying in 5s..."
387
+
388
+ end
389
+
390
+ return result
391
+
392
+ end
393
+
394
+ end
395
+ end
396
+
397
+