flapjack 1.6.0 → 2.0.0b1

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.
Files changed (301) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -6
  3. data/.gitmodules +1 -1
  4. data/.rspec +1 -1
  5. data/.ruby-version +1 -1
  6. data/.travis.yml +12 -13
  7. data/CHANGELOG.md +2 -9
  8. data/CONTRIBUTING.md +7 -2
  9. data/Gemfile +4 -13
  10. data/LICENCE +1 -0
  11. data/README.md +8 -2
  12. data/Rakefile +2 -2
  13. data/bin/flapjack +3 -12
  14. data/build.sh +4 -2
  15. data/etc/flapjack_config.toml.example +273 -0
  16. data/features/ack_after_sched_maint.feature +18 -21
  17. data/features/cli.feature +11 -71
  18. data/features/cli_flapjack-feed-events.feature +14 -15
  19. data/features/cli_flapjack-nagios-receiver.feature +12 -41
  20. data/features/cli_flapper.feature +12 -41
  21. data/features/cli_purge.feature +5 -6
  22. data/features/cli_receive-events.feature +6 -7
  23. data/features/cli_simulate-failed-check.feature +5 -6
  24. data/features/events.feature +206 -181
  25. data/features/events_check_names.feature +4 -7
  26. data/features/notification_rules.feature +144 -223
  27. data/features/notifications.feature +65 -57
  28. data/features/rollup.feature +45 -47
  29. data/features/steps/cli_steps.rb +4 -5
  30. data/features/steps/events_steps.rb +163 -373
  31. data/features/steps/notifications_steps.rb +408 -264
  32. data/features/steps/packaging-lintian_steps.rb +0 -4
  33. data/features/steps/time_travel_steps.rb +0 -26
  34. data/features/support/daemons.rb +6 -31
  35. data/features/support/env.rb +65 -74
  36. data/flapjack.gemspec +22 -24
  37. data/lib/flapjack.rb +14 -7
  38. data/lib/flapjack/cli/flapper.rb +74 -173
  39. data/lib/flapjack/cli/maintenance.rb +278 -109
  40. data/lib/flapjack/cli/migrate.rb +950 -0
  41. data/lib/flapjack/cli/purge.rb +19 -22
  42. data/lib/flapjack/cli/receiver.rb +150 -326
  43. data/lib/flapjack/cli/server.rb +8 -235
  44. data/lib/flapjack/cli/simulate.rb +42 -57
  45. data/lib/flapjack/configuration.rb +51 -37
  46. data/lib/flapjack/coordinator.rb +138 -129
  47. data/lib/flapjack/data/acknowledgement.rb +177 -0
  48. data/lib/flapjack/data/alert.rb +97 -158
  49. data/lib/flapjack/data/check.rb +611 -0
  50. data/lib/flapjack/data/condition.rb +70 -0
  51. data/lib/flapjack/data/contact.rb +226 -456
  52. data/lib/flapjack/data/event.rb +96 -184
  53. data/lib/flapjack/data/extensions/associations.rb +59 -0
  54. data/lib/flapjack/data/extensions/short_name.rb +25 -0
  55. data/lib/flapjack/data/medium.rb +428 -0
  56. data/lib/flapjack/data/metrics.rb +194 -0
  57. data/lib/flapjack/data/notification.rb +22 -281
  58. data/lib/flapjack/data/rule.rb +473 -0
  59. data/lib/flapjack/data/scheduled_maintenance.rb +244 -0
  60. data/lib/flapjack/data/state.rb +221 -0
  61. data/lib/flapjack/data/statistic.rb +112 -0
  62. data/lib/flapjack/data/tag.rb +277 -0
  63. data/lib/flapjack/data/test_notification.rb +182 -0
  64. data/lib/flapjack/data/unscheduled_maintenance.rb +159 -0
  65. data/lib/flapjack/data/validators/id_validator.rb +20 -0
  66. data/lib/flapjack/exceptions.rb +6 -0
  67. data/lib/flapjack/filters/acknowledgement.rb +23 -16
  68. data/lib/flapjack/filters/base.rb +0 -5
  69. data/lib/flapjack/filters/delays.rb +53 -43
  70. data/lib/flapjack/filters/ok.rb +23 -14
  71. data/lib/flapjack/filters/scheduled_maintenance.rb +3 -3
  72. data/lib/flapjack/filters/unscheduled_maintenance.rb +12 -3
  73. data/lib/flapjack/gateways/aws_sns.rb +65 -49
  74. data/lib/flapjack/gateways/aws_sns/alert.text.erb +2 -2
  75. data/lib/flapjack/gateways/aws_sns/alert_subject.text.erb +2 -2
  76. data/lib/flapjack/gateways/aws_sns/rollup_subject.text.erb +1 -1
  77. data/lib/flapjack/gateways/email.rb +107 -90
  78. data/lib/flapjack/gateways/email/alert.html.erb +19 -18
  79. data/lib/flapjack/gateways/email/alert.text.erb +20 -14
  80. data/lib/flapjack/gateways/email/alert_subject.text.erb +2 -1
  81. data/lib/flapjack/gateways/email/rollup.html.erb +14 -13
  82. data/lib/flapjack/gateways/email/rollup.text.erb +13 -10
  83. data/lib/flapjack/gateways/jabber.rb +679 -671
  84. data/lib/flapjack/gateways/jabber/alert.text.erb +9 -6
  85. data/lib/flapjack/gateways/jsonapi.rb +164 -350
  86. data/lib/flapjack/gateways/jsonapi/data/join_descriptor.rb +44 -0
  87. data/lib/flapjack/gateways/jsonapi/data/method_descriptor.rb +21 -0
  88. data/lib/flapjack/gateways/jsonapi/helpers/headers.rb +63 -0
  89. data/lib/flapjack/gateways/jsonapi/helpers/miscellaneous.rb +136 -0
  90. data/lib/flapjack/gateways/jsonapi/helpers/resources.rb +227 -0
  91. data/lib/flapjack/gateways/jsonapi/helpers/serialiser.rb +313 -0
  92. data/lib/flapjack/gateways/jsonapi/helpers/swagger_docs.rb +322 -0
  93. data/lib/flapjack/gateways/jsonapi/methods/association_delete.rb +115 -0
  94. data/lib/flapjack/gateways/jsonapi/methods/association_get.rb +288 -0
  95. data/lib/flapjack/gateways/jsonapi/methods/association_patch.rb +178 -0
  96. data/lib/flapjack/gateways/jsonapi/methods/association_post.rb +116 -0
  97. data/lib/flapjack/gateways/jsonapi/methods/metrics.rb +71 -0
  98. data/lib/flapjack/gateways/jsonapi/methods/resource_delete.rb +119 -0
  99. data/lib/flapjack/gateways/jsonapi/methods/resource_get.rb +186 -0
  100. data/lib/flapjack/gateways/jsonapi/methods/resource_patch.rb +239 -0
  101. data/lib/flapjack/gateways/jsonapi/methods/resource_post.rb +197 -0
  102. data/lib/flapjack/gateways/jsonapi/middleware/array_param_fixer.rb +27 -0
  103. data/lib/flapjack/gateways/jsonapi/{rack → middleware}/json_params_parser.rb +7 -6
  104. data/lib/flapjack/gateways/jsonapi/middleware/request_timestamp.rb +18 -0
  105. data/lib/flapjack/gateways/oobetet.rb +222 -170
  106. data/lib/flapjack/gateways/pager_duty.rb +388 -0
  107. data/lib/flapjack/gateways/pager_duty/alert.text.erb +13 -0
  108. data/lib/flapjack/gateways/slack.rb +56 -48
  109. data/lib/flapjack/gateways/slack/alert.text.erb +1 -1
  110. data/lib/flapjack/gateways/slack/rollup.text.erb +1 -1
  111. data/lib/flapjack/gateways/sms_aspsms.rb +155 -0
  112. data/lib/flapjack/gateways/sms_aspsms/alert.text.erb +7 -0
  113. data/lib/flapjack/gateways/sms_aspsms/rollup.text.erb +2 -0
  114. data/lib/flapjack/gateways/sms_messagenet.rb +77 -57
  115. data/lib/flapjack/gateways/sms_messagenet/alert.text.erb +3 -2
  116. data/lib/flapjack/gateways/sms_nexmo.rb +53 -51
  117. data/lib/flapjack/gateways/sms_nexmo/alert.text.erb +2 -2
  118. data/lib/flapjack/gateways/sms_nexmo/rollup.text.erb +1 -1
  119. data/lib/flapjack/gateways/sms_twilio.rb +79 -62
  120. data/lib/flapjack/gateways/sms_twilio/alert.text.erb +3 -2
  121. data/lib/flapjack/gateways/web.rb +437 -345
  122. data/lib/flapjack/gateways/web/middleware/request_timestamp.rb +18 -0
  123. data/lib/flapjack/gateways/web/public/css/bootstrap.css +3793 -4340
  124. data/lib/flapjack/gateways/web/public/css/bootstrap.css.map +1 -0
  125. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.eot +0 -0
  126. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.svg +273 -214
  127. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  128. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.woff +0 -0
  129. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
  130. data/lib/flapjack/gateways/web/public/js/bootstrap.js +1637 -1607
  131. data/lib/flapjack/gateways/web/public/js/self_stats.js +1 -2
  132. data/lib/flapjack/gateways/web/views/_pagination.html.erb +19 -0
  133. data/lib/flapjack/gateways/web/views/check.html.erb +159 -121
  134. data/lib/flapjack/gateways/web/views/checks.html.erb +82 -41
  135. data/lib/flapjack/gateways/web/views/contact.html.erb +59 -71
  136. data/lib/flapjack/gateways/web/views/contacts.html.erb +32 -8
  137. data/lib/flapjack/gateways/web/views/index.html.erb +2 -2
  138. data/lib/flapjack/gateways/web/views/{layout.erb → layout.html.erb} +7 -23
  139. data/lib/flapjack/gateways/web/views/self_stats.html.erb +32 -33
  140. data/lib/flapjack/gateways/web/views/tag.html.erb +32 -0
  141. data/lib/flapjack/gateways/web/views/tags.html.erb +51 -0
  142. data/lib/flapjack/logger.rb +34 -3
  143. data/lib/flapjack/notifier.rb +180 -112
  144. data/lib/flapjack/patches.rb +8 -63
  145. data/lib/flapjack/pikelet.rb +185 -143
  146. data/lib/flapjack/processor.rb +323 -191
  147. data/lib/flapjack/record_queue.rb +33 -0
  148. data/lib/flapjack/redis_proxy.rb +66 -0
  149. data/lib/flapjack/utility.rb +21 -15
  150. data/lib/flapjack/version.rb +2 -1
  151. data/libexec/httpbroker.go +218 -14
  152. data/libexec/oneoff.go +13 -10
  153. data/spec/lib/flapjack/configuration_spec.rb +286 -0
  154. data/spec/lib/flapjack/coordinator_spec.rb +103 -157
  155. data/spec/lib/flapjack/data/check_spec.rb +175 -0
  156. data/spec/lib/flapjack/data/contact_spec.rb +26 -349
  157. data/spec/lib/flapjack/data/event_spec.rb +76 -291
  158. data/spec/lib/flapjack/data/medium_spec.rb +19 -0
  159. data/spec/lib/flapjack/data/rule_spec.rb +43 -0
  160. data/spec/lib/flapjack/data/scheduled_maintenance_spec.rb +976 -0
  161. data/spec/lib/flapjack/data/unscheduled_maintenance_spec.rb +34 -0
  162. data/spec/lib/flapjack/gateways/aws_sns_spec.rb +111 -60
  163. data/spec/lib/flapjack/gateways/email_spec.rb +194 -161
  164. data/spec/lib/flapjack/gateways/jabber_spec.rb +961 -162
  165. data/spec/lib/flapjack/gateways/jsonapi/methods/check_links_spec.rb +155 -0
  166. data/spec/lib/flapjack/gateways/jsonapi/methods/checks_spec.rb +426 -0
  167. data/spec/lib/flapjack/gateways/jsonapi/methods/contact_links_spec.rb +217 -0
  168. data/spec/lib/flapjack/gateways/jsonapi/methods/contacts_spec.rb +425 -0
  169. data/spec/lib/flapjack/gateways/jsonapi/methods/events_spec.rb +271 -0
  170. data/spec/lib/flapjack/gateways/jsonapi/methods/media_spec.rb +257 -0
  171. data/spec/lib/flapjack/gateways/jsonapi/methods/medium_links_spec.rb +163 -0
  172. data/spec/lib/flapjack/gateways/jsonapi/methods/metrics_spec.rb +8 -0
  173. data/spec/lib/flapjack/gateways/jsonapi/methods/rule_links_spec.rb +212 -0
  174. data/spec/lib/flapjack/gateways/jsonapi/methods/rules_spec.rb +289 -0
  175. data/spec/lib/flapjack/gateways/jsonapi/methods/scheduled_maintenance_links_spec.rb +49 -0
  176. data/spec/lib/flapjack/gateways/jsonapi/methods/scheduled_maintenances_spec.rb +242 -0
  177. data/spec/lib/flapjack/gateways/jsonapi/methods/tag_links_spec.rb +274 -0
  178. data/spec/lib/flapjack/gateways/jsonapi/methods/tags_spec.rb +302 -0
  179. data/spec/lib/flapjack/gateways/jsonapi/methods/unscheduled_maintenance_links_spec.rb +49 -0
  180. data/spec/lib/flapjack/gateways/jsonapi/methods/unscheduled_maintenances_spec.rb +339 -0
  181. data/spec/lib/flapjack/gateways/jsonapi_spec.rb +1 -1
  182. data/spec/lib/flapjack/gateways/oobetet_spec.rb +151 -79
  183. data/spec/lib/flapjack/gateways/pager_duty_spec.rb +353 -0
  184. data/spec/lib/flapjack/gateways/slack_spec.rb +53 -53
  185. data/spec/lib/flapjack/gateways/sms_aspsms_spec.rb +106 -0
  186. data/spec/lib/flapjack/gateways/sms_messagenet_spec.rb +111 -54
  187. data/spec/lib/flapjack/gateways/sms_nexmo_spec.rb +50 -51
  188. data/spec/lib/flapjack/gateways/sms_twilio_spec.rb +108 -48
  189. data/spec/lib/flapjack/gateways/web_spec.rb +144 -216
  190. data/spec/lib/flapjack/notifier_spec.rb +132 -1
  191. data/spec/lib/flapjack/pikelet_spec.rb +111 -50
  192. data/spec/lib/flapjack/processor_spec.rb +210 -40
  193. data/spec/lib/flapjack/redis_proxy_spec.rb +45 -0
  194. data/spec/lib/flapjack/utility_spec.rb +11 -15
  195. data/spec/service_consumers/fixture_data.rb +547 -0
  196. data/spec/service_consumers/pact_helper.rb +21 -32
  197. data/spec/service_consumers/pacts/flapjack-diner_v2.0.json +4652 -0
  198. data/spec/service_consumers/provider_states_for_flapjack-diner.rb +279 -322
  199. data/spec/service_consumers/provider_support.rb +8 -0
  200. data/spec/spec_helper.rb +34 -44
  201. data/spec/support/erb_view_helper.rb +1 -1
  202. data/spec/support/factories.rb +58 -0
  203. data/spec/support/jsonapi_helper.rb +15 -26
  204. data/spec/support/mock_logger.rb +43 -0
  205. data/spec/support/xmpp_comparable.rb +24 -0
  206. data/src/flapjack/transport_test.go +30 -1
  207. data/tasks/dump_keys.rake +82 -0
  208. data/tasks/events.rake +7 -7
  209. data/tasks/support/flapjack_config_benchmark.toml +28 -0
  210. data/tasks/support/flapjack_config_benchmark.yaml +0 -2
  211. metadata +175 -222
  212. data/Guardfile +0 -14
  213. data/etc/flapjack_config.yaml.example +0 -477
  214. data/features/cli_flapjack-populator.feature +0 -90
  215. data/features/support/silent_system.rb +0 -4
  216. data/lib/flapjack/cli/import.rb +0 -108
  217. data/lib/flapjack/data/entity.rb +0 -652
  218. data/lib/flapjack/data/entity_check.rb +0 -1044
  219. data/lib/flapjack/data/message.rb +0 -56
  220. data/lib/flapjack/data/migration.rb +0 -234
  221. data/lib/flapjack/data/notification_rule.rb +0 -425
  222. data/lib/flapjack/data/semaphore.rb +0 -44
  223. data/lib/flapjack/data/tagged.rb +0 -48
  224. data/lib/flapjack/gateways/jsonapi/check_methods.rb +0 -206
  225. data/lib/flapjack/gateways/jsonapi/check_presenter.rb +0 -221
  226. data/lib/flapjack/gateways/jsonapi/contact_methods.rb +0 -186
  227. data/lib/flapjack/gateways/jsonapi/entity_methods.rb +0 -223
  228. data/lib/flapjack/gateways/jsonapi/medium_methods.rb +0 -185
  229. data/lib/flapjack/gateways/jsonapi/metrics_methods.rb +0 -132
  230. data/lib/flapjack/gateways/jsonapi/notification_rule_methods.rb +0 -141
  231. data/lib/flapjack/gateways/jsonapi/pagerduty_credential_methods.rb +0 -139
  232. data/lib/flapjack/gateways/jsonapi/report_methods.rb +0 -146
  233. data/lib/flapjack/gateways/pagerduty.rb +0 -318
  234. data/lib/flapjack/gateways/pagerduty/alert.text.erb +0 -10
  235. data/lib/flapjack/gateways/web/public/css/select2-bootstrap.css +0 -87
  236. data/lib/flapjack/gateways/web/public/css/select2.css +0 -615
  237. data/lib/flapjack/gateways/web/public/css/tablesort.css +0 -67
  238. data/lib/flapjack/gateways/web/public/img/select2-spinner.gif +0 -0
  239. data/lib/flapjack/gateways/web/public/img/select2.png +0 -0
  240. data/lib/flapjack/gateways/web/public/img/select2x2.png +0 -0
  241. data/lib/flapjack/gateways/web/public/js/backbone.js +0 -1581
  242. data/lib/flapjack/gateways/web/public/js/backbone.jsonapi.js +0 -322
  243. data/lib/flapjack/gateways/web/public/js/flapjack.js +0 -82
  244. data/lib/flapjack/gateways/web/public/js/jquery.tablesorter.js +0 -1640
  245. data/lib/flapjack/gateways/web/public/js/jquery.tablesorter.widgets.js +0 -1390
  246. data/lib/flapjack/gateways/web/public/js/modules/contact.js +0 -520
  247. data/lib/flapjack/gateways/web/public/js/modules/entity.js +0 -28
  248. data/lib/flapjack/gateways/web/public/js/modules/medium.js +0 -40
  249. data/lib/flapjack/gateways/web/public/js/select2.js +0 -3397
  250. data/lib/flapjack/gateways/web/public/js/tablesort.js +0 -44
  251. data/lib/flapjack/gateways/web/public/js/underscore.js +0 -1276
  252. data/lib/flapjack/gateways/web/views/edit_contacts.html.erb +0 -173
  253. data/lib/flapjack/gateways/web/views/entities.html.erb +0 -30
  254. data/lib/flapjack/gateways/web/views/entity.html.erb +0 -51
  255. data/lib/flapjack/rack_logger.rb +0 -47
  256. data/lib/flapjack/redis_pool.rb +0 -42
  257. data/spec/lib/flapjack/data/entity_check_spec.rb +0 -1418
  258. data/spec/lib/flapjack/data/entity_spec.rb +0 -872
  259. data/spec/lib/flapjack/data/message_spec.rb +0 -30
  260. data/spec/lib/flapjack/data/migration_spec.rb +0 -104
  261. data/spec/lib/flapjack/data/notification_rule_spec.rb +0 -232
  262. data/spec/lib/flapjack/data/notification_spec.rb +0 -53
  263. data/spec/lib/flapjack/data/semaphore_spec.rb +0 -24
  264. data/spec/lib/flapjack/filters/acknowledgement_spec.rb +0 -6
  265. data/spec/lib/flapjack/filters/delays_spec.rb +0 -6
  266. data/spec/lib/flapjack/filters/ok_spec.rb +0 -6
  267. data/spec/lib/flapjack/filters/scheduled_maintenance_spec.rb +0 -6
  268. data/spec/lib/flapjack/filters/unscheduled_maintenance_spec.rb +0 -6
  269. data/spec/lib/flapjack/gateways/jsonapi/check_methods_spec.rb +0 -315
  270. data/spec/lib/flapjack/gateways/jsonapi/check_presenter_spec.rb +0 -223
  271. data/spec/lib/flapjack/gateways/jsonapi/contact_methods_spec.rb +0 -131
  272. data/spec/lib/flapjack/gateways/jsonapi/entity_methods_spec.rb +0 -389
  273. data/spec/lib/flapjack/gateways/jsonapi/medium_methods_spec.rb +0 -231
  274. data/spec/lib/flapjack/gateways/jsonapi/notification_rule_methods_spec.rb +0 -169
  275. data/spec/lib/flapjack/gateways/jsonapi/pagerduty_credential_methods_spec.rb +0 -114
  276. data/spec/lib/flapjack/gateways/jsonapi/report_methods_spec.rb +0 -590
  277. data/spec/lib/flapjack/gateways/pagerduty_spec.rb +0 -249
  278. data/spec/lib/flapjack/gateways/web/views/check.html.erb_spec.rb +0 -21
  279. data/spec/lib/flapjack/gateways/web/views/contact.html.erb_spec.rb +0 -24
  280. data/spec/lib/flapjack/gateways/web/views/index.html.erb_spec.rb +0 -16
  281. data/spec/lib/flapjack/redis_pool_spec.rb +0 -29
  282. data/spec/service_consumers/pacts/flapjack-diner_v1.0.json +0 -4702
  283. data/tasks/entities.rake +0 -151
  284. data/tasks/profile.rake +0 -282
  285. data/tmp/acknowledge.rb +0 -13
  286. data/tmp/create_config_yaml.rb +0 -16
  287. data/tmp/create_event_ok.rb +0 -30
  288. data/tmp/create_event_unknown.rb +0 -30
  289. data/tmp/create_events_failure.rb +0 -34
  290. data/tmp/create_events_ok.rb +0 -32
  291. data/tmp/create_events_ok_fail_ack_ok.rb +0 -53
  292. data/tmp/create_events_ok_failure.rb +0 -41
  293. data/tmp/create_events_ok_failure_ack.rb +0 -53
  294. data/tmp/dummy_contacts.json +0 -43
  295. data/tmp/dummy_entities.json +0 -37
  296. data/tmp/generate_nagios_test_hosts.rb +0 -16
  297. data/tmp/notification_rules.rb +0 -73
  298. data/tmp/parse_config_yaml.rb +0 -7
  299. data/tmp/redis_find_spurious_unknown_states.rb +0 -52
  300. data/tmp/test_json_post.rb +0 -19
  301. data/tmp/test_notification_rules_api.rb +0 -171
@@ -1,19 +1,66 @@
1
1
  <% if @auto_refresh %>
2
2
  <meta http-equiv="refresh" content="<%= @auto_refresh %>" >
3
3
  <% end %>
4
- <% page_title "#{@adjective.capitalize} Checks" %>
4
+ <% page_title "Checks" %>
5
5
 
6
6
  <div class="page-header">
7
- <h2><%= @adjective.capitalize %> Checks</h2>
7
+ <h2>Checks</h2>
8
8
  </div>
9
9
 
10
- <p><%= h @count_failing_checks %> failing out of <%= h @count_current_checks %></p>
10
+ <div class="row">
11
+ <div class="col-md-12">
11
12
 
12
- <table class="table table-bordered table-hover table-condensed tablesorter">
13
+ <form action="<%= @base_url %>checks" method="get" role="form" class="form-horizontal">
14
+
15
+ <div class="form-group">
16
+ <label class="col-sm-2 control-label" for="start_time">Name:</label>
17
+ <div class="col-sm-6">
18
+ <input type="text" name="name" class="form-control" size="20" maxlength="80" value="<%= h params[:name] %>">
19
+ <span class="help-block">
20
+ e.g. the exact name, or a /regexp/
21
+ </span>
22
+ </div>
23
+ <div class="col-sm-2"></div>
24
+ <div class="col-sm-2">
25
+ <button type="submit" class="btn btn-success">Refresh</button>
26
+ </div>
27
+ </div>
28
+
29
+ <div class="form-group">
30
+ <label class="col-sm-2 control-label" for="start_time">Enabled?</label>
31
+ <div class="col-sm-2">
32
+ <select name="enabled" class="form-control">
33
+ <option value="f"<%= @enabled.is_a?(FalseClass) ? 'selected' : '' %>>No</option>
34
+ <option value="t"<%= @enabled.is_a?(TrueClass) ? 'selected' : '' %>>Yes</option>
35
+ <option value=""<%= @enabled.nil? ? 'selected' : '' %>>All</option>
36
+ </select>
37
+ <span class="help-block">
38
+ Filter by whether checks are enabled
39
+ </span>
40
+ </div>
41
+ <label class="col-sm-2 control-label" for="start_time">Failing?</label>
42
+ <div class="col-sm-2">
43
+ <select name="failing" class="form-control">
44
+ <option value="f"<%= @failing.is_a?(FalseClass) ? 'selected' : '' %>>No</option>
45
+ <option value="t"<%= @failing.is_a?(TrueClass) ? 'selected' : '' %>>Yes</option>
46
+ <option value=""<%= @failing.nil? ? 'selected' : '' %>>All</option>
47
+ </select>
48
+ <span class="help-block">
49
+ Filter by whether checks are failing
50
+ </span>
51
+ </div>
52
+ <div class="col-sm-4"></div>
53
+ </div>
54
+
55
+ </form><!-- form-horizontal-->
56
+
57
+ </div>
58
+ </div>
59
+
60
+ <table class="table table-bordered table-hover table-condensed">
13
61
  <thead>
14
62
  <tr>
15
- <th data-placeholder="e.g. app[1-3]*">Entity</th>
16
- <th data-placeholder="e.g. disk">Check</th>
63
+ <th data-placeholder="e.g. app[1-3]*:disk">Check</th>
17
64
  <th data-placeholder="e.g. critical">State</th>
18
65
  <th data-placeholder="e.g. !simulated">Summary</th>
19
66
  <th data-placeholder="e.g. <2h 0m">Last State Change</th>
@@ -22,41 +69,35 @@
22
69
  </tr>
23
70
  </thead>
24
71
  <tbody>
25
- <% @entities_sorted.each do |entity| %>
26
- <% row_entity = nil %>
27
- <% entity_link = @base_url + "entity/" << u(entity) %>
28
- <% @states[entity].each do |check, status, summary, changed, updated, in_unscheduled_outage, in_scheduled_outage, notified| %>
29
- <%
30
- row_colour = case status
31
- when 'critical', 'unknown'
32
- 'danger'
33
- when 'ok', 'up'
34
- 'success'
35
- else
36
- status
37
- end
38
-
39
- check_link = @base_url + "check?entity=" << u(entity) << "&amp;check=" << u(check)
40
- %>
41
- <tr class="<%= row_colour %>">
42
- <% unless row_entity && entity == row_entity %>
43
- <td>
44
- <a href="<%= entity_link %>"><%= h entity %></a>
45
- </td>
46
- <% end %>
47
- <td><a href="<%= check_link %>" title="check detail"><%= h check %></a></td>
48
- <td class="<%= status %>">
49
- <%= h status.upcase %>
50
- <% if in_unscheduled_outage%> (Ack'd)<% end %>
51
- <% if in_scheduled_outage %> (Sched)<% end %>
52
- </td>
53
- <td><%= h summary %></td>
54
- <td><%= h changed %></td>
55
- <td><%= h updated %></td>
56
- <td><%= h notified %></td>
57
- </tr>
58
-
59
- <% end %>
72
+ <% @checks.each do |check| %>
73
+ <%
74
+ status = @states[check[:id]]
75
+
76
+ row_colour = case status[:condition]
77
+ when 'critical', 'unknown'
78
+ 'danger'
79
+ when 'ok', 'up'
80
+ 'success'
81
+ else
82
+ status[:condition]
83
+ end
84
+
85
+ check_link = @base_url + "checks/" + u(check[:id])
86
+ %>
87
+ <tr class="<%= row_colour %>">
88
+ <td><a href="<%= check_link %>" title="check detail"><%= h check[:name] %></a></td>
89
+ <td>
90
+ <%= h status[:condition].upcase %>
91
+ <% if false %> (Ack'd)<% end %>
92
+ <% if false %> (Sched)<% end %>
93
+ </td>
94
+ <td><%= h status[:summary] %></td>
95
+ <td><%= h status[:last_changed] %></td>
96
+ <td><%= h status[:last_updated] %></td>
97
+ <td><%= h status[:last_notified] %></td>
98
+ </tr>
60
99
  <% end %>
61
100
  </tbody>
62
101
  </table>
102
+
103
+ <%= erb '_pagination.html'.to_sym, :layout => false %>
@@ -1,11 +1,9 @@
1
1
  <div class="page-header">
2
- <h2><%= h @contact.name %></h2>
2
+ <h2><%= h @contact[:name] %></h2>
3
3
  </div>
4
4
 
5
- <% alerting = {} %>
6
-
7
5
  <h3>Contact Media</h3>
8
- <% if !@contact.media || @contact.media.empty? %>
6
+ <% if @media.nil? || @media.empty? %>
9
7
  <p>No media</p>
10
8
  <% else %>
11
9
  <table class="table table-bordered table-hover table-condensed">
@@ -16,16 +14,19 @@
16
14
  <th>Summary Mode</th>
17
15
  <th>Summary Threshold</th>
18
16
  </tr>
19
- <% @contact.media.each_pair do |mk, mv| %>
20
- <% alerting_checks = @contact.alerting_checks_for_media(mk) %>
21
- <% alerting[mk] = alerting_checks unless (alerting_checks.nil? || alerting_checks.empty?) %>
17
+ <% @media.each do |med| %>
18
+ <% alerting_checks = @alerting_checks_by_media_id[med[:id]] %>
19
+ <% media_transport = med[:transport] %>
22
20
  <tr>
23
- <% if 'pagerduty'.eql?(mk) %>
21
+ <% if 'pagerduty'.eql?(media_transport) %>
24
22
  <td>PagerDuty</td>
25
23
  <td>
26
- <% @pagerduty_credentials.each_pair do |pk, pv| %>
24
+ <% [:pagerduty_subdomain, :pagerduty_user_name,
25
+ :pagerduty_password, :pagerduty_token,
26
+ :pagerduty_ack_duration].each do |pk| %>
27
+ <% pv = med[pk] %>
27
28
  <% unless pv.empty? %>
28
- <p><%= 'password'.eql?(pk) ? h("#{pk}: ...") : h("#{pk}: #{pv}") %></p>
29
+ <p><%= :pagerduty_password.eql?(pk) ? h("#{pk}: ...") : h("#{pk}: #{pv}") %></p>
29
30
  <% end %>
30
31
  <% end %>
31
32
  </td>
@@ -33,22 +34,22 @@
33
34
  <td></td>
34
35
  <td></td>
35
36
  <% else %>
36
- <% if 'sms'.eql?(mk) %>
37
- <td><%= h mk.upcase %></td>
37
+ <% if 'sms'.eql?(media_transport) %>
38
+ <td><%= h media_transport.upcase %></td>
38
39
  <% else %>
39
- <td><%= h mk.capitalize %></td>
40
+ <td><%= h media_transport.capitalize %></td>
40
41
  <% end %>
41
- <td><%= h mv %></td>
42
+ <td><%= h med[:address] %></td>
42
43
  <td>
43
- <% if @contact.media_intervals[mk] %>
44
- <%= h @contact.media_intervals[mk] %> seconds
44
+ <% if med[:interval] %>
45
+ <%= h med[:interval] %> seconds
45
46
  <% else %>
46
47
  no custom interval
47
48
  <% end %>
48
49
  </td>
49
50
  <td>
50
- <% rollup_threshold = @contact.media_rollup_thresholds[mk] %>
51
- <% num_alerting = alerting[mk].nil? ? 0 : alerting[mk].length %>
51
+ <% rollup_threshold = med[:rollup_threshold] %>
52
+ <% num_alerting = alerting_checks.nil? ? 0 : alerting_checks.length %>
52
53
  <% if rollup_threshold.nil? || (num_alerting < rollup_threshold.to_i) %>
53
54
  No -
54
55
  <% else %>
@@ -70,27 +71,23 @@
70
71
  <% end %>
71
72
 
72
73
  <h3>Alerting Checks</h3>
73
- <p>Alerting checks are any that are failing, not acknowledged, not in scheduled maintenance, and currently allowed by this contact's notification rules.</p>
74
+ <p>Alerting checks are any that are failing (and have alerted), not acknowledged, not in scheduled maintenance, and currently allowed by this contact's notification rules.</p>
74
75
 
75
- <% if alerting.empty? %>
76
+ <% if @alerting_checks_by_media_id.nil? || @alerting_checks_by_media_id.empty? %>
76
77
  <p><em>There are no currently alerting checks.</em></p>
77
78
  <% else %>
78
79
  <table class="table table-bordered table-hover table-condensed">
79
80
  <tr>
80
- <th>Media</th>
81
+ <th>Medium</th>
81
82
  <th>Alerting Checks</th>
82
83
  </tr>
83
- <% alerting.each_pair do |media, checks| %>
84
+ <% @alerting_checks_by_media_id.each_pair do |media_id, checks| %>
84
85
  <% if checks.length > 0 %>
85
86
  <tr>
86
- <td><%= h media.capitalize %></td>
87
+ <td><%= h @media.detect {|m| m[:id].eql?(media_id) }[:transport].capitalize %></td>
87
88
  <td>
88
- <% checks.each do |entity_check| %>
89
- <% entity, check = entity_check.split(':', 2) %>
90
- <% check_link = "<a href=\"#{@base_url}check?entity=#{u(entity)}&amp;check=#{u(check)}\" title=\"check status\">" +
91
- h(check) + "</a>"%>
92
- <a href="<%= @base_url %>entity/<%= u(entity) %>" title="entity status"><%= h entity %></a> ::
93
- <%= check_link %> <br />
89
+ <% checks.each do |check| %>
90
+ <a href="<%= @base_url %>checks/<%= u(check[:id]) %>" title="check status"><%= h(check[:name]) %></a><br />
94
91
  <% end %>
95
92
  </td>
96
93
  </tr>
@@ -99,64 +96,55 @@
99
96
  </table>
100
97
  <% end %>
101
98
 
102
- <h3>Notification Rules</h3>
103
- <% rules = @contact.notification_rules %>
104
- <% if !rules || rules.empty? %>
105
- <p>No notification rules</p>
99
+ <h3>Rules</h3>
100
+ <% if !@rules || @rules.empty? %>
101
+ <p>No rules</p>
106
102
  <% else %>
107
103
  <table class="table table-bordered table-hover table-condensed">
108
104
  <tr>
109
- <th>ID</th>
110
- <th>Entities</th>
111
- <th>Entities Regex</th>
105
+ <th>Name/ID</th>
106
+ <th>Blackhole</th>
107
+ <th>Strategy</th>
112
108
  <th>Tags</th>
113
- <th>Tags Regex</th>
114
- <th>Warning Media</th>
115
- <th>Critical Media</th>
109
+ <th>Conditions</th>
110
+ <th>Media</th>
116
111
  <th>Time Restrictions</th>
117
- <th>Blackholes</th>
118
112
  </tr>
119
- <% rules.each do |rule| %>
113
+ <% @rules.each do |rule| %>
114
+ <% rule_name = rule[:name].nil? || rule[:name].empty? ? rule[:id] : rule[:name] %>
115
+ <% blackhole = rule[:blackhole] ? 'true' : 'false' %>
116
+ <% tags = @tags_by_rule_id[rule[:id]] %>
117
+ <% tag_names = tags.nil? ? [] : tags.map {|t| t[:name] } %>
118
+ <% rule_conds = rule[:conditions_list] %>
119
+ <% media = @media_by_rule_id[rule[:id]] %>
120
+ <% transports = media.nil? ? [] : media.map {|m| m[:transport] } %>
120
121
  <tr>
121
- <td><%= h rule.id %></td>
122
- <td><%= h( (rule.entities && !rule.entities.empty?) ? rule.entities.join(', ') : '-') %></td>
123
- <td><%= h( (rule.regex_entities && !rule.regex_entities.empty?) ? rule.regex_entities.join(', ') : '-') %></td>
124
- <td><%= h( (rule.tags && !rule.tags.empty?) ? rule.tags.to_a.join(', ') : '-') %></td>
125
- <td><%= h( (rule.regex_tags && !rule.regex_tags.empty?) ? rule.regex_tags.to_a.join(', ') : '-') %></td>
126
- <td><%= h( (rule.warning_media && !rule.warning_media.empty?) ? rule.warning_media.join(', ') : '-')%></td>
127
- <td><%= h( (rule.critical_media && !rule.critical_media.empty?) ? rule.critical_media.join(', ') : '-') %></td>
128
- <td><%= h(rule.time_restrictions) %></td>
129
- <% blackholes = [] %>
130
- <% blackholes << 'Warning' if rule.warning_blackhole %>
131
- <% blackholes << 'Critical' if rule.critical_blackhole %>
132
- <td><%= h(blackholes.join(', ')) %></td>
122
+ <td><%= h( rule_name ) %></td>
123
+ <td><%= h( blackhole ) %></td>
124
+ <td><%= h( rule[:strategy]) %></td>
125
+ <td><%= h( !tag_names.empty? ? tag_names.join(', ') : '-') %></td>
126
+ <td><%= h( (!rule_conds.nil? && !rule_conds.empty?) ? rule_conds : '-')%></td>
127
+ <td><%= h( !transports.empty? ? transports.join(', ') : '-') %></td>
128
+ <td><%= h rule[:time_restriction_ical] %></td>
133
129
  </tr>
134
130
  <% end %>
135
131
  </table>
136
132
  <% end %>
137
133
 
138
- <h3>All Entities and Checks</h3>
139
- <% if !@entities_and_checks || @entities_and_checks.empty? %>
140
- <p>No entities</p>
134
+ <h3>All Checks</h3>
135
+ <% if @checks.empty? %>
136
+ <p>No checks</p>
141
137
  <% else %>
142
138
  <table class="table table-bordered table-hover table-condensed">
143
139
  <tr>
144
- <th>Entity</th>
145
140
  <th>Checks</th>
146
141
  </tr>
147
- <% @entities_and_checks.each do |ec| %>
148
- <%
149
- entity = ec[:entity]
150
- checks = ec[:checks]
151
- %>
152
- <tr>
153
- <td><a href="<%= @base_url %>entity/<%= u(entity.name) %>" title="entity status"><%= h entity.name %></a></td>
154
- <td>
155
- <% checks.each do |check| %>
156
- <%= "<a href=\"#{@base_url}check?entity=#{u(entity.name)}&amp;check=#{u(check)}\" title=\"check status\">#{ h check }</a>" %>
157
- <% end %>
158
- </td>
159
- </tr>
160
- <% end %>
142
+ <tr>
143
+ <td>
144
+ <% @checks.each do |check| %>
145
+ <a href="<%= @base_url %>checks/<%= u(check[:id]) %>" title="check status"><%= h check[:name] %></a>
146
+ <% end %>
147
+ </td>
148
+ </tr>
161
149
  </table>
162
150
  <% end %>
@@ -4,24 +4,48 @@
4
4
  <h2>Contacts</h2>
5
5
  </div>
6
6
 
7
+ <div class="row">
8
+ <div class="col-md-8">
9
+
10
+ <form action="<%= @base_url %>contacts" method="get" role="form" class="form-horizontal">
11
+
12
+ <div class="form-group">
13
+ <label class="col-sm-2 control-label" for="start_time">Name:</label>
14
+ <div class="col-sm-10">
15
+ <input type="text" name="name" class="form-control" size="20" maxlength="80" value="<%= h params[:name] %>">
16
+ <span class="help-block">
17
+ e.g. the exact name, or a /regexp/
18
+ </span>
19
+ </div>
20
+
21
+ <div class="form-group">
22
+ <div class="col-sm-2"></div>
23
+ <div class="col-sm-10">
24
+ <button type="submit" class="btn btn-success">Refresh</button>
25
+ </div>
26
+ </div>
27
+
28
+ </div>
29
+
30
+ </form><!-- form-horizontal-->
31
+
32
+ </div>
33
+ </div>
34
+
7
35
  <% if !@contacts || @contacts.empty? %>
8
36
  <p>No contacts</p>
9
37
  <% else %>
10
38
  <table class="table table-bordered table-hover table-condensed">
11
39
  <tr>
12
40
  <th>Name</th>
13
- <th>Email</th>
14
41
  </tr>
15
- <% @contacts.sort_by {|c| [c.last_name, c.first_name] }.each do |contact| %>
42
+ <% @contacts.each do |contact| %>
16
43
  <tr>
17
- <td><a href="<%= @base_url %>contacts/<%= contact.id %>" title="contact details"><%= h contact.name %></a></td>
18
- <td><%= h contact.email %></td>
44
+ <td><a href="<%= @base_url %>contacts/<%= contact[:id] %>" title="contact details"><%= h contact[:name] %></a></td>
19
45
  </tr>
20
46
  <% end %>
21
47
  </table>
22
48
  <% end %>
49
+ <br>
23
50
 
24
- <a href="<%= @base_url %>edit_contacts"/>
25
- Edit contacts
26
- <span class="label label-danger">beta</span>
27
- </a>
51
+ <%= erb '_pagination.html'.to_sym, :layout => false %>
@@ -4,5 +4,5 @@
4
4
  <h2>Summary</h2>
5
5
  </div> <!-- page header -->
6
6
 
7
- <h4><a href="<% @base_url %>entities_failing" title="failing entities"><%= h @count_failing_entities %></a> out of <a href="<% @base_url %>entities" title="all entities"><%= h @count_current_entities %></a> entities have failing checks</h4>
8
- <h4><a href="<% @base_url %>checks_failing" title="failing checks"><%= h @count_failing_checks %></a> out of <a href="<% @base_url %>checks_all" title="all checks"><%= h @count_current_checks %></a> checks are failing</h4>
7
+ <h4><a href="<% @base_url %>checks?failing=1&amp;enabled=1" title="failing checks"><%= h @metrics[:check_counts][:failing] %></a> out of <a href="<% @base_url %>checks?enabled=1" title="enabled checks"><%= h @metrics[:check_counts][:enabled] %></a> checks are failing</h4>
8
+
@@ -2,12 +2,8 @@
2
2
  require_css 'bootstrap'
3
3
  require_css 'screen'
4
4
  require_css 'font-awesome'
5
- require_css 'tablesort'
6
5
 
7
6
  require_js 'jquery-1.10.2'
8
- require_js 'jquery.tablesorter'
9
- require_js 'jquery.tablesorter.widgets'
10
- require_js 'tablesort'
11
7
  require_js 'moment'
12
8
  %>
13
9
 
@@ -34,34 +30,22 @@
34
30
  <ul class="nav navbar-nav">
35
31
  <li<%= include_active?('') %>>
36
32
  <a title="Summary" href="<%= @base_url %>">
37
- <i class="fa fa-trophy fa-lg"></i>
33
+ <i class="fa fa-list fa-lg"></i>
38
34
  Summary
39
35
  </a>
40
36
  </li>
41
- <li<%= include_active?('entities') %>>
42
- <a title="Entities" href="<%= @base_url %>entities">
43
- <i class="fa fa-bullseye fa-lg"></i>
44
- Entities
45
- </a>
46
- </li>
47
- <li<%= include_active?('entities_failing') %>>
48
- <a title="Failing Entities" href="<%= @base_url %>entities_failing">
49
- <i class="fa fa-bullhorn fa-lg"></i>
50
- Failing Entities
37
+ <li<%= include_active?('checks_all') %>>
38
+ <a title="Tags" href="<%= @base_url %>tags">
39
+ <i class="fa fa-tags fa-lg"></i>
40
+ Tags
51
41
  </a>
52
42
  </li>
53
- <li<%= include_active?('checks_all') %>>
54
- <a title="Checks" href="<%= @base_url %>checks_all">
43
+ <li<%= include_active?('checks') %>>
44
+ <a title="Checks" href="<%= @base_url %>checks">
55
45
  <i class="fa fa-check-circle-o fa-lg"></i>
56
46
  Checks
57
47
  </a>
58
48
  </li>
59
- <li<%= include_active?('checks_failing') %>>
60
- <a title="Failing Checks" href="<%= @base_url %>checks_failing">
61
- <i class="fa fa-times-circle-o fa-lg"></i>
62
- Failing Checks
63
- </a>
64
- </li>
65
49
  <li<%= include_active?('contacts') %>>
66
50
  <a title="Contacts" href="<%= @base_url %>contacts">
67
51
  <i class="fa fa-users fa-lg"></i>