nagiosharder 0.3.0 → 0.4.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,281 @@
1
+ require 'terminal-table'
2
+ require 'optparse'
3
+ require 'nagiosharder'
4
+
5
+ class NagiosHarder
6
+ class Cli
7
+
8
+ attr_reader :options, :command, :param, :the_rest, :host, :service
9
+
10
+ def initialize(argv)
11
+ @options = parse_connection_options(argv)
12
+ @command, @param = argv
13
+ @host, @service = param.split("/") if param
14
+ @the_rest = argv[2..-1]
15
+ end
16
+
17
+ def run
18
+ return_value = case command
19
+ when 'status'
20
+ service_table do
21
+ client.host_status(host).select do |name, s|
22
+ service.nil? || service == name
23
+ end.map { |name, s| s }
24
+ end
25
+ true
26
+ when /^(ack|acknowledged)$/
27
+ if service.nil?
28
+ client.acknowledge_host(host, the_rest.join(' '))
29
+ else
30
+ client.acknowledge_service(host, service, the_rest.join(' '))
31
+ end
32
+ when /^unack/
33
+ client.unacknowledge_service(host, service)
34
+ when /^(mute|disable_notifications)$/
35
+ client.disable_service_notifications(host, service)
36
+ when /^(unmute|enable_notifications)$/
37
+ client.enable_service_notifications(host, service)
38
+ when 'check'
39
+ if service
40
+ client.schedule_service_check(host, service)
41
+ else
42
+ client.schedule_host_check(host)
43
+ end
44
+ when 'downtime'
45
+ if service
46
+ client.schedule_service_downtime(host, service, :type => :fixed, :start_time => Time.now, :end_time => Time.now + the_rest.first.to_i.minutes)
47
+ else
48
+ client.schedule_host_downtime(host, :type => :fixed, :start_time => Time.now, :end_time => Time.now + the_rest.first.to_i.minutes)
49
+ end
50
+ when 'problems'
51
+ service_table do
52
+ params = {
53
+ :service_status_types => [:critical, :warning, :unknown],
54
+ }
55
+ params[:group] = param
56
+ client.service_status(params)
57
+ end
58
+ true
59
+ when /^(critical|warning|unknown)/
60
+ service_table do
61
+ params = {
62
+ :service_status_types => [
63
+ $1,
64
+ ],
65
+ :service_props => [
66
+ :hard_state,
67
+ :no_scheduled_downtime,
68
+ :state_unacknowledged,
69
+ :notifications_enabled
70
+ ]
71
+ }
72
+ params[:group] = param
73
+ client.service_status(params)
74
+ end
75
+ true
76
+ when /^(triage|unhandled)/
77
+ service_table do
78
+ params = {
79
+ :service_status_types => [
80
+ :critical,
81
+ :warning,
82
+ :unknown
83
+ ],
84
+ :host_props => [
85
+ :no_scheduled_downtime,
86
+ :state_unacknowledged,
87
+ :notifications_enabled
88
+ ],
89
+ :service_props => [
90
+ :no_scheduled_downtime,
91
+ :state_unacknowledged,
92
+ :notifications_enabled
93
+ ]
94
+ }
95
+ params[:group] = param
96
+ client.service_status(params)
97
+ end
98
+ true
99
+ when /^muted/
100
+ service_table do
101
+ params = {
102
+ :service_props => [
103
+ :notifications_disabled,
104
+ ]
105
+ }
106
+ params[:group] = param
107
+ client.service_status(params)
108
+ end
109
+ true
110
+ when /^(acked|acknowledged)/
111
+ service_table do
112
+ params = {
113
+ :service_status_types => [
114
+ :critical,
115
+ :warning,
116
+ :unknown
117
+ ],
118
+ :service_props => [
119
+ :state_acknowledged,
120
+ ]
121
+ }
122
+ params[:group] = param
123
+ client.service_status(params)
124
+ end
125
+ true
126
+ else
127
+ debug "'#{command}'"
128
+ raise ArgumentError, help
129
+ end
130
+ if return_value
131
+ 0
132
+ else
133
+ puts "Sorry, bro, nagios didn't like that."
134
+ 1
135
+ end
136
+ end
137
+
138
+ protected
139
+
140
+ def client
141
+ debug "loading client with options #{options.inspect}"
142
+ @client ||= NagiosHarder::Site.new(options['nagios_url'], options['user'], options['password'], options['version'], options['time'])
143
+ end
144
+
145
+ def parse_connection_options(argv)
146
+ options = {
147
+ 'version' => 3
148
+ }
149
+
150
+ optparse = OptionParser.new do |opts|
151
+ opts.banner = "Usage: nagiosharder [options] [command]"
152
+
153
+ opts.on( '-h', '--help') do
154
+ raise ArgumentError, opts.help
155
+ end
156
+
157
+ opts.on( '-c', '--config [/path/to/file]', 'YAML config file [optional, but recommended]') do |file|
158
+ options.merge!(YAML.load_file(file))
159
+ end
160
+
161
+ opts.on( '-u', '--user USER', 'Nagios user') do |user|
162
+ options['user'] = user
163
+ end
164
+
165
+ opts.on( '-p', '--password PASSWORD', 'Nagios password') do |password|
166
+ options['password'] = password
167
+ end
168
+
169
+ opts.on( '-n', '--nagios_url URL', 'Nagios cgi url') do |nagios_url|
170
+ options['nagios_url'] = nagios_url
171
+ end
172
+
173
+ opts.on( '-v', '--version [3]', 'Nagios version (2 or 3, defaults to 3)') do |version|
174
+ options['version'] = version
175
+ end
176
+
177
+ opts.on( '-t', '--time [us|euro]', 'Nagios time format') do |time|
178
+ options['time'] = time
179
+ end
180
+
181
+ end
182
+
183
+ begin
184
+ optparse.parse!(argv)
185
+ rescue OptionParser::InvalidOption, OptionParser::MissingArgument => e
186
+ raise ArgumentError, e.message + "\n\n" + optparse.help
187
+ end
188
+
189
+ unless options['nagios_url'] && options['user'] && options['password']
190
+ raise ArgumentError, optparse.help
191
+ end
192
+
193
+ options
194
+ end
195
+
196
+ def service_table
197
+ table = Terminal::Table.new(:headings => ['Service', 'Status', 'Details']) do |t|
198
+ services = yield
199
+ services.each do |service|
200
+ t << service_row(service)
201
+ end
202
+ t
203
+ end
204
+ table.align_column(1, :right)
205
+ puts table
206
+ end
207
+
208
+ def service_row(service)
209
+ service['status'] << "/ACK" if service['acknowledged']
210
+ service['status'] << "/MUTE" if service['notifications_disabled']
211
+ service['status'] << "/COMMENT" if service['comments_url']
212
+ [
213
+ service['host']+"/"+service["service"],
214
+ service['status'],
215
+ wrap_text(service['extended_info'], 40)
216
+ ]
217
+ end
218
+
219
+ # wraps text at the specified column, 80 by default
220
+ def wrap_text(txt, col = 80)
221
+ txt.gsub(/(.{1,#{col}})( +|$\n?)|(.{1,#{col}})/,
222
+ "\\1\\3\n")
223
+ end
224
+
225
+ def debug(*args)
226
+ $stderr.puts *args if ENV['DEBUG']
227
+ end
228
+
229
+ def help
230
+ help = <<-HELP
231
+ NagiosHarder
232
+
233
+ USAGE:
234
+
235
+ nagiosharder --help
236
+ nagiosharder [options] [command]
237
+
238
+ COMMANDS:
239
+
240
+ nagiosharder commands
241
+
242
+ nagiosharder status aux1
243
+ nagiosharder status aux1/http
244
+
245
+ nagiosharder acknowledge aux1 [message]
246
+
247
+ nagiosharder acknowledge aux1/http [message]
248
+ nagiosharder ack aux1/http [message]
249
+
250
+ nagiosharder unacknowledge aux1/http
251
+ nagiosharder unack aux1/http
252
+
253
+ nagiosharder mute aux1
254
+ nagiosharder mute aux1/http
255
+ nagiosharder disable_notifications aux1/http
256
+
257
+ nagiosharder unmute aux1
258
+ nagiosharder unmute aux1/http
259
+ nagiosharder enable_notifications aux1/http
260
+
261
+ nagiosharder check aux1/http
262
+
263
+ nagiosharder downtime aux1 15
264
+ nagiosharder downtime aux1/http 15
265
+
266
+ nagiosharder problems
267
+ nagiosharder problems http-services
268
+
269
+ nagiosharder acknowledged
270
+ nagiosharder acked http-services
271
+
272
+ nagiosharder muted
273
+ nagiosharder muted http-services
274
+
275
+ nagiosharder triage
276
+ nagiosharder unhandled
277
+ nagiosharder unhandled http-services
278
+ HELP
279
+ end
280
+ end
281
+ end
@@ -0,0 +1,140 @@
1
+ module Nagiosharder
2
+ module Filters
3
+
4
+ # irb> Nagiosharder::Filters.value(:host)
5
+ # => 0
6
+ # irb> Nagiosharder::Filters.value(:host, :state_acknowledged)
7
+ # => 4
8
+ # irb> Nagiosharder::Filters.value(:host, :state_acknowledged, :checks_disabled)
9
+ # => 20
10
+ def self.value(type, *args)
11
+ args.each.inject(0) do |i, arg|
12
+ begin
13
+ i += const_get("#{type}_#{arg}".upcase)
14
+ rescue NameError
15
+ i
16
+ end
17
+ end
18
+ end
19
+
20
+ #/********************* EXTENDED INFO CGI DISPLAY TYPES *********************/
21
+
22
+ DISPLAY_PROCESS_INFO=0
23
+ DISPLAY_HOST_INFO=1
24
+ DISPLAY_SERVICE_INFO=2
25
+ DISPLAY_COMMENTS=3
26
+ DISPLAY_PERFORMANCE=4
27
+ DISPLAY_HOSTGROUP_INFO=5
28
+ DISPLAY_DOWNTIME=6
29
+ DISPLAY_SCHEDULING_QUEUE=7
30
+ DISPLAY_SERVICEGROUP_INFO=8
31
+
32
+
33
+ #/************************ COMMAND CGI COMMAND MODES *************************/
34
+
35
+ CMDMODE_NONE=0
36
+ CMDMODE_REQUEST=1
37
+ CMDMODE_COMMIT=2
38
+
39
+
40
+
41
+ #/******************** HOST AND SERVICE NOTIFICATION TYPES ******************/
42
+
43
+ NOTIFICATION_ALL=0 #/* all service and host notifications */
44
+ NOTIFICATION_SERVICE_ALL=1 #/* all types of service notifications */
45
+ NOTIFICATION_HOST_ALL=2 #/* all types of host notifications */
46
+ NOTIFICATION_SERVICE_WARNING=4
47
+ NOTIFICATION_SERVICE_UNKNOWN=8
48
+ NOTIFICATION_SERVICE_CRITICAL=16
49
+ NOTIFICATION_SERVICE_RECOVERY=32
50
+ NOTIFICATION_HOST_DOWN=64
51
+ NOTIFICATION_HOST_UNREACHABLE=128
52
+ NOTIFICATION_HOST_RECOVERY=256
53
+ NOTIFICATION_SERVICE_ACK=512
54
+ NOTIFICATION_HOST_ACK=1024
55
+ NOTIFICATION_SERVICE_FLAP=2048
56
+ NOTIFICATION_HOST_FLAP=4096
57
+ NOTIFICATION_SERVICE_CUSTOM=8192
58
+ NOTIFICATION_HOST_CUSTOM=16384
59
+
60
+
61
+ #/********************** HOST AND SERVICE ALERT TYPES **********************/
62
+
63
+ HISTORY_ALL=0 #/* all service and host alert */
64
+ HISTORY_SERVICE_ALL=1 #/* all types of service alerts */
65
+ HISTORY_HOST_ALL=2 #/* all types of host alerts */
66
+ HISTORY_SERVICE_WARNING=4
67
+ HISTORY_SERVICE_UNKNOWN=8
68
+ HISTORY_SERVICE_CRITICAL=16
69
+ HISTORY_SERVICE_RECOVERY=32
70
+ HISTORY_HOST_DOWN=64
71
+ HISTORY_HOST_UNREACHABLE=128
72
+ HISTORY_HOST_RECOVERY=256
73
+
74
+
75
+ #/****************************** SORT TYPES *******************************/
76
+
77
+ SORT_NONE=0
78
+ SORT_ASCENDING=1
79
+ SORT_DESCENDING=2
80
+
81
+
82
+ #/***************************** SORT OPTIONS ******************************/
83
+
84
+ SORT_NOTHING=0
85
+ SORT_HOSTNAME=1
86
+ SORT_SERVICENAME=2
87
+ SORT_SERVICESTATUS=3
88
+ SORT_LASTCHECKTIME=4
89
+ SORT_CURRENTATTEMPT=5
90
+ SORT_STATEDURATION=6
91
+ SORT_NEXTCHECKTIME=7
92
+ SORT_HOSTSTATUS=8
93
+ SORT_HOSTURGENCY=9
94
+
95
+
96
+ #/****************** HOST AND SERVICE FILTER PROPERTIES *******************/
97
+
98
+ HOST_SCHEDULED_DOWNTIME=1
99
+ HOST_NO_SCHEDULED_DOWNTIME=2
100
+ HOST_STATE_ACKNOWLEDGED=4
101
+ HOST_STATE_UNACKNOWLEDGED=8
102
+ HOST_CHECKS_DISABLED=16
103
+ HOST_CHECKS_ENABLED=32
104
+ HOST_EVENT_HANDLER_DISABLED=64
105
+ HOST_EVENT_HANDLER_ENABLED=128
106
+ HOST_FLAP_DETECTION_DISABLED=256
107
+ HOST_FLAP_DETECTION_ENABLED=512
108
+ HOST_IS_FLAPPING=1024
109
+ HOST_IS_NOT_FLAPPING=2048
110
+ HOST_NOTIFICATIONS_DISABLED=4096
111
+ HOST_NOTIFICATIONS_ENABLED=8192
112
+ HOST_PASSIVE_CHECKS_DISABLED=16384
113
+ HOST_PASSIVE_CHECKS_ENABLED=32768
114
+ HOST_PASSIVE_CHECK=65536
115
+ HOST_ACTIVE_CHECK=131072
116
+ HOST_HARD_STATE=262144
117
+ HOST_SOFT_STATE=524288
118
+
119
+ SERVICE_SCHEDULED_DOWNTIME=1
120
+ SERVICE_NO_SCHEDULED_DOWNTIME=2
121
+ SERVICE_STATE_ACKNOWLEDGED=4
122
+ SERVICE_STATE_UNACKNOWLEDGED=8
123
+ SERVICE_CHECKS_DISABLED=16
124
+ SERVICE_CHECKS_ENABLED=32
125
+ SERVICE_EVENT_HANDLER_DISABLED=64
126
+ SERVICE_EVENT_HANDLER_ENABLED=128
127
+ SERVICE_FLAP_DETECTION_ENABLED=256
128
+ SERVICE_FLAP_DETECTION_DISABLED=512
129
+ SERVICE_IS_FLAPPING=1024
130
+ SERVICE_IS_NOT_FLAPPING=2048
131
+ SERVICE_NOTIFICATIONS_DISABLED=4096
132
+ SERVICE_NOTIFICATIONS_ENABLED=8192
133
+ SERVICE_PASSIVE_CHECKS_DISABLED=16384
134
+ SERVICE_PASSIVE_CHECKS_ENABLED=32768
135
+ SERVICE_PASSIVE_CHECK=65536
136
+ SERVICE_ACTIVE_CHECK=131072
137
+ SERVICE_HARD_STATE=262144
138
+ SERVICE_SOFT_STATE=524288
139
+ end
140
+ end
data/nagiosharder.gemspec CHANGED
@@ -1,66 +1,29 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
1
  # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
5
3
 
6
4
  Gem::Specification.new do |s|
7
- s.name = %q{nagiosharder}
8
- s.version = "0.3.0"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Joshua Nichols"]
12
- s.date = %q{2011-05-05}
5
+ s.name = "nagiosharder"
6
+ s.version = "0.4.0.rc1"
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["Josh Nichols", "Jesse Newland"]
9
+ s.email = ["josh@technicalpickles.com", "jesse@github.com"]
10
+ s.homepage = "http://github.com/railsmachine/nagiosharder"
11
+ s.summary = %q{Nagios access at your ruby fingertips}
13
12
  s.description = %q{Nagios access at your ruby fingertips}
14
- s.email = %q{josh@technicalpickles.com}
15
- s.extra_rdoc_files = [
16
- "LICENSE",
17
- "README.rdoc"
18
- ]
19
- s.files = [
20
- ".document",
21
- "LICENSE",
22
- "README.rdoc",
23
- "Rakefile",
24
- "lib/nagiosharder.rb",
25
- "nagiosharder.gemspec",
26
- "spec/nagiosharder_spec.rb",
27
- "spec/spec.opts",
28
- "spec/spec_helper.rb"
29
- ]
30
- s.homepage = %q{http://github.com/railsmachine/nagiosharder}
31
- s.require_paths = ["lib"]
32
- s.rubygems_version = %q{1.4.2}
33
- s.summary = %q{Nagios access at your ruby fingertips}
34
- s.test_files = [
35
- "spec/nagiosharder_spec.rb",
36
- "spec/spec_helper.rb"
37
- ]
38
13
 
39
- if s.respond_to? :specification_version then
40
- s.specification_version = 3
14
+ s.rubyforge_project = "nagiosharder"
41
15
 
42
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
43
- s.add_runtime_dependency(%q<rest-client>, ["~> 1.6.1"])
44
- s.add_runtime_dependency(%q<nokogiri>, ["~> 1.4.3"])
45
- s.add_runtime_dependency(%q<activesupport>, [">= 0"])
46
- s.add_runtime_dependency(%q<httparty>, ["~> 0.6.1"])
47
- s.add_runtime_dependency(%q<hashie>, ["~> 1.0.0"])
48
- s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
49
- else
50
- s.add_dependency(%q<rest-client>, ["~> 1.6.1"])
51
- s.add_dependency(%q<nokogiri>, ["~> 1.4.3"])
52
- s.add_dependency(%q<activesupport>, [">= 0"])
53
- s.add_dependency(%q<httparty>, ["~> 0.6.1"])
54
- s.add_dependency(%q<hashie>, ["~> 1.0.0"])
55
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
56
- end
57
- else
58
- s.add_dependency(%q<rest-client>, ["~> 1.6.1"])
59
- s.add_dependency(%q<nokogiri>, ["~> 1.4.3"])
60
- s.add_dependency(%q<activesupport>, [">= 0"])
61
- s.add_dependency(%q<httparty>, ["~> 0.6.1"])
62
- s.add_dependency(%q<hashie>, ["~> 1.0.0"])
63
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
64
- end
65
- end
16
+ s.add_dependency 'rest-client', '~> 1.6.1'
17
+ s.add_dependency 'nokogiri'
18
+ s.add_dependency 'activesupport'
19
+ s.add_dependency 'i18n'
20
+ s.add_dependency 'terminal-table'
21
+ s.add_dependency 'httparty', '~> 0.8.3'
22
+ s.add_dependency 'hashie', '~> 1.2.0'
23
+ s.add_development_dependency "rspec", ">= 1.2.9"
66
24
 
25
+ s.files = `git ls-files`.split("\n")
26
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
27
+ s.executables = ['nagiosharder']
28
+ s.require_paths = ["lib"]
29
+ end