naginata 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +142 -0
- data/Rakefile +11 -0
- data/bin/naginata +6 -0
- data/integration-test/.gitignore +1 -0
- data/integration-test/Naginatafile +22 -0
- data/integration-test/Vagrantfile +100 -0
- data/lib/naginata.rb +17 -0
- data/lib/naginata/cli.rb +66 -0
- data/lib/naginata/cli/fetch.rb +29 -0
- data/lib/naginata/cli/notification.rb +64 -0
- data/lib/naginata/command/external_command.rb +198 -0
- data/lib/naginata/configuration.rb +100 -0
- data/lib/naginata/configuration/filter.rb +78 -0
- data/lib/naginata/configuration/nagios_server.rb +83 -0
- data/lib/naginata/configuration/service.rb +35 -0
- data/lib/naginata/defaults.rb +8 -0
- data/lib/naginata/dsl.rb +28 -0
- data/lib/naginata/loader.rb +39 -0
- data/lib/naginata/runner.rb +36 -0
- data/lib/naginata/status.rb +82 -0
- data/lib/naginata/ui.rb +6 -0
- data/lib/naginata/ui/shell.rb +39 -0
- data/lib/naginata/version.rb +3 -0
- data/naginata.gemspec +28 -0
- metadata +159 -0
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'naginata'
|
2
|
+
require 'naginata/command/external_command'
|
3
|
+
require 'naginata/configuration'
|
4
|
+
require 'naginata/runner'
|
5
|
+
|
6
|
+
module Naginata
|
7
|
+
class CLI::Notification
|
8
|
+
|
9
|
+
def initialize(options)
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
if !@options[:enable] and !@options[:disable]
|
15
|
+
abort "Either --enable or --disable options is required"
|
16
|
+
end
|
17
|
+
if @options[:enable] and @options[:disable]
|
18
|
+
abort "Both --enable and --disable options can not be given"
|
19
|
+
end
|
20
|
+
|
21
|
+
if @options[:all_hosts]
|
22
|
+
::Naginata::Configuration.env.add_filter(:host, :all)
|
23
|
+
elsif @options[:patterns].empty?
|
24
|
+
abort "At least one hostpattern must be given or use --all-hosts option"
|
25
|
+
else
|
26
|
+
::Naginata::Configuration.env.add_filter(:host, @options[:patterns])
|
27
|
+
end
|
28
|
+
if @options[:services]
|
29
|
+
::Naginata::Configuration.env.add_filter(:service, @options[:services])
|
30
|
+
end
|
31
|
+
|
32
|
+
command_file = ::Naginata::Configuration.env.fetch(:nagios_server_options)[:command_file]
|
33
|
+
|
34
|
+
if !@options[:force]
|
35
|
+
Naginata.ui.info "Following notifications will be #{@options[:enable] ? 'enabled' : 'disabled'}", true
|
36
|
+
Naginata::Runner.run_locally do |nagios_server, services|
|
37
|
+
services.group_by{ |s| s.hostname }.each do |hostname, svcs|
|
38
|
+
puts hostname
|
39
|
+
svcs.each do |service|
|
40
|
+
Naginata.ui.info " - #{service.description}", true
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
abort unless Naginata.ui.yes?("Are you sure? [y|N]")
|
45
|
+
end
|
46
|
+
|
47
|
+
Naginata::Runner.run do |backend, nagios_server, services|
|
48
|
+
path = nagios_server.fetch(:command_file) || command_file
|
49
|
+
|
50
|
+
services.each do |service|
|
51
|
+
opts = {path: (nagios_server.fetch(:command_file) || command_file), host_name: service.hostname}
|
52
|
+
opts.merge!(service_description: service.description) if service.description != :ping
|
53
|
+
action = @options[:enable] ? 'enable' : 'disable'
|
54
|
+
host_or_svc = service.description == :ping ? 'host' : 'svc'
|
55
|
+
command_arg = Naginata::Command::ExternalCommand.send("#{action}_#{host_or_svc}_notifications".to_sym, opts).split(/\s+/, 2)
|
56
|
+
command = command_arg.shift.to_sym
|
57
|
+
backend.execute command, command_arg
|
58
|
+
end
|
59
|
+
end
|
60
|
+
Naginata.ui.info "Done", true
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,198 @@
|
|
1
|
+
module Naginata::Command
|
2
|
+
|
3
|
+
class ExternalCommand
|
4
|
+
|
5
|
+
def self.method_missing(name, *args, &block)
|
6
|
+
raise ArgumentError, "only one argment allowed" if args.size > 1
|
7
|
+
options = args.first || {}
|
8
|
+
dispatch(name, options)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.dispatch(action, options = {})
|
12
|
+
action = action.to_s.upcase.to_sym
|
13
|
+
raise ArgumentError, "action name #{action} is not implemented" unless List.include? action
|
14
|
+
raise ArgumentError, ":path option is required" if options[:path].nil?
|
15
|
+
|
16
|
+
ts = options[:ts] || Time.now.to_i
|
17
|
+
format = 'echo "[%d] %s" > %s'
|
18
|
+
str = [action.to_s, List.keys_for(action).map{|k| options[k.to_sym]}].flatten.join(';')
|
19
|
+
format % [ts, str, options[:path]]
|
20
|
+
end
|
21
|
+
|
22
|
+
# ref Original code here
|
23
|
+
# https://github.com/ripienaar/ruby-nagios/blob/master/lib/nagios/external_commands/list.rb
|
24
|
+
#
|
25
|
+
# List of all available nagios external commands, formats and
|
26
|
+
# descriptions can be obtained from
|
27
|
+
# http://www.nagios.org/developerinfo/externalcommands
|
28
|
+
class List
|
29
|
+
ACTIONS = {
|
30
|
+
:ACKNOWLEDGE_HOST_PROBLEM => %w{host_name sticky notify persistent author comment},
|
31
|
+
:ACKNOWLEDGE_SVC_PROBLEM => %w{host_name service_description sticky notify persistent author comment},
|
32
|
+
:ADD_HOST_COMMENT => %w{host_name persistent author comment},
|
33
|
+
:ADD_SVC_COMMENT => %w{host_name service_description persistent author comment},
|
34
|
+
:CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD => %w{contact_name notification_timeperiod},
|
35
|
+
:CHANGE_CONTACT_MODATTR => %w{contact_name value},
|
36
|
+
:CHANGE_CONTACT_MODHATTR => %w{contact_name value},
|
37
|
+
:CHANGE_CONTACT_MODSATTR => %w{contact_name value},
|
38
|
+
:CHANGE_CONTACT_SVC_NOTIFICATION_TIMEPERIOD => %w{contact_name notification_timeperiod},
|
39
|
+
:CHANGE_CUSTOM_CONTACT_VAR => %w{contact_name varname varvalue},
|
40
|
+
:CHANGE_CUSTOM_HOST_VAR => %w{host_name varname varvalue},
|
41
|
+
:CHANGE_CUSTOM_SVC_VAR => %w{host_name service_description varname varvalue},
|
42
|
+
:CHANGE_GLOBAL_HOST_EVENT_HANDLER => %w{event_handler_command},
|
43
|
+
:CHANGE_GLOBAL_SVC_EVENT_HANDLER => %w{event_handler_command},
|
44
|
+
:CHANGE_HOST_CHECK_COMMAND => %w{host_name check_command},
|
45
|
+
:CHANGE_HOST_CHECK_TIMEPERIOD => %w{host_name check_timeperod},
|
46
|
+
:CHANGE_HOST_EVENT_HANDLER => %w{host_name event_handler_command},
|
47
|
+
:CHANGE_HOST_MODATTR => %w{host_name value},
|
48
|
+
:CHANGE_MAX_HOST_CHECK_ATTEMPTS => %w{host_name check_attempts},
|
49
|
+
:CHANGE_MAX_SVC_CHECK_ATTEMPTS => %w{host_name service_description check_attempts},
|
50
|
+
:CHANGE_NORMAL_HOST_CHECK_INTERVAL => %w{host_name check_interval},
|
51
|
+
:CHANGE_NORMAL_SVC_CHECK_INTERVAL => %w{host_name service_description check_interval},
|
52
|
+
:CHANGE_RETRY_HOST_CHECK_INTERVAL => %w{host_name service_description check_interval},
|
53
|
+
:CHANGE_RETRY_SVC_CHECK_INTERVAL => %w{host_name service_description check_interval},
|
54
|
+
:CHANGE_SVC_CHECK_COMMAND => %w{host_name service_description check_command},
|
55
|
+
:CHANGE_SVC_CHECK_TIMEPERIOD => %w{host_name service_description check_timeperiod},
|
56
|
+
:CHANGE_SVC_EVENT_HANDLER => %w{host_name service_description event_handler_command},
|
57
|
+
:CHANGE_SVC_MODATTR => %w{host_name service_description value},
|
58
|
+
:CHANGE_SVC_NOTIFICATION_TIMEPERIOD => %w{host_name service_description notification_timeperiod},
|
59
|
+
:DELAY_HOST_NOTIFICATION => %w{host_name notification_time},
|
60
|
+
:DELAY_SVC_NOTIFICATION => %w{host_name service_description notification_time},
|
61
|
+
:DEL_ALL_HOST_COMMENTS => %w{host_name},
|
62
|
+
:DEL_ALL_SVC_COMMENTS => %w{host_name service_description},
|
63
|
+
:DEL_HOST_COMMENT => %w{comment_id},
|
64
|
+
:DEL_HOST_DOWNTIME => %w{downtime_id},
|
65
|
+
:DEL_SVC_COMMENT => %w{comment_id},
|
66
|
+
:DEL_SVC_DOWNTIME => %w{downtime_id},
|
67
|
+
:DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST => %w{host_name},
|
68
|
+
:DISABLE_CONTACTGROUP_HOST_NOTIFICATIONS => %w{contactgroup_name},
|
69
|
+
:DISABLE_CONTACTGROUP_SVC_NOTIFICATIONS => %w{contactgroup_name},
|
70
|
+
:DISABLE_CONTACT_HOST_NOTIFICATIONS => %w{contact_name},
|
71
|
+
:DISABLE_CONTACT_SVC_NOTIFICATIONS => %w{contact_name},
|
72
|
+
:DISABLE_EVENT_HANDLERS => [],
|
73
|
+
:DISABLE_FAILURE_PREDICTION => [],
|
74
|
+
:DISABLE_FLAP_DETECTION => [],
|
75
|
+
:DISABLE_HOSTGROUP_HOST_CHECKS => %w{hostgroup_name},
|
76
|
+
:DISABLE_HOSTGROUP_HOST_NOTIFICATIONS => %w{hostgroup_name},
|
77
|
+
:DISABLE_HOSTGROUP_PASSIVE_HOST_CHECKS => %w{hostgroup_name},
|
78
|
+
:DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS => %w{hostgroup_name},
|
79
|
+
:DISABLE_HOSTGROUP_SVC_CHECKS => %w{hostgroup_name},
|
80
|
+
:DISABLE_HOSTGROUP_SVC_NOTIFICATIONS => %w{hostgroup_name},
|
81
|
+
:DISABLE_HOST_AND_CHILD_NOTIFICATIONS => %w{host_name},
|
82
|
+
:DISABLE_HOST_CHECK => %w{host_name},
|
83
|
+
:DISABLE_HOST_EVENT_HANDLER => %w{host_name},
|
84
|
+
:DISABLE_HOST_FLAP_DETECTION => %w{host_name},
|
85
|
+
:DISABLE_HOST_FRESHNESS_CHECKS => [],
|
86
|
+
:DISABLE_HOST_NOTIFICATIONS => %w{host_name},
|
87
|
+
:DISABLE_HOST_SVC_CHECKS => %w{host_name},
|
88
|
+
:DISABLE_HOST_SVC_NOTIFICATIONS => %w{host_name},
|
89
|
+
:DISABLE_NOTIFICATIONS => [],
|
90
|
+
:DISABLE_PASSIVE_HOST_CHECKS => %w{host_name},
|
91
|
+
:DISABLE_PASSIVE_SVC_CHECKS => %w{host_name service_description},
|
92
|
+
:DISABLE_PERFORMANCE_DATA => [],
|
93
|
+
:DISABLE_SERVICEGROUP_HOST_CHECKS => %w{servicegroup_name},
|
94
|
+
:DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS => %w{servicegroup_name},
|
95
|
+
:DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS => %w{servicegroup_name},
|
96
|
+
:DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS => %w{servicegroup_name},
|
97
|
+
:DISABLE_SERVICEGROUP_SVC_CHECKS => %w{servicegroup_name},
|
98
|
+
:DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS => %w{servicegroup_name},
|
99
|
+
:DISABLE_SERVICE_FLAP_DETECTION => %w{host_name service_description},
|
100
|
+
:DISABLE_SERVICE_FRESHNESS_CHECKS => [],
|
101
|
+
:DISABLE_SVC_CHECK => %w{host_name service_description},
|
102
|
+
:DISABLE_SVC_EVENT_HANDLER => %w{host_name service_description},
|
103
|
+
:DISABLE_SVC_FLAP_DETECTION => %w{host_name service_description},
|
104
|
+
:DISABLE_SVC_NOTIFICATIONS => %w{host_name service_description},
|
105
|
+
:ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST => %w{host_name},
|
106
|
+
:ENABLE_CONTACTGROUP_HOST_NOTIFICATIONS => %w{contactgroup_name},
|
107
|
+
:ENABLE_CONTACTGROUP_SVC_NOTIFICATIONS => %w{contactgroup_name},
|
108
|
+
:ENABLE_CONTACT_HOST_NOTIFICATIONS => %w{contact_name},
|
109
|
+
:ENABLE_CONTACT_SVC_NOTIFICATIONS => %w{contact_name},
|
110
|
+
:ENABLE_EVENT_HANDLERS => [],
|
111
|
+
:ENABLE_FAILURE_PREDICTION => [],
|
112
|
+
:ENABLE_FLAP_DETECTION => [],
|
113
|
+
:ENABLE_HOSTGROUP_HOST_CHECKS => %w{hostgroup_name},
|
114
|
+
:ENABLE_HOSTGROUP_HOST_NOTIFICATIONS => %w{hostgroup_name},
|
115
|
+
:ENABLE_HOSTGROUP_PASSIVE_HOST_CHECKS => %w{hostgroup_name},
|
116
|
+
:ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS => %w{hostgroup_name},
|
117
|
+
:ENABLE_HOSTGROUP_SVC_CHECKS => %w{hostgroup_name},
|
118
|
+
:ENABLE_HOSTGROUP_SVC_NOTIFICATIONS => %w{hostgroup_name},
|
119
|
+
:ENABLE_HOST_AND_CHILD_NOTIFICATIONS => %w{host_name},
|
120
|
+
:ENABLE_HOST_CHECK => %w{host_name},
|
121
|
+
:ENABLE_HOST_EVENT_HANDLER => %w{host_name},
|
122
|
+
:ENABLE_HOST_FLAP_DETECTION => %w{host_name},
|
123
|
+
:ENABLE_HOST_FRESHNESS_CHECKS => [],
|
124
|
+
:ENABLE_HOST_NOTIFICATIONS => %w{host_name},
|
125
|
+
:ENABLE_HOST_SVC_CHECKS => %w{host_name},
|
126
|
+
:ENABLE_HOST_SVC_NOTIFICATIONS => %w{host_name},
|
127
|
+
:ENABLE_NOTIFICATIONS => [],
|
128
|
+
:ENABLE_PASSIVE_HOST_CHECKS => %w{host_name},
|
129
|
+
:ENABLE_PASSIVE_SVC_CHECKS => %w{host_name service_description},
|
130
|
+
:ENABLE_PERFORMANCE_DATA => [],
|
131
|
+
:ENABLE_SERVICEGROUP_HOST_CHECKS => %w{servicegroup_name},
|
132
|
+
:ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS => %w{servicegroup_name},
|
133
|
+
:ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS => %w{servicegroup_name},
|
134
|
+
:ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS => %w{servicegroup_name},
|
135
|
+
:ENABLE_SERVICEGROUP_SVC_CHECKS => %w{servicegroup_name},
|
136
|
+
:ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS => %w{servicegroup_name},
|
137
|
+
:ENABLE_SERVICE_FRESHNESS_CHECKS => [],
|
138
|
+
:ENABLE_SVC_CHECK => %w{host_name service_description},
|
139
|
+
:ENABLE_SVC_EVENT_HANDLER => %w{host_name service_description},
|
140
|
+
:ENABLE_SVC_FLAP_DETECTION => %w{host_name service_description},
|
141
|
+
:ENABLE_SVC_NOTIFICATIONS => %w{host_name service_description},
|
142
|
+
:PROCESS_FILE => %w{file_name delete},
|
143
|
+
:PROCESS_HOST_CHECK_RESULT => %w{host_name status_code plugin_output},
|
144
|
+
:PROCESS_SERVICE_CHECK_RESULT => %w{host_name service_description return_code plugin_output},
|
145
|
+
:READ_STATE_INFORMATION => [],
|
146
|
+
:REMOVE_HOST_ACKNOWLEDGEMENT => %w{host_name},
|
147
|
+
:REMOVE_SVC_ACKNOWLEDGEMENT => %w{host_name service_description},
|
148
|
+
:RESTART_PROGRAM => [],
|
149
|
+
:SAVE_STATE_INFORMATION => [],
|
150
|
+
:SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME => %w{host_name start_time end_time fixed trigger_id duration author comment},
|
151
|
+
:SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME => %w{host_name start_time end_time fixed trigger_id duration author comment},
|
152
|
+
:SCHEDULE_FORCED_HOST_CHECK => %w{host_name check_time},
|
153
|
+
:SCHEDULE_FORCED_HOST_SVC_CHECKS => %w{host_name check_time},
|
154
|
+
:SCHEDULE_FORCED_SVC_CHECK => %w{host_name service_description check_time},
|
155
|
+
:SCHEDULE_HOSTGROUP_HOST_DOWNTIME => %w{hostgroup_name start_time end_time fixed trigger_id duration author comment},
|
156
|
+
:SCHEDULE_HOSTGROUP_SVC_DOWNTIME => %w{hostgroup_name start_time end_time fixed trigger_id duration author comment},
|
157
|
+
:SCHEDULE_HOST_CHECK => %w{host_name check_time},
|
158
|
+
:SCHEDULE_HOST_DOWNTIME => %w{host_name start_time end_time fixed trigger_id duration author comment},
|
159
|
+
:SCHEDULE_HOST_SVC_CHECKS => %w{host_name check_time},
|
160
|
+
:SCHEDULE_HOST_SVC_DOWNTIME => %w{host_name start_time end_time fixed trigger_id duration author comment},
|
161
|
+
:SCHEDULE_SERVICEGROUP_HOST_DOWNTIME => %w{servicegroup_name start_time end_time fixed trigger_id duration author comment},
|
162
|
+
:SCHEDULE_SERVICEGROUP_SVC_DOWNTIME => %w{servicegroup_name start_time end_time fixed trigger_id duration author comment},
|
163
|
+
:SCHEDULE_SVC_CHECK => %w{host_name service_description check_time},
|
164
|
+
:SCHEDULE_SVC_DOWNTIME => %w{host_name service_desription start_time end_time fixed trigger_id duration author comment},
|
165
|
+
:SEND_CUSTOM_HOST_NOTIFICATION => %w{host_name options author comment},
|
166
|
+
:SEND_CUSTOM_SVC_NOTIFICATION => %w{host_name service_description options author comment},
|
167
|
+
:SET_HOST_NOTIFICATION_NUMBER => %w{host_name notification_number},
|
168
|
+
:SET_SVC_NOTIFICATION_NUMBER => %w{host_name service_description notification_number},
|
169
|
+
:SHUTDOWN_PROGRAM => [],
|
170
|
+
:START_ACCEPTING_PASSIVE_HOST_CHECKS => [],
|
171
|
+
:START_ACCEPTING_PASSIVE_SVC_CHECKS => [],
|
172
|
+
:START_EXECUTING_HOST_CHECKS => [],
|
173
|
+
:START_EXECUTING_SVC_CHECKS => [],
|
174
|
+
:START_OBSESSING_OVER_HOST => %w{host_name},
|
175
|
+
:START_OBSESSING_OVER_HOST_CHECKS => [],
|
176
|
+
:START_OBSESSING_OVER_SVC => %w{host_name service_description},
|
177
|
+
:START_OBSESSING_OVER_SVC_CHECKS => [],
|
178
|
+
:STOP_ACCEPTING_PASSIVE_HOST_CHECKS => [],
|
179
|
+
:STOP_ACCEPTING_PASSIVE_SVC_CHECKS => [],
|
180
|
+
:STOP_EXECUTING_HOST_CHECKS => [],
|
181
|
+
:STOP_EXECUTING_SVC_CHECKS => [],
|
182
|
+
:STOP_OBSESSING_OVER_HOST => %w{host_name},
|
183
|
+
:STOP_OBSESSING_OVER_HOST_CHECKS => [],
|
184
|
+
:STOP_OBSESSING_OVER_SVC => %w{host_name service_description},
|
185
|
+
:STOP_OBSESSING_OVER_SVC_CHECKS => []
|
186
|
+
}.freeze
|
187
|
+
|
188
|
+
def self.include?(action)
|
189
|
+
ACTIONS.keys.include? action.to_sym
|
190
|
+
end
|
191
|
+
|
192
|
+
def self.keys_for(action)
|
193
|
+
ACTIONS[action]
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require_relative 'configuration/filter'
|
2
|
+
require_relative 'configuration/nagios_server'
|
3
|
+
require_relative 'configuration/service'
|
4
|
+
|
5
|
+
module Naginata
|
6
|
+
class Configuration
|
7
|
+
|
8
|
+
def initialize(config = nil)
|
9
|
+
@config ||= config
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.env
|
13
|
+
@env ||= new
|
14
|
+
end
|
15
|
+
|
16
|
+
def set(key, value)
|
17
|
+
config[key] = value
|
18
|
+
end
|
19
|
+
|
20
|
+
def set_if_empty(key, value)
|
21
|
+
config[key] = value unless config.has_key? key
|
22
|
+
end
|
23
|
+
|
24
|
+
def fetch(key, default=nil, &block)
|
25
|
+
if block_given?
|
26
|
+
config.fetch(key, &block)
|
27
|
+
else
|
28
|
+
config.fetch(key, default)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def keys
|
33
|
+
config.keys
|
34
|
+
end
|
35
|
+
|
36
|
+
# @ToDo second argment for server specific options
|
37
|
+
def nagios_server(name)
|
38
|
+
nagios_servers << NagiosServer.new(name)
|
39
|
+
end
|
40
|
+
|
41
|
+
def host(host, options = {})
|
42
|
+
ArgumentError "on: is required option" unless options[:on]
|
43
|
+
nagios = options[:on]
|
44
|
+
services << Host.new(host, on: nagios)
|
45
|
+
Array(options[:services]).each { |s| services << Service.new(s, host: host, on: nagios) }
|
46
|
+
end
|
47
|
+
|
48
|
+
def timestamp
|
49
|
+
@timestamp ||= Time.now.utc
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_filter(type, values)
|
53
|
+
filters << Filter.new(type, values)
|
54
|
+
end
|
55
|
+
|
56
|
+
def filter list
|
57
|
+
filters.reduce(list) { |l,f| f.filter l }
|
58
|
+
end
|
59
|
+
|
60
|
+
def filter_service list
|
61
|
+
filters.reduce(list) { |l,f| f.filter_service l }
|
62
|
+
end
|
63
|
+
|
64
|
+
def nagios_servers
|
65
|
+
@nagios_servers ||= []
|
66
|
+
end
|
67
|
+
|
68
|
+
def services
|
69
|
+
@services ||= []
|
70
|
+
end
|
71
|
+
|
72
|
+
def backend
|
73
|
+
SSHKit
|
74
|
+
end
|
75
|
+
|
76
|
+
def configure_backend
|
77
|
+
backend.configure do |sshkit|
|
78
|
+
sshkit.format = fetch(:format)
|
79
|
+
sshkit.output_verbosity = fetch(:log_level)
|
80
|
+
sshkit.backend = fetch(:sshkit_backend, SSHKit::Backend::Netssh)
|
81
|
+
sshkit.backend.configure do |backend|
|
82
|
+
backend.pty = fetch(:pty)
|
83
|
+
backend.ssh_options = (backend.ssh_options || {}).merge(fetch(:ssh_options,{}))
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def filters
|
92
|
+
@filters ||= []
|
93
|
+
end
|
94
|
+
|
95
|
+
def config
|
96
|
+
@config ||= Hash.new
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'naginata/configuration'
|
2
|
+
require 'naginata/configuration/service'
|
3
|
+
|
4
|
+
module Naginata
|
5
|
+
class Configuration
|
6
|
+
class Filter
|
7
|
+
def initialize type, values = nil
|
8
|
+
raise "Invalid filter type #{type}" unless [:nagios_server, :host, :service].include? type
|
9
|
+
av = Array(values).dup
|
10
|
+
@mode = case
|
11
|
+
when av.include?(:all) then :all
|
12
|
+
else type
|
13
|
+
end
|
14
|
+
@rex = case @mode
|
15
|
+
when :all
|
16
|
+
nil # this creates a filter matching any string
|
17
|
+
when :nagios_server, :host
|
18
|
+
av.map!{|v| (v.is_a?(String) && v =~ /^(?<name>[-A-Za-z0-9.]+)(,\g<name>)*$/) ? v.split(',') : v }
|
19
|
+
av.flatten!
|
20
|
+
av.map! do |v|
|
21
|
+
case v
|
22
|
+
when Regexp then v
|
23
|
+
else
|
24
|
+
vs = v.to_s
|
25
|
+
vs =~ /^[-A-Za-z0-9.]+$/ ? vs : Regexp.new(vs)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
Regexp.union av
|
29
|
+
when :service
|
30
|
+
av.map!{|v| v.is_a?(String) ? v.split(',') : v }
|
31
|
+
av.flatten!
|
32
|
+
av.map! do |v|
|
33
|
+
case v
|
34
|
+
when Regexp then v
|
35
|
+
else
|
36
|
+
vs = v.to_s
|
37
|
+
Regexp.new(vs)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
Regexp.union av
|
41
|
+
else
|
42
|
+
raise "unprocessable type"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def filter nagios_servers
|
47
|
+
a = Array(nagios_servers)
|
48
|
+
case @mode
|
49
|
+
when :all
|
50
|
+
a
|
51
|
+
when :nagios_server
|
52
|
+
a.select { |ns| @rex.match ns.to_s }
|
53
|
+
else
|
54
|
+
a
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def filter_service services
|
59
|
+
a = Array(services)
|
60
|
+
case @mode
|
61
|
+
when :all
|
62
|
+
a
|
63
|
+
when :nagios_server
|
64
|
+
a.select { |s| @rex.match s.nagios }
|
65
|
+
when :host
|
66
|
+
a.select { |s| @rex.match s.hostname }
|
67
|
+
when :service
|
68
|
+
# Ignore host monitors
|
69
|
+
a.reject { |s| s.description == :ping }
|
70
|
+
.select { |s| @rex.match s.description }
|
71
|
+
else
|
72
|
+
a
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'sshkit'
|
2
|
+
|
3
|
+
module Naginata
|
4
|
+
class Configuration
|
5
|
+
class NagiosServer < SSHKit::Host
|
6
|
+
extend Forwardable
|
7
|
+
def_delegators :properties, :fetch, :set
|
8
|
+
|
9
|
+
def with(properties)
|
10
|
+
properties.each { |key, value| add_property(key, value) }
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
def properties
|
15
|
+
@properties ||= Properties.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def netssh_options
|
19
|
+
@netssh_options ||= super.merge( fetch(:ssh_options) || {} )
|
20
|
+
end
|
21
|
+
|
22
|
+
def matches?(other)
|
23
|
+
hostname == other.hostname
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def add_property(key, value)
|
29
|
+
if respond_to?("#{key}=")
|
30
|
+
send("#{key}=", value)
|
31
|
+
else
|
32
|
+
set(key, value)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class Properties
|
37
|
+
|
38
|
+
def initialize
|
39
|
+
@properties = {}
|
40
|
+
end
|
41
|
+
|
42
|
+
def set(key, value)
|
43
|
+
pval = @properties[key]
|
44
|
+
if pval.is_a? Hash and value.is_a? Hash
|
45
|
+
pval.merge!(value)
|
46
|
+
elsif pval.is_a? Array and value.is_a? Array
|
47
|
+
pval.concat value
|
48
|
+
else
|
49
|
+
@properties[key] = value
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def fetch(key)
|
54
|
+
@properties[key]
|
55
|
+
end
|
56
|
+
|
57
|
+
def respond_to?(method, include_all=false)
|
58
|
+
@properties.has_key?(method)
|
59
|
+
end
|
60
|
+
|
61
|
+
def keys
|
62
|
+
@properties.keys
|
63
|
+
end
|
64
|
+
|
65
|
+
def method_missing(key, value=nil)
|
66
|
+
if value
|
67
|
+
set(lvalue(key), value)
|
68
|
+
else
|
69
|
+
fetch(key)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def lvalue(key)
|
76
|
+
key.to_s.chomp('=').to_sym
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|