nagios_config 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/nagios_config/formater.rb +2 -2
- data/lib/nagios_config/main.rb +72 -0
- data/lib/nagios_config/parser.rb +67 -63
- data/lib/nagios_config.rb +2 -1
- metadata +5 -4
@@ -47,8 +47,8 @@ module NagiosConfig
|
|
47
47
|
|
48
48
|
def format_Define(define)
|
49
49
|
buffer << "define "
|
50
|
-
name_width = define.variables.map
|
51
|
-
value_width = define.variables.map
|
50
|
+
name_width = define.variables.map {|e| e.name}.map {|e| e.value}.map {|e| e.length}.max || 0
|
51
|
+
value_width = define.variables.map {|e| e.val}.map {|e| e.value}.map {|e| e.length}.max || 0
|
52
52
|
variable_width = define_indent + define_name_width + name_width + value_width
|
53
53
|
|
54
54
|
self.define_name_width += name_width
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module NagiosConfig
|
2
|
+
class Main
|
3
|
+
attr_accessor :variables, :objects
|
4
|
+
|
5
|
+
def initialize(variables={}, objects=[])
|
6
|
+
self.variables = Hash[variables.map {|k,v| [k.to_sym,v]}]
|
7
|
+
self.objects = objects
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_node(node)
|
11
|
+
instance = new
|
12
|
+
object_store = instance.objects
|
13
|
+
node.nodes.each do |node|
|
14
|
+
if node.is_a?(NagiosConfig::Variable)
|
15
|
+
name = node.name.value
|
16
|
+
value = node.val.value
|
17
|
+
case instance[name]
|
18
|
+
when nil
|
19
|
+
instance[name] = value
|
20
|
+
when Array
|
21
|
+
instance[name].push(value)
|
22
|
+
else
|
23
|
+
instance[name] = [instance[name], value]
|
24
|
+
end
|
25
|
+
elsif node.is_a?(NagiosConfig::Define)
|
26
|
+
NagiosConfig::Object.from_node(node, object_store)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
instance
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.parse(io, include_comments=false)
|
33
|
+
from_node(NagiosConfig::Parser.new(!include_comments).parse(io))
|
34
|
+
end
|
35
|
+
|
36
|
+
def [](name)
|
37
|
+
variables[name.to_sym]
|
38
|
+
end
|
39
|
+
|
40
|
+
def []=(name, value)
|
41
|
+
variables[name.to_sym] = value
|
42
|
+
end
|
43
|
+
|
44
|
+
def objects(of_type=nil)
|
45
|
+
return @objects unless of_type
|
46
|
+
of_type = of_type.to_sym
|
47
|
+
objects.select {|obj| obj.type == of_type}
|
48
|
+
end
|
49
|
+
|
50
|
+
def ==(other)
|
51
|
+
other.is_a?(self.class) && other.variables == variables &&
|
52
|
+
other.objects == objects
|
53
|
+
end
|
54
|
+
|
55
|
+
def inspect
|
56
|
+
"#<#{self.class.name}:#{object_id} @variables=#{variables.inspect}, " <<
|
57
|
+
"@objects=#{objects.class.name}:#{objects.object_id}" <<
|
58
|
+
"(#{objects.length} items)>"
|
59
|
+
end
|
60
|
+
|
61
|
+
def method_missing(name, *args)
|
62
|
+
if name.to_s !~ /=$/ && args.empty?
|
63
|
+
self[name.to_sym]
|
64
|
+
elsif name.to_s =~ /=$/ && args.length == 1
|
65
|
+
self[name.to_s.chomp("=").to_sym] = args.first
|
66
|
+
else
|
67
|
+
super
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
data/lib/nagios_config/parser.rb
CHANGED
@@ -5,46 +5,50 @@ require 'events'
|
|
5
5
|
|
6
6
|
module NagiosConfig
|
7
7
|
class Parser
|
8
|
-
attr_accessor :scanner, :state
|
8
|
+
attr_accessor :scanner, :state
|
9
9
|
include Events::Emitter
|
10
10
|
|
11
|
-
|
11
|
+
NEWLINE = "\n".freeze
|
12
|
+
EQUALS = "=".freeze
|
13
|
+
OPEN_BRACE = "{".freeze
|
14
|
+
|
15
|
+
def initialize(ignore_comments=false)
|
12
16
|
@state = :body
|
13
|
-
|
14
|
-
|
17
|
+
@scanner = StringScanner.new("")
|
18
|
+
@value_buffer = ""
|
19
|
+
@ignore_comments = ignore_comments
|
15
20
|
end
|
16
21
|
|
17
22
|
def parse(io)
|
18
23
|
root = NagiosConfig::Config.new
|
19
|
-
|
24
|
+
current = root
|
20
25
|
current_variable = nil
|
21
26
|
on(:comment) do |comment|
|
22
|
-
|
23
|
-
end
|
27
|
+
current.add_node(NagiosConfig::Comment.new(comment))
|
28
|
+
end unless @ignore_comments
|
24
29
|
on(:whitespace) do |whitespace|
|
25
|
-
|
26
|
-
end
|
30
|
+
current.add_node(NagiosConfig::Whitespace.new(whitespace))
|
31
|
+
end unless @ignore_comments
|
27
32
|
on(:trailing_comment) do |comment|
|
28
|
-
|
29
|
-
end
|
33
|
+
current.nodes.last.add_node(NagiosConfig::TrailingComment.new(comment))
|
34
|
+
end unless @ignore_comments
|
30
35
|
on(:name) do |name|
|
31
36
|
current_variable = NagiosConfig::Variable.new
|
32
37
|
current_variable.add_node(NagiosConfig::Name.new(name))
|
33
|
-
|
38
|
+
current.add_node(current_variable)
|
34
39
|
end
|
35
40
|
on(:value) do |value|
|
36
41
|
current_variable.add_node(NagiosConfig::Value.new(value))
|
37
|
-
current_variable = nil
|
38
42
|
end
|
39
43
|
on(:begin_define) do
|
40
|
-
|
41
|
-
root.add_node(
|
44
|
+
current = NagiosConfig::Define.new
|
45
|
+
root.add_node(current)
|
42
46
|
end
|
43
47
|
on(:type) do |type|
|
44
|
-
|
48
|
+
current.add_node(NagiosConfig::Type.new(type))
|
45
49
|
end
|
46
50
|
on(:finish_define) do
|
47
|
-
|
51
|
+
current = root
|
48
52
|
end
|
49
53
|
stream_parse(io)
|
50
54
|
root
|
@@ -58,10 +62,8 @@ module NagiosConfig
|
|
58
62
|
end
|
59
63
|
|
60
64
|
def <<(string)
|
61
|
-
scanner
|
62
|
-
|
63
|
-
scanner << string
|
64
|
-
self.state = send(state)
|
65
|
+
@scanner << string
|
66
|
+
@state = send(@state)
|
65
67
|
end
|
66
68
|
|
67
69
|
private
|
@@ -71,59 +73,61 @@ module NagiosConfig
|
|
71
73
|
alias start body
|
72
74
|
|
73
75
|
def empty_line
|
74
|
-
whitespace = scanner.scan(/[ \t]*\n/)
|
76
|
+
whitespace = @scanner.scan(/[ \t]*\n/)
|
75
77
|
if whitespace
|
76
|
-
emit(:whitespace, whitespace)
|
77
|
-
in_define ? definition_body : body
|
78
|
-
elsif in_define && whitespace = scanner.scan(/[ \t]*(?=;)/) && trailing_comment
|
79
|
-
emit(:whitespace, whitespace)
|
78
|
+
emit(:whitespace, whitespace) unless @ignore_comments
|
79
|
+
@in_define ? definition_body : body
|
80
|
+
elsif @in_define && whitespace = @scanner.scan(/[ \t]*(?=;)/) && trailing_comment
|
81
|
+
emit(:whitespace, whitespace) unless @ignore_comments
|
80
82
|
definition_body
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
84
86
|
def leading_whitespace
|
85
|
-
if scanner.
|
87
|
+
if @scanner.skip(/[ \t]+[^\s]/)
|
86
88
|
raise ParseError.new("leading whitespace not allowed")
|
87
89
|
end
|
88
90
|
end
|
89
91
|
|
90
92
|
def comment
|
91
|
-
comment = scanner.scan(/[ \t]
|
93
|
+
comment = @scanner.scan(/[ \t]*#[^\n]*\n/)
|
92
94
|
if comment
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
95
|
+
if !@ignore_comments
|
96
|
+
comment.lstrip!
|
97
|
+
comment.slice!(0)
|
98
|
+
comment.chomp!(NEWLINE)
|
99
|
+
emit(:comment, comment)
|
100
|
+
end
|
101
|
+
@in_define ? definition_body : body
|
102
|
+
elsif @scanner.check(/#/)
|
99
103
|
:comment
|
100
104
|
end
|
101
105
|
end
|
102
106
|
|
103
107
|
def name
|
104
|
-
name = scanner.scan(/[^\s=]+=/)
|
108
|
+
name = @scanner.scan(/[^\s=]+=/)
|
105
109
|
if name
|
106
|
-
name.chomp!(
|
110
|
+
name.chomp!(EQUALS)
|
107
111
|
emit(:name, name)
|
108
112
|
value
|
109
|
-
elsif scanner.
|
113
|
+
elsif @scanner.skip(/[^\n]+\n/)
|
110
114
|
raise ParseError.new("expected variable definition")
|
111
|
-
elsif scanner.check(/[^\s]+/) &&
|
115
|
+
elsif @scanner.check(/[^\s]+/) && !@scanner.check(/d(e(f(i(n(e?))?)?)?)?\Z/)
|
112
116
|
:name
|
113
117
|
end
|
114
118
|
end
|
115
119
|
|
116
120
|
def value
|
117
|
-
value = scanner.scan(
|
121
|
+
value = @scanner.scan(/[^\n]*\n/)
|
118
122
|
if value
|
119
|
-
value = value_buffer + value
|
120
|
-
value.chomp!(
|
123
|
+
value = @value_buffer + value
|
124
|
+
value.chomp!(NEWLINE)
|
121
125
|
raise ParseError.new("value expected") if value.empty?
|
122
126
|
emit(:value, value)
|
123
|
-
|
127
|
+
@value_buffer = ""
|
124
128
|
body
|
125
|
-
elsif value = scanner.scan(/.+/)
|
126
|
-
value_buffer << value
|
129
|
+
elsif value = @scanner.scan(/.+/)
|
130
|
+
@value_buffer << value
|
127
131
|
:value
|
128
132
|
else
|
129
133
|
:value
|
@@ -131,22 +135,22 @@ module NagiosConfig
|
|
131
135
|
end
|
132
136
|
|
133
137
|
def definition
|
134
|
-
if scanner.skip(/define[ \t]/)
|
138
|
+
if @scanner.skip(/define[ \t]/)
|
135
139
|
emit(:begin_define)
|
136
|
-
|
140
|
+
@in_define = true
|
137
141
|
type
|
138
142
|
end
|
139
143
|
end
|
140
144
|
|
141
145
|
def type
|
142
|
-
type = scanner.scan(/[^;{]+[ \t]*\{[ \t]*\n/)
|
146
|
+
type = @scanner.scan(/[^;{]+[ \t]*\{[ \t]*\n/)
|
143
147
|
if type
|
144
148
|
type.strip!
|
145
|
-
type.chomp!(
|
149
|
+
type.chomp!(OPEN_BRACE)
|
146
150
|
type.strip!
|
147
151
|
emit(:type, type)
|
148
152
|
definition_body
|
149
|
-
elsif scanner.check(/([^;{]+[ \t]*(\{[ \t]*)?)?\Z/)
|
153
|
+
elsif @scanner.check(/([^;{]+[ \t]*(\{[ \t]*)?)?\Z/)
|
150
154
|
:type
|
151
155
|
else
|
152
156
|
raise ParseError.new("type expected")
|
@@ -158,29 +162,29 @@ module NagiosConfig
|
|
158
162
|
end
|
159
163
|
|
160
164
|
def definition_name
|
161
|
-
name = scanner.scan(/[ \t]*[^\s;#]+[ \t]+/)
|
165
|
+
name = @scanner.scan(/[ \t]*[^\s;#]+[ \t]+/)
|
162
166
|
if name
|
163
167
|
name.strip!
|
164
168
|
emit(:name, name)
|
165
169
|
definition_value
|
166
|
-
elsif scanner.check(/[ \t]*[^\s#;}]+\Z/)
|
170
|
+
elsif @scanner.check(/[ \t]*[^\s#;}]+\Z/)
|
167
171
|
:definition_name
|
168
|
-
elsif scanner.
|
172
|
+
elsif @scanner.skip(/[ \t]*[^\s#;]+\n/)
|
169
173
|
raise ParseError.new("value expected")
|
170
174
|
end
|
171
175
|
end
|
172
176
|
|
173
177
|
def definition_value
|
174
|
-
value = scanner.scan(/[^\n;#]*(?=(\n|;))/)
|
178
|
+
value = @scanner.scan(/[^\n;#]*(?=(\n|;))/)
|
175
179
|
if value
|
176
|
-
value = value_buffer + value
|
180
|
+
value = @value_buffer + value
|
177
181
|
value.strip!
|
178
182
|
raise ParseError.new("value expected") if value.empty?
|
179
183
|
emit(:value, value)
|
180
|
-
|
184
|
+
@value_buffer = ""
|
181
185
|
after_value
|
182
|
-
elsif value = scanner.scan(/[^\n;#]+/)
|
183
|
-
value_buffer << value
|
186
|
+
elsif value = @scanner.scan(/[^\n;#]+/)
|
187
|
+
@value_buffer << value
|
184
188
|
:definition_value
|
185
189
|
else
|
186
190
|
:definition_value
|
@@ -188,7 +192,7 @@ module NagiosConfig
|
|
188
192
|
end
|
189
193
|
|
190
194
|
def after_value
|
191
|
-
if scanner.skip(/[ \t]*\n/) || trailing_comment
|
195
|
+
if @scanner.skip(/[ \t]*\n/) || trailing_comment
|
192
196
|
definition_body
|
193
197
|
else
|
194
198
|
:after_value
|
@@ -196,18 +200,18 @@ module NagiosConfig
|
|
196
200
|
end
|
197
201
|
|
198
202
|
def finish_definition
|
199
|
-
if scanner.
|
203
|
+
if @scanner.skip(/[ \t]*\}[ \t]*\n/)
|
200
204
|
emit(:finish_define)
|
201
|
-
|
205
|
+
@in_define = false
|
202
206
|
body
|
203
207
|
end
|
204
208
|
end
|
205
209
|
|
206
210
|
def trailing_comment
|
207
|
-
trailing_comment = scanner.scan(/[ \t]
|
208
|
-
if trailing_comment
|
211
|
+
trailing_comment = @scanner.scan(/[ \t]*;[^\n]*\n/)
|
212
|
+
if trailing_comment && !@ignore_comments
|
209
213
|
trailing_comment.strip!
|
210
|
-
trailing_comment.chomp!(
|
214
|
+
trailing_comment.chomp!(NEWLINE)
|
211
215
|
trailing_comment.slice!(0)
|
212
216
|
emit(:trailing_comment, trailing_comment)
|
213
217
|
end
|
data/lib/nagios_config.rb
CHANGED
@@ -4,4 +4,5 @@ require File.dirname(__FILE__) + "/nagios_config/ast"
|
|
4
4
|
require File.dirname(__FILE__) + "/nagios_config/parser"
|
5
5
|
require File.dirname(__FILE__) + "/nagios_config/formater"
|
6
6
|
require File.dirname(__FILE__) + "/nagios_config/builder"
|
7
|
-
require File.dirname(__FILE__) + "/nagios_config/object"
|
7
|
+
require File.dirname(__FILE__) + "/nagios_config/object"
|
8
|
+
require File.dirname(__FILE__) + "/nagios_config/main"
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nagios_config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Matthew Sadler
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-03-31 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- lib/nagios_config/builder.rb
|
48
48
|
- lib/nagios_config/errors.rb
|
49
49
|
- lib/nagios_config/formater.rb
|
50
|
+
- lib/nagios_config/main.rb
|
50
51
|
- lib/nagios_config/node.rb
|
51
52
|
- lib/nagios_config/object.rb
|
52
53
|
- lib/nagios_config/parser.rb
|