nagira 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +29 -23
- data/{lib → app}/app.rb +6 -7
- data/{lib/app/routes → app}/get/config.rb +0 -0
- data/{lib/app/routes → app}/get/objects.rb +0 -0
- data/{lib/app/routes → app}/get/status.rb +18 -15
- data/app/get/status/hostgroups.rb +49 -0
- data/{lib/app/routes → app}/put.rb +0 -0
- data/{lib/app/routes → app}/put/host.rb +0 -0
- data/{lib/app/routes → app}/put/status.rb +0 -0
- data/bin/nagira +3 -3
- data/config/defaults.rb +9 -10
- data/config/environment.rb +9 -10
- data/lib/nagira.rb +12 -8
- data/lib/nagira/hostgroup.rb +46 -0
- data/spec/00_configuration_spec.rb +21 -21
- data/spec/01_data_format/01_nagira_response_spec.rb +26 -26
- data/spec/01_data_format/02_0_status_spec.rb +11 -11
- data/spec/01_data_format/02_nagira_data_spec.rb +27 -27
- data/spec/01_data_format/03_api_spec.rb +12 -12
- data/spec/get/comments_spec.rb +15 -15
- data/spec/get/endpoints_spec.rb +34 -19
- data/spec/get/hostgroup.rb +79 -0
- data/spec/get/hosts_spec.rb +10 -10
- data/spec/get/services_spec.rb +8 -8
- data/spec/put/host_spec.rb +12 -12
- data/spec/put/status_spec.rb +23 -22
- data/spec/put/support.rb +24 -24
- data/spec/spec_helper.rb +3 -2
- data/version.txt +1 -1
- metadata +45 -27
data/lib/nagira.rb
CHANGED
@@ -8,16 +8,18 @@ require 'active_support/core_ext/hash/slice' # for Hash.slice
|
|
8
8
|
require 'json'
|
9
9
|
require 'yaml'
|
10
10
|
require 'sinatra'
|
11
|
+
require 'sinatra/namespace'
|
11
12
|
require 'sinatra/reloader'
|
12
13
|
|
13
14
|
$: << File.dirname(__FILE__) << File.dirname(File.dirname(__FILE__))
|
14
15
|
|
15
16
|
require 'config/defaults'
|
16
17
|
|
17
|
-
require "app/
|
18
|
-
require "app/
|
19
|
-
require "app/
|
18
|
+
require "app/get/config"
|
19
|
+
require "app/get/objects"
|
20
|
+
require "app/get/status"
|
20
21
|
|
22
|
+
require "nagira/hostgroup"
|
21
23
|
|
22
24
|
#
|
23
25
|
# environment file must go after default, some settings override
|
@@ -30,17 +32,19 @@ class Nagira < Sinatra::Base
|
|
30
32
|
|
31
33
|
VERSION = File.read(File.expand_path(File.dirname(__FILE__)) + '/../version.txt').strip
|
32
34
|
GITHUB = "http://dmytro.github.com/nagira/"
|
33
|
-
|
35
|
+
|
36
|
+
register Sinatra::Namespace
|
37
|
+
|
34
38
|
##
|
35
39
|
# When this prefix added to routes convert output to ActiveResource
|
36
40
|
# compatible format (basically Array instead of Hash).
|
37
41
|
#
|
38
42
|
AR_PREFIX = "/ar"
|
39
43
|
|
40
|
-
# Get all routes that Nagira provides.
|
41
|
-
def api
|
44
|
+
# Get all routes that Nagira provides.
|
45
|
+
def api
|
42
46
|
api = { }
|
43
|
-
|
47
|
+
|
44
48
|
param_regex = Regexp.new '\(\[\^\\\\\/\?\#\]\+\)'
|
45
49
|
Nagira.routes.keys.each do |method|
|
46
50
|
api[method] ||= []
|
@@ -50,7 +54,7 @@ class Nagira < Sinatra::Base
|
|
50
54
|
path.sub!(param_regex,":#{parm}")
|
51
55
|
end
|
52
56
|
path.gsub!('\\','')
|
53
|
-
api[method] << path unless path.empty?
|
57
|
+
api[method] << path unless path.empty?
|
54
58
|
end
|
55
59
|
end
|
56
60
|
api
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class Nagira < Sinatra::Base
|
2
|
+
class Hostgroup
|
3
|
+
attr_reader :objects, :status, :name, :hostgroup, :data
|
4
|
+
|
5
|
+
def initialize(name)
|
6
|
+
@name = name
|
7
|
+
@objects = $nagios[:objects].objects
|
8
|
+
@status = $nagios[:status].status['hosts']
|
9
|
+
@hostgroup = @objects[:hostgroup][name]
|
10
|
+
@data = { }
|
11
|
+
end
|
12
|
+
|
13
|
+
def members
|
14
|
+
hostgroup[:members].split(",")
|
15
|
+
end
|
16
|
+
|
17
|
+
# i.e. both servcie and hoststatus
|
18
|
+
def full
|
19
|
+
members.each do |hostname|
|
20
|
+
data[hostname] = @status[hostname]
|
21
|
+
end
|
22
|
+
data
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def status(mode)
|
27
|
+
members.each do |hostname|
|
28
|
+
begin
|
29
|
+
data[hostname] = @status[hostname][mode]
|
30
|
+
rescue NoMethodError
|
31
|
+
data[hostname] = { }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
data
|
35
|
+
end
|
36
|
+
|
37
|
+
def service_status
|
38
|
+
status 'servicestatus'
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def host_status
|
43
|
+
status 'hoststatus'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -1,47 +1,47 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe "Configuration" do
|
3
|
+
describe "Configuration" do
|
4
4
|
|
5
5
|
set :environment, ENV['RACK_ENV'] || :test
|
6
6
|
|
7
|
-
before {
|
7
|
+
before {
|
8
8
|
@cfg = Nagios::Config.new(Nagira.settings.nagios_cfg)
|
9
9
|
}
|
10
10
|
|
11
11
|
context "nagios.cfg" do
|
12
12
|
|
13
|
-
it { File.
|
14
|
-
|
13
|
+
it { expect(File).to exist(@cfg.path) }
|
14
|
+
|
15
15
|
it "should be parseable" do
|
16
|
-
|
16
|
+
expect { @cfg.parse }.not_to raise_error
|
17
17
|
end
|
18
18
|
|
19
|
-
context "parsing nagios.cfg file" do
|
19
|
+
context "parsing nagios.cfg file" do
|
20
20
|
|
21
21
|
before { @cfg.parse }
|
22
|
-
|
23
|
-
it "should have PATH to objects file" do
|
24
|
-
@cfg.object_cache_file.
|
22
|
+
|
23
|
+
it "should have PATH to objects file" do
|
24
|
+
expect(@cfg.object_cache_file).to be_a_kind_of String
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
it "should have PATH to status file" do
|
28
|
-
@cfg.status_file.
|
28
|
+
expect(@cfg.status_file).to be_a_kind_of String
|
29
29
|
end
|
30
30
|
|
31
31
|
end # parsing nagios.cfg file
|
32
32
|
end # nagios.cfg
|
33
|
-
|
34
|
-
context "data files" do
|
33
|
+
|
34
|
+
context "data files" do
|
35
35
|
before { @cfg.parse }
|
36
|
-
|
36
|
+
|
37
37
|
context Nagios::Status do
|
38
|
-
|
38
|
+
|
39
39
|
subject { Nagios::Status.new( Nagira.settings.status_cfg || @cfg.status_file ) }
|
40
40
|
|
41
|
-
it { File.
|
42
|
-
|
41
|
+
it { expect(File).to exist( subject.path ) }
|
42
|
+
|
43
43
|
it "should be parseable" do
|
44
|
-
|
44
|
+
expect { subject.parse }.not_to raise_error
|
45
45
|
end
|
46
46
|
end # Nagios::Status
|
47
47
|
|
@@ -50,10 +50,10 @@ describe "Configuration" do
|
|
50
50
|
|
51
51
|
subject { Nagios::Objects.new( Nagira.settings.objects_cfg || @cfg.object_cache_file) }
|
52
52
|
|
53
|
-
it { File.
|
54
|
-
|
53
|
+
it { expect(File).to exist(subject.path) }
|
54
|
+
|
55
55
|
it "should be parseable" do
|
56
|
-
|
56
|
+
expect { subject.parse }.not_to raise_error
|
57
57
|
end
|
58
58
|
end # Nagios::Objects
|
59
59
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Nagira do
|
3
|
+
describe Nagira do
|
4
4
|
|
5
5
|
set :environment, ENV['RACK_ENV'] || :test
|
6
6
|
|
7
7
|
include Rack::Test::Methods
|
8
|
-
|
8
|
+
|
9
9
|
def app
|
10
10
|
@app ||= Nagira
|
11
11
|
end
|
@@ -17,18 +17,18 @@ describe Nagira do
|
|
17
17
|
|
18
18
|
context "simple page load" do
|
19
19
|
TOP_PAGES.each do |page|
|
20
|
-
it "/#{page} should load" do
|
20
|
+
it "/#{page} should load" do
|
21
21
|
get "/#{page}"
|
22
|
-
last_response.
|
22
|
+
expect(last_response).to be_ok
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
|
26
26
|
# Check 3 different formats
|
27
27
|
FORMATS.each do |format|
|
28
|
-
|
28
|
+
|
29
29
|
it "should load '#{page}.#{format}' page" do
|
30
30
|
get "/#{page}.#{format}"
|
31
|
-
last_response.
|
31
|
+
expect(last_response).to be_ok
|
32
32
|
end
|
33
33
|
|
34
34
|
end
|
@@ -39,46 +39,46 @@ describe Nagira do
|
|
39
39
|
|
40
40
|
TOP_PAGES.each do |page|
|
41
41
|
context page do
|
42
|
-
|
42
|
+
|
43
43
|
FORMATS.each do |format|
|
44
44
|
|
45
45
|
context format do
|
46
46
|
|
47
|
-
before do
|
47
|
+
before do
|
48
48
|
get "/#{page}.#{format}"
|
49
49
|
@header = last_response.header
|
50
50
|
@body = last_response.body
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
it "Content-type: application/#{format}" do
|
54
|
-
@header['Content-Type'].
|
54
|
+
expect(@header['Content-Type']).to match(/^application\/#{format}.*/)
|
55
55
|
end
|
56
56
|
|
57
57
|
it "body should have content" do
|
58
|
-
@body.
|
58
|
+
expect(@body).to_not be_empty
|
59
59
|
end
|
60
60
|
|
61
61
|
it "#{format} should be parseable" do
|
62
62
|
case format
|
63
63
|
when 'json'
|
64
|
-
|
64
|
+
expect { JSON.parse @body }.not_to raise_error
|
65
65
|
when 'xml'
|
66
|
-
|
66
|
+
expect { Hash.from_xml @body }.not_to raise_error
|
67
67
|
when 'yaml'
|
68
|
-
|
68
|
+
expect { YAML.load @body }.not_to raise_error
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
end
|
74
|
-
|
75
|
-
context 'default format' do
|
74
|
+
|
75
|
+
context 'default format' do
|
76
76
|
it "/#{page}.#{Nagira.settings.format} response should be the same as /#{page}" do
|
77
77
|
get "/#{page}.#{Nagira.settings.format}"
|
78
78
|
a = last_response.body
|
79
|
-
get "/#{page}"
|
79
|
+
get "/#{page}"
|
80
80
|
b = last_response.body
|
81
|
-
a.
|
81
|
+
expect(a).to eq b
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
@@ -88,7 +88,7 @@ describe Nagira do
|
|
88
88
|
#
|
89
89
|
# GET /config
|
90
90
|
# ----------------------------------------
|
91
|
-
context "/config" do
|
91
|
+
context "/config" do
|
92
92
|
|
93
93
|
before do
|
94
94
|
get "/_config.json"
|
@@ -103,15 +103,15 @@ describe Nagira do
|
|
103
103
|
nagios_user nagios_group }.each do |key|
|
104
104
|
|
105
105
|
it "attribute #{key} should be a String" do
|
106
|
-
@data[key].
|
107
|
-
end
|
106
|
+
expect(@data[key]).to be_a_kind_of String
|
107
|
+
end
|
108
108
|
end
|
109
109
|
|
110
110
|
# Congiration arrays
|
111
|
-
%w{cfg_file cfg_dir}.each do |key|
|
111
|
+
%w{cfg_file cfg_dir}.each do |key|
|
112
112
|
it "attribute #{key} should be an Array" do
|
113
|
-
@data[key].
|
114
|
-
end
|
113
|
+
expect(@data[key]).to be_a_kind_of Array
|
114
|
+
end
|
115
115
|
end
|
116
116
|
|
117
117
|
end
|
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
# Check these routes
|
6
6
|
# ----------------------------------------
|
7
|
-
# get "/config" do
|
7
|
+
# get "/config" do
|
8
8
|
# get "/objects" do
|
9
9
|
# get "/objects/:type" do |type|
|
10
10
|
# get "/objects/:type/:name" do |type,name|
|
@@ -12,42 +12,42 @@
|
|
12
12
|
# get "/status/:hostname/services" do |hostname|
|
13
13
|
# get "/status/:hostname" do |hostname|
|
14
14
|
# get "/status" do
|
15
|
-
# get "/api" do
|
15
|
+
# get "/api" do
|
16
16
|
|
17
17
|
require 'spec_helper'
|
18
18
|
|
19
19
|
|
20
|
-
describe Nagira do
|
20
|
+
describe Nagira do
|
21
21
|
|
22
22
|
set :environment, ENV['RACK_ENV'] || :test
|
23
23
|
|
24
24
|
include Rack::Test::Methods
|
25
|
-
|
25
|
+
|
26
26
|
def app
|
27
27
|
@app ||= Nagira
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
|
31
31
|
|
32
32
|
#
|
33
33
|
# GET /status
|
34
34
|
# -----------------------------
|
35
35
|
|
36
|
-
context 'data types' do
|
36
|
+
context 'data types' do
|
37
37
|
|
38
|
-
{
|
38
|
+
{
|
39
39
|
"/_status" => Hash,
|
40
40
|
"/_status/_state" => Hash,
|
41
41
|
"/_status/_list" => Array
|
42
42
|
}.each do |url,klas|
|
43
|
-
|
44
|
-
it "#{url} should return #{klas}" do
|
43
|
+
|
44
|
+
it "#{url} should return #{klas}" do
|
45
45
|
get "#{url}.json"
|
46
|
-
JSON.parse(last_response.body).
|
46
|
+
expect(JSON.parse(last_response.body)).to be_a_kind_of klas
|
47
47
|
end
|
48
48
|
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
|
52
52
|
end
|
53
53
|
end
|
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
# Check these routes
|
6
6
|
# ----------------------------------------
|
7
|
-
# get "/config" do
|
7
|
+
# get "/config" do
|
8
8
|
# get "/objects" do
|
9
9
|
# get "/objects/:type" do |type|
|
10
10
|
# get "/objects/:type/:name" do |type,name|
|
@@ -12,16 +12,16 @@
|
|
12
12
|
# get "/status/:hostname/services" do |hostname|
|
13
13
|
# get "/status/:hostname" do |hostname|
|
14
14
|
# get "/status" do
|
15
|
-
# get "/api" do
|
15
|
+
# get "/api" do
|
16
16
|
|
17
17
|
require 'spec_helper'
|
18
18
|
|
19
|
-
describe Nagira do
|
19
|
+
describe Nagira do
|
20
20
|
|
21
21
|
set :environment, ENV['RACK_ENV'] || :test
|
22
22
|
|
23
23
|
include Rack::Test::Methods
|
24
|
-
|
24
|
+
|
25
25
|
def app
|
26
26
|
@app ||= Nagira
|
27
27
|
end
|
@@ -31,7 +31,7 @@ describe Nagira do
|
|
31
31
|
# ----------------------------------------
|
32
32
|
context "/objects" do
|
33
33
|
|
34
|
-
before :all do
|
34
|
+
before :all do
|
35
35
|
get "/_objects"
|
36
36
|
@data = JSON.parse last_response.body
|
37
37
|
|
@@ -40,39 +40,39 @@ describe Nagira do
|
|
40
40
|
# $allkeys = (%w{host service contact timeperiod} + @data.keys).uniq
|
41
41
|
end
|
42
42
|
|
43
|
-
|
43
|
+
|
44
44
|
context 'hash key' do
|
45
45
|
%w{host service contact timeperiod}.each do |obj|
|
46
|
-
it "objects[#{obj}] should exist" do
|
47
|
-
@data[obj].
|
46
|
+
it "objects[#{obj}] should exist" do
|
47
|
+
expect(@data[obj]).to be_a_kind_of Hash
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
%w{host service contact timeperiod}.each do |obj|
|
53
53
|
context "/_objects/#{obj}" do
|
54
|
-
|
55
|
-
it "should respond to HTTP resuest" do
|
54
|
+
|
55
|
+
it "should respond to HTTP resuest" do
|
56
56
|
get "/_objects/#{obj}.json"
|
57
|
-
last_response.
|
57
|
+
expect(last_response).to be_ok
|
58
58
|
end
|
59
|
-
|
60
|
-
it "response to /objects/#{obj} should be Hash" do
|
59
|
+
|
60
|
+
it "response to /objects/#{obj} should be Hash" do
|
61
61
|
get "/_objects/#{obj}.json"
|
62
|
-
JSON.parse(last_response.body).
|
62
|
+
expect(JSON.parse(last_response.body)).to be_a_kind_of Hash
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
66
|
-
end
|
66
|
+
end
|
67
67
|
# /objects --------------------
|
68
|
-
|
68
|
+
|
69
69
|
|
70
70
|
#
|
71
71
|
# GET /status
|
72
72
|
# -----------------------------
|
73
73
|
|
74
|
-
context '/status' do
|
75
|
-
before :all do
|
74
|
+
context '/status' do
|
75
|
+
before :all do
|
76
76
|
get "/_status"
|
77
77
|
@data = JSON.parse last_response.body
|
78
78
|
|
@@ -82,18 +82,18 @@ describe Nagira do
|
|
82
82
|
get "/_status/_state"
|
83
83
|
@state = JSON.parse last_response.body
|
84
84
|
end
|
85
|
-
|
86
|
-
context "list of hosts should be the same" do
|
87
|
-
it "full and state" do
|
88
|
-
@data.keys.
|
85
|
+
|
86
|
+
context "list of hosts should be the same" do
|
87
|
+
it "full and state" do
|
88
|
+
expect(@data.keys).to eq @state.keys
|
89
89
|
end
|
90
90
|
|
91
|
-
it "list and state" do
|
92
|
-
@list.
|
91
|
+
it "list and state" do
|
92
|
+
expect(@list).to eq @state.keys
|
93
93
|
end
|
94
94
|
|
95
|
-
it "list and data" do
|
96
|
-
@list.
|
95
|
+
it "list and data" do
|
96
|
+
expect(@list).to eq @data.keys
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|