nagira 0.5.0 → 0.5.1
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.
- checksums.yaml +4 -4
- data/History.md +3 -0
- data/app/app.rb +27 -75
- data/app/get/config.rb +1 -1
- data/app/put.rb +8 -8
- data/config/defaults.rb +2 -4
- data/config/environment.rb +2 -1
- data/lib/nagira.rb +6 -0
- data/lib/nagira/background_parse.rb +113 -21
- data/lib/nagira/hostgroup.rb +2 -2
- data/lib/nagira/hostservice.rb +1 -1
- data/lib/nagira/nagios.rb +0 -1
- data/lib/nagira/parser.rb +110 -0
- data/lib/nagira/servicegroup.rb +1 -1
- data/lib/nagira/simple_logger.rb +11 -0
- data/lib/nagira/timed_parse.rb +3 -3
- data/lib/tasks/debug.rake +3 -3
- data/spec/01_background_parser.rb +27 -0
- data/spec/put/support.rb +3 -3
- data/version.txt +1 -1
- metadata +20 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ba8c40871546f2f94e517df75a4041fc2e439c0
|
4
|
+
data.tar.gz: 609ac720f528e5d0a5d6a74eaf9d85ff9d215c4d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e34c0161e542e366e1a3d0f83f53938c2a4d914c3a8aa8b81ac1503e21930374bee6f20901dafe59ea4cb20a017cd8865b7d7734a2f152135ef88899f544aaf8
|
7
|
+
data.tar.gz: c90991ee5002abc1d42625385765fc3acadb521027f1bf6cabe976cf1f9422f344eeeb2389159a5c5e183625564ab3a8485dd372b449bc31be5f3c88df06e7e0
|
data/History.md
CHANGED
data/app/app.rb
CHANGED
@@ -53,6 +53,7 @@ require 'nagira'
|
|
53
53
|
class Nagira < Sinatra::Base
|
54
54
|
set :app_file, __FILE__
|
55
55
|
|
56
|
+
|
56
57
|
##
|
57
58
|
# Do some necessary tasks at start and then run Sinatra app.
|
58
59
|
#
|
@@ -60,45 +61,23 @@ class Nagira < Sinatra::Base
|
|
60
61
|
# @overload before("Initial Config")
|
61
62
|
configure do
|
62
63
|
|
63
|
-
|
64
|
-
|
65
|
-
|
64
|
+
Parser.config = settings.nagios_cfg
|
65
|
+
Parser.status = settings.status_cfg || Parser.config.status_file
|
66
|
+
Parser.objects = settings.objects_cfg || Parser.config.object_cache_file
|
67
|
+
Parser.commands = settings.command_file || Parser.config.command_file
|
66
68
|
|
67
|
-
|
68
|
-
|
69
|
-
$nagios[:config].status_file
|
70
|
-
),
|
71
|
-
objects: Nagios::Objects.new( Nagira.settings.objects_cfg ||
|
72
|
-
$nagios[:config].object_cache_file
|
73
|
-
),
|
74
|
-
commands: Nagios::ExternalCommands.new( Nagira.settings.command_file ||
|
75
|
-
$nagios[:config].command_file
|
76
|
-
)
|
77
|
-
})
|
69
|
+
BackgroundParser.ttl = ::DEFAULT[:ttl].to_i
|
70
|
+
BackgroundParser.start = ::DEFAULT[:start_background_parser]
|
78
71
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
),
|
83
|
-
objects_inflight: Nagios::Objects.new( Nagira.settings.objects_cfg ||
|
84
|
-
$nagios[:config].object_cache_file
|
85
|
-
)
|
86
|
-
}) if ::DEFAULT[:start_background_parser]
|
72
|
+
Logger.log "Starting Nagira application"
|
73
|
+
Logger.log "Version #{Nagira::VERSION}"
|
74
|
+
Logger.log "Running in #{Nagira.settings.environment} environment"
|
87
75
|
|
88
|
-
|
89
|
-
|
90
|
-
puts "[#{Time.now}] -- Running in #{Nagira.settings.environment} environment"
|
91
|
-
$nagios.keys.each do |x|
|
92
|
-
puts "[#{Time.now}] -- Using nagios #{x} file: #{$nagios[x].path}"
|
76
|
+
Parser.state.to_h.keys.each do |x|
|
77
|
+
Logger.log "Using nagios #{x} file: #{Parser.state[x].path}"
|
93
78
|
end
|
94
79
|
|
95
|
-
|
96
|
-
$nagios[:objects].parse
|
97
|
-
|
98
|
-
@status = $nagios[:status].status['hosts']
|
99
|
-
@objects = $nagios[:objects].objects
|
100
|
-
|
101
|
-
Nagios::BackgroundParser.new
|
80
|
+
BackgroundParser.run if BackgroundParser.configured?
|
102
81
|
end
|
103
82
|
|
104
83
|
|
@@ -121,44 +100,21 @@ class Nagira < Sinatra::Base
|
|
121
100
|
#
|
122
101
|
# @method parse_nagios_files
|
123
102
|
# @overload before("Parse Nagios files")
|
124
|
-
|
125
103
|
before do
|
104
|
+
Logger.log("BackgroundParser is not running", :warning) if
|
105
|
+
BackgroundParser.configured? && BackgroundParser.dead?
|
126
106
|
|
127
|
-
|
128
|
-
unless $bg.alive?
|
129
|
-
logger.warn "Background Parser is configured to run, but is not active"
|
130
|
-
$nagios[:config].parse
|
131
|
-
$nagios[:status].parse
|
132
|
-
$nagios[:objects].parse
|
133
|
-
end
|
134
|
-
$use_inflight_status ? @status = $nagios[:status_inflight].status['hosts']
|
135
|
-
: @status = $nagios[:status].status['hosts']
|
136
|
-
$use_inflight_objects ? @objects = $nagios[:objects_inflight].objects
|
137
|
-
: @objects = $nagios[:objects].objects
|
138
|
-
else
|
139
|
-
$nagios[:config].parse
|
140
|
-
$nagios[:status].parse
|
141
|
-
$nagios[:objects].parse
|
142
|
-
@status = $nagios[:status].status['hosts']
|
143
|
-
@objects = $nagios[:objects].objects
|
144
|
-
end
|
107
|
+
Parser.parse
|
145
108
|
|
109
|
+
@status = Parser.status['hosts']
|
110
|
+
@objects = Parser.objects
|
146
111
|
|
147
|
-
##
|
148
|
-
# TODO: This stuff breaks XML valid. Will have to wait.
|
149
|
-
#
|
150
|
-
# idx = 0
|
151
|
-
# @status.keys.uniq.each do |hostname|
|
152
|
-
# @status[idx] = @status[hostname]
|
153
|
-
# idx += 1
|
154
|
-
# end
|
155
112
|
#
|
156
113
|
# Add plural keys to use ActiveResource with Nagira
|
157
114
|
#
|
158
115
|
@objects.keys.each do |singular|
|
159
116
|
@objects[singular.to_s.pluralize.to_sym] = @objects[singular]
|
160
117
|
end
|
161
|
-
|
162
118
|
end
|
163
119
|
|
164
120
|
##
|
@@ -191,18 +147,22 @@ class Nagira < Sinatra::Base
|
|
191
147
|
# GET /_objects.json # => :json
|
192
148
|
# GET /_status/_list.yaml # => :yaml
|
193
149
|
#
|
194
|
-
|
150
|
+
before do
|
195
151
|
request.path_info.sub!(/#{settings.format_extensions}/, '')
|
196
152
|
@format = ($1 || settings.format).to_sym
|
197
153
|
content_type "application/#{@format.to_s}"
|
198
154
|
end
|
199
155
|
|
156
|
+
##
|
157
|
+
# @method detect_ar_type
|
158
|
+
# @overload before('detect ActiveResource mode')
|
159
|
+
#
|
160
|
+
# Detect if this a request for ActiveResource PATH
|
161
|
+
#
|
200
162
|
before do
|
201
|
-
request.path_info
|
202
|
-
@active_resource = $1 ? true : false
|
163
|
+
@active_resource = request.path_info =~ %r{^#{Nagira::AR_PREFIX}/}
|
203
164
|
end
|
204
165
|
|
205
|
-
|
206
166
|
##
|
207
167
|
# @method strip_output_type
|
208
168
|
# @overload before('detect output mode')
|
@@ -253,7 +213,6 @@ class Nagira < Sinatra::Base
|
|
253
213
|
end
|
254
214
|
end
|
255
215
|
|
256
|
-
|
257
216
|
##
|
258
217
|
# @method object_not_found
|
259
218
|
# @overload after("Object not found or bad request")
|
@@ -273,7 +232,6 @@ class Nagira < Sinatra::Base
|
|
273
232
|
end
|
274
233
|
end
|
275
234
|
|
276
|
-
|
277
235
|
##
|
278
236
|
# @method argument_error
|
279
237
|
# @overload after("ArgumentError")
|
@@ -285,7 +243,6 @@ class Nagira < Sinatra::Base
|
|
285
243
|
halt [400, @data.send("to_#{@format}") ] if ! @data[:result]
|
286
244
|
end
|
287
245
|
|
288
|
-
|
289
246
|
##
|
290
247
|
# @method convert_to_active_resource
|
291
248
|
# @overload after("Return Array for ActiveResouce routes")
|
@@ -314,9 +271,6 @@ class Nagira < Sinatra::Base
|
|
314
271
|
body( @callback ? "#{@callback.to_s} (#{@data.to_json})" : @data.send("to_#{@format}") )
|
315
272
|
end
|
316
273
|
|
317
|
-
|
318
|
-
|
319
|
-
|
320
274
|
##
|
321
275
|
# @method get_api
|
322
276
|
# @overload get(/_api)
|
@@ -328,7 +282,6 @@ class Nagira < Sinatra::Base
|
|
328
282
|
nil
|
329
283
|
end
|
330
284
|
|
331
|
-
|
332
285
|
##
|
333
286
|
# @method get_runtime_config
|
334
287
|
# @overload get(/_runtime)
|
@@ -342,7 +295,7 @@ class Nagira < Sinatra::Base
|
|
342
295
|
environment: Nagira.settings.environment,
|
343
296
|
home: ENV['HOME'],
|
344
297
|
user: ENV['LOGNAME'],
|
345
|
-
nagiosFiles: $nagios.keys.map { |x| { x => $nagios[x].path }}
|
298
|
+
nagiosFiles: $nagios.to_h.keys.map { |x| { x => $nagios[x].path }}
|
346
299
|
}
|
347
300
|
}
|
348
301
|
nil
|
@@ -366,7 +319,6 @@ class Nagira < Sinatra::Base
|
|
366
319
|
# get "/:resource" do |resource|
|
367
320
|
# respond_with $nagios.status[resource], @format
|
368
321
|
# end
|
369
|
-
|
370
322
|
end
|
371
323
|
|
372
324
|
require "app/put/status"
|
data/app/get/config.rb
CHANGED
data/app/put.rb
CHANGED
@@ -2,12 +2,12 @@ class Nagira < Sinatra::Base
|
|
2
2
|
|
3
3
|
# @method parse_input_data
|
4
4
|
# @overload before("Parse PUT request body")
|
5
|
-
#
|
5
|
+
#
|
6
6
|
# Process the data before on each HTTP request.
|
7
7
|
#
|
8
|
-
# @return [Array] @input Sets @input instance variable.
|
8
|
+
# @return [Array] @input Sets @input instance variable.
|
9
9
|
#
|
10
|
-
before do
|
10
|
+
before do
|
11
11
|
if request.put?
|
12
12
|
data = request.body.read
|
13
13
|
@input = case @format
|
@@ -22,16 +22,16 @@ class Nagira < Sinatra::Base
|
|
22
22
|
end
|
23
23
|
|
24
24
|
# Define helpers for put methods
|
25
|
-
helpers do
|
25
|
+
helpers do
|
26
26
|
|
27
27
|
# Helper to send PUT update to Nagios::ExternalCommands
|
28
28
|
#
|
29
|
-
# @param [Hash] params
|
29
|
+
# @param [Hash] params
|
30
30
|
# @param [Symbol] action Nagios external command name
|
31
31
|
#
|
32
|
-
# FIXME: This only accepts single service. Modify to use Arrays too
|
32
|
+
# FIXME: This only accepts single service. Modify to use Arrays too
|
33
33
|
def put_update action, params
|
34
|
-
res =
|
34
|
+
res = Parser.commands.write(params.merge({ :action => action }))
|
35
35
|
{ :result => res[:result], :object => res[:data]}
|
36
36
|
end
|
37
37
|
end
|
@@ -49,5 +49,5 @@ class Nagira < Sinatra::Base
|
|
49
49
|
def update_host_status params
|
50
50
|
put_update :PROCESS_HOST_CHECK_RESULT, params
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
end
|
data/config/defaults.rb
CHANGED
@@ -9,7 +9,6 @@
|
|
9
9
|
# Exception is ::DEFAULT[:ttl] which is not overriden by environment.rb
|
10
10
|
# and should be changed here.
|
11
11
|
|
12
|
-
|
13
12
|
DEFAULT = {
|
14
13
|
|
15
14
|
format_extensions: '\.(json|yaml|xml)$', # Regex for available
|
@@ -41,7 +40,7 @@ DEFAULT = {
|
|
41
40
|
# this number of seconds. To disable timed parsing, set
|
42
41
|
# ttl to 0 or negative number.
|
43
42
|
|
44
|
-
ttl: ENV['NAGIRA_TTL'].to_i || 5,
|
43
|
+
ttl: (ENV['NAGIRA_TTL'] && ENV['NAGIRA_TTL'].to_i) || 5,
|
45
44
|
|
46
45
|
##
|
47
46
|
# start_background_parser used in Nagios::BackgroundParse class.
|
@@ -53,7 +52,7 @@ DEFAULT = {
|
|
53
52
|
# intervals slightly shorter than `ttl` to ensure that data are
|
54
53
|
# always updated. So, `ttl` should be larger than 1.
|
55
54
|
#
|
56
|
-
start_background_parser: (ENV['NAGIRA_BG_PARSING']
|
55
|
+
start_background_parser: (ENV['NAGIRA_BG_PARSING'] != '0'),
|
57
56
|
|
58
57
|
##
|
59
58
|
# By default hostname regular expression accepts alpha-numerics,
|
@@ -91,5 +90,4 @@ configure do
|
|
91
90
|
end
|
92
91
|
end
|
93
92
|
|
94
|
-
|
95
93
|
end
|
data/config/environment.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
require 'pry'
|
1
2
|
class Nagira < Sinatra::Base
|
2
3
|
|
4
|
+
|
3
5
|
disable :protection
|
4
6
|
enable :logging
|
5
7
|
|
@@ -33,7 +35,6 @@ class Nagira < Sinatra::Base
|
|
33
35
|
set :show_exceptions, false
|
34
36
|
end
|
35
37
|
|
36
|
-
|
37
38
|
# configure :production do
|
38
39
|
# # If your nagios.cfg file is in 'standard' location (in RH and
|
39
40
|
# # Debian it usially installed under /etc/nagios(3)?) you don't need
|
data/lib/nagira.rb
CHANGED
@@ -9,6 +9,7 @@ require 'json'
|
|
9
9
|
require 'yaml'
|
10
10
|
require 'sinatra'
|
11
11
|
require 'sinatra/reloader'
|
12
|
+
require 'singleton'
|
12
13
|
|
13
14
|
$: << File.dirname(__FILE__) << File.dirname(File.dirname(__FILE__))
|
14
15
|
|
@@ -22,6 +23,11 @@ require "nagira/hostgroup"
|
|
22
23
|
require "nagira/servicegroup"
|
23
24
|
require "nagira/hostservice"
|
24
25
|
|
26
|
+
require "nagira/background_parse"
|
27
|
+
require "nagira/parser"
|
28
|
+
require "nagira/simple_logger"
|
29
|
+
|
30
|
+
|
25
31
|
#
|
26
32
|
# environment file must go after default, some settings override
|
27
33
|
# defaults.
|
@@ -1,31 +1,123 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
module Nagios
|
1
|
+
class Nagira < Sinatra::Base
|
4
2
|
##
|
5
3
|
# Background parsing of status.dat file in separate thread. Runs on
|
6
|
-
# regular intervals
|
4
|
+
# regular intervals defined by :ttl
|
7
5
|
#
|
8
6
|
class BackgroundParser
|
7
|
+
include Singleton
|
9
8
|
|
10
|
-
##
|
11
|
-
#
|
12
|
-
# If :ttl is not defined set to 0 and do not run
|
13
|
-
# background parsing.
|
14
|
-
#
|
15
9
|
def initialize
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
10
|
+
@use_inflight_flag = false
|
11
|
+
end
|
12
|
+
|
13
|
+
# For large Nagios files there's a significant time required for
|
14
|
+
# the parsing, if HTTP request comes during the parsing, data
|
15
|
+
# could be missing. To prevent this from happening flag variable
|
16
|
+
# defines two sets of the parsed data, which are parsed at
|
17
|
+
# different sequential runs of the parser.
|
18
|
+
attr_accessor :use_inflight_flag
|
19
|
+
|
20
|
+
class << self
|
21
|
+
|
22
|
+
##
|
23
|
+
# Target data structure (i.e. $nagios hash for example) which is
|
24
|
+
# updated by BackgroundParser.
|
25
|
+
#
|
26
|
+
def target
|
27
|
+
@target ||= Parser.state
|
28
|
+
end
|
29
|
+
|
30
|
+
##
|
31
|
+
# \@ttl (Fixint, seconds) defines re-parsing interval for the
|
32
|
+
# BackgroundParser.
|
33
|
+
#
|
34
|
+
# Set @@ttl after initialization, to be able to pass
|
35
|
+
# configuration variables.
|
36
|
+
#
|
37
|
+
# @see start=
|
38
|
+
#
|
39
|
+
# Example:
|
40
|
+
# Nagios::BackgroundParser.ttl = ::DEFAULT[:ttl].to_i
|
41
|
+
# Nagios::BackgroundParser.start = ::DEFAULT[:start_background_parser]
|
42
|
+
# Nagios::BackgroundParser.run
|
43
|
+
#
|
44
|
+
def ttl= ttl
|
45
|
+
@ttl = ttl
|
28
46
|
end
|
47
|
+
|
48
|
+
##
|
49
|
+
# \@start (Boolean) defines whether BackgroundParser should be
|
50
|
+
# started.
|
51
|
+
#
|
52
|
+
# Set :start variable after initialization, to be able to pass
|
53
|
+
# configuration values.
|
54
|
+
#
|
55
|
+
# @see ttl=
|
56
|
+
#
|
57
|
+
# Example:
|
58
|
+
# Nagios::BackgroundParser.ttl = ::DEFAULT[:ttl].to_i
|
59
|
+
# Nagios::BackgroundParser.start = ::DEFAULT[:start_background_parser]
|
60
|
+
# Nagios::BackgroundParser.run
|
61
|
+
#
|
62
|
+
def start= start
|
63
|
+
@start = start
|
64
|
+
end
|
65
|
+
|
66
|
+
##
|
67
|
+
# Is BackgroundParser configured to run?
|
68
|
+
def configured?
|
69
|
+
@ttl > 0 && @start
|
70
|
+
end
|
71
|
+
|
72
|
+
##
|
73
|
+
# Is BG parser thread running
|
74
|
+
#
|
75
|
+
def alive?
|
76
|
+
!@bg.nil? && @bg.alive?
|
77
|
+
end
|
78
|
+
|
79
|
+
##
|
80
|
+
# See alive?
|
81
|
+
def dead?
|
82
|
+
!alive?
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
##
|
87
|
+
# Start BG Parser if it's configured to run and TTL is defined
|
88
|
+
def run
|
89
|
+
if configured? && dead?
|
90
|
+
|
91
|
+
Logger.log "Starting background parser thread with interval #{@ttl} sec"
|
92
|
+
|
93
|
+
target.status_inflight = Nagios::Status.new(target[:status].path)
|
94
|
+
target.objects_inflight = Nagios::Objects.new(target[:objects].path)
|
95
|
+
|
96
|
+
Parser.parse [:status_inflight,:objects_inflight]
|
97
|
+
|
98
|
+
@bg = Thread.new {
|
99
|
+
loop {
|
100
|
+
target[with_inflight?(:status)].parse
|
101
|
+
target[with_inflight?(:objects)].parse
|
102
|
+
sleep @ttl
|
103
|
+
@use_inflight_flag = !@use_inflight_flag
|
104
|
+
}
|
105
|
+
}
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def inflight?
|
110
|
+
@use_inflight_flag
|
111
|
+
end
|
112
|
+
##
|
113
|
+
# Construct file symbol, based on in flight status.
|
114
|
+
# @see run
|
115
|
+
def with_inflight?(file)
|
116
|
+
(inflight? ? "#{file}_inflight" : file).to_sym
|
117
|
+
end
|
118
|
+
|
29
119
|
end
|
30
120
|
end
|
31
121
|
end
|
122
|
+
|
123
|
+
# LocalWords: ttl BackgroundParser config param Fixint
|
data/lib/nagira/hostgroup.rb
CHANGED
@@ -4,8 +4,8 @@ class Nagira < Sinatra::Base
|
|
4
4
|
|
5
5
|
def initialize(name)
|
6
6
|
@name = name
|
7
|
-
@objects =
|
8
|
-
@status =
|
7
|
+
@objects = Parser.objects
|
8
|
+
@status = Parser.status['hosts']
|
9
9
|
@hostgroup = @objects[:hostgroup][name]
|
10
10
|
@data = { }
|
11
11
|
end
|
data/lib/nagira/hostservice.rb
CHANGED
data/lib/nagira/nagios.rb
CHANGED
@@ -0,0 +1,110 @@
|
|
1
|
+
class Nagira < Sinatra::Base
|
2
|
+
# Singleton class, that handles parsing of the Nagios data. This
|
3
|
+
# class uses another singleton class BackgroundParser for repeating
|
4
|
+
# parsing of the files in background thread.
|
5
|
+
#
|
6
|
+
# Example usage:
|
7
|
+
#
|
8
|
+
# Parser.config = < path to nagios.cfg file>
|
9
|
+
# Parser.status = < path to status.cfg file>
|
10
|
+
# Parser.objects = < path to object_cache file>
|
11
|
+
# Parser.commands = < path to the external command execution file >
|
12
|
+
#
|
13
|
+
class Parser
|
14
|
+
include Singleton
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@state = OpenStruct.new
|
18
|
+
end
|
19
|
+
|
20
|
+
# State structure keep all the Nagios parsed state information for
|
21
|
+
# :objects, :status, :config, etc. as well as "inflight" data.
|
22
|
+
attr_accessor :state
|
23
|
+
|
24
|
+
class << self
|
25
|
+
|
26
|
+
# Detect which half of the data should be returned. There's a
|
27
|
+
# pissiblility that during request data are bing parsed, which
|
28
|
+
# can result in incomplete or broken data. This ensures, that
|
29
|
+
# only data that are not being parsed now returned.
|
30
|
+
def inflight?
|
31
|
+
BackgroundParser.inflight?
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# Construct file symbol, based on in flight status.
|
36
|
+
#
|
37
|
+
# @see inflight?
|
38
|
+
def with_inflight?(file)
|
39
|
+
(inflight? ? "#{file}_inflight" : file).to_sym
|
40
|
+
end
|
41
|
+
|
42
|
+
# Return state object
|
43
|
+
def state
|
44
|
+
instance.state
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# If BackgroundParser is not running, then parse files,
|
49
|
+
# otherwise do nothing, as the data are already parsed by the
|
50
|
+
# BG.
|
51
|
+
def parse(files = %i{config objects status})
|
52
|
+
return if BackgroundParser.alive?
|
53
|
+
files
|
54
|
+
.map { |f| state.send(f) }
|
55
|
+
.map(&:parse)
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Configuration object of the Nagios and Nagira parser. Create
|
60
|
+
# new configuration and parse it at the time of creation.
|
61
|
+
#
|
62
|
+
def config=(config)
|
63
|
+
state.config = Nagios::Config.new(config)
|
64
|
+
state.config.parse
|
65
|
+
end
|
66
|
+
|
67
|
+
# Return parsed configuration.
|
68
|
+
def config
|
69
|
+
state.config
|
70
|
+
end
|
71
|
+
|
72
|
+
# Create new data structure for the host status data
|
73
|
+
#
|
74
|
+
# @param status_file [String] PATH to the file
|
75
|
+
def status=(status_file)
|
76
|
+
state.status = Nagios::Status.new(status_file)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Return parsed hosts status. Depending on the inflight flag
|
80
|
+
# return either "A" or "B" set of data.
|
81
|
+
def status
|
82
|
+
state
|
83
|
+
.send(with_inflight?(:status))
|
84
|
+
.status
|
85
|
+
end
|
86
|
+
|
87
|
+
# Create new data structure for parsed object_cache file
|
88
|
+
# information.
|
89
|
+
#
|
90
|
+
# @param objects_file [String] PATH to the file
|
91
|
+
def objects=(objects_file)
|
92
|
+
state.objects = Nagios::Objects.new(objects_file)
|
93
|
+
end
|
94
|
+
|
95
|
+
def objects
|
96
|
+
state
|
97
|
+
.send(with_inflight?(:objects))
|
98
|
+
.objects
|
99
|
+
end
|
100
|
+
|
101
|
+
def commands=(commands_file)
|
102
|
+
state.commands = Nagios::ExternalCommands.new(commands_file)
|
103
|
+
end
|
104
|
+
|
105
|
+
def commands
|
106
|
+
state.commands
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
data/lib/nagira/servicegroup.rb
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
class Nagira < Sinatra::Base
|
2
|
+
# Simple logger helper. Use as: Logger.log(message)
|
3
|
+
class Logger
|
4
|
+
include Singleton
|
5
|
+
|
6
|
+
# Print log message to stdout with optional warning tag
|
7
|
+
def self.log(message, warning=false)
|
8
|
+
puts "[#{Time.now}] -- #{ "WARNING:" if warning } #{message}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/nagira/timed_parse.rb
CHANGED
@@ -56,7 +56,7 @@ module Nagios
|
|
56
56
|
end
|
57
57
|
|
58
58
|
attr_accessor :last_parsed, :parse_interval
|
59
|
-
|
59
|
+
|
60
60
|
def last_changed
|
61
61
|
@last_changed = File.mtime(@path)
|
62
62
|
end
|
@@ -65,13 +65,13 @@ module Nagios
|
|
65
65
|
def changed?
|
66
66
|
self.last_changed > self.last_parsed
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
# Check if:
|
70
70
|
# - file changed?
|
71
71
|
# - was it parsed recently?
|
72
72
|
def need_parsing?
|
73
73
|
changed? && ((Time.now - self.last_parsed) > @parse_interval)
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
end
|
77
77
|
end
|
data/lib/tasks/debug.rake
CHANGED
@@ -31,9 +31,9 @@ namespace :debug do
|
|
31
31
|
#
|
32
32
|
# These files from parsed config.
|
33
33
|
#
|
34
|
-
files <<
|
35
|
-
files <<
|
36
|
-
files <<
|
34
|
+
files << Parser.config.path
|
35
|
+
files << Parser.status.path
|
36
|
+
files << Parser.objects.path
|
37
37
|
|
38
38
|
open("#{dir}/sherlock.txt", "w") { |f| f.puts os_info }
|
39
39
|
open("#{dir}/permissions.txt", "w") { |f| f.puts permissions }
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe "BackgroundParser" do
|
5
|
+
|
6
|
+
before {
|
7
|
+
Nagios::BackgroundParser.ttl = 1
|
8
|
+
Nagios::BackgroundParser.start = true
|
9
|
+
}
|
10
|
+
|
11
|
+
it "is configured" do
|
12
|
+
expect(Nagios::BackgroundParser).to be_configured
|
13
|
+
end
|
14
|
+
|
15
|
+
context "after start" do
|
16
|
+
|
17
|
+
before {
|
18
|
+
Nagios::BackgroundParser.run
|
19
|
+
sleep 0.1
|
20
|
+
}
|
21
|
+
|
22
|
+
it "is running" do
|
23
|
+
expect(Nagios::BackgroundParser).to be_alive
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
data/spec/put/support.rb
CHANGED
@@ -42,9 +42,9 @@ end
|
|
42
42
|
|
43
43
|
shared_examples_for :write_to_nagios_cmd_file do
|
44
44
|
before (:all) do
|
45
|
-
|
45
|
+
File.delete ::Nagira::Parser.commands.path rescue nil
|
46
46
|
end
|
47
|
-
let (:cmd) {
|
47
|
+
let (:cmd) { ::Nagira::Parser.commands.path }
|
48
48
|
|
49
49
|
it "writes to nagios.cmd file" do
|
50
50
|
expect(File).to exist(cmd)
|
@@ -52,7 +52,7 @@ shared_examples_for :write_to_nagios_cmd_file do
|
|
52
52
|
end
|
53
53
|
|
54
54
|
after (:each) do
|
55
|
-
File.delete
|
55
|
+
File.delete ::Nagira::Parser.commands.path rescue nil
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
data/version.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.1
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nagira
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dmytro Kovalov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -298,30 +298,38 @@ executables:
|
|
298
298
|
extensions: []
|
299
299
|
extra_rdoc_files: []
|
300
300
|
files:
|
301
|
-
- bin/nagira
|
302
301
|
- History.md
|
303
302
|
- Rakefile
|
304
|
-
- version.txt
|
305
303
|
- app/app.rb
|
306
304
|
- app/get/config.rb
|
307
305
|
- app/get/objects.rb
|
306
|
+
- app/get/status.rb
|
308
307
|
- app/get/status/hostgroups.rb
|
309
308
|
- app/get/status/servicegroups.rb
|
310
|
-
- app/
|
309
|
+
- app/put.rb
|
311
310
|
- app/put/host.rb
|
312
311
|
- app/put/status.rb
|
313
|
-
-
|
312
|
+
- bin/nagira
|
313
|
+
- bin/nagira-setup
|
314
|
+
- config/defaults.rb
|
315
|
+
- config/environment.rb
|
316
|
+
- config/nagira.defaults
|
317
|
+
- config/nagira.init_d
|
318
|
+
- config/puma.rb
|
319
|
+
- lib/nagira.rb
|
314
320
|
- lib/nagira/background_parse.rb
|
315
321
|
- lib/nagira/hostgroup.rb
|
316
322
|
- lib/nagira/hostservice.rb
|
317
323
|
- lib/nagira/nagios.rb
|
324
|
+
- lib/nagira/parser.rb
|
318
325
|
- lib/nagira/servicegroup.rb
|
326
|
+
- lib/nagira/simple_logger.rb
|
319
327
|
- lib/nagira/timed_parse.rb
|
320
|
-
- lib/nagira.rb
|
321
328
|
- lib/tasks/config.rake
|
322
329
|
- lib/tasks/debug.rake
|
323
330
|
- lib/tasks/doc.rake
|
324
331
|
- spec/00_configuration_spec.rb
|
332
|
+
- spec/01_background_parser.rb
|
325
333
|
- spec/01_data_format/01_nagira_response_spec.rb
|
326
334
|
- spec/01_data_format/02_0_status_spec.rb
|
327
335
|
- spec/01_data_format/02_nagira_data_spec.rb
|
@@ -337,28 +345,23 @@ files:
|
|
337
345
|
- spec/put/status_spec.rb
|
338
346
|
- spec/put/support.rb
|
339
347
|
- spec/spec_helper.rb
|
340
|
-
- config/defaults.rb
|
341
|
-
- config/environment.rb
|
342
|
-
- config/nagira.defaults
|
343
|
-
- config/nagira.init_d
|
344
|
-
- config/puma.rb
|
345
348
|
- test/benchmark.rb
|
349
|
+
- test/data/bad/README
|
346
350
|
- test/data/bad/nagios.cfg
|
347
351
|
- test/data/bad/objects.cache
|
348
|
-
- test/data/bad/README
|
349
352
|
- test/data/bad/status.dat
|
350
353
|
- test/data/json/GET.txt
|
354
|
+
- test/data/json/README.txt
|
351
355
|
- test/data/json/host_check.json
|
352
356
|
- test/data/json/host_check.sh
|
353
357
|
- test/data/json/ping.json
|
354
358
|
- test/data/json/ping_and_http.json
|
355
359
|
- test/data/json/ping_and_http_check.sh
|
356
360
|
- test/data/json/ping_check.sh
|
357
|
-
- test/data/json/README.txt
|
358
361
|
- test/data/nagios.cfg
|
359
362
|
- test/data/objects.cache
|
360
363
|
- test/data/status.dat
|
361
|
-
-
|
364
|
+
- version.txt
|
362
365
|
homepage: http://dmytro.github.com/nagira
|
363
366
|
licenses:
|
364
367
|
- MIT
|
@@ -372,7 +375,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
372
375
|
requirements:
|
373
376
|
- - '>='
|
374
377
|
- !ruby/object:Gem::Version
|
375
|
-
version:
|
378
|
+
version: 2.0.0
|
376
379
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
377
380
|
requirements:
|
378
381
|
- - '>='
|
@@ -380,7 +383,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
380
383
|
version: '0'
|
381
384
|
requirements: []
|
382
385
|
rubyforge_project:
|
383
|
-
rubygems_version: 2.
|
386
|
+
rubygems_version: 2.4.6
|
384
387
|
signing_key:
|
385
388
|
specification_version: 4
|
386
389
|
summary: 'Nagira : Nagios RESTful API'
|