zabbirc 0.0.11 → 0.1.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: af897ba02297f7617cf59c4e8e3566ad2dcadd1d
4
- data.tar.gz: ca9355720c51cc0105dcc535392729a545a5bd78
3
+ metadata.gz: 0a9f3850b4563b9782a38dcef10d46b7afee95e7
4
+ data.tar.gz: 85a2a418b4db1d3793de71ac005178e16e538de5
5
5
  SHA512:
6
- metadata.gz: 528f8d9b60be512037ff03aca50c6f0c2424e5ac830230260fb3e332d7d9de8ddbed2f4d8e3ab7137f490494937fe48acae3aecc615e38c38e319e9abb466205
7
- data.tar.gz: 46e162cbaaf6d118fcf98cf7880d2fa77e753d6e0120b6ebc16efe5a4c3d634ca160869274424454e2a3c1f8c404f276e468cc16e9c84af9c0ba3934ce4f0690
6
+ metadata.gz: 1728b9299ba68cf8a68c6c85fee3fe2e36162e9cdf51ae3881841e4df09bae2ed2d63e3f3debabb8a904e32ac9fc549bd5c8820ea4a0b6e23bc4164271affc33
7
+ data.tar.gz: 5a142e7572ae5808c71cda5496528ff2a7aab66527131a715b911769b5d1a9dc682fb83310211c5a98d4c3aa1504a653b6497fb3a42936be796c394e8ea3cc18
@@ -0,0 +1,120 @@
1
+ module Zabbirc
2
+ module Irc
3
+ HELP_FEATURES = {}
4
+ class BaseCommand
5
+ def self.register_help command, description
6
+ raise ArgumentError, "command `#{command}` already registered" if HELP_FEATURES.key? command
7
+ HELP_FEATURES[command] = description
8
+ end
9
+
10
+ def help_features
11
+ HELP_FEATURES
12
+ end
13
+
14
+ attr_reader :op
15
+ def initialize ops, message, cmd
16
+ @ops = ops
17
+ @message = message
18
+ @op = get_op @message
19
+ @cmd = cmd.to_s.strip.gsub(/\s{2,}/," ")
20
+ @args = @cmd.split(/ /)
21
+ end
22
+
23
+ def run
24
+ return unless authenticated?
25
+ begin
26
+ perform # perform method should be implemented in subclass
27
+ rescue Zabbix::NotConnected => e
28
+ reply "#{e.to_s}"
29
+ rescue UserInputError => e
30
+ reply e.reply_messages
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def authenticated?
37
+ @op.present?
38
+ end
39
+
40
+ def get_op obj
41
+ login = get_login obj
42
+ @ops.get login
43
+ end
44
+
45
+ def get_login obj
46
+ case obj
47
+ when Cinch::Message
48
+ obj.user.user.sub("~","")
49
+ when Cinch::User
50
+ obj.user.user.sub("~","")
51
+ when String
52
+ obj
53
+ else
54
+ # Used for tests
55
+ return obj.login if obj.respond_to? :login
56
+ return get_login(obj.user) if obj.respond_to? :user
57
+ end
58
+ end
59
+
60
+ def reply msg, *options
61
+ options = options.extract_options!.reverse_merge(prefix: "")
62
+ msg = Array.wrap msg
63
+ msg = msg.collect do |m|
64
+ "#{@op.nick}: #{options[:prefix]}#{m}"
65
+ end.join("\n")
66
+
67
+ @message.reply msg
68
+ end
69
+
70
+ def find_host host
71
+ hosts = Zabbix::Host.get(search: {host: host})
72
+ case hosts.size
73
+ when 0
74
+ reply "Host not found `#{host}`"
75
+ when 1
76
+ return hosts.first
77
+ when 2..10
78
+ reply "Found #{hosts.size} hosts: #{hosts.collect(&:name).join(', ')}. Be more specific"
79
+ else
80
+ reply "Found #{hosts.size} Be more specific"
81
+ end
82
+ false
83
+ end
84
+
85
+ def find_event short_eventid
86
+ begin
87
+ eventid = Zabbirc.events_id_shortener.get_id short_eventid
88
+ unless eventid
89
+ reply "Bad event id `#{short_eventid}`"
90
+ return false
91
+ end
92
+ event = Zabbix::Event.find(eventid, {selectHosts: :extend, selectRelatedObject: :extend})
93
+ if event.nil?
94
+ reply "Could not find event with id `#{short_eventid}`"
95
+ return false
96
+ end
97
+ event
98
+ rescue Zabbix::IDNotUniqueError => e
99
+ reply "Could not find event: #{e}"
100
+ false
101
+ end
102
+ end
103
+
104
+ def parse_priority priority
105
+ Priority.new(priority)
106
+ rescue ArgumentError => e
107
+ reply("#{e}")
108
+ nil
109
+ end
110
+ end
111
+
112
+ class UserInputError < StandardError
113
+
114
+ attr_reader :reply_messages
115
+ def initialize reply_messages
116
+ @reply_messages = reply_messages
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,72 @@
1
+ module Zabbirc
2
+ module Irc
3
+ class EventCommand < BaseCommand
4
+ register_help "events", "Show events from last #{Zabbirc.config.notify_about_events_from_last.to_i / 60} minutes filtered by <priority> and <host>. Usage: !events [<priority [<host>]]"
5
+ register_help "ack", "Acknowledges event with message. Usage: !ack <event-id> <ack-message>"
6
+ private
7
+ def perform
8
+ command = @args.shift
9
+ case command
10
+ when "events"
11
+ perform_events
12
+ when "ack"
13
+ perform_ack
14
+ end
15
+ end
16
+
17
+ def perform_events
18
+ priority = parse_priority(@args.shift || 0)
19
+ return unless priority
20
+ host = @args.join(" ")
21
+
22
+ events = Zabbix::Event.recent
23
+ events = events.select{|e| e.priority >= priority }
24
+ events = events.select{|e| e.any_host_matches? /#{host}/ } if host.present?
25
+ msg = if events.any?
26
+ events.collect do |e|
27
+ "#{e.label}"
28
+ end
29
+ else
30
+ host_filter = host.present? ? " and host `#{host}`" : ""
31
+ "No last events for priority `#{priority}`#{host_filter}"
32
+ end
33
+ reply msg
34
+ end
35
+
36
+ def perform_ack
37
+ short_event_id = @args.shift
38
+ message = @args.join(" ")
39
+
40
+ if short_event_id.blank? or message.blank?
41
+ reply help_features["ack"]
42
+ return
43
+ end
44
+ event = find_event short_event_id
45
+ return unless event
46
+
47
+ if event.acknowledge "#{op.nick}: #{message}"
48
+ reply "Event `#{event.label}` acknowledged with message: #{message}"
49
+ else
50
+ reply "Could not acknowledge event `#{event.label}`"
51
+ end
52
+ end
53
+
54
+ def find_event short_eventid
55
+ eventid = Zabbirc.events_id_shortener.get_id short_eventid
56
+ unless eventid
57
+ reply "Bad event id `#{short_eventid}`"
58
+ return false
59
+ end
60
+ event = Zabbix::Event.find(eventid, {selectHosts: :extend, selectRelatedObject: :extend})
61
+ if event.nil?
62
+ reply "Could not find event with id `#{short_eventid}`"
63
+ return false
64
+ end
65
+ event
66
+ rescue Zabbix::IDNotUniqueError => e
67
+ reply "Could not find event: #{e}"
68
+ false
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,20 @@
1
+ module Zabbirc
2
+ module Irc
3
+ class HelpCommand < BaseCommand
4
+
5
+ private
6
+ def perform
7
+ command = @args.join(" ")
8
+ case command
9
+ when nil, ""
10
+ reply "Zabbirc - Zabbix IRC Bot - available commands: #{help_features.keys.join(", ")}. Type '!zabbirc help <command>' for detailed help"
11
+ when *help_features.keys
12
+ reply help_features[command], prefix: "HELP #{command}: "
13
+ else
14
+ reply "Unknown help command: #{command}"
15
+ end
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,65 @@
1
+ module Zabbirc
2
+ module Irc
3
+ class HostCommand < BaseCommand
4
+ register_help "status", "Show status of host. Usage: !status <hostname>"
5
+ register_help "latest", "Show last <N> (default 8) events of host. Usage: !latest <hostname> [<N>]"
6
+ private
7
+ def perform
8
+ @sub_command = @args.shift
9
+ case @sub_command
10
+ when "status"
11
+ perform_status
12
+ when "latest"
13
+ perform_latest
14
+ end
15
+ end
16
+
17
+ def host
18
+ @host ||= begin
19
+ hostname = @args.shift
20
+ if hostname.blank?
21
+ reply help_features[@sub_command]
22
+ return
23
+ end
24
+ find_host hostname
25
+ end
26
+ end
27
+
28
+ def perform_status
29
+ return unless host
30
+
31
+ triggers = Zabbix::Trigger.get(hostids: host.id, filter: {value: 1}, selectHosts: :extend)
32
+ triggers = triggers.sort{|x,y| x.priority <=> y.priority }
33
+ msg = ["Host: #{host.name}"]
34
+ if triggers.empty?
35
+ msg[0] << " - status: OK"
36
+ else
37
+ msg[0] << " - status: #{triggers.size} problems"
38
+ triggers.each do |trigger|
39
+ msg << "status: #{trigger.label}"
40
+ end
41
+ end
42
+ reply msg
43
+ end
44
+
45
+ def perform_latest
46
+ return unless host
47
+ limit = @args.shift
48
+ limit ||= 8
49
+
50
+ msg = ["Host: #{host.name}"]
51
+ events = Zabbix::Event.get(hostids: host.id, limit: limit, selectHosts: :extend, selectRelatedObject: :extend, sortfield: :clock, sortorder: "DESC")
52
+ if events.empty?
53
+ msg[0] << " - no events found"
54
+ else
55
+ msg[0] << " - showing last #{events.size} events"
56
+ events.each do |event|
57
+ msg << "!latest: #{event.label}"
58
+ end
59
+ end
60
+ reply msg
61
+ end
62
+
63
+ end
64
+ end
65
+ end
@@ -9,33 +9,19 @@ module Zabbirc
9
9
  listen_to :join, method: :sync_ops
10
10
  listen_to :leaving, method: :sync_ops
11
11
 
12
- match /zabbirc help\s*$/, method: :zabbirc_help
13
- match /zabbirc help (.+)\s*$/, method: :zabbirc_help_detail
14
12
  match /zabbirc status\s*$/, method: :zabbirc_status
15
13
 
14
+ # Help
15
+ match /(?:zabbirc help|help)(?: (.*))?\Z/, method: :help_command
16
+
16
17
  # Settings
17
- register_help "settings", "Show your op specific settings. Usage: !settings"
18
- match "settings", method: :show_settings
19
- register_help "settings set", "Set your op specific settings. Usage: !setting set <setting-name> <setting-value>"
20
- match /settings set ([#_a-zA-Z0-9]+)(?: ([#\-_a-zA-Z0-9]+))?/, method: :set_setting
21
- match /(settings set)\s*$/, method: :zabbirc_help_detail
18
+ match /settings(?: (.*))?\Z/, method: :settings_command
22
19
 
23
20
  # Events
24
- register_help "events", "Show events from last #{Zabbirc.config.notify_about_events_from_last.to_i / 60} minutes filtered by <priority> and <host>. Usage: !events [<priority [<host>]]"
25
- match /events(?: ([a-zA-Z0-9\-]+)(?: ([a-zA-Z0-9\-]+))?)?\s*$/, method: :list_events
21
+ match /((?:ack|events)(?: .*)?)/, method: :event_command
26
22
 
27
23
  # Host
28
- register_help "status", "Show status of host. Usage: !status <hostname>"
29
- match /status ([a-zA-Z0-9\-.]+)/, method: :host_status
30
- register_help "latest", "Show last <N> (default 8) events of host. Usage: !latest <hostname> [<N>]"
31
- match /latest ([a-zA-Z0-9\-.]+)(?: (\d+))?/, method: :host_latest
32
- match /(latest)\s*$/, method: :zabbirc_help_detail
33
-
34
- # ACK
35
- register_help "ack", "Acknowledges event with message. Usage: !ack <event-id> <ack-message>"
36
- match /ack ([a-zA-Z0-9]+) (.*)/, method: :acknowledge_event
37
- match /(ack)\s*$/, method: :zabbirc_help_detail
38
- match /(ack) (?:[^ ]+)\s*$/, method: :zabbirc_help_detail
24
+ match /((?:status|latest)(?: .*)?)/, method: :host_command
39
25
  end
40
26
  end
41
27
  end
@@ -3,15 +3,15 @@ module Zabbirc
3
3
  module PluginMethods
4
4
  extend ActiveSupport::Concern
5
5
  include Help
6
- extend Help::ClassMethods
7
6
 
8
7
  def zabbirc_status m
9
8
  ops_msg = ops.find_all{|o| o.nick.present? }.collect{|o| "#{o.nick} as #{o.login}"}
10
9
  msg = []
10
+ version = "Zabbirc #{Zabbirc::VERSION}"
11
11
  if Zabbix::Connection.test_connection
12
- msg << "#{m.user.nick}: Zabbix API connection successfull"
12
+ msg << "#{m.user.nick}: #{version} - Zabbix API connection successfull"
13
13
  else
14
- msg << "#{m.user.nick}: Zabbix API connection FAILED !!!"
14
+ msg << "#{m.user.nick}: #{version} - Zabbix API connection FAILED !!!"
15
15
  end
16
16
  msg << "#{m.user.nick}: Identified ops: #{ops_msg.join(", ")}"
17
17
  m.reply msg.join("\n")
@@ -19,63 +19,24 @@ module Zabbirc
19
19
  rescue_not_connected m, e
20
20
  end
21
21
 
22
- def acknowledge_event m, eventid, message
23
- op = authenticate m
24
- return unless op
25
- event = find_event m, eventid
26
- return unless event
27
-
28
- if event.acknowledge "#{op.nick}: #{message}"
29
- m.reply "#{op.nick}: Event `#{event.label}` acknowledged with message: #{message}"
30
- else
31
- m.reply "#{op.nick}: Could not acknowledge event `#{event.label}`"
32
- end
33
- rescue Zabbix::NotConnected => e
34
- rescue_not_connected m, e
22
+ def help_command m, cmd
23
+ cmd = HelpCommand.new(ops, m, cmd)
24
+ cmd.run
35
25
  end
36
26
 
37
- def host_status m, host
38
- op = authenticate m
39
- return unless op
40
- host = find_host m, host
41
- return unless host
42
-
43
- triggers = Zabbix::Trigger.get(hostids: host.id, filter: {value: 1}, selectHosts: :extend)
44
- triggers = triggers.sort{|x,y| x.priority <=> y.priority }
45
- msg = ["#{op.nick}: Host: #{host.name}"]
46
- if triggers.empty?
47
- msg[0] << " - status: OK"
48
- else
49
- msg[0] << " - status: #{triggers.size} problems"
50
- triggers.each do |trigger|
51
- msg << "#{op.nick}: status: #{trigger.label}"
52
- end
53
- end
54
- m.reply msg.join("\n")
55
- rescue Zabbix::NotConnected => e
56
- rescue_not_connected m, e
27
+ def host_command m, cmd
28
+ cmd = HostCommand.new(ops, m, cmd)
29
+ cmd.run
57
30
  end
58
31
 
59
- def host_latest m, host, limit
60
- limit ||= 8
61
- op = authenticate m
62
- return unless op
63
- host = find_host m, host
64
- return unless host
32
+ def settings_command m, cmd
33
+ cmd = SettingsCommand.new(ops, m, cmd)
34
+ cmd.run
35
+ end
65
36
 
66
- msg = ["#{op.nick}: Host: #{host.name}"]
67
- events = Zabbix::Event.get(hostids: host.id, limit: limit, selectHosts: :extend, selectRelatedObject: :extend, sortfield: :clock, sortorder: "DESC")
68
- if events.empty?
69
- msg[0] << " - no events found"
70
- else
71
- msg[0] << " - showing last #{events.size} events"
72
- events.each do |event|
73
- msg << "#{op.nick}: !latest: #{event.label}"
74
- end
75
- end
76
- m.reply msg.join("\n")
77
- rescue Zabbix::NotConnected => e
78
- rescue_not_connected m, e
37
+ def event_command m, cmd
38
+ cmd = EventCommand.new(ops, m, cmd)
39
+ cmd.run
79
40
  end
80
41
 
81
42
  def sync_ops m, u=nil
@@ -83,101 +44,6 @@ module Zabbirc
83
44
  bot.zabbirc_service.ops_service.iterate
84
45
  end
85
46
 
86
- ### Settings
87
- def show_settings m
88
- op = authenticate m
89
- return unless op
90
- m.reply "#{op.nick}: #{op.setting}"
91
- end
92
-
93
- def set_setting m, key, value
94
- op = authenticate m
95
- return unless op
96
- case key
97
- when "notify", "notify_recoveries"
98
- set_boolean m, op, key, value
99
- when "events_priority"
100
- set_events_priority m, op, value
101
- when "primary_channel"
102
- set_primary_channel m, op, value
103
- else
104
- m.reply "#{op.nick}: unknown setting `#{key}`"
105
- end
106
- end
107
-
108
- def set_boolean m, op, key, value
109
- if value.nil?
110
- m.reply "#{op.nick}: #{key} allowed values: true, on, 1, false, off, 0"
111
- return
112
- end
113
-
114
- case value
115
- when "true", "on", "1"
116
- op.setting.set key, true
117
- when "false", "off", "0"
118
- op.setting.set key, false
119
- else
120
- m.reply "#{op.nick}: uknown value `#{value}`. Allowed values: true, on, 1, false, off, 0"
121
- return
122
- end
123
- m.reply "#{op.nick}: setting `#{key}` has been set to `#{op.setting.get key}`"
124
- end
125
-
126
- def set_events_priority m, op, value
127
- if value.nil?
128
- m.reply "#{op.nick}: events_priority allowed values: #{Priority::PRIORITIES.values.collect{|v| "`#{v}`"}.join(', ')} or numeric #{Priority::PRIORITIES.keys.join(", ")} "
129
- return
130
- end
131
- begin
132
- value = value.to_i if value =~ /^\d+$/
133
- priority = Priority.new value
134
- rescue ArgumentError
135
- m.reply "#{op.nick}: uknown value `#{value}`. Allowed values: #{Priority::PRIORITIES.values.collect{|v| "`#{v}`"}.join(', ')} or numeric #{Priority::PRIORITIES.keys.join(", ")} "
136
- return
137
- end
138
- op.setting.set :events_priority, priority.code
139
- m.reply "#{op.nick}: setting `events_priority` has been set to `#{op.setting.get :events_priority}`"
140
- end
141
-
142
- def set_primary_channel m, op, value
143
- channel_names = op.channels.collect(&:name)
144
- if value.nil?
145
- m.reply "#{op.nick}: notify allowed values: #{channel_names.join(", ")}"
146
- return
147
- end
148
- case value
149
- when *channel_names
150
- op.setting.set :primary_channel, value
151
- else
152
- m.reply "#{op.nick}: uknown value `#{value}`. Allowed values: #{channel_names.join(", ")}"
153
- return
154
- end
155
- m.reply "#{op.nick}: setting `primary_channel` has been set to `#{op.setting.get :primary_channel}`"
156
- end
157
-
158
- ### Events
159
- def list_events m, priority=nil, host=nil
160
- op = authenticate m
161
- return unless op
162
- priority = parse_priority(m, priority || 0)
163
- return unless priority
164
-
165
- events = Zabbix::Event.recent
166
- events = events.select{|e| e.priority >= priority }
167
- events = events.select{|e| e.any_host_matches? /#{host}/ } if host
168
- msg = if events.any?
169
- events.collect do |e|
170
- "#{op.nick}: #{e.label}"
171
- end.join("\n")
172
- else
173
- host_filter = host ? " and host `#{host}`" : ""
174
- "#{op.nick}: No last events for priority `#{priority}`#{host_filter}"
175
- end
176
- m.reply msg
177
- rescue Zabbix::NotConnected => e
178
- rescue_not_connected m, e
179
- end
180
-
181
47
  def ops
182
48
  @ops ||= bot.zabbirc_service.ops
183
49
  end
@@ -204,50 +70,6 @@ module Zabbirc
204
70
 
205
71
  private
206
72
 
207
- def find_host m, host
208
- op = get_op m
209
- hosts = Zabbix::Host.get(search: {host: host})
210
- case hosts.size
211
- when 0
212
- m.reply "#{op.nick}: Host not found `#{host}`"
213
- when 1
214
- return hosts.first
215
- when 2..10
216
- m.reply "#{op.nick}: Found #{hosts.size} hosts: #{hosts.collect(&:name).join(', ')}. Be more specific"
217
- else
218
- m.reply "#{op.nick}: Found #{hosts.size} Be more specific"
219
- end
220
- false
221
- end
222
-
223
- def find_event m, short_eventid
224
- op = get_op m
225
- begin
226
- eventid = Zabbirc.events_id_shortener.get_id short_eventid
227
- unless eventid
228
- m.reply "#{op.nick}: Bad event id `#{short_eventid}`"
229
- return false
230
- end
231
- event = Zabbix::Event.find(eventid, {selectHosts: :extend, selectRelatedObject: :extend})
232
- if event.nil?
233
- m.reply "#{op.nick} Could not find event with id `#{short_eventid}`"
234
- return false
235
- end
236
- event
237
- rescue Zabbix::IDNotUniqueError => e
238
- m.reply "#{op.nick} Could not find event: #{e}"
239
- false
240
- end
241
- end
242
-
243
- def parse_priority m, priority
244
- op = get_op m
245
- Priority.new(priority)
246
- rescue ArgumentError => e
247
- m.reply("#{op.nick}: #{e}")
248
- nil
249
- end
250
-
251
73
  def rescue_not_connected m, e
252
74
  op = get_op m
253
75
  return unless op