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 +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
|