zabbirc 0.0.11 → 0.1.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: 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