nagios-api-client 0.4
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 +4 -0
- data/.irbrc +4 -0
- data/Gemfile +6 -0
- data/README.md +82 -0
- data/Rakefile +1 -0
- data/lib/nagios.rb +6 -0
- data/lib/nagios/api.rb +15 -0
- data/lib/nagios/api/client.rb +30 -0
- data/lib/nagios/api/downtime.rb +28 -0
- data/lib/nagios/api/host.rb +47 -0
- data/lib/nagios/api/interface.rb +78 -0
- data/lib/nagios/api/resource.rb +38 -0
- data/lib/nagios/api/service.rb +88 -0
- data/lib/nagios/api/state.rb +17 -0
- data/lib/nagios/api/version.rb +5 -0
- data/nagios-api-client.gemspec +25 -0
- metadata +96 -0
data/.gitignore
ADDED
data/.irbrc
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
Ruby Nagios API Client
|
2
|
+
========
|
3
|
+
|
4
|
+
A ruby gem used to interact with the nagios-api (REST interface to Nagios) server:
|
5
|
+
|
6
|
+
https://github.com/xb95/nagios-api
|
7
|
+
|
8
|
+
Install
|
9
|
+
-------
|
10
|
+
|
11
|
+
gem install nagios-api-client
|
12
|
+
|
13
|
+
If you are using bundler, add this to your Gemfile:
|
14
|
+
|
15
|
+
gem "nagios-api-client", require: 'nagios/api'
|
16
|
+
|
17
|
+
If not using bundler:
|
18
|
+
|
19
|
+
require 'rubygems'
|
20
|
+
require 'nagios/api'
|
21
|
+
|
22
|
+
Examples
|
23
|
+
------
|
24
|
+
|
25
|
+
# Create a new client to interact with the nagios-api server.
|
26
|
+
client = Nagios::API::Client.new("http://nagios-server:8181")
|
27
|
+
|
28
|
+
# Optionally set authentication credentials
|
29
|
+
client = Nagios::API::Client.new("http://nagios-server:8181", user: 'user', password: 'password')
|
30
|
+
|
31
|
+
# Find a host
|
32
|
+
host = client.hosts.find("hostname")
|
33
|
+
|
34
|
+
# Find a service on the host
|
35
|
+
service = host.services.find("servicename")
|
36
|
+
|
37
|
+
# Check the status
|
38
|
+
puts service.status
|
39
|
+
|
40
|
+
# Check the status details
|
41
|
+
puts service.status_details
|
42
|
+
|
43
|
+
# Schedule downtime
|
44
|
+
service.schedule_downtime(
|
45
|
+
author: "User 1",
|
46
|
+
comment: "This is flexible downtime",
|
47
|
+
start_time: Time.now,
|
48
|
+
fixed: false,
|
49
|
+
duration: 3600,
|
50
|
+
end_time: Time.now + 14400
|
51
|
+
)
|
52
|
+
|
53
|
+
Author
|
54
|
+
------
|
55
|
+
|
56
|
+
Philippe Green <phil@greenviewdata.com>
|
57
|
+
Greenview Data, Inc.
|
58
|
+
|
59
|
+
License
|
60
|
+
-------
|
61
|
+
|
62
|
+
The MIT License (MIT)
|
63
|
+
|
64
|
+
Copyright (c) 2014 Greenview Data, Inc.
|
65
|
+
|
66
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
67
|
+
of this software and associated documentation files (the "Software"), to deal
|
68
|
+
in the Software without restriction, including without limitation the rights
|
69
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
70
|
+
copies of the Software, and to permit persons to whom the Software is
|
71
|
+
furnished to do so, subject to the following conditions:
|
72
|
+
|
73
|
+
The above copyright notice and this permission notice shall be included in all
|
74
|
+
copies or substantial portions of the Software.
|
75
|
+
|
76
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
77
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
78
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
79
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
80
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
81
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
82
|
+
SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/nagios.rb
ADDED
data/lib/nagios/api.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'nagios/api/version'
|
2
|
+
|
3
|
+
module Nagios
|
4
|
+
module API
|
5
|
+
autoload :Interface, 'nagios/api/interface'
|
6
|
+
autoload :Client, 'nagios/api/client'
|
7
|
+
autoload :Service, 'nagios/api/service'
|
8
|
+
autoload :Services, 'nagios/api/service'
|
9
|
+
autoload :State, 'nagios/api/state'
|
10
|
+
autoload :Host, 'nagios/api/host'
|
11
|
+
autoload :Hosts, 'nagios/api/host'
|
12
|
+
autoload :Resource, 'nagios/api/resource'
|
13
|
+
autoload :Downtime, 'nagios/api/downtime'
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Nagios::API
|
2
|
+
# Create a new client to interact with the nagios-api server.
|
3
|
+
#
|
4
|
+
# client = Nagios::API::Client.new("http://nagios-server:8181")
|
5
|
+
#
|
6
|
+
# Optionally set authentication credentials
|
7
|
+
#
|
8
|
+
# client = Nagios::API::Client.new("http://nagios-server:8181", user: 'user', password: 'password')
|
9
|
+
#
|
10
|
+
class Client
|
11
|
+
attr_reader :base_url, :options, :state
|
12
|
+
|
13
|
+
def initialize(base_url, extra_args = {})
|
14
|
+
@base_url = base_url
|
15
|
+
@options = extra_args
|
16
|
+
end
|
17
|
+
|
18
|
+
def api
|
19
|
+
@api ||= Nagios::API::Interface.new(options.merge(base_url: base_url))
|
20
|
+
end
|
21
|
+
|
22
|
+
def hosts
|
23
|
+
@hosts ||= Nagios::API::Hosts.new(api_client: self)
|
24
|
+
end
|
25
|
+
|
26
|
+
def state
|
27
|
+
@state ||= Nagios::API::State.new(api_client: self)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Nagios::API
|
2
|
+
class Downtime < Nagios::API::Resource
|
3
|
+
attr_reader :api_client, :service, :host
|
4
|
+
|
5
|
+
def initialize(args = {})
|
6
|
+
@service = args.delete(:service)
|
7
|
+
@host = args.delete(:host)
|
8
|
+
|
9
|
+
args['end_time'] = Time.at(args['end_time'].to_i)
|
10
|
+
args['start_time'] = Time.at(args['start_time'].to_i)
|
11
|
+
args['created_at'] = Time.at(args['entry_time'].to_i)
|
12
|
+
|
13
|
+
super(args)
|
14
|
+
end
|
15
|
+
|
16
|
+
def id
|
17
|
+
downtime_id
|
18
|
+
end
|
19
|
+
|
20
|
+
def cancel
|
21
|
+
result = api_client.api.post("/cancel_downtime/#{id}", {})
|
22
|
+
|
23
|
+
raise StandardError, "Unknown response canceling downtime: #{result}" unless result == "cancelled"
|
24
|
+
|
25
|
+
true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Nagios::API
|
2
|
+
class Hosts
|
3
|
+
attr_reader :api_client
|
4
|
+
|
5
|
+
def initialize(args = {})
|
6
|
+
@api_client = args[:api_client]
|
7
|
+
@host_cache = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def find(hostname)
|
11
|
+
return @host_cache[hostname] if @host_cache.has_key?(hostname)
|
12
|
+
|
13
|
+
host = Host.new(api_client.api.query("/host/#{hostname}").merge(api_client: api_client))
|
14
|
+
@host_cache[hostname] = host
|
15
|
+
host
|
16
|
+
end
|
17
|
+
|
18
|
+
def reload
|
19
|
+
@host_cache = {}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class Host < Nagios::API::Resource
|
24
|
+
def services
|
25
|
+
@services ||= Nagios::API::Services.new(api_client: api_client, host: self)
|
26
|
+
end
|
27
|
+
|
28
|
+
def name
|
29
|
+
host_name
|
30
|
+
end
|
31
|
+
|
32
|
+
def state
|
33
|
+
api_client.state.for_host(name)
|
34
|
+
end
|
35
|
+
|
36
|
+
def schedule_downtime
|
37
|
+
# host
|
38
|
+
# author
|
39
|
+
# comment
|
40
|
+
# start_time
|
41
|
+
# fixed
|
42
|
+
# duration
|
43
|
+
# end_time
|
44
|
+
# services_too
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'curb-fu'
|
3
|
+
|
4
|
+
module Nagios::API
|
5
|
+
class Interface
|
6
|
+
class HTTPError < StandardError; end
|
7
|
+
class BackendAPIError < StandardError; end
|
8
|
+
|
9
|
+
attr_accessor :base_url, :username, :password, :use_cache
|
10
|
+
|
11
|
+
def initialize(args = {})
|
12
|
+
@base_url = args[:base_url]
|
13
|
+
@username = args[:username]
|
14
|
+
@password = args[:password]
|
15
|
+
@use_cache = args[:use_cache]
|
16
|
+
end
|
17
|
+
|
18
|
+
def query(path)
|
19
|
+
result = query_from_api(path)
|
20
|
+
|
21
|
+
return result unless use_cache
|
22
|
+
save_to_cache(path, result) if result
|
23
|
+
result ||= query_from_cache(path)
|
24
|
+
end
|
25
|
+
|
26
|
+
def memcached
|
27
|
+
@memcached ||= Memcached.new("localhost:11211")
|
28
|
+
end
|
29
|
+
|
30
|
+
def save_to_cache(path, data)
|
31
|
+
memcached.set path, data, 0
|
32
|
+
end
|
33
|
+
|
34
|
+
def query_from_cache(path)
|
35
|
+
memcached.get(path) rescue nil
|
36
|
+
end
|
37
|
+
|
38
|
+
def authentication_options
|
39
|
+
!username.nil? ? { username: username, password: password } : {}
|
40
|
+
end
|
41
|
+
|
42
|
+
def post(path, params)
|
43
|
+
args = { url: base_url + path, headers: { 'Accept' => 'application/json', 'Content-Type' => 'application/json' } }
|
44
|
+
args.merge!(authentication_options)
|
45
|
+
result = CurbFu.post(args, params.to_json)
|
46
|
+
|
47
|
+
if result.success?
|
48
|
+
data = JSON.parse(result.body)
|
49
|
+
|
50
|
+
if data['success']
|
51
|
+
return data['content']
|
52
|
+
else
|
53
|
+
raise BackendAPIError, data['content']
|
54
|
+
end
|
55
|
+
else
|
56
|
+
raise HTTPError, "Error communicating with API server: #{result.status}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def query_from_api(path)
|
61
|
+
args = { url: base_url + path, headers: { Accept: 'application/json' } }
|
62
|
+
args.merge!(authentication_options)
|
63
|
+
result = CurbFu.get(args)
|
64
|
+
|
65
|
+
if result.success?
|
66
|
+
data = JSON.parse(result.body)
|
67
|
+
|
68
|
+
if data['success']
|
69
|
+
return data['content']
|
70
|
+
else
|
71
|
+
raise BackendAPIError
|
72
|
+
end
|
73
|
+
else
|
74
|
+
raise HTTPError, "Error communicating with API server: #{result.status}"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Nagios::API
|
2
|
+
class Resource
|
3
|
+
attr_reader :api_client
|
4
|
+
attr_accessor :attributes
|
5
|
+
|
6
|
+
def initialize(args = {})
|
7
|
+
@api_client = args.delete(:api_client)
|
8
|
+
@attributes = {}
|
9
|
+
self.attributes = args
|
10
|
+
end
|
11
|
+
|
12
|
+
def attributes=(args = {})
|
13
|
+
args ||= {}
|
14
|
+
args.each do |key, value|
|
15
|
+
self.send(:"#{key}=", value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def method_missing(meth, *args, &block)
|
20
|
+
if meth.to_s =~ /^(.+)=$/
|
21
|
+
@attributes[$1.to_sym] = args[0]
|
22
|
+
elsif @attributes.has_key?(meth)
|
23
|
+
@attributes[meth]
|
24
|
+
else
|
25
|
+
super # You *must* call super if you don't handle the
|
26
|
+
# method, otherwise you'll mess up Ruby's method
|
27
|
+
# lookup.
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_hash(options = {})
|
32
|
+
hash = attributes
|
33
|
+
hash.reject! { |key, value| options[:except].include?(key.to_sym) || options[:except].include?(key.to_s) } if options[:except]
|
34
|
+
hash.reject! { |key, value| !options[:only].include?(key.to_sym) && !options[:only].include?(key.to_s) } if options[:only]
|
35
|
+
hash
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Nagios::API
|
2
|
+
class Services
|
3
|
+
class NoHost < StandardError; end
|
4
|
+
|
5
|
+
attr_reader :api_client
|
6
|
+
attr_accessor :host
|
7
|
+
|
8
|
+
def initialize(args = {})
|
9
|
+
@api_client = args[:api_client]
|
10
|
+
@host = args[:host]
|
11
|
+
end
|
12
|
+
|
13
|
+
def all
|
14
|
+
raise NoHost unless host
|
15
|
+
|
16
|
+
@services ||= api_client.api.query("/service/#{host.name}").values.collect do |service_attributes|
|
17
|
+
Service.new(service_attributes.merge(api_client: api_client, host: host))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def find(name)
|
22
|
+
raise NoHost unless host
|
23
|
+
|
24
|
+
all.find { |service| service.name.downcase == name.downcase }
|
25
|
+
end
|
26
|
+
|
27
|
+
def reload
|
28
|
+
@services = nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Service < Nagios::API::Resource
|
33
|
+
def name
|
34
|
+
service
|
35
|
+
end
|
36
|
+
|
37
|
+
def state
|
38
|
+
return nil unless host
|
39
|
+
|
40
|
+
host.state['services'][name]
|
41
|
+
end
|
42
|
+
|
43
|
+
def downtimes
|
44
|
+
return nil unless state
|
45
|
+
|
46
|
+
dts = state['downtimes'] ? state['downtimes'].values : []
|
47
|
+
dts.collect { |dt| Nagios::API::Downtime.new(dt.merge(service: self, api_client: api_client)) }
|
48
|
+
end
|
49
|
+
|
50
|
+
# schedule_downtime arguments:
|
51
|
+
# author
|
52
|
+
# comment
|
53
|
+
# start_time
|
54
|
+
# fixed
|
55
|
+
# duration
|
56
|
+
# end_time
|
57
|
+
def schedule_downtime(params = {})
|
58
|
+
params = params.dup
|
59
|
+
params[:host] = host.name
|
60
|
+
params[:service] = name
|
61
|
+
params[:start_time] = params[:start_time].to_i if params[:start_time]
|
62
|
+
params[:end_time] = params[:end_time].to_i if params[:end_time]
|
63
|
+
|
64
|
+
result = api_client.api.post("/schedule_downtime", params)
|
65
|
+
|
66
|
+
raise StandardError, "Unknown response scheduling downtime: #{result}" unless result == "scheduled"
|
67
|
+
|
68
|
+
true
|
69
|
+
end
|
70
|
+
|
71
|
+
def status
|
72
|
+
case current_state.to_i
|
73
|
+
when 0
|
74
|
+
:ok
|
75
|
+
when 1
|
76
|
+
:warning
|
77
|
+
when 2
|
78
|
+
:critical
|
79
|
+
else
|
80
|
+
:unknown
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def status_details
|
85
|
+
plugin_output
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Nagios::API
|
2
|
+
class State < Nagios::API::Resource
|
3
|
+
def initialize(args = {})
|
4
|
+
super
|
5
|
+
|
6
|
+
reload
|
7
|
+
end
|
8
|
+
|
9
|
+
def reload
|
10
|
+
self.attributes = { :data => api_client.api.query("/state") }
|
11
|
+
end
|
12
|
+
|
13
|
+
def for_host(hostname)
|
14
|
+
data[hostname]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "nagios/api/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "nagios-api-client"
|
7
|
+
s.version = Nagios::API::VERSION
|
8
|
+
s.author = "Philippe Green, Greenview Data, Inc."
|
9
|
+
s.email = ["development@greenviewdata.com"]
|
10
|
+
s.homepage = "https://github.com/gdi/ruby-nagios-api-client"
|
11
|
+
s.license = "MIT"
|
12
|
+
s.summary = %q{Interface to interact with the nagios-api server}
|
13
|
+
s.description = %q{Interact with the nagios-api (REST interface to Nagios) server found at github.com/xb95/nagios-api}
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- spec/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.required_ruby_version = '>= 1.9.2'
|
21
|
+
|
22
|
+
s.add_runtime_dependency "curb-fu"
|
23
|
+
|
24
|
+
s.add_development_dependency "rspec"
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nagios-api-client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.4'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Philippe Green, Greenview Data, Inc.
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-03-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: curb-fu
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: Interact with the nagios-api (REST interface to Nagios) server found
|
47
|
+
at github.com/xb95/nagios-api
|
48
|
+
email:
|
49
|
+
- development@greenviewdata.com
|
50
|
+
executables: []
|
51
|
+
extensions: []
|
52
|
+
extra_rdoc_files: []
|
53
|
+
files:
|
54
|
+
- .gitignore
|
55
|
+
- .irbrc
|
56
|
+
- Gemfile
|
57
|
+
- README.md
|
58
|
+
- Rakefile
|
59
|
+
- lib/nagios.rb
|
60
|
+
- lib/nagios/api.rb
|
61
|
+
- lib/nagios/api/client.rb
|
62
|
+
- lib/nagios/api/downtime.rb
|
63
|
+
- lib/nagios/api/host.rb
|
64
|
+
- lib/nagios/api/interface.rb
|
65
|
+
- lib/nagios/api/resource.rb
|
66
|
+
- lib/nagios/api/service.rb
|
67
|
+
- lib/nagios/api/state.rb
|
68
|
+
- lib/nagios/api/version.rb
|
69
|
+
- nagios-api-client.gemspec
|
70
|
+
homepage: https://github.com/gdi/ruby-nagios-api-client
|
71
|
+
licenses:
|
72
|
+
- MIT
|
73
|
+
post_install_message:
|
74
|
+
rdoc_options: []
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.9.2
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ! '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 1.8.25
|
92
|
+
signing_key:
|
93
|
+
specification_version: 3
|
94
|
+
summary: Interface to interact with the nagios-api server
|
95
|
+
test_files: []
|
96
|
+
has_rdoc:
|