ruby-nagios 0.0.1 → 0.0.2
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.
- data/.gitignore +1 -0
- data/README.md +92 -0
- data/bin/nagsrv +1 -2
- data/lib/nagios.rb +9 -0
- data/lib/nagios/config.rb +64 -0
- data/lib/nagios/objects.rb +189 -0
- data/ruby-nagios.gemspec +1 -1
- metadata +34 -54
- data/README +0 -5
- data/pkg/ruby-nagios-0.0.1.gem +0 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
pkg
|
data/README.md
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
What?
|
2
|
+
=====
|
3
|
+
Have you ever had to disable alerts, retry a check
|
4
|
+
or acknowledge outages on a large amount of service
|
5
|
+
with Nagios and hated the web UI for it?
|
6
|
+
|
7
|
+
This is a CLI tool and Ruby library that parses your
|
8
|
+
status log file and let you query it for information
|
9
|
+
or create external commands to be piped into the nagios
|
10
|
+
command file.
|
11
|
+
|
12
|
+
You can get this software here on GitHub or via RubyGems
|
13
|
+
as *ruby-nagios*
|
14
|
+
|
15
|
+
Using on the CLI?
|
16
|
+
=================
|
17
|
+
Find out what services match a regular expression:
|
18
|
+
|
19
|
+
nagsrv --list-services --with-service /puppet/
|
20
|
+
puppet-freshness
|
21
|
+
puppetd
|
22
|
+
puppetmaster
|
23
|
+
|
24
|
+
Find hosts with the service /puppet/:
|
25
|
+
|
26
|
+
nagsrv --list-hosts --with-service /puppet/
|
27
|
+
dev1.your.net
|
28
|
+
dev2.your.net
|
29
|
+
.
|
30
|
+
.
|
31
|
+
|
32
|
+
Disable notifications for them all on all hosts:
|
33
|
+
|
34
|
+
nagsrv.rb --disable-notify --with-service /puppet/
|
35
|
+
[1263129006] DISABLE_SVC_NOTIFICATIONS;dev1.your.net;puppet-freshness
|
36
|
+
[1263129006] DISABLE_SVC_NOTIFICATIONS;dev1.your.net;puppetd
|
37
|
+
[1263129006] DISABLE_SVC_NOTIFICATIONS;dev1.your.net;puppet-freshness
|
38
|
+
.
|
39
|
+
.
|
40
|
+
.
|
41
|
+
|
42
|
+
Only do it for hosts matching /dev2/:
|
43
|
+
|
44
|
+
nagsrv.rb --disable-notify --with-service /puppet/ --for-host /dev2/
|
45
|
+
[1263129038] DISABLE_SVC_NOTIFICATIONS;dev2.your.net;puppet-freshness
|
46
|
+
[1263129038] DISABLE_SVC_NOTIFICATIONS;dev2.your.net;puppetd
|
47
|
+
|
48
|
+
You can do ack's, force checks etc, see the help or
|
49
|
+
comments in the nagsrv.rb script. To actually get
|
50
|
+
nagios to do these actions just redirect the output
|
51
|
+
from these commands to the Nagios CMD file. On my
|
52
|
+
machine that is /var/log/nagios/rw/nagios.cmd.
|
53
|
+
|
54
|
+
Using from Ruby?
|
55
|
+
================
|
56
|
+
|
57
|
+
You can also do the same from within Ruby easily,
|
58
|
+
the library lets you search host by any property
|
59
|
+
on a service, here we'll find all hosts with
|
60
|
+
service /puppet/ on host /dev2/:
|
61
|
+
|
62
|
+
require 'rubygems'
|
63
|
+
require 'nagios/status'
|
64
|
+
nagios = Nagios::Status.new
|
65
|
+
nagios.parsestatus("status.log")
|
66
|
+
|
67
|
+
options = {:forhost => "/dev2/", :action => "${host}",
|
68
|
+
:withservice => "/puppet/"}
|
69
|
+
services = nagios.find_services(options)
|
70
|
+
|
71
|
+
puts services.join("\n")
|
72
|
+
|
73
|
+
This will in this case just print:
|
74
|
+
|
75
|
+
dev2.your.net
|
76
|
+
|
77
|
+
If you didn't specify the :action string it would
|
78
|
+
just return an array of services found. The :action
|
79
|
+
string is a template that lets you return the matches
|
80
|
+
in any format you like, here's a template to Acknowledge
|
81
|
+
services:
|
82
|
+
|
83
|
+
"[${tstamp}] ACKNOWLEDGE_SVC_PROBLEM;;${host};${service};1 \
|
84
|
+
;0;1;#{ENV['USER']};Acknowledged from CLI"
|
85
|
+
|
86
|
+
The only variables it supports now is ${host}, ${service}
|
87
|
+
and ${tstamp} we can easily add more if needed.
|
88
|
+
|
89
|
+
Contact?
|
90
|
+
========
|
91
|
+
|
92
|
+
R.I.Pienaar / rip@devco.net / @ripienaar / http://devco.net/
|
data/bin/nagsrv
CHANGED
data/lib/nagios.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
module Nagios
|
2
|
+
|
3
|
+
=begin rdoc
|
4
|
+
|
5
|
+
Configuration parser for Nagios. Constructor parses Nagios' main
|
6
|
+
config file and returns an object: each configuration option's value
|
7
|
+
assigned to an instance variable and attribute reader method is
|
8
|
+
created.
|
9
|
+
|
10
|
+
Can be used as:
|
11
|
+
|
12
|
+
require 'nagios/config'
|
13
|
+
nagios = Nagios::Config.new "lib/ruby-nagios/test/data/nagios.cfg"
|
14
|
+
|
15
|
+
nagios.log_file
|
16
|
+
=> "/var/log/nagios3/nagios.log"
|
17
|
+
|
18
|
+
nagios.status_file
|
19
|
+
=> "/var/cache/nagios3/status.dat"
|
20
|
+
|
21
|
+
|
22
|
+
=end
|
23
|
+
class Config
|
24
|
+
|
25
|
+
DEFAULT_CONFIG = "/etc/nagios*/nagios.cfg"
|
26
|
+
|
27
|
+
# Read and parse configuration file.
|
28
|
+
#
|
29
|
+
# @param [String] config_file PATH to the configuration file. If
|
30
|
+
# PATH is not provided method will look for configuration file
|
31
|
+
# +nagios.cfg+ in +/etc/nagios*+ directory.
|
32
|
+
# @note If you have more than one /etc/nagios* directories then
|
33
|
+
# only first one will be used. For example, Debian can have
|
34
|
+
# both Nagios 2 and 3 installed. In the latter case
|
35
|
+
# configuration file is +/etc/nagios3/nagios.cfg+.
|
36
|
+
# @author Dmytro Kovalov, dmytro.kovalov@gmail.com
|
37
|
+
def initialize config_file=nil
|
38
|
+
@config = config_file || Dir.glob(DEFAULT_CONFIG).first
|
39
|
+
|
40
|
+
raise "No configuration file option and no files in #{DEFAULT_CONFIG} " unless @config
|
41
|
+
raise "Configuration file #{@config} does not exist" unless File.exist? @config
|
42
|
+
raise "Configuration file #{@config} is not readable" unless File.readable? @config
|
43
|
+
|
44
|
+
File.readlines(@config).map{ |l| l.sub(/#.*$/,'')}.delete_if { |l| l=~ /^$/}.each do |l|
|
45
|
+
key,val = l.strip.split('=',2)
|
46
|
+
raise "Incorrect configuration line #{l}" unless key && val
|
47
|
+
|
48
|
+
case key
|
49
|
+
when /cfg_(file|dir)/ # There could be multiple entries for cfg_dir/file
|
50
|
+
instance_variable_set("@#{key}", (instance_variable_get("@#{key}") || []) << val )
|
51
|
+
else
|
52
|
+
instance_variable_set("@#{key}", val)
|
53
|
+
instance_eval val =~ /^[\d\.-]+/ ?
|
54
|
+
"def #{key}; return #{val}; end" :
|
55
|
+
"def #{key}; return %Q{#{val}}; end"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Special case for cfg_file and cfg_dir: they are Arrays
|
61
|
+
attr_reader :cfg_file, :cfg_dir
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,189 @@
|
|
1
|
+
module Nagios
|
2
|
+
|
3
|
+
=begin rdoc
|
4
|
+
|
5
|
+
= DESCRIPTION
|
6
|
+
|
7
|
+
Nagios::Objects -- class for parsing Nagios' objects.cache
|
8
|
+
file. Objects.cache file keeps information about lists of objects
|
9
|
+
being monitored by Nagios. It is created by Nagios process on
|
10
|
+
(re)start. Since it is machine-generated file syntax should not vary
|
11
|
+
from file to file.
|
12
|
+
|
13
|
+
Class implements 2 methods at the time of writing:
|
14
|
+
* constructor - that only creates an instance and
|
15
|
+
* parse method - that does actual parsing and populates instance variable @objects
|
16
|
+
|
17
|
+
= SYNOPSIS
|
18
|
+
|
19
|
+
require 'nagios/objects'
|
20
|
+
|
21
|
+
nagios = Nagios::Objects.new("test/objects.cache").new.parse
|
22
|
+
print nagios.objects[:contactgroup]
|
23
|
+
|
24
|
+
== Files
|
25
|
+
|
26
|
+
Location of objects.cache file depends on Nagios configuration (in
|
27
|
+
many cases varies from one UNIX/Linux ditribution to another) and is
|
28
|
+
defined by directive in nagios.cfg file.
|
29
|
+
|
30
|
+
On Debian system objects.cache it is in
|
31
|
+
/var/cache/nagios3/objects.cache:
|
32
|
+
|
33
|
+
object_cache_file=/var/cache/nagios3/objects.cache
|
34
|
+
|
35
|
+
== Parsed data hash
|
36
|
+
|
37
|
+
irb(main):010:0> pp nagios.objects
|
38
|
+
{:timeperiod=>
|
39
|
+
{"24x7"=>
|
40
|
+
{:timeperiod_name=>"24x7",
|
41
|
+
:alias=>"24 Hours A Day, 7 Days A Week",
|
42
|
+
:sunday=>"00:00-24:00",
|
43
|
+
:monday=>"00:00-24:00",
|
44
|
+
:tuesday=>"00:00-24:00",
|
45
|
+
:wednesday=>"00:00-24:00",
|
46
|
+
:thursday=>"00:00-24:00",
|
47
|
+
:friday=>"00:00-24:00",
|
48
|
+
:saturday=>"00:00-24:00"},
|
49
|
+
"never"=>{:timeperiod_name=>"never", :alias=>"Never"},
|
50
|
+
|
51
|
+
= Author
|
52
|
+
|
53
|
+
Dmytro Kovalov, dmytro.kovalov@gmail.com
|
54
|
+
2011, Dec, 27 - First working version
|
55
|
+
|
56
|
+
=end
|
57
|
+
|
58
|
+
class Objects
|
59
|
+
|
60
|
+
# @param [String] path UNIX path to the objects.cache file
|
61
|
+
# @see Nagios::Objects.parse
|
62
|
+
def initialize path
|
63
|
+
raise "File does not exist" unless File.exist? path
|
64
|
+
raise "File is not readable" unless File.readable? path
|
65
|
+
@objects_file = path
|
66
|
+
@objects = {}
|
67
|
+
end
|
68
|
+
|
69
|
+
# PATH to the objects.cache file
|
70
|
+
attr_accessor :objects_file
|
71
|
+
|
72
|
+
# Parsed objects
|
73
|
+
attr_accessor :objects
|
74
|
+
|
75
|
+
|
76
|
+
=begin rdoc
|
77
|
+
|
78
|
+
Read objects.cache file and parse it.
|
79
|
+
|
80
|
+
Method reads file by blocks. Each block defines one object, definition
|
81
|
+
starts with 'define <type> {' and ends with '}'. Each block has a
|
82
|
+
'<type>_name' line which defines name of the instance of the
|
83
|
+
object.
|
84
|
+
|
85
|
+
Code of the 'parse()' method assumes, that _name line is always first
|
86
|
+
in the block! This can be not always the case.
|
87
|
+
|
88
|
+
Example of a block:
|
89
|
+
|
90
|
+
define contactgroup {
|
91
|
+
contactgroup_name admins
|
92
|
+
alias Nagios Administrators
|
93
|
+
members root
|
94
|
+
}
|
95
|
+
|
96
|
+
Example of a parsed object:
|
97
|
+
|
98
|
+
nagios.objects[:contactgroup]
|
99
|
+
=> {"admins"=>{:contactgroup_name=>"admins", :alias=>"Nagios Administrators", :members=>"root"}}
|
100
|
+
|
101
|
+
nagios.contactgroup
|
102
|
+
=> {"admins"=>{:contactgroup_name=>"admins", :alias=>"Nagios Administrators", :members=>"root"}}
|
103
|
+
|
104
|
+
=== Convenience methods
|
105
|
+
|
106
|
+
Method parse creates helper methods for every type of object after
|
107
|
+
parsing. Same property can be accessed either using Hash @objects
|
108
|
+
(i.e. nagios.objects[:host]) or convenience method: nagios.host.
|
109
|
+
|
110
|
+
=end
|
111
|
+
def parse
|
112
|
+
block = {}
|
113
|
+
content = File.readlines objects_file
|
114
|
+
handler = nil
|
115
|
+
content.each do |line|
|
116
|
+
case
|
117
|
+
when line =~ /^\s*$/ then next # Skip empty lines
|
118
|
+
when line =~ /^\s*#/ then next # Skip comments
|
119
|
+
when line =~ /(\w+) \{/ # Block starts as "define host {"
|
120
|
+
block = {}
|
121
|
+
handler = $1.to_sym
|
122
|
+
when line =~ /\}/ # End of block
|
123
|
+
#
|
124
|
+
# Process it. Each block type has line <type>_name in the definition: host_name, command_name
|
125
|
+
#
|
126
|
+
@objects[handler] ||= {}
|
127
|
+
@objects[handler][block["#{handler.to_s}_name".to_sym]] = block
|
128
|
+
block = { }
|
129
|
+
when line =~ /^\s*(\w+)\s+([^\{\}]+)$/ # Build Hash from key-value pairs like: "max_check_attempts 10"
|
130
|
+
block[$1.to_sym] = $2.strip
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# Create instance methods for easy access to properties
|
135
|
+
@objects.each do |key,val|
|
136
|
+
instance_variable_set("@#{key}", val)
|
137
|
+
instance_eval "def #{key}; return #{val}; end"
|
138
|
+
end
|
139
|
+
self
|
140
|
+
end
|
141
|
+
|
142
|
+
# Basic find function for resources.
|
143
|
+
# @param [Symbol] resource Resource to search from: :host, :hostgroup, etc.
|
144
|
+
# @param [Symbol] attribute Attribute to use in search. For example, find host by hostname or address, etc. anything that's defined for this resource
|
145
|
+
# @param [Symbol] message Is either 'find' or 'find_all' passed from caller. In case of 'find' returns 1 hash, 'find_all' - Array of Hash'es.
|
146
|
+
# @param [String] or [Regexp] pattern Search pattern
|
147
|
+
|
148
|
+
def find resource, message, attribute, pattern
|
149
|
+
self.send(resource.to_sym).values.send(message) do |a|
|
150
|
+
case pattern
|
151
|
+
when String
|
152
|
+
a[attribute.to_sym] == pattern
|
153
|
+
when Regexp
|
154
|
+
a[attribute.to_sym] =~ pattern
|
155
|
+
else
|
156
|
+
raise 'Unknown pattern for search'
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
# Replace standard +method_missing+ with dynamic search methods. Calls internally self.find.
|
163
|
+
#
|
164
|
+
# @see find
|
165
|
+
#
|
166
|
+
# @param [Symbol] sym Should be in the form
|
167
|
+
# find(_all)?_<resource>_by_<attribute>. Similar to
|
168
|
+
# ActiveResource find_* dynamic methods. Depending on the name
|
169
|
+
# of the mthod called (find or find_all) will pass message to
|
170
|
+
# self.find method, that will call {Array.find} or
|
171
|
+
# {Array.find_all} accordingly.
|
172
|
+
#
|
173
|
+
# find_*_by and find_all_*. find_all returns Array of
|
174
|
+
# hashes.
|
175
|
+
|
176
|
+
def method_missing sym, *args, &block
|
177
|
+
raise(NoMethodError, "No such method #{sym.to_s} for #{self.class}") unless sym.to_s =~ /^(find(_all)?)_(.*)_by_(.*)$/
|
178
|
+
# message - either 'find' of 'find_all'
|
179
|
+
# resource - type of objects to search: host, hostgroup etc.
|
180
|
+
# attribute - name of the attribute to do search by: :host_name, :check_command
|
181
|
+
# @param *args String or Regexp to search objects
|
182
|
+
message,resource,attribute = $1, $3, $4
|
183
|
+
|
184
|
+
self.find resource,message,attribute,args[0]
|
185
|
+
end
|
186
|
+
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
data/ruby-nagios.gemspec
CHANGED
metadata
CHANGED
@@ -1,88 +1,68 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-nagios
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 1
|
10
|
-
version: 0.0.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- R.I.Pienaar
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-07-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: rake
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &4747960 !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
33
22
|
type: :development
|
34
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *4747960
|
35
25
|
description: Manage alerts, checks and acks in bulk
|
36
26
|
email: rip@devco.net
|
37
|
-
executables:
|
27
|
+
executables:
|
38
28
|
- check_check
|
39
29
|
- nagsrv
|
40
30
|
extensions: []
|
41
|
-
|
42
31
|
extra_rdoc_files: []
|
43
|
-
|
44
|
-
|
32
|
+
files:
|
33
|
+
- .gitignore
|
45
34
|
- COPYING
|
46
|
-
- README
|
35
|
+
- README.md
|
47
36
|
- Rakefile
|
48
37
|
- bin/check_check
|
49
38
|
- bin/nagsrv
|
39
|
+
- lib/nagios.rb
|
40
|
+
- lib/nagios/config.rb
|
41
|
+
- lib/nagios/objects.rb
|
50
42
|
- lib/nagios/status.rb
|
51
|
-
- pkg/ruby-nagios-0.0.1.gem
|
52
43
|
- ruby-nagios.gemspec
|
53
|
-
has_rdoc: true
|
54
44
|
homepage: http://devco.net/
|
55
45
|
licenses: []
|
56
|
-
|
57
46
|
post_install_message:
|
58
47
|
rdoc_options: []
|
59
|
-
|
60
|
-
require_paths:
|
48
|
+
require_paths:
|
61
49
|
- lib
|
62
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
51
|
none: false
|
64
|
-
requirements:
|
65
|
-
- -
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
|
68
|
-
|
69
|
-
- 0
|
70
|
-
version: "0"
|
71
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
57
|
none: false
|
73
|
-
requirements:
|
74
|
-
- -
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
|
77
|
-
segments:
|
78
|
-
- 0
|
79
|
-
version: "0"
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
80
62
|
requirements: []
|
81
|
-
|
82
63
|
rubyforge_project:
|
83
|
-
rubygems_version: 1.
|
64
|
+
rubygems_version: 1.8.11
|
84
65
|
signing_key:
|
85
66
|
specification_version: 3
|
86
67
|
summary: Ruby library for managing Nagios
|
87
68
|
test_files: []
|
88
|
-
|
data/README
DELETED
@@ -1,5 +0,0 @@
|
|
1
|
-
Have you ever had to disable alerts, retry a check or acknowledge outages on a large amount of services with Nagios and hated the web UI for it?
|
2
|
-
|
3
|
-
This is a CLI tool and Ruby library that parses your status log file and let you query it for information or create external commands to be piped into the nagios command file.
|
4
|
-
|
5
|
-
See http://code.google.com/p/ruby-nagios/ for more information
|
data/pkg/ruby-nagios-0.0.1.gem
DELETED
Binary file
|