Advertisement
Guest User

Untitled

a guest
Apr 17th, 2017
372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.28 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" =>
  67. {"name" => groups},"preservekeys" => 0)}
  68. groupids = grps != [] ? grps.keys() : []
  69.  
  70. # Query Zabbix for current problem triggers
  71. result = serv.run {
  72. Zabby::Trigger.get(
  73. "filter" => {"value" => 1 },
  74. "min_severity" => MINPRIORITY,
  75. "groupids" => groupids,
  76. "output" => "extend",
  77. "monitored" => 1,
  78. "withLastEventUnacknowledged" => 1,
  79. "skipDependent" => 1,
  80. "selectHosts" => 1,
  81. "expandDescription" => 1,
  82. "sortfield" => "lastchange",
  83. "sortorder" => "DESC")
  84. }
  85.  
  86. triggers = {
  87. 0 => [],
  88. 1 => [],
  89. 2 => [],
  90. 3 => [],
  91. 4 => [],
  92. 5 => []
  93. }
  94. lastchange = {
  95. 0 => 0,
  96. 1 => 0,
  97. 2 => 0,
  98. 3 => 0,
  99. 4 => 0,
  100. 5 => 0
  101. }
  102. triggerlist = []
  103.  
  104. # Parse the results
  105. jsonObj = JSON.parse(result.to_json)
  106. jsonObj.each do |j|
  107. prio = j["priority"].to_i
  108. last = j["lastchange"].to_i
  109. tgrid = j["triggerid"]
  110. hostid = j["hosts"][0]["hostid"]
  111. tlink = SERVER + "/zabbix.php?action=problem.view&filter_triggerids[]=
  112. " + tgrid + "&filter_set=1"
  113. hostnme = serv.run {Zabby::Host.get("hostids" => hostid)}[0]["name"]
  114. hostnme = hostnme.gsub(/\..*$/, '') # strip domain name if necessary
  115. descr = j["description"]
  116. triggers[prio] << hostnme + " : " + descr
  117. status = Time.at(last) < (Time.now - ANIMATE) ? NAMES[prio] : NAMES[prio]
  118. + "-blink"
  119. triggerlist << {
  120. host: hostnme,
  121. trigger: descr,
  122. link: tlink,
  123. widget_class: "#{status}"
  124. }
  125. if last > lastchange[prio] then
  126. lastchange[prio] = last
  127. end
  128. end
  129. triggerlist = triggerlist.take(8) # Limit the list to 8 entries
  130.  
  131. # Loop through priorities to populate the widgets
  132. for i in MINPRIORITY..5
  133. total = triggers[i].count
  134.  
  135. # Set the color of the widget
  136. if total > 0 then
  137. status = Time.at(lastchange[i]) < (Time.now - ANIMATE) ? NAMES[i] : NAMES[i]
  138. + "-blink"
  139. else
  140. status = "ok" end
  141.  
  142. # Limit the displayed events to 3 per widget
  143. list = triggers[i].uniq
  144. if list.count > 4 then
  145. list = list[0..2]
  146. list <i< "[...]"
  147. end
  148.  
  149. # send the data to the widget
  150. send_event( screen + "_" + NAMES[i],
  151. { current: total, last: lastcount[screen][i], status: status, items: list } )
  152.  
  153. lastcount[screen][i] = total # Copy trigger counts to last value
  154. end
  155. send_event( screen + "_list", { items: triggerlist } )
  156. send_event( screen + "_text", {title: screen, status: "ok"} )
  157. end
  158. rescue Zabby::ResponseCodeError => e
  159. SCREENS.each do |screen, groups|
  160. send_event( screen + "_text", {title:
  161. "DASHBOARD IN ERROR : Cannot connect to Zabbix", status: NAMES[5] + "-blink"} )
  162. end
  163. rescue => e
  164. SCREENS.each do |screen, groups|
  165. send_event( screen + "_text", {title:
  166. "DASHBOARD IN ERROR : #{e}", status: NAMES[5] + "-blink"} )
  167. end
  168. end
  169. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement