bind9mgr 0.3.12 → 0.3.13

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -82,3 +82,8 @@
82
82
  === 0.3.11 / 2011-12-26
83
83
 
84
84
  * Missing newLine after rr in generated zone db files bug fix
85
+
86
+ === 0.3.13 / 2013-02-13
87
+
88
+ * Parser fix: TXT records with spaces are parsed without failure
89
+ * test added
data/lib/bind9mgr.rb CHANGED
@@ -6,7 +6,7 @@ require File.join( File.dirname(__FILE__), 'resource_record' )
6
6
  require File.join( File.dirname(__FILE__), 'parser' )
7
7
 
8
8
  module Bind9mgr
9
- VERSION = '0.3.12'
9
+ VERSION = '0.3.13'
10
10
 
11
11
  ZONES_BIND_SUBDIR = 'primary'
12
12
 
data/lib/parser.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  module Bind9mgr
2
- TYPES = %w{A CNAME TXT PTR NS SRV} # SOA, MX - are different
2
+ # this TYPES will be parsed with simplified state_rules chain
3
+ TYPES = %w{A CNAME PTR NS SRV} # SOA, MX, TXT - are different
3
4
  class Parser
4
5
 
5
6
  attr_reader :state
@@ -12,9 +13,10 @@ module Bind9mgr
12
13
  @STATE_RULES =
13
14
  # [current_state, target_state, proc to perform(token will be passe in)
14
15
  [ [:start, :origin, Proc.new{ |t| t == '$ORIGIN' }],
15
- [:origin, :start, Proc.new{ |t| set_origin t }],
16
+ [:origin, :last_token_in_a_row, Proc.new{ |t| set_origin t }],
16
17
  [:start, :ttl, Proc.new{ |t| t == '$TTL' }],
17
- [:ttl, :start, Proc.new{ |t| set_ttl t }],
18
+ [:ttl, :last_token_in_a_row, Proc.new{ |t| set_ttl t }],
19
+ [:last_token_in_a_row, :start, Proc.new{ |t| t == "\n" ? true : false }],
18
20
  [:start, :type, Proc.new{ |t| TYPES.include?(t) ? add_rr(nil, nil, nil, t, nil) : false }],
19
21
  [:start, :klass, Proc.new{ |t| KLASSES.include?(t) ? add_rr(nil, nil, t, nil, nil) : false }],
20
22
  [:start, :rttl, Proc.new{ |t| t.match(/^\d+$/) ? add_rr(nil, t, nil, nil, nil) : false }],
@@ -23,11 +25,13 @@ module Bind9mgr
23
25
  [:owner, :klass, Proc.new{ |t| KLASSES.include?(t) ? update_last_rr(nil, nil, t, nil, nil) : false }],
24
26
  [:owner, :type, Proc.new{ |t| TYPES.include?(t) ? update_last_rr(nil, nil, nil, t, nil) : false }],
25
27
  [:owner, :mx, Proc.new{ |t| t == 'MX' ? update_last_rr(nil, nil, nil, t, nil) : false }],
28
+ [:owner, :txt, Proc.new{ |t| t == 'TXT' ? update_last_rr(nil, nil, nil, t, nil) : false }],
26
29
  [:rttl, :klass, Proc.new{ |t| KLASSES.include?(t) ? update_last_rr(nil, nil, t, nil, nil) : false }],
27
30
  [:klass, :type, Proc.new{ |t| TYPES.include?(t) ? update_last_rr(nil, nil, nil, t, nil) : false }],
28
- [:type, :start, Proc.new{ |t| update_last_rr(nil, nil, nil, nil, t) }],
31
+ [:type, :last_token_in_a_row, Proc.new{ |t| update_last_rr(nil, nil, nil, nil, t) }],
29
32
  [:klass, :soa, Proc.new{ |t| t == 'SOA' ? update_last_rr(nil, nil, nil, t, nil) : false }],
30
- [:soa, :start, Proc.new{ |t| rdata = [t] + @tokens.shift(7)
33
+ [:soa, :last_token_in_a_row, Proc.new{ |t| rdata = [t] + @tokens.shift(@tokens.index(')'))
34
+ rdata.select!{|tt| tt != "\n" }
31
35
  raise ParserError, "Zone parsing error: parentices expected in SOA record.\n#{@content}" if (rdata[2] != '(') && (@tokens.first != ')')
32
36
  rdata.delete_at(2)
33
37
  @result.options[:support_email] = rdata[1]
@@ -40,7 +44,8 @@ module Bind9mgr
40
44
  @tokens.shift
41
45
  }],
42
46
  [:klass, :mx, Proc.new{ |t| t == 'MX' ? update_last_rr(nil, nil, nil, t, nil) : false }],
43
- [:mx, :start, Proc.new{ |t| update_last_rr(nil, nil, nil, nil, [t] + [@tokens.shift]) }]
47
+ [:mx, :last_token_in_a_row, Proc.new{ |t| update_last_rr(nil, nil, nil, nil, [t] + [@tokens.shift]) }],
48
+ [:txt, :last_token_in_a_row, Proc.new{ |t| update_last_rr(nil, nil, nil, nil, ([t] + [@tokens.shift(@tokens.index("\n"))]).join(" ")) }] # '\t' symbol is lost here! may be a BUG
44
49
  ]
45
50
  end
46
51
 
@@ -48,6 +53,8 @@ module Bind9mgr
48
53
  @content = str # for debugging
49
54
  @tokens = tokenize( str )
50
55
 
56
+ puts @tokens.inspect
57
+
51
58
  cntr = 0
52
59
  while @tokens.size > 0
53
60
  token = @tokens.shift
@@ -65,7 +72,7 @@ module Bind9mgr
65
72
  @state = current_edge[1] if flag
66
73
  end
67
74
 
68
- raise( ParserError, "no successful rules found. cur_state: #{@state}, token: #{token}" ) unless flag
75
+ raise( ParserError, "no successful rules found. cur_state: #{@state}, token: #{token}, next tokens: #{@tokens.inspect}" ) unless flag
69
76
  cntr += 1
70
77
  end
71
78
 
@@ -77,7 +84,35 @@ module Bind9mgr
77
84
  private
78
85
 
79
86
  def tokenize str
80
- str.gsub(/;.*$/, '').split(/\s/).select{|s|s.length > 0}
87
+ dirty_tokens = str.gsub(/;.*$/, '').split(/[ \t\r]/)
88
+
89
+ puts dirty_tokens.inspect
90
+
91
+ tokens = []
92
+ dirty_tokens.each do |t|
93
+
94
+
95
+
96
+ if t.index("\n")
97
+ puts "n found: #{t.inspect}"
98
+ while t.index("\n") do
99
+ i = t.index("\n")-1
100
+ puts "slice: #{i}, #{t.slice(0..(i >= 0 ? i : 0))}"
101
+ tokens << t.slice!(0..i) if i >= 0
102
+ puts "after slice: #{t.inspect}"
103
+ tokens << "\n"
104
+ puts "cut:" + t.slice!(0..0).inspect
105
+ end
106
+ puts "add after cut:#{t.inspect}"
107
+ tokens << t
108
+ else
109
+ puts "just add:#{t}"
110
+ tokens << t
111
+ end
112
+
113
+ end
114
+
115
+ tokens.select{|s|s.length > 0}
81
116
  end
82
117
 
83
118
  def get_options
data/spec/parser_spec.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Bind9mgr::Parser do
4
+
5
+ # first rrs are used by index at some tests so dont change their sequence
4
6
  let(:test_zone) do
5
- %q{$ORIGIN cloud.ru.
7
+ %Q{$ORIGIN cloud.ru.
6
8
  $TTL 86400 ; 1 day
7
9
  @ IN SOA cloud.ru. root.cloud.ru. (
8
10
  2011083002 ; serial
@@ -17,6 +19,8 @@ nfsstorage IN CNAME ns
17
19
  mail IN MX 40 192.168.1.33
18
20
  www CNAME @
19
21
  cloud.ru. IN A 192.168.1.1
22
+ human-txt TXT 'this is text with spases'
23
+
20
24
  NS ns2.cloud.ru
21
25
  manager IN A 192.168.1.20
22
26
  director IN A 192.168.1.23
@@ -97,6 +101,14 @@ esx1 IN A 192.168.1.2
97
101
  rr.rdata.should eql('192.168.1.200')
98
102
  end
99
103
 
104
+ it "should parse TXT records" do
105
+ rr = @result.records[7]
106
+ rr.type.should == 'TXT'
107
+ rr.owner.should eql('human-txt')
108
+ rr.klass.should eql(nil)
109
+ rr.rdata.should eql("'this is text with spases'")
110
+ end
111
+
100
112
  it "should parse MX records(and mx priority!)" do
101
113
  rr = @result.records[4]
102
114
  rr.type.should == 'MX'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bind9mgr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.12
4
+ version: 0.3.13
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,19 +9,40 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-27 00:00:00.000000000Z
12
+ date: 2013-02-13 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rdoc
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '3.10'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '3.10'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: hoe
16
- requirement: &24340360 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
17
33
  none: false
18
34
  requirements:
19
35
  - - ~>
20
36
  - !ruby/object:Gem::Version
21
- version: '2.12'
37
+ version: '3.5'
22
38
  type: :development
23
39
  prerelease: false
24
- version_requirements: *24340360
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '3.5'
25
46
  description: This gem contains some classes to manage bind9 zone files
26
47
  email:
27
48
  - mikhail@mad-box.ru
@@ -72,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
93
  version: '0'
73
94
  requirements: []
74
95
  rubyforge_project: bind9mgr
75
- rubygems_version: 1.8.10
96
+ rubygems_version: 1.8.24
76
97
  signing_key:
77
98
  specification_version: 3
78
99
  summary: This gem contains some classes to manage bind9 zone files