sensu-plugins-telegram 0.1.1 → 0.2.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 44dcdd9f2bbeb114f84c725b7df2f2e7d23b2a38
4
- data.tar.gz: ca812cdac116189c7657804385292d2c7ddcd6bb
3
+ metadata.gz: b27c66b68f1ee795b6aa43157a5fd6f41d215582
4
+ data.tar.gz: d5819eb9b5e000459f20265a4e4e60461ccee9da
5
5
  SHA512:
6
- metadata.gz: c72fe5c116dd5e7fcd749762d2006780e12855d4b87e5f7f45df5acb355495ad489c5a10e9384e0b4d75c8aa5cf197428f0adb08a0927a51262cab0652759117
7
- data.tar.gz: bccb86613026e1cf88d2e5393d103deec939f9749021b851d26f73f8e676a09588019de8994d75d16750adf6a5c14b8ea3e8196cff43260784d91de726bd33ea
6
+ metadata.gz: 7a27771ac2da30b8a25a711777c6450d605876c73c8cd586af2ed7b99d469f433744fa5caf98cc78ed6b40d866e337357f93e4ead52937c328b53242aa19b36a
7
+ data.tar.gz: c104cab7aa44ec827173e55fe3f087a8820637519824f88973057da4dc576a8f3a51a9798ff67037b8c16a6b1918ccf20376b968e2d889e1a18ca9d03e9c9c42
data/README.md CHANGED
@@ -15,7 +15,20 @@ This plugin provides a handler to send notifications to a Telegram chat.
15
15
 
16
16
  ## Usage
17
17
 
18
- This gem requires a JSON configuration file with the following contents:
18
+ After installation, you have to set up a `pipe` type handler, like so:
19
+
20
+ ```json
21
+ {
22
+ "handlers": {
23
+ "telegram": {
24
+ "type": "pipe",
25
+ "command": "handler-telegram.rb"
26
+ }
27
+ }
28
+ }
29
+ ```
30
+
31
+ This gem also expects a JSON configuration file with the following contents:
19
32
 
20
33
  ```json
21
34
  {
@@ -39,10 +52,53 @@ This gem requires a JSON configuration file with the following contents:
39
52
  be written to a file in this location. You can then monitor this
40
53
  location to detect any errors with the Telegram handler.
41
54
 
42
- If you want to send some events to one chat, and other events to another
43
- chat, you can directly add the chat_id to the event data (the `@event` hash)
44
- using a mutator. Then, create one handler specification for each channel,
45
- specifying the corresponding mutator. For example:
55
+ ### Advanced configuration
56
+
57
+ By default, the handler assumes that the config parameters are specified in the
58
+ `telegram` top-level key of the JSON, as shown above. You also have the option
59
+ to make the handler fetch the config from a different key. To do this, pass the
60
+ `-j` option to the handler with the name of the desired key You can define
61
+ multiple handlers, and each handler can send notifications to a different chat
62
+ and from a different bot. You could, for example, have critical and non-critical
63
+ Telegram groups, and send the notifications to one or the other depending on the
64
+ check. For example:
65
+
66
+ ```json
67
+ {
68
+ "handlers": {
69
+ "critical_telegram": {
70
+ "type": "pipe",
71
+ "command": "handler-telegram.rb -j critical_telegram_options"
72
+ },
73
+ "non_critical_telegram": {
74
+ "type": "pipe",
75
+ "command": "handler-telegram.rb -j non_critical_telegram_options"
76
+ }
77
+ }
78
+ }
79
+ ```
80
+
81
+ This example will fetch the options from a JSON like this:
82
+
83
+ ```json
84
+ {
85
+ "telegram": {
86
+ "bot_token": "YOUR_BOT_TOKEN"
87
+ },
88
+ "critical_telegram_options": {
89
+ "chat_id": -123123
90
+ },
91
+ "non_critical_telegram_options": {
92
+ "chat_id": -456456
93
+ }
94
+ }
95
+ ```
96
+
97
+ As you can see, you can specify the default config in the `telegram` key, and
98
+ the rest of the config in their own custom keys.
99
+
100
+ You can also directly add the configuration parameters to the event data using a
101
+ mutator. For example:
46
102
 
47
103
  ```ruby
48
104
  #!/usr/bin/env ruby
@@ -53,6 +109,14 @@ event.merge!(chat_id: -456456)
53
109
  puts JSON.dump(event)
54
110
  ```
55
111
 
112
+ ### Configuration precedence
113
+
114
+ The handler will load the config as follows (from least to most priority):
115
+
116
+ * Default `telegram` key
117
+ * Custom config keys
118
+ * Event data
119
+
56
120
  ## Installation
57
121
 
58
122
  [Installation and Setup](http://sensu-plugins.io/docs/installation_instructions.html)
@@ -25,27 +25,7 @@
25
25
  # "error_file_location": "/tmp/telegram_handler_error"
26
26
  # }
27
27
  # }
28
- #
29
- # Parameters:
30
- # - bot_token: your bot's token, as provided by @BotFather
31
- # - chat_id: the chat to which the error message is to be sent.
32
- # The bot must be a member of this channel or group.
33
- # You can get this chat_id by adding the bot to the corresponding group
34
- # and then accessing https://api.telegram.org/bot<TOKEN>/getUpdates
35
- # - error_file_location (optional): in case there is a failure sending the
36
- # message to Telegram (ie. connectivity issues), the exception mesage will
37
- # be written to a file in this location. You can then monitor this
38
- # location to detect any errors with the Telegram handler.
39
- #
40
- # If you want to send some events to one chat, and other events to another
41
- # chat, you can directly add the chat_id to the event data (the `@event` hash)
42
- # using a mutator. For example:
43
- # #!/usr/bin/env ruby
44
- # require 'rubygems'
45
- # require 'json'
46
- # event = JSON.parse(STDIN.read, :symbolize_names => true)
47
- # event.merge!(chat_id: -456456)
48
- # puts JSON.dump(event)
28
+ # For more details, please see the README.
49
29
  #
50
30
  # NOTES:
51
31
  #
@@ -58,23 +38,37 @@
58
38
  require 'rubygems' if RUBY_VERSION < '1.9.0'
59
39
  require 'sensu-handler'
60
40
  require 'restclient'
41
+ require 'cgi'
61
42
 
62
43
  class TelegramHandler < Sensu::Handler
44
+ option :json_config,
45
+ description: 'Config name',
46
+ short: '-j config_key',
47
+ long: '--json_config config_key',
48
+ required: false
63
49
 
64
50
  def chat_id
65
- @event['chat_id'] || settings['telegram']['chat_id']
51
+ fetch_setting 'chat_id'
66
52
  end
67
53
 
68
54
  def bot_token
69
- settings['telegram']['bot_token']
55
+ fetch_setting 'bot_token'
70
56
  end
71
57
 
72
58
  def error_file
73
- settings['telegram']['error_file_location']
59
+ fetch_setting 'error_file_location'
60
+ end
61
+
62
+ def fetch_setting(setting_key)
63
+ config_key = config[:json_config]
64
+
65
+ value = @event[setting_key]
66
+ value ||= settings[config_key][setting_key] if config_key
67
+ value || settings['telegram'][setting_key]
74
68
  end
75
69
 
76
70
  def event_name
77
- @event['client']['name'] + '/' + @event['check']['name']
71
+ client_name + '/' + check_name
78
72
  end
79
73
 
80
74
  def action_name
@@ -86,17 +80,42 @@ class TelegramHandler < Sensu::Handler
86
80
  actions[@event['action']]
87
81
  end
88
82
 
83
+ def action_icon
84
+ icons = {
85
+ 'create' => "\xF0\x9F\x98\xB1",
86
+ 'resolve' => "\xF0\x9F\x98\x8D",
87
+ 'flapping' => "\xF0\x9F\x90\x9D"
88
+ }
89
+ icons[@event['action']]
90
+ end
91
+
92
+ def client_name
93
+ escape_html @event['client']['name']
94
+ end
95
+
96
+ def check_name
97
+ escape_html @event['check']['name']
98
+ end
99
+
100
+ def output
101
+ escape_html @event['check']['output']
102
+ end
103
+
104
+ def escape_html(string)
105
+ CGI.escapeHTML(string)
106
+ end
107
+
89
108
  def telegram_url
90
109
  "https://api.telegram.org/bot#{bot_token}/sendMessage"
91
110
  end
92
111
 
93
112
  def build_message
94
113
  [
95
- "<b>Alert #{action_name}</b>",
96
- "<b>Host:</b> #{@event['client']['name']}",
97
- "<b>Check:</b> #{@event['check']['name']}",
98
- "<b>Status:</b> #{translate_status}",
99
- "<b>Output:</b> #{@event['check']['output']}"
114
+ "<b>Alert #{action_name}</b> #{action_icon}",
115
+ "<b>Host:</b> #{client_name}",
116
+ "<b>Check:</b> #{check_name}",
117
+ "<b>Status:</b> #{status} #{status_icon}",
118
+ "<b>Output:</b> <code>#{output}</code>"
100
119
  ].join("\n")
101
120
  end
102
121
 
@@ -111,33 +130,31 @@ class TelegramHandler < Sensu::Handler
111
130
 
112
131
  def handle_error(exception)
113
132
  open(error_file, 'w') do |f|
114
- f.puts "URL: " + telegram_url
115
- f.puts "Params: " + params.inspect
116
- f.puts "Exception: " + exception.inspect
133
+ f.puts 'URL: ' + telegram_url
134
+ f.puts 'Params: ' + params.inspect
135
+ f.puts 'Exception: ' + exception.inspect
117
136
  end if error_file
118
137
  end
119
138
 
120
139
  def clear_error
121
- File.delete(error_file) if File.exist?(error_file)
140
+ File.delete(error_file) if error_file && File.exist?(error_file)
122
141
  end
123
142
 
124
143
  def handle
125
- begin
126
- print "Sending to Telegram: " + params.inspect
127
- RestClient.post(telegram_url, params, format: :json)
128
- puts "... done."
129
- clear_error
130
- rescue SocketError, RestClient::Exception => e
131
- handle_error(e)
132
- puts "... Telegram handler error '#{e.inspect}' while attempting to report an incident: #{event_name} #{action_name}"
133
- end
144
+ print 'Sending to Telegram: ' + params.inspect
145
+ RestClient.post(telegram_url, params, format: :json)
146
+ puts '... done.'
147
+ clear_error
148
+ rescue SocketError, RestClient::Exception => e
149
+ handle_error(e)
150
+ puts "... Telegram handler error '#{e.inspect}' while attempting to report an incident: #{event_name} #{action_name}"
134
151
  end
135
152
 
136
153
  def check_status
137
154
  @event['check']['status']
138
155
  end
139
156
 
140
- def translate_status
157
+ def status
141
158
  status = {
142
159
  0 => 'OK',
143
160
  1 => 'Warning',
@@ -146,4 +163,14 @@ class TelegramHandler < Sensu::Handler
146
163
  }
147
164
  status[check_status.to_i]
148
165
  end
166
+
167
+ def status_icon
168
+ icons = {
169
+ 0 => "\xF0\x9F\x91\x8D",
170
+ 1 => "\xE2\x9A\xA1",
171
+ 2 => "\xF0\x9F\x9A\xA8",
172
+ 3 => "\xF0\x9F\x8C\x80"
173
+ }
174
+ icons[check_status.to_i]
175
+ end
149
176
  end
@@ -1,8 +1,8 @@
1
1
  module SensuPluginsTelegram
2
2
  module Version
3
3
  MAJOR = 0
4
- MINOR = 1
5
- PATCH = 1
4
+ MINOR = 2
5
+ PATCH = 0
6
6
 
7
7
  VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-plugins-telegram
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hernan Schmidt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-18 00:00:00.000000000 Z
11
+ date: 2016-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sensu-plugin