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
@@ -3,4 +3,4 @@
3
3
  <% unless ['acknowledgement', 'test'].include?(@alert.notification_type) -%>
4
4
  is <%= @alert.state_title_case -%>
5
5
  <% end -%>
6
- at <%= Time.at(@alert.time).strftime('%-d %b %H:%M') %><%= (summary.nil? || summary.empty?) ? '' : ", #{summary}" -%>
6
+ at <%= Time.at(@alert.time).strftime('%-d %b %H:%M') %><%= (summary.nil? || summary.empty?) ? '' : ", #{summary}" -%>
@@ -1,2 +1,2 @@
1
1
  <%= @alert.type_sentence_case %>: <%= @alert.rollup_states_summary -%>
2
- (<%= @alert.rollup_states_detail_text(:max_checks_per_state => 3) -%>)
2
+ (<%= @alert.rollup_states_detail_text(:max_checks_per_state => 3) -%>)
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'net/http'
4
+ require 'uri'
5
+ require 'uri/https'
6
+
7
+ require 'active_support/inflector'
8
+
9
+ require 'flapjack/redis_proxy'
10
+ require 'flapjack/record_queue'
11
+ require 'flapjack/utility'
12
+ require 'flapjack/exceptions'
13
+
14
+ require 'flapjack/data/alert'
15
+ require 'flapjack/data/check'
16
+
17
+ module Flapjack
18
+ module Gateways
19
+ class SmsAspsms
20
+
21
+ ASPSMS_DEFAULT_HOST = 'webservice.aspsms.com'
22
+ ASPSMS_DEFAULT_PATH = '/aspsmsx.asmx/SimpleTextSMS'
23
+ ASPSMS_DEFAULT_ORIGINATOR = 'Flapjack'
24
+
25
+ attr_accessor :sent
26
+
27
+ include Flapjack::Utility
28
+
29
+ def initialize(opts = {})
30
+ @lock = opts[:lock]
31
+
32
+ @config = opts[:config]
33
+
34
+ # TODO support for config reloading
35
+ @queue = Flapjack::RecordQueue.new(@config['queue'] || 'sms_aspsms_notifications',
36
+ Flapjack::Data::Alert)
37
+
38
+ @sent = 0
39
+
40
+ Flapjack.logger.debug("new sms aspsms gateway pikelet with the following options: #{@config.inspect}")
41
+ end
42
+
43
+ def start
44
+ begin
45
+ Zermelo.redis = Flapjack.redis
46
+
47
+ loop do
48
+ @lock.synchronize do
49
+ @queue.foreach {|alert| handle_alert(alert) }
50
+ end
51
+
52
+ @queue.wait
53
+ end
54
+ ensure
55
+ Flapjack.redis.quit
56
+ end
57
+ end
58
+
59
+ def stop_type
60
+ :exception
61
+ end
62
+
63
+ private
64
+
65
+ def handle_alert(alert)
66
+ endpoint_host = @config["endpoint_host"] || ASPSMS_DEFAULT_HOST
67
+ endpoint_path = @config["endpoint_path"] || ASPSMS_DEFAULT_PATH
68
+ originator = @config["originator"] || ASPSMS_DEFAULT_ORIGINATOR
69
+ username = @config["username"]
70
+ password = @config["password"]
71
+
72
+ address = alert.medium.address
73
+ notification_id = alert.id
74
+ message_type = alert.rollup ? 'rollup' : 'alert'
75
+
76
+ sms_dir = File.join(File.dirname(__FILE__), 'sms_aspsms')
77
+ sms_template_erb, sms_template =
78
+ load_template(@config['templates'], message_type, 'text', sms_dir)
79
+
80
+ @alert = alert
81
+ bnd = binding
82
+
83
+ begin
84
+ message = sms_template_erb.result(bnd).chomp
85
+ rescue => e
86
+ Flapjack.logger.error "Error while executing the ERB for an sms: " +
87
+ "ERB being executed: #{sms_template}"
88
+ raise
89
+ end
90
+
91
+ if @config.nil? || (@config.respond_to?(:empty?) && @config.empty?)
92
+ Flapjack.logger.error "Aspsms config is missing"
93
+ return
94
+ end
95
+
96
+ errors = []
97
+
98
+ safe_message = truncate(message, 156)
99
+
100
+ [[username, "Aspsms username is missing"],
101
+ [password, "Aspsms password is missing"],
102
+ [address, "SMS address is missing"],
103
+ [notification_id, "Notification id is missing"]].each do |val_err|
104
+
105
+ next unless val_err.first.nil? || (val_err.first.respond_to?(:empty?) && val_err.first.empty?)
106
+ errors << val_err.last
107
+ end
108
+
109
+ unless errors.empty?
110
+ errors.each {|err| Flapjack.logger.error err }
111
+ return
112
+ end
113
+
114
+ query = {'UserKey' => username,
115
+ 'Password' => password,
116
+ 'Recipient' => address,
117
+ 'Originator' => originator,
118
+ 'MessageText' => safe_message}
119
+
120
+ # TODO ensure we're not getting a cached response from a proxy or similar,
121
+ # use appropriate headers etc.
122
+ uri = URI::HTTPS.build(:host => endpoint_host,
123
+ :path => endpoint_path,
124
+ :port => 443,
125
+ :query => URI.encode_www_form(query))
126
+
127
+ http = Net::HTTP.new(uri.host, uri.port)
128
+ http.use_ssl = true
129
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
130
+ request = Net::HTTP::Get.new(uri.request_uri)
131
+
132
+ http_response = http.request(request)
133
+
134
+ Flapjack.logger.debug "server response: #{http_response.inspect}"
135
+
136
+ status = http_response.code
137
+
138
+ if (status.to_i >= 200) && (status.to_i <= 206)
139
+ @sent += 1
140
+ Flapjack.logger.info "Sent SMS via Aspsms, response status is #{status}, " +
141
+ "alert id: #{alert.id}"
142
+ else
143
+ Flapjack.logger.error "Failed to send SMS via Aspsms, response status is #{status}, " +
144
+ "alert id: #{alert.id}"
145
+ end
146
+ rescue => e
147
+ Flapjack.logger.error "Error generating or delivering sms to #{alert.medium.address}: #{e.class}: #{e.message}"
148
+ Flapjack.logger.error e.backtrace.join("\n")
149
+ raise
150
+ end
151
+
152
+ end
153
+ end
154
+ end
155
+
@@ -0,0 +1,7 @@
1
+ <% check = @alert.check -%>
2
+ <% summary = @alert.summary -%>
3
+ <%= @alert.type_sentence_case %>: <%= "'#{check.name}'" -%>
4
+ <% unless ['acknowledgement', 'test'].include?(@alert.type) -%>
5
+ is <%= @alert.state_title_case -%>
6
+ <% end -%>
7
+ at <%= Time.at(@alert.time).strftime('%-d %b %H:%M') %><%= (summary.nil? || summary.empty?) ? '' : ", #{summary}" -%>
@@ -0,0 +1,2 @@
1
+ <%= @alert.type_sentence_case %>: <%= @alert.rollup_states_summary -%>
2
+ (<%= @alert.rollup_states_detail_text(:max_checks_per_state => 3) -%>)
@@ -1,95 +1,103 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'em-synchrony'
4
- require 'em-synchrony/em-http'
3
+ require 'net/http'
4
+ require 'uri'
5
+ require 'uri/https'
6
+
5
7
  require 'active_support/inflector'
6
8
 
7
- require 'flapjack/redis_pool'
9
+ require 'flapjack/redis_proxy'
10
+ require 'flapjack/record_queue'
11
+ require 'flapjack/utility'
12
+ require 'flapjack/exceptions'
8
13
 
9
14
  require 'flapjack/data/alert'
10
- require 'flapjack/utility'
15
+ require 'flapjack/data/check'
11
16
 
12
17
  module Flapjack
13
18
  module Gateways
14
19
  class SmsMessagenet
15
20
 
16
- MESSAGENET_DEFAULT_URL = 'https://www.messagenet.com.au/dotnet/Lodge.asmx/LodgeSMSMessage'
21
+ MESSAGENET_DEFAULT_HOST = 'www.messagenet.com.au'
22
+ MESSAGENET_DEFAULT_PATH = '/dotnet/Lodge.asmx/LodgeSMSMessage'
23
+
24
+ attr_accessor :sent
17
25
 
18
26
  include Flapjack::Utility
19
27
 
20
28
  def initialize(opts = {})
29
+ @lock = opts[:lock]
30
+
21
31
  @config = opts[:config]
22
- @logger = opts[:logger]
23
- @redis_config = opts[:redis_config] || {}
24
- @redis = Flapjack::RedisPool.new(:config => @redis_config, :size => 1, :logger => @logger)
25
32
 
26
- @logger.info("starting")
27
- @logger.debug("new sms_messagenet gateway pikelet with the following options: #{@config.inspect}")
33
+ # TODO support for config reloading
34
+ @queue = Flapjack::RecordQueue.new(@config['queue'] || 'sms_notifications',
35
+ Flapjack::Data::Alert)
28
36
 
29
37
  @sent = 0
30
- end
31
38
 
32
- def stop
33
- @logger.info("stopping")
34
- @should_quit = true
35
-
36
- redis_uri = @redis_config[:path] ||
37
- "redis://#{@redis_config[:host] || '127.0.0.1'}:#{@redis_config[:port] || '6379'}/#{@redis_config[:db] || '0'}"
38
- shutdown_redis = EM::Hiredis.connect(redis_uri)
39
- shutdown_redis.rpush(@config['queue'], Flapjack.dump_json('notification_type' => 'shutdown'))
39
+ Flapjack.logger.debug("new sms gateway pikelet with the following options: #{@config.inspect}")
40
40
  end
41
41
 
42
42
  def start
43
- queue = @config['queue']
44
-
45
- until @should_quit
46
- begin
47
- @logger.debug("sms_messagenet gateway is going into blpop mode on #{queue}")
48
- alert = Flapjack::Data::Alert.next(queue, :redis => @redis, :logger => @logger)
49
- deliver(alert) unless alert.nil?
50
- rescue => e
51
- @logger.error "Error generating or dispatching SMS Messagenet message: #{e.class}: #{e.message}\n" +
52
- e.backtrace.join("\n")
43
+ begin
44
+ Zermelo.redis = Flapjack.redis
45
+
46
+ loop do
47
+ @lock.synchronize do
48
+ @queue.foreach {|alert| handle_alert(alert) }
49
+ end
50
+
51
+ @queue.wait
53
52
  end
53
+ ensure
54
+ Flapjack.redis.quit
54
55
  end
55
56
  end
56
57
 
57
- def deliver(alert)
58
- endpoint = @config["endpoint"] || MESSAGENET_DEFAULT_URL
58
+ def stop_type
59
+ :exception
60
+ end
61
+
62
+ private
63
+
64
+ def handle_alert(alert)
65
+ endpoint_host = @config["endpoint_host"] || MESSAGENET_DEFAULT_HOST
66
+ endpoint_path = @config["endpoint_path"] || MESSAGENET_DEFAULT_PATH
59
67
  username = @config["username"]
60
68
  password = @config["password"]
61
69
 
62
- address = alert.address
63
- notification_id = alert.notification_id
64
- message_type = alert.rollup ? 'rollup' : 'alert'
70
+ address = alert.medium.address
71
+ notification_id = alert.id
72
+ message_type = alert.rollup ? 'rollup' : 'alert'
65
73
 
74
+ sms_dir = File.join(File.dirname(__FILE__), 'sms_messagenet')
66
75
  sms_template_erb, sms_template =
67
- load_template(@config['templates'], message_type, 'text',
68
- File.join(File.dirname(__FILE__), 'sms_messagenet'))
76
+ load_template(@config['templates'], message_type, 'text', sms_dir)
69
77
 
70
- @alert = alert
71
- bnd = binding
78
+ @alert = alert
79
+ bnd = binding
72
80
 
73
81
  begin
74
82
  message = sms_template_erb.result(bnd).chomp
75
83
  rescue => e
76
- @logger.error "Error while executing the ERB for an sms: " +
84
+ Flapjack.logger.error "Error while executing the ERB for an sms: " +
77
85
  "ERB being executed: #{sms_template}"
78
86
  raise
79
87
  end
80
88
 
81
89
  if @config.nil? || (@config.respond_to?(:empty?) && @config.empty?)
82
- @logger.error "Messagenet config is missing"
90
+ Flapjack.logger.error "Messagenet config is missing"
83
91
  return
84
92
  end
85
93
 
86
94
  errors = []
87
95
 
88
- safe_message = truncate(message, 159)
96
+ safe_message = truncate(message, 156)
89
97
 
90
98
  [[username, "Messagenet username is missing"],
91
99
  [password, "Messagenet password is missing"],
92
- [address, "SMS address is missing"],
100
+ [address, "SMS address is missing"],
93
101
  [notification_id, "Notification id is missing"]].each do |val_err|
94
102
 
95
103
  next unless val_err.first.nil? || (val_err.first.respond_to?(:empty?) && val_err.first.empty?)
@@ -97,32 +105,44 @@ module Flapjack
97
105
  end
98
106
 
99
107
  unless errors.empty?
100
- errors.each {|err| @logger.error err }
108
+ errors.each {|err| Flapjack.logger.error err }
101
109
  return
102
110
  end
103
111
 
104
- query = {'Username' => username,
105
- 'Pwd' => password,
106
- 'PhoneNumber' => address,
112
+ query = {'Username' => username,
113
+ 'Pwd' => password,
114
+ 'PhoneNumber' => address,
107
115
  'PhoneMessage' => safe_message}
108
116
 
109
- http = EM::HttpRequest.new(endpoint).get(:query => query)
117
+ # TODO ensure we're not getting a cached response from a proxy or similar,
118
+ # use appropriate headers etc.
119
+ uri = URI::HTTPS.build(:host => endpoint_host,
120
+ :path => endpoint_path,
121
+ :port => 443,
122
+ :query => URI.encode_www_form(query))
123
+
124
+ http = Net::HTTP.new(uri.host, uri.port)
125
+ http.use_ssl = true
126
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
127
+ request = Net::HTTP::Get.new(uri.request_uri)
128
+
129
+ http_response = http.request(request)
130
+
131
+ Flapjack.logger.debug "server response: #{http_response.inspect}"
110
132
 
111
- @logger.debug "server response: #{http.response}"
133
+ status = http_response.code
112
134
 
113
- status = (http.nil? || http.response_header.nil?) ? nil : http.response_header.status
114
- if (status >= 200) && (status <= 206)
135
+ if (status.to_i >= 200) && (status.to_i <= 206)
115
136
  @sent += 1
116
- alert.record_send_success!
117
- @logger.debug "Sent SMS via Messagenet, response status is #{status}, " +
118
- "notification_id: #{notification_id}"
137
+ Flapjack.logger.info "Sent SMS via Messagenet, response status is #{status}, " +
138
+ "alert id: #{alert.id}"
119
139
  else
120
- @logger.error "Failed to send SMS via Messagenet, response status is #{status}, " +
121
- "notification_id: #{notification_id}"
140
+ Flapjack.logger.error "Failed to send SMS via Messagenet, response status is #{status}, " +
141
+ "alert id: #{alert.id}"
122
142
  end
123
143
  rescue => e
124
- @logger.error "Error generating or delivering sms to #{alert.address}: #{e.class}: #{e.message}"
125
- @logger.error e.backtrace.join("\n")
144
+ Flapjack.logger.error "Error generating or delivering sms to #{alert.medium.address}: #{e.class}: #{e.message}"
145
+ Flapjack.logger.error e.backtrace.join("\n")
126
146
  raise
127
147
  end
128
148
 
@@ -1,6 +1,7 @@
1
+ <% check = @alert.check -%>
1
2
  <% summary = @alert.summary -%>
2
- <%= @alert.type_sentence_case %>: '<%= @alert.check %>' on <%= @alert.entity -%>
3
- <% unless ['acknowledgement', 'test'].include?(@alert.notification_type) -%>
3
+ <%= @alert.type_sentence_case %>: <%= "'#{check.name}'" -%>
4
+ <% unless ['acknowledgement', 'test'].include?(@alert.type) -%>
4
5
  is <%= @alert.state_title_case -%>
5
6
  <% end -%>
6
7
  at <%= Time.at(@alert.time).strftime('%-d %b %H:%M') %><%= (summary.nil? || summary.empty?) ? '' : ", #{summary}" -%>
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'em-synchrony'
4
- require 'em-synchrony/em-http'
5
- require 'active_support/inflector'
3
+ require 'erb'
6
4
 
7
- require 'flapjack/redis_pool'
5
+ require 'nexmo'
8
6
 
9
- require 'flapjack/data/alert'
7
+ require 'flapjack/redis_proxy'
8
+ require 'flapjack/record_queue'
10
9
  require 'flapjack/utility'
10
+ require 'flapjack/exceptions'
11
11
 
12
- require 'nexmo'
12
+ require 'flapjack/data/alert'
13
13
 
14
14
  module Flapjack
15
15
  module Gateways
@@ -17,103 +17,105 @@ module Flapjack
17
17
 
18
18
  include Flapjack::Utility
19
19
 
20
+ attr_accessor :sent
21
+
20
22
  def initialize(opts = {})
23
+ @lock = opts[:lock]
21
24
  @config = opts[:config]
22
- @logger = opts[:logger]
23
- @redis_config = opts[:redis_config] || {}
24
- @redis = Flapjack::RedisPool.new(:config => @redis_config, :size => 1, :logger => @logger)
25
25
 
26
- @logger.info("starting")
27
- @logger.debug("new sms_nexmo gateway pikelet with the following options: #{@config.inspect}")
26
+ # TODO support for config reloading
27
+ @queue = Flapjack::RecordQueue.new(@config['queue'] || 'sms_nexmo_notifications',
28
+ Flapjack::Data::Alert)
28
29
 
29
30
  @sent = 0
30
31
  end
31
32
 
32
- def stop
33
- @logger.info("stopping")
34
- @should_quit = true
33
+ def start
34
+ Flapjack.logger.debug("new sms_nexmo gateway pikelet with the following options: #{@config.inspect}")
35
35
 
36
- redis_uri = @redis_config[:path] ||
37
- "redis://#{@redis_config[:host] || '127.0.0.1'}:#{@redis_config[:port] || '6379'}/#{@redis_config[:db] || '0'}"
38
- shutdown_redis = EM::Hiredis.connect(redis_uri)
39
- shutdown_redis.rpush(@config['queue'], Flapjack.dump_json('notification_type' => 'shutdown'))
40
- end
36
+ begin
37
+ Zermelo.redis = Flapjack.redis
41
38
 
42
- def start
43
- queue = @config['queue']
44
-
45
- until @should_quit
46
- begin
47
- @logger.debug("sms_nexmo gateway is going into blpop mode on #{queue}")
48
- alert = Flapjack::Data::Alert.next(queue, :redis => @redis, :logger => @logger)
49
- deliver(alert) unless alert.nil?
50
- rescue => e
51
- @logger.error "Error generating or dispatching SMS Nexmo message: #{e.class}: #{e.message}\n" +
52
- e.backtrace.join("\n")
39
+ loop do
40
+ @lock.synchronize do
41
+ @queue.foreach {|alert| handle_alert(alert) }
42
+ end
43
+
44
+ @queue.wait
53
45
  end
46
+ ensure
47
+ Flapjack.redis.quit
54
48
  end
55
49
  end
56
50
 
57
- def deliver(alert)
51
+ def stop_type
52
+ :exception
53
+ end
54
+
55
+ private
56
+
57
+ def handle_alert(alert)
58
+ Flapjack.logger.debug "Woo, got an alert to send out: #{alert.inspect}"
59
+
58
60
  api_key = @config["api_key"]
59
61
  secret = @config["secret"]
60
62
  from = @config["from"]
61
63
 
62
- address = alert.address
63
- notification_id = alert.notification_id
64
+ address = alert.medium.address
64
65
  message_type = alert.rollup ? 'rollup' : 'alert'
65
66
 
66
- sms_template_erb, sms_template =
67
- load_template(@config['templates'], message_type, 'text',
68
- File.join(File.dirname(__FILE__), 'sms_nexmo'))
67
+ sms_dir = File.join(File.dirname(__FILE__), 'sms_nexmo')
68
+ sms_nexmo_template_erb, sms_nexmo_template =
69
+ load_template(@config['templates'], message_type, 'text', sms_dir)
69
70
 
70
71
  @alert = alert
71
72
  bnd = binding
72
73
 
73
74
  begin
74
- message = sms_template_erb.result(bnd).chomp
75
+ message = sms_nexmo_template_erb.result(bnd).chomp
75
76
  rescue => e
76
- @logger.error "Error while executing the ERB for an sms: " +
77
- "ERB being executed: #{sms_template}"
77
+ Flapjack.logger.error "Error while executing the ERB for a Nexmo SMS: " +
78
+ "ERB being executed: #{sms_nexmo_template}"
78
79
  raise
79
80
  end
80
81
 
81
82
  if @config.nil? || (@config.respond_to?(:empty?) && @config.empty?)
82
- @logger.error "Messagenet config is missing"
83
+ Flapjack.logger.error "Nexmo SMS config is missing"
83
84
  return
84
85
  end
85
86
 
86
87
  errors = []
87
88
 
88
- safe_message = truncate(message, 159)
89
+ safe_message = (message.length > 159) ?
90
+ message[0..158].gsub(/...$/, '...') : message,
89
91
 
90
92
  [[api_key, "Nexmo api_key is missing"],
91
- [secret, "Twilio auth_token is missing"],
92
- [from, "SMS from address is missing"],
93
- [address, "SMS address is missing"],
94
- [notification_id, "Notification id is missing"]].each do |val_err|
93
+ [secret, "Nexmo auth_token is missing"],
94
+ [from, "Nexmo from address is missing"],
95
+ [address, "Nexmo address is missing"]].each do |val_err|
95
96
 
96
97
  next unless val_err.first.nil? || (val_err.first.respond_to?(:empty?) && val_err.first.empty?)
97
98
  errors << val_err.last
98
99
  end
99
100
 
100
101
  unless errors.empty?
101
- errors.each {|err| @logger.error err }
102
+ errors.each {|err| Flapjack.logger.error err }
102
103
  return
103
104
  end
104
105
 
105
106
  begin
106
- nexmo = Nexmo::Client.new(key: api_key, secret: secret)
107
- nexmo.send_message(from: from, to: address, text: safe_message)
107
+ nexmo = Nexmo::Client.new(:key => api_key, :secret => secret)
108
+ nexmo.send_message(:from => from, :to => address, :text => safe_message)
108
109
  @sent += 1
109
110
  rescue => e
110
- @logger.error "Error sending SMS via Nexmo: #{e.message}"
111
+ Flapjack.logger.error "Error sending SMS via Nexmo: #{e.message}"
111
112
  end
112
113
  rescue => e
113
- @logger.error "Error generating or delivering sms to #{alert.address}: #{e.class}: #{e.message}"
114
- @logger.error e.backtrace.join("\n")
114
+ Flapjack.logger.error "Error generating or delivering Nexmo SMS message to #{alert.medium.address}: #{e.class}: #{e.message}"
115
+ Flapjack.logger.error e.backtrace.join("\n")
115
116
  raise
116
117
  end
118
+
117
119
  end
118
120
  end
119
121
  end