sensu-plugins-telegram 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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