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 +4 -4
- data/lib/zabbirc/irc/base_command.rb +120 -0
- data/lib/zabbirc/irc/event_command.rb +72 -0
- data/lib/zabbirc/irc/help_command.rb +20 -0
- data/lib/zabbirc/irc/host_command.rb +65 -0
- data/lib/zabbirc/irc/plugin.rb +6 -20
- data/lib/zabbirc/irc/plugin_methods.rb +16 -194
- data/lib/zabbirc/irc/settings_command.rb +159 -0
- data/lib/zabbirc/op.rb +16 -6
- data/lib/zabbirc/setting.rb +49 -12
- data/lib/zabbirc/version.rb +3 -0
- data/lib/zabbirc/zabbix/event.rb +23 -0
- data/lib/zabbirc/zabbix/host.rb +1 -0
- data/lib/zabbirc/zabbix/host_group.rb +8 -0
- data/lib/zabbirc/zabbix/resource/associations.rb +12 -6
- data/lib/zabbirc/zabbix/resource/base.rb +10 -2
- data/lib/zabbirc/zabbix/resource/finders.rb +1 -1
- data/lib/zabbirc.rb +2 -1
- data/spec/event_command_spec.rb +114 -0
- data/spec/host_command_spec.rb +106 -0
- data/spec/settings_command_spec.rb +125 -0
- data/spec/support/ops_builder.rb +23 -0
- data/tmp/playground.rb +22 -0
- data/tmp/stopwatch.rb +52 -0
- metadata +18 -7
- data/spec/bot_spec.rb +0 -212
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a9f3850b4563b9782a38dcef10d46b7afee95e7
|
4
|
+
data.tar.gz: 85a2a418b4db1d3793de71ac005178e16e538de5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/zabbirc/irc/plugin.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
23
|
-
|
24
|
-
|
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
|
38
|
-
|
39
|
-
|
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
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
-
|
67
|
-
|
68
|
-
|
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
|