icinga-dashing 0.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.
@@ -0,0 +1,5 @@
1
+ require 'icinga-dashing/socket'
2
+ require 'icinga-dashing/status'
3
+
4
+ module IcingaDashing
5
+ end
@@ -0,0 +1,36 @@
1
+ module IcingaDashing
2
+ class Socket
3
+ require 'socket'
4
+ hostname="icinga01.lklg.net"
5
+ port=6557
6
+
7
+ def socket_initialize(hostname,port)
8
+ return TCPSocket.open(hostname,port)
9
+ end
10
+
11
+ def socket_close(s)
12
+ s.shutdown(:WR)
13
+ answer = s.read
14
+ s.close
15
+ return answer
16
+ end
17
+
18
+ def getdevices(type,columns,filters)
19
+ s = socket_initialize
20
+ s.send "GET #{type}\n", 0
21
+ s.send "Columns: #{columns}\n", 0
22
+ s.send "Filter: #{filters}\n", 0
23
+ s.send "OutputFormat: csv\n", 0
24
+ answer = socket_close(s)
25
+ end
26
+
27
+ def getstate(hostname)
28
+ s = socket_initialize
29
+ s.send "GET hosts\n", 0
30
+ s.send "Columns: state acknowledged\n", 0
31
+ s.send "Filter: name = #{hostname}\n", 0
32
+ s.send "OutputFormat: csv\n", 0
33
+ answer = socket_close(s)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,388 @@
1
+ module IcingaDashing
2
+ class Status
3
+ private
4
+ #
5
+ # === Args:
6
+ # +list+::
7
+ # Array with stati
8
+ #
9
+ # === Description:
10
+ # Puts a totalstatus of a array
11
+ #
12
+ # === Return:
13
+ # +status+::
14
+ # Returns a totalstatus of a array
15
+ #
16
+ def Status.stateall(list)
17
+ i = 0
18
+ list.each do |item|
19
+ if item.class.to_s != "Array"
20
+ list[i] = list[i].to_i
21
+ else
22
+ list[i] = list[i][1].to_i
23
+ end
24
+ i += 1
25
+ end
26
+ sorted = bubble(list)
27
+ i = 0
28
+ sorted = case sorted[-1]
29
+ when 0 then "normal"
30
+ when 1 then "unknownack"
31
+ when 2 then "warningack"
32
+ when 3 then "criticalack"
33
+ when 4 then "unknown"
34
+ when 5 then "warning"
35
+ when 6 then "danger"
36
+ end
37
+ return sorted
38
+ end
39
+ #
40
+ # === Args:
41
+ # +list+::
42
+ # array which should be sorted
43
+ #
44
+ # === Description:
45
+ # Sorts a array (DESC)
46
+ #
47
+ # === Return:
48
+ # +list+::
49
+ # Sorted array
50
+ #
51
+ def Status.bubble(list)
52
+ return list if list.size <= 1 # already sorted
53
+ swapped = true
54
+ while swapped do
55
+ swapped = false
56
+ 0.upto(list.size-2) do |i|
57
+ if list[i] > list[i+1]
58
+ list[i], list[i+1] = list[i+1], list[i] # swap values
59
+ swapped = true
60
+ end
61
+ end
62
+ end
63
+ list
64
+ end
65
+
66
+ #
67
+ # === Args:
68
+ # +hostgroup+::
69
+ # Objectname of the hostgroup in icinga
70
+ #
71
+ # === Description:
72
+ # Gets all groupmember
73
+ #
74
+ # === Return:
75
+ # +erg+::
76
+ # Returns all groupmember [array]
77
+ #
78
+
79
+ def Status.hgm(hostgroup)
80
+ erg = `python /root/status.py hostgroups members 'name = #{hostgroup}'`.gsub!("\n\n","").split(",")
81
+ return erg
82
+ end
83
+
84
+ #
85
+ # === Args:
86
+ # +name+::
87
+ # Name in icinga
88
+ # +qa+::
89
+ # type of the object (Hostgroup, Service, Host)
90
+ #
91
+ # === Description:
92
+ # Gets the data from the icinga host
93
+ #
94
+ # === Return:
95
+ # +erg+::
96
+ # Returns a status and the "acknowledgment"
97
+ #
98
+
99
+ def Status.get(name,qa)
100
+ erg = case qa
101
+ when "ssh" then `python /root/status.py services 'state acknowledged' 'host_name = #{name}'`.gsub!("\n\n","").split("\n")
102
+ when "hsh" then `python /root/status.py hosts 'state acknowledged' 'host_name = #{name}'`.gsub!("\n\n","")
103
+ when "hs" then `python /root/status.py #{name}`.gsub!("\n\n","")
104
+ when "ssd" then `python /root/status.py services 'state acknowledged' 'display_name = #{name}'`.gsub!("\n\n","")
105
+ end
106
+ if qa == "ssh" then
107
+ i = 0
108
+ erg.each do |item|
109
+ erg[i] = casestate(item,qa[0])
110
+ i += 1
111
+ end
112
+ erg = bubble(erg)[-1]
113
+ else
114
+ erg = casestate(erg,qa[0])
115
+ end
116
+ end
117
+
118
+ #
119
+ # === Args:
120
+ # +value+::
121
+ # A value which should convert
122
+ # +type+::
123
+ # (s)ervice | (h)ost
124
+ #
125
+ # === Description:
126
+ # convert a status + "acknowledged" in a dashing-readable format
127
+ #
128
+ # === Return:
129
+ # +erg+::
130
+ # Returns the status
131
+ #
132
+
133
+ def Status.casestate(value,type)
134
+ if type == "s"
135
+ erg = case value
136
+ when "0;0" then 0
137
+ when "3;1" then 1
138
+ when "1;1" then 2
139
+ when "2;1" then 3
140
+ when "3;0" then 4
141
+ when "1;0" then 5
142
+ when "2;0" then 6
143
+ end
144
+ elsif type == "h"
145
+ erg = case value
146
+ when "0;0" then 0
147
+ when "1;1" then 3
148
+ when "1;0" then 6
149
+ end
150
+ end
151
+ return erg
152
+ end
153
+
154
+
155
+ #
156
+ # === Args:
157
+ # +state+::
158
+ # status, which schould be converted to numeric [string]
159
+ #
160
+ # === Description:
161
+ # Converts a named status to a numeric status
162
+ #
163
+ # === Return:
164
+ # +conv+::
165
+ # Returns the nummeric status
166
+
167
+ def Status.convback(state)
168
+ conv = case state
169
+ when "normal" then 0
170
+ when "unknownack" then 1
171
+ when "warningack" then 2
172
+ when "criticalack" then 3
173
+ when "unknown" then 4
174
+ when "warning" then 5
175
+ when "critical","danger" then 6
176
+ end
177
+ return conv
178
+ end
179
+
180
+ #
181
+ # === Args:
182
+ # +groupname+::
183
+ # Name of the groupobject
184
+ #
185
+ # === Description:
186
+ # Gets the status of all hosts in a hostgroup
187
+ #
188
+ # === Return:
189
+ # +res+::
190
+ # Returns a status of all hosts
191
+
192
+ def Status.getgroup(groupname)
193
+ res = hgm(groupname)
194
+ i = 0
195
+ res.each do |item|
196
+ res[i] = get(item, "hsh")
197
+ i += 1
198
+ end
199
+ res = bubble(res)[-1]
200
+ return res
201
+ end
202
+
203
+ #
204
+ # === Args:
205
+ # +groupname+::
206
+ # Name of the groupobject
207
+ #
208
+ # === Description:
209
+ # Gets the status of all hosts in a hostgroup and its services
210
+ #
211
+ # === Return:
212
+ # +res+::
213
+ # Returns a stati of all hosts and services
214
+
215
+ def Status.groupservices(groupname)
216
+ member = hgm(groupname)
217
+ i = 0
218
+ res = []
219
+ member.each do |item|
220
+ res[i] = get(item, "ssh")
221
+ i += 1
222
+ end
223
+ res = bubble(res)[-1]
224
+ return res
225
+ end
226
+
227
+ #
228
+ # === Args:
229
+ # +pages+::
230
+ # printed pages [integer or array of integers]
231
+ #
232
+ # === Description:
233
+ # add up the printed pages
234
+ #
235
+ # === Return:
236
+ # +total+::
237
+ # Returns the total printed pages with a ahousands separator
238
+ #
239
+ =begin
240
+ def Status.countpages(pages)
241
+ if pages.class.to_s == "array"
242
+ pages.each do |item|
243
+ total += item
244
+ end
245
+ else
246
+ total = pages
247
+ end
248
+ if total > 10000
249
+ total = total.to_s.insert(2,".")
250
+ elsif total > 1000
251
+ total = total.to_s.insert(1,".")
252
+ end
253
+ return total
254
+ end
255
+ =end
256
+ public
257
+ #
258
+ #
259
+ # === Args:
260
+ # +labels+::
261
+ # the Labels [array]
262
+ # +values+::
263
+ # host- or service-states [array]
264
+ #
265
+ # === Description:
266
+ # Prepare the host- and service-states
267
+ #
268
+ # === Return:
269
+ # Returns a multidimensional array. Ready to push this to the dashboard [array]
270
+ #
271
+
272
+ def Status.prepare(labels, values)
273
+ status = []
274
+ i = 0
275
+ values.each do |item|
276
+ item = case item
277
+ when 0 then "<i class='icon-ok'></i>"
278
+ when 1,2,3 then "<i class='icon-cog icon-spin'></i>"
279
+ when 5 then "<i class='icon-warning-sign'></i>"
280
+ when 4 then "<i class='icon-question-sign'></i>"
281
+ when 6 then "<i class='icon-remove'></i>"
282
+ end
283
+ status[i] = {label: labels[i], value: item}
284
+ i +=1
285
+ end
286
+ totalstate = stateall(values)
287
+ status.push(totalstate)
288
+ return status
289
+ end
290
+
291
+ #
292
+ #
293
+ # === Args:
294
+ # +list+::
295
+ # The old tile [array]
296
+ # +label+::
297
+ # Label of the new value [string]
298
+ # +value+::
299
+ # The value with the state [array]
300
+ # +position+::
301
+ # Position at the tile [integer]
302
+ #
303
+ # === Description:
304
+ # Adds an object to a tile, which should not display by a icon
305
+ #
306
+ # === Return:
307
+ # Returns the new tile (already prepared) [array]
308
+ #
309
+
310
+ def Status.inject(list,label,value,position)
311
+ lnew = list
312
+ oldstate = list[-1]
313
+ newstate = casestate(value[1],"s")
314
+ oldstate = convback(oldstate)
315
+ gesstate = [oldstate.to_i, newstate.to_i]
316
+ gesstate = stateall(gesstate)
317
+ lnew.insert(position, {label: label, value: value[0]})
318
+ lnew.delete(list[-1])
319
+ lnew << gesstate
320
+ end
321
+
322
+
323
+ #
324
+ #
325
+ # === Args:
326
+ # +name+::
327
+ # The name of the object [string]
328
+ # +type+::
329
+ # type of the object (service or host) [string]
330
+ # +group+::
331
+ # true, if the object is a host- or servicegroup [boolean]
332
+ # +etc+::
333
+ # additional object which schould be added to the group [array]
334
+ #
335
+ # === Description:
336
+ # Gets the host- and servicestate
337
+ #
338
+ # === Return:
339
+ # Returns the state of a host, service or a group
340
+ #
341
+
342
+ def Status.getstate(name, type, group=false, etc=nil)
343
+ if group && type == "service"
344
+ res = groupservices(name)
345
+ elsif group
346
+ res = getgroup(name)
347
+ elsif type == "service"
348
+ res = get(name, "ssd")
349
+ elsif type == "servicehost"
350
+ res = get(name, "ssh")
351
+ elsif type == "host"
352
+ res = get(name, "hs")
353
+ end
354
+ return res
355
+ end
356
+
357
+ #
358
+ # === Args:
359
+ # +spoolserver+::
360
+ # Objectname(s) from the spoolserver (one or more) [string or array]
361
+ #
362
+ # === Description:
363
+ # Gets the today total printed pages from one or more spoolserver
364
+ #
365
+ # === Return:
366
+ # Returns the today total printed pages [string]
367
+ #
368
+ =begin
369
+ def Status.totalpages(spoolserver)
370
+ if spoolserver.class.to_s == "array"
371
+ pages = []
372
+ i = 0
373
+ spoolserver.each do |item|
374
+ res = `python /root/status.py services perf_data 'host_name = #{item}'`.gsub!("\n\n","").split(";")
375
+ pages[i] = res[9].split(/TotalPagesPrinted'=(.*)/).to_i
376
+ i += 1
377
+ end
378
+ else
379
+ res = `python /root/status.py services perf_data 'host_name = #{spoolserver}'`.gsub!("\n\n","").split(";")
380
+ pages = res[9].split(/TotalPagesPrinted'=(.*)/)
381
+ pages.to_i
382
+ end
383
+ total = countpages(pages)
384
+ return total
385
+ end
386
+ =end
387
+ end
388
+ end
metadata ADDED
@@ -0,0 +1,51 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: icinga-dashing
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.5'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Landkreis Lüneburg - IT-Service
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-10-10 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: A Gem to get host- or servicestates from icinga to dashing
15
+ email: ''
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/icinga-dashing.rb
21
+ - lib/icinga-dashing/socket.rb
22
+ - lib/icinga-dashing/status.rb
23
+ homepage: http://landkreis-lueneburg.de
24
+ licenses:
25
+ - Data licence Germany âttribution âersion 1.0
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements:
43
+ - You need mk_livestatus to use Status!
44
+ - http://mathias-kettner.de/checkmk_livestatus.html
45
+ rubyforge_project:
46
+ rubygems_version: 1.8.23
47
+ signing_key:
48
+ specification_version: 3
49
+ summary: icinga-dashing
50
+ test_files: []
51
+ has_rdoc: