icinga2 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+