Advertisement
Guest User

Untitled

a guest
Apr 17th, 2017
532
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.20 KB | None | 0 0
  1. require 'zabby'
  2. require 'json'
  3. require 'active_support/core_ext/numeric/time'
  4.  
  5. ########################## PARAMETERS ##############################
  6. SERVER = "https://dewhn17sv.corp.peri/zabbix" # Zabbix server URL
  7. USER = "monitor" # Zabbix user with API query rights
  8. PASSWORD = "M0n!t0R" # Password
  9. MINPRIORITY = 2 # Minimum priority level
  10. ANIMATE = 5.minutes # New triggers animation delay
  11. QUERYDELAY = '5s' # Zabbix API query delay
  12.  
  13. #########################################################
  14. # Zabbix groups to dashboard screens mapping : #
  15. # "Screen1" => [ "Zabbix group 1", "Zabbix group 2" ], #
  16. # "Screen2" => [ "Zabbix group 3" ] #
  17. #########################################################
  18. SCREENS = {
  19. "Windows Server WHN" => [ "Windows Servers WHN", "Windows Cluster" ],
  20. "AIX" => [ "AIX SAP", "AIX Informix", "AIX" ],
  21. "Centrio Server" => [ "Centrio" ],
  22. "PSD Server" => [ "PSD Server" ],
  23. "PSD Citrix Farm" => ["PSD_Citrix_Farm"],
  24. "Internet" => [ "Internet" ],
  25. "VPN WAN" => [ "VPN", "VPN WH" ],
  26. "Domain Controller" => [ "DC" ],
  27. "Exchange" => [ "Exchange" ],
  28. }
  29.  
  30.  
  31. ########################## CONSTANTS ###############################
  32. NAMES = {
  33. 1 => "info",
  34. 2 => "warn",
  35. 3 => "avrg",
  36. 4 => "high",
  37. 5 => "disa"
  38. }
  39. NAMES.default = "ok"
  40.  
  41. ############################ MAIN ##################################
  42. lastchange = Time.now
  43. set :screens, SCREENS.keys # Pass the list of screens to HTML page
  44.  
  45. # Initialize the last count hash
  46. lastcount = {}
  47. SCREENS.each do | k, v |
  48. lastcount[k] = {}
  49. for i in MINPRIORITY..5
  50. lastcount[k][i] = 0
  51. end
  52. end
  53.  
  54. # Start the scheduler
  55. SCHEDULER.every QUERYDELAY, allow_overlapping: false do
  56.  
  57. begin
  58. serv = Zabby.init do
  59. set :server => SERVER
  60. set :user => USER
  61. set :password => PASSWORD
  62. login
  63. end
  64. SCREENS.each do |screen, groups|
  65. # Get the group IDs
  66. grps = serv.run {Zabby::Hostgroup.get("filter" =>{"name" => groups},"preservekeys" => 0)}
  67. groupids = grps != [] ? grps.keys() : []
  68.  
  69. # Query Zabbix for current problem triggers
  70. result = serv.run {
  71. Zabby::Trigger.get(
  72. "filter" => {"value" => 1 },
  73. "min_severity" => MINPRIORITY,
  74. "groupids" => groupids,
  75. "output" => "extend",
  76. "monitored" => 1,
  77. "withLastEventUnacknowledged" => 1,
  78. "skipDependent" => 1,
  79. "selectHosts" => 1,
  80. "expandDescription" => 1,
  81. "sortfield" => "lastchange",
  82. "sortorder" => "DESC")
  83. }
  84.  
  85. triggers = {
  86. 0 => [],
  87. 1 => [],
  88. 2 => [],
  89. 3 => [],
  90. 4 => [],
  91. 5 => []
  92. }
  93. lastchange = {
  94. 0 => 0,
  95. 1 => 0,
  96. 2 => 0,
  97. 3 => 0,
  98. 4 => 0,
  99. 5 => 0
  100. }
  101. triggerlist = []
  102.  
  103. # Parse the results
  104. jsonObj = JSON.parse(result.to_json)
  105. jsonObj.each do |j|
  106. prio = j["priority"].to_i
  107. last = j["lastchange"].to_i
  108. tgrid = j["triggerid"]
  109. hostid = j["hosts"][0]["hostid"]
  110. tlink = SERVER + "/zabbix.php?action=problem.view&filter_triggerids[]=" + tgrid + "&filter_set=1"
  111. hostnme = serv.run {Zabby::Host.get("hostids" => hostid)}[0]["name"]
  112. hostnme = hostnme.gsub(/\..*$/, '') # strip domain name if necessary
  113. descr = j["description"]
  114. triggers[prio] << hostnme + " : " + descr
  115. status = Time.at(last) < (Time.now - ANIMATE) ? NAMES[prio] : NAMES[prio] + "-blink"
  116. triggerlist << {
  117. host: hostnme,
  118. trigger: descr,
  119. link: tlink,
  120. widget_class: "#{status}"
  121. }
  122. if last > lastchange[prio] then
  123. lastchange[prio] = last
  124. end
  125. end
  126. triggerlist = triggerlist.take(8) # Limit the list to 8 entries
  127.  
  128. # Loop through priorities to populate the widgets
  129. for i in MINPRIORITY..5
  130. total = triggers[i].count
  131.  
  132. # Set the color of the widget
  133. if total > 0 then
  134. status = Time.at(lastchange[i]) < (Time.now - ANIMATE) ? NAMES[i] : NAMES[i] + "-blink"
  135. else
  136. status = "ok" end
  137.  
  138. # Limit the displayed events to 3 per widget
  139. list = triggers[i].uniq
  140. if list.count > 4 then
  141. list = list[0..2]
  142. list <i< "[...]"
  143. end
  144.  
  145. # send the data to the widget
  146. send_event( screen + "_" + NAMES[i], { current: total, last: lastcount[screen][i], status: status, items: list } )
  147.  
  148. lastcount[screen][i] = total # Copy trigger counts to last value
  149. end
  150. send_event( screen + "_list", { items: triggerlist } )
  151. send_event( screen + "_text", {title: screen, status: "ok"} )
  152. end
  153. rescue Zabby::ResponseCodeError => e
  154. SCREENS.each do |screen, groups|
  155. send_event( screen + "_text", {title: "DASHBOARD IN ERROR : Cannot connect to Zabbix", status: NAMES[5] + "-blink"} )
  156. end
  157. rescue => e
  158. SCREENS.each do |screen, groups|
  159. send_event( screen + "_text", {title: "DASHBOARD IN ERROR : #{e}", status: NAMES[5] + "-blink"} )
  160. end
  161. end
  162. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement