rtdi 1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/README.md +9 -0
  2. data/bin/dashing +9 -0
  3. data/javascripts/batman.jquery.js +163 -0
  4. data/javascripts/batman.js +13680 -0
  5. data/javascripts/dashing.coffee +125 -0
  6. data/javascripts/es5-shim.js +1021 -0
  7. data/javascripts/jquery.js +4 -0
  8. data/lib/dashing.rb +6 -0
  9. data/lib/dashing/app.rb +178 -0
  10. data/lib/dashing/cli.rb +109 -0
  11. data/lib/dashing/downloader.rb +18 -0
  12. data/lib/rtdi.rb +6 -0
  13. data/lib/rtdi/socket.rb +39 -0
  14. data/lib/rtdi/start.rb +170 -0
  15. data/lib/rtdi/status.rb +476 -0
  16. data/templates/dashboard/%name%.erb.tt +7 -0
  17. data/templates/job/%name%.rb +4 -0
  18. data/templates/project/.gitignore +2 -0
  19. data/templates/project/Gemfile +7 -0
  20. data/templates/project/README.md +1 -0
  21. data/templates/project/assets/favicon.ico +0 -0
  22. data/templates/project/assets/fonts/fontawesome-webfont.eot +0 -0
  23. data/templates/project/assets/fonts/fontawesome-webfont.svg +255 -0
  24. data/templates/project/assets/fonts/fontawesome-webfont.ttf +0 -0
  25. data/templates/project/assets/fonts/fontawesome-webfont.woff +0 -0
  26. data/templates/project/assets/images/favicon.ico +0 -0
  27. data/templates/project/assets/images/itslogo.png +0 -0
  28. data/templates/project/assets/images/itslogoflur.png +0 -0
  29. data/templates/project/assets/images/itslogozi207.png +0 -0
  30. data/templates/project/assets/images/logo.png +0 -0
  31. data/templates/project/assets/javascripts/application.coffee +42 -0
  32. data/templates/project/assets/javascripts/cycleDashboard.coffee +523 -0
  33. data/templates/project/assets/javascripts/d3-3.2.8.js +5 -0
  34. data/templates/project/assets/javascripts/d3.v2.min.js +4 -0
  35. data/templates/project/assets/javascripts/dashing.gridster.coffee +37 -0
  36. data/templates/project/assets/javascripts/gridster/jquery.gridster.js +3263 -0
  37. data/templates/project/assets/javascripts/gridster/jquery.leanModal.min.js +5 -0
  38. data/templates/project/assets/javascripts/jquery.knob.js +646 -0
  39. data/templates/project/assets/javascripts/rickshaw-1.4.3.min.js +2 -0
  40. data/templates/project/assets/javascripts/rickshaw.min.js +3 -0
  41. data/templates/project/assets/javascripts/rickshaw.min.js.1 +3 -0
  42. data/templates/project/assets/javascripts/rickshaw.min.js.bak +2 -0
  43. data/templates/project/assets/stylesheets/application.scss +342 -0
  44. data/templates/project/assets/stylesheets/font-awesome.css +313 -0
  45. data/templates/project/assets/stylesheets/jquery.gridster.css +57 -0
  46. data/templates/project/config.ru +19 -0
  47. data/templates/project/dashboards/layout.erb +32 -0
  48. data/templates/project/dashboards/rtdi_sample.erb +31 -0
  49. data/templates/project/dashboards/sample.erb +25 -0
  50. data/templates/project/dashboards/sampletv.erb +56 -0
  51. data/templates/project/jobs/buzzwords.rb +9 -0
  52. data/templates/project/jobs/convergence.rb +14 -0
  53. data/templates/project/jobs/rtdi_sample.rb +16 -0
  54. data/templates/project/jobs/sample.rb +13 -0
  55. data/templates/project/lib/bsp.csv +16 -0
  56. data/templates/project/public/404.html +26 -0
  57. data/templates/project/public/favicon.ico +0 -0
  58. data/templates/project/widgets/clock/clock.coffee +18 -0
  59. data/templates/project/widgets/clock/clock.html +2 -0
  60. data/templates/project/widgets/clock/clock.scss +13 -0
  61. data/templates/project/widgets/comments/comments.coffee +24 -0
  62. data/templates/project/widgets/comments/comments.html +7 -0
  63. data/templates/project/widgets/comments/comments.scss +33 -0
  64. data/templates/project/widgets/graph/graph.coffee +36 -0
  65. data/templates/project/widgets/graph/graph.html +5 -0
  66. data/templates/project/widgets/graph/graph.scss +65 -0
  67. data/templates/project/widgets/iframe/iframe.coffee +9 -0
  68. data/templates/project/widgets/iframe/iframe.html +1 -0
  69. data/templates/project/widgets/iframe/iframe.scss +8 -0
  70. data/templates/project/widgets/image/image.coffee +9 -0
  71. data/templates/project/widgets/image/image.html +1 -0
  72. data/templates/project/widgets/image/image.scss +13 -0
  73. data/templates/project/widgets/list/list.coffee +34 -0
  74. data/templates/project/widgets/list/list.html +18 -0
  75. data/templates/project/widgets/list/list.scss +60 -0
  76. data/templates/project/widgets/meter/meter.coffee +14 -0
  77. data/templates/project/widgets/meter/meter.html +7 -0
  78. data/templates/project/widgets/meter/meter.scss +35 -0
  79. data/templates/project/widgets/number/number.coffee +24 -0
  80. data/templates/project/widgets/number/number.html +11 -0
  81. data/templates/project/widgets/number/number.scss +39 -0
  82. data/templates/project/widgets/text/text.coffee +1 -0
  83. data/templates/project/widgets/text/text.html +7 -0
  84. data/templates/project/widgets/text/text.scss +32 -0
  85. data/templates/widget/%name%/%name%.coffee.tt +9 -0
  86. data/templates/widget/%name%/%name%.html +1 -0
  87. data/templates/widget/%name%/%name%.scss.tt +3 -0
  88. metadata +392 -0
@@ -0,0 +1,476 @@
1
+ module RTDI
2
+ class Status
3
+ private
4
+
5
+ #
6
+ # === Args:
7
+ # +list+::
8
+ # Array with stati
9
+ #
10
+ # === Description:
11
+ # Puts a totalstatus of a array
12
+ #
13
+ # === Return:
14
+ # +status+::
15
+ # Returns a totalstatus of a array
16
+ #
17
+
18
+ def self.stateall(list)
19
+ i = 0
20
+ list.each do |item|
21
+ if item.class.to_s != "Array"
22
+ list[i] = list[i].to_i
23
+ else
24
+ list[i] = list[i][1].to_i
25
+ end
26
+ i += 1
27
+ end
28
+ sorted = bubble(list)
29
+ i = 0
30
+ sorted = case sorted[-1]
31
+ when 0 then "normal"
32
+ when 1 then "unknownack"
33
+ when 2 then "warningack"
34
+ when 3 then "criticalack"
35
+ when 4 then "unknown"
36
+ when 5 then "warning"
37
+ when 6 then "danger"
38
+ end
39
+ return sorted
40
+ end
41
+ #
42
+ # === Args:
43
+ # +list+::
44
+ # array which should be sorted
45
+ #
46
+ # === Description:
47
+ # Sorts a array (DESC)
48
+ #
49
+ # === Return:
50
+ # +list+::
51
+ # Sorted array
52
+ #
53
+
54
+ def self.bubble(list)
55
+ return list if list.class.to_s != "Array"
56
+ return list if list.size <= 1 # already sorted
57
+ swapped = true
58
+ while swapped do
59
+ swapped = false
60
+ 0.upto(list.size-2) do |i|
61
+ if list[i] > list[i+1]
62
+ list[i], list[i+1] = list[i+1], list[i] # swap values
63
+ swapped = true
64
+ end
65
+ end
66
+ end
67
+ list
68
+ end
69
+
70
+ #
71
+ # === Args:
72
+ # +hostgroup+::
73
+ # Objectname of the hostgroup in icinga
74
+ #
75
+ # === Description:
76
+ # Gets all groupmember
77
+ #
78
+ # === Return:
79
+ # +erg+::
80
+ # Returns all groupmember [array]
81
+ #
82
+
83
+ def self.hgm(hostgroup)
84
+ erg = RTDI::IDSocket.request("hostgroups","members","name = #{hostgroup}").split(",")
85
+ return erg
86
+ end
87
+
88
+ #
89
+ # === Args:
90
+ # +servicegroup+::
91
+ # Objectname of the servicegroup in icinga
92
+ #
93
+ # === Description:
94
+ # Gets all groupmember
95
+ #
96
+ # === Return:
97
+ # +erg+::
98
+ # Returns all groupmember [array]
99
+ #
100
+ def self.sgm(servicegroup)
101
+ erg = RTDI::IDSocket.request("servicegroups","members","name = #{servicegroup}").split(",")
102
+ i = 0
103
+ return erg
104
+ end
105
+
106
+ #
107
+ # === Args:
108
+ # +name+::
109
+ # Name in icinga
110
+ # +qa+::
111
+ # type of the object (Hostgroup, Service, Host)
112
+ #
113
+ # === Description:
114
+ # Gets the data from the icinga host
115
+ #
116
+ # === Return:
117
+ # +erg+::
118
+ # Returns a status and the "acknowledgment"
119
+ #
120
+
121
+ def self.get(name,qa)
122
+ begin
123
+ erg = case qa
124
+ when "ssh" then RTDI::IDSocket.request("services","state acknowledged","host_name = #{name}")
125
+ when "hsh" then RTDI::IDSocket.request("hosts","state acknowledged","host_name = #{name}")
126
+ when "hs" then RTDI::IDSocket.request("hosts","state acknowledged","name = #{name}")
127
+ when "ssd" then RTDI::IDSocket.request("services","state acknowledged","display_name = #{name}")
128
+ when "sgi" then RTDI::IDSocket.request("services","state acknowledged","host_name = #{name[0]}","display_name = #{name[1]}")
129
+ end
130
+ if erg.length == 0
131
+ raise 'Das Objekt "' + name.to_s + '" existiert nicht in Icinga!'
132
+ end
133
+ if qa == "ssh" then
134
+ tmp = []
135
+ erg_length = erg.length / 3
136
+ i = 0
137
+ erg_length.downto(0) do |item|
138
+ tmp[item] = erg[i,3]
139
+ i += 3
140
+ end
141
+ erg = tmp[1,erg.length]
142
+ i = 0
143
+ erg.each do |item|
144
+ erg[i] = casestate(item,qa[0])
145
+ i += 1
146
+ end
147
+ erg = bubble(erg)[-1]
148
+ else
149
+ erg = casestate(erg,qa[0])
150
+ end
151
+ rescue Exception => e
152
+ puts "Es ist ein Fehler aufgetreten: " + e.message
153
+ puts "Objekttyp: unknown"
154
+ end
155
+ end
156
+
157
+ #
158
+ # === Args:
159
+ # +value+::
160
+ # A value which should convert
161
+ # +type+::
162
+ # (s)ervice | (h)ost
163
+ #
164
+ # === Description:
165
+ # convert a status + "acknowledged" in a dashing-readable format
166
+ #
167
+ # === Return:
168
+ # +erg+::
169
+ # Returns the status
170
+ #
171
+
172
+ def self.casestate(value,type)
173
+ if type == "s"
174
+ erg = case value
175
+ when "0;0","0" then 0
176
+ when "3;1" then 1
177
+ when "1;1" then 2
178
+ when "2;1" then 3
179
+ when "3;0","3" then 4
180
+ when "1;0","1" then 5
181
+ when "2;0","2" then 6
182
+ end
183
+ elsif type == "h"
184
+ erg = case value
185
+ when "0;0","0" then 0
186
+ when "1;1" then 3
187
+ when "1;0","1" then 6
188
+ end
189
+ end
190
+ return erg
191
+ end
192
+
193
+
194
+ #
195
+ # === Args:
196
+ # +state+::
197
+ # status, which schould be converted to numeric [string]
198
+ #
199
+ # === Description:
200
+ # Converts a named status to a numeric status
201
+ #
202
+ # === Return:
203
+ # +conv+::
204
+ # Returns the nummeric status
205
+
206
+ def self.convback(state)
207
+ conv = case state
208
+ when "normal" then 0
209
+ when "unknownack" then 1
210
+ when "warningack" then 2
211
+ when "criticalack" then 3
212
+ when "unknown" then 4
213
+ when "warning" then 5
214
+ when "critical","danger" then 6
215
+ end
216
+ return conv
217
+ end
218
+
219
+ #
220
+ # === Args:
221
+ # +groupname+::
222
+ # Name of the groupobject
223
+ #
224
+ # === Description:
225
+ # Gets the status of all hosts in a hostgroup
226
+ #
227
+ # === Return:
228
+ # +res+::
229
+ # Returns a status of all hosts
230
+
231
+ def self.getgroup(groupname)
232
+ begin
233
+ res = hgm(groupname)
234
+ if res.length == 0
235
+ raise 'Das Objekt "' + groupname + '" existiert nicht in Icinga!'
236
+ end
237
+ i = 0
238
+ res.each do |item|
239
+ res[i] = get(item, "hsh")
240
+ i += 1
241
+ end
242
+ res = bubble(res)[-1]
243
+ rescue Exception => e
244
+ puts "Es ist ein Fehler aufgetreten: " + e.message
245
+ puts "Objekttyp: Servicegroup"
246
+ end
247
+ return res
248
+ end
249
+
250
+ #
251
+ # === Args:
252
+ # +groupname+::
253
+ # Name of the groupobject
254
+ #
255
+ # === Description:
256
+ # Gets the status of all hosts in a hostgroup and its services
257
+ #
258
+ # === Return:
259
+ # +res+::
260
+ # Returns a stati of all hosts and services
261
+
262
+ def self.gs(groupname,servicename)
263
+ begin
264
+ member = sgm(groupname)
265
+ if member.length == 0
266
+ raise 'Das Objekt "' + groupname.to_s + '" existiert nicht in Icinga!'
267
+ end
268
+ i = 0
269
+ res = []
270
+ member.each do |item|
271
+ res[i] = RTDI::IDSocket.request("services","perf_data state","host_name = #{item.split("|")[0]}","display_name = #{servicename}")
272
+ if res[i] == 0
273
+ raise 'Das Objekt "' + item.split("|")[0] + '" und dem Service "' + servicename.to_s + '" existiert nicht!'
274
+ end
275
+ i += 1
276
+ end
277
+ x = 0
278
+ state = []
279
+ res.each do |item|
280
+ state[x] = item.split(";")[1]
281
+ res[x] = item.split(";")[0]
282
+ x += 1
283
+ end
284
+ state = bubble(state)[-1]
285
+ res << state
286
+ rescue Exception => e
287
+ puts "Es ist ein Fehler aufgetreten: " + e.message
288
+ puts "Objekttyp: Servicegroup"
289
+ end
290
+ return res
291
+ end
292
+
293
+
294
+ def self.groupservices(groupname)
295
+ begin
296
+ member = hgm(groupname)
297
+ if member.length == 0
298
+ raise 'Das Objekt "' + groupname.to_s + '" existiert nicht in Icinga!'
299
+ end
300
+ i = 0
301
+ res = []
302
+ member.each do |item|
303
+ res[i] = get(item, "ssh")
304
+ i += 1
305
+ end
306
+ res = bubble(res)[-1]
307
+ rescue Exception => e
308
+ puts "Es ist ein Fehler aufgetreten: " + e.message
309
+ puts "Objekttyp: Hostgroup with services"
310
+ end
311
+ return res
312
+ end
313
+
314
+ public
315
+ #
316
+ #
317
+ # === Args:
318
+ # +labels+::
319
+ # the Labels [array]
320
+ # +values+::
321
+ # host- or service-states [array]
322
+ #
323
+ # === Description:
324
+ # Prepare the host- and service-states
325
+ #
326
+ # === Return:
327
+ # Returns a multidimensional array. Ready to push this to the dashboard [array]
328
+ #
329
+ def self.prepare(labels, values)
330
+ status = []
331
+ i = 0
332
+ values.each do |item|
333
+ item = case item
334
+ when 0 then "<i class='icon-ok'></i>"
335
+ when 1,2,3 then "<i class='icon-cog'></i>"
336
+ when 5 then "<i class='icon-warning-sign'></i>"
337
+ when 4 then "<i class='icon-question-sign'></i>"
338
+ when 6 then "<i class='icon-remove'></i>"
339
+ end
340
+ status[i] = {label: labels[i], value: item}
341
+ i +=1
342
+ end
343
+ totalstate = stateall(values)
344
+ status.push(totalstate)
345
+ return status
346
+ end
347
+
348
+ #
349
+ #
350
+ # === Args:
351
+ # +list+::
352
+ # The old tile [array]
353
+ # +label+::
354
+ # Label of the new value [string]
355
+ # +value+::
356
+ # The value with the state [array]
357
+ # +position+::
358
+ # Position at the tile [integer]
359
+ #
360
+ # === Description:
361
+ # Adds an object to a tile, which should not display by a icon
362
+ #
363
+ # === Return:
364
+ # Returns the new tile (already prepared) [array]
365
+ #
366
+
367
+ def self.raw(oldlist,lab,value)
368
+ if oldlist.length > 1
369
+ state_old = oldlist.delete(oldlist[-1])
370
+ new_list = oldlist
371
+ newstate = casestate(value[1],"s")
372
+ state_old_cb = convback(state_old)
373
+ gesstate = [state_old_cb.to_i, newstate.to_i]
374
+ gesstate = stateall(gesstate)
375
+ new_list.insert(-1, {label: lab, value: value[0]})
376
+ new_list << gesstate
377
+ elsif oldlist.length == 1
378
+ newstate = casestate(value[1],"s")
379
+ new_list = []
380
+ new_list.insert(-1, {label: lab, value: value[0]})
381
+ new_list << newstate
382
+ end
383
+ return new_list
384
+ end
385
+
386
+ #
387
+ #
388
+ # === Args:
389
+ # +name+::
390
+ # The name of the object [string]
391
+ # +type+::
392
+ # type of the object (service or host) [string]
393
+ # +group+::
394
+ # true, if the object is a host- or servicegroup [boolean]
395
+ # +etc+::
396
+ # additional object which schould be added to the group [array]
397
+ #
398
+ # === Description:
399
+ # Gets the host- and servicestate
400
+ #
401
+ # === Return:
402
+ # Returns the state of a host, service or a group
403
+ #
404
+ def self.getstate(name, type, group=false, etc=nil)
405
+ if group && type == "service"
406
+ res = groupservices(name)
407
+ elsif group
408
+ res = getgroup(name)
409
+ elsif type == "service"
410
+ res = get(name, "ssd")
411
+ elsif type == "servicehost"
412
+ res = get(name, "ssh")
413
+ elsif type == "host"
414
+ res = get(name, "hs")
415
+ end
416
+ return res
417
+ end
418
+
419
+ #
420
+ #
421
+ # === Args:
422
+ # +name+::
423
+ # The name of the service-object [string]
424
+ #
425
+ # === Description:
426
+ # Gets the perf_data of a service
427
+ #
428
+ # === Return:
429
+ # Return the perf_data
430
+ #
431
+ def self.getperfdata(name)
432
+ extname = []
433
+ begin
434
+ if name.index(":")
435
+ extname = name.split(":")
436
+ res = RTDI::IDSocket.request("services","state perf_data","display_name = #{extname[1]}","host_name = #{extname[0]}")
437
+ if res.length == 0
438
+ raise 'Das Objekt "' + extname[0] + '" mit dem Service "' + extname[1] + '" existiert nicht in Icinga!'
439
+ end
440
+ else
441
+ extname[1] = name
442
+ res = RTDI::IDSocket.request("services","state perf_data","display_name = #{extname[1]}")
443
+ if res.length == 0
444
+ raise 'Das Objekt "' + extname[1] + '" existiert nicht in Icinga!'
445
+ end
446
+ end
447
+ res = res.split(";")
448
+ state = res[0]
449
+ res = res[1].scan(/[=]([0-9]+[.,]?[0-9]+)/)
450
+ #res[0] = res[1].split(/[=]([0-9]+[.,]?[0-9]+)/)
451
+ res << state
452
+ rescue Exception => e
453
+ puts "Es ist ein Fehler aufgetreten: " + e.message
454
+ puts "Objekttyp: Service (perf_data)"
455
+ end
456
+ return res
457
+ end
458
+ def self.calcpue()
459
+ energymeter = RTDI::IDSocket.request("services","perf_data","display_name = energymeter_power")
460
+ pdu = RTDI::Status.gs("pdu_activepower","pdu_activepower")
461
+ pue = []
462
+ i = 0
463
+ pdu_strom = 0
464
+ pdu.each do |item|
465
+ if item.length != 1
466
+ pdu_strom += item.gsub!("ActivePower=","").to_i
467
+ i += 1
468
+ end
469
+ end
470
+ energymeter = energymeter.scan(/[=]([0-9]+[.,]?[0-9]+)/)[0][0]
471
+ pue[0] = (pdu_strom.to_f / energymeter.to_f).round 2
472
+ pue[1] = "0"
473
+ return pue
474
+ end
475
+ end
476
+ end