dns-zonefile 1.1.6 → 1.1.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 5ec11df0243060f498e791d455121e688836e89e
4
- data.tar.gz: 60e6d94574f023f6eb9446af7ae8bf44e26291e4
2
+ SHA256:
3
+ metadata.gz: 4edd1610f1ecdf845654917cd1f3ea2aa83f1196a87be9bf97c59a34d10392ec
4
+ data.tar.gz: cf115e357d4763424d310592ebf0eb5d18366fff4a2bb451c61a80371317b62e
5
5
  SHA512:
6
- metadata.gz: 4e16724a0649b230bc9fc34a8689f5852c16e08ac415e1f8b419e4950944756c207b3f451333c90b77cb15280e64674c302454aa9982711ab45139519de42bc7
7
- data.tar.gz: d0ff6c4667591e49e23d579078ec584067d436ce3d37fad5d6e7d4b3c088972cdd838c74969732fcac1436d91ae374689cd56b82feda690eb0a338bcafb1db06
6
+ metadata.gz: 3416c7cc446f189fe4c03e128f37c2b2b9b886c911a7a11345ade49c6ae6bc2a138cf95cc76f77721950ff820bd5817d1e874b9fc90420af42333f54572b4592
7
+ data.tar.gz: e0ee661f673016703e919225b9fc04b3e40ce59effbba2417c0f5489c9db6109f4c8aac23ffed06f2252fbb08c5d65f6c4f5860bd8caa4ccb384adbccc0d178b
@@ -1,4 +1,10 @@
1
1
  language: ruby
2
2
 
3
+ before_install:
4
+ - yes | gem update --system --force
5
+ - gem install bundler
6
+
3
7
  rvm:
4
- - 2.3
8
+ - 2.5
9
+ - 2.6
10
+ - 2.7
@@ -30,3 +30,7 @@ $ rake
30
30
  ## Tests
31
31
 
32
32
  Submit unit tests for your changes. You can test your changes on your machine by [running the test suite](#testing).
33
+
34
+ ## Publishing
35
+
36
+ Once a PR is merged into master, bump the version in `lib/dns/zonefile/version.rb` and commit that change. Next, add a new tag with that version number and push the tag to GitHub. Finally, if you are a maintainer with access rights for rubygems.org, run `gem build dnsimple-zonefile.gemspec` followed by `gem push dnsimple-zonefile-x.x.x.gem` where x.x.x is the version number you just set.
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in dns-zonefile.gemspec
4
4
  gemspec
data/Rakefile CHANGED
@@ -3,4 +3,4 @@ require "rspec/core/rake_task"
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task default: :spec
@@ -1,42 +1,41 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path("../lib", __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'dns/zonefile/version'
3
+ require "dns/zonefile/version"
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "dns-zonefile"
8
- spec.version = DNS::Zonefile::VERSION
9
- spec.authors = ["Craig R Webster", "Anthony Eden"]
10
- spec.email = ["craig@barkingiguana.com", "anthonyeden@gmail.com"]
6
+ spec.name = "dns-zonefile"
7
+ spec.version = DNS::Zonefile::VERSION
8
+ spec.authors = ["Craig R Webster", "Anthony Eden"]
9
+ spec.email = ["craig@barkingiguana.com", "anthonyeden@gmail.com"]
11
10
 
12
- spec.summary = %q{Work with zonefiles (RFC 1035 section 5 and RFC 1034 section 3.6.1)}
13
- spec.description = <<-EOD
14
- The format of a DNS Zonefile is defined in RFC 1035 section 5 and RFC
15
- 1034 section 3.6.1. To anyone who's using BIND they'll look very
16
- familiar.
17
-
18
- This is an attempt to use Ruby parse them into an object graph which can
19
- be investigated programatically, manipulated, validated or printed into
20
- some canonical form.
11
+ spec.summary = "Work with zonefiles (RFC 1035 section 5 and RFC 1034 section 3.6.1)"
12
+ spec.description = <<~EOD
13
+ The format of a DNS Zonefile is defined in RFC 1035 section 5 and RFC
14
+ 1034 section 3.6.1. To anyone who's using BIND they'll look very
15
+ familiar.
16
+
17
+ This is an attempt to use Ruby parse them into an object graph which can
18
+ be investigated programatically, manipulated, validated or printed into
19
+ some canonical form.
21
20
  EOD
22
- spec.homepage = "https://github.com/craigw/dns-zonefile"
21
+ spec.homepage = "https://github.com/craigw/dns-zonefile"
23
22
 
24
23
  # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
25
24
  # delete this section to allow pushing this gem to any host.
26
25
  if spec.respond_to?(:metadata)
27
- spec.metadata['allowed_push_host'] = "https://rubygems.org"
26
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
28
27
  else
29
28
  raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
30
29
  end
31
30
 
32
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
33
- spec.bindir = "exe"
34
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
32
+ spec.bindir = "exe"
33
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
35
34
  spec.require_paths = ["lib"]
36
35
 
37
- spec.add_dependency "treetop", '~> 1.6'
38
- spec.add_dependency "polyglot", '~> 0.3'
39
- spec.add_development_dependency "bundler", "~> 1.11"
40
- spec.add_development_dependency "rake", "~> 10.0"
36
+ spec.add_dependency "treetop", "~> 1.6"
37
+ spec.add_dependency "polyglot", "~> 0.3"
38
+ spec.add_development_dependency "bundler", "~> 2.1"
39
+ spec.add_development_dependency "rake", "~> 13.0"
41
40
  spec.add_development_dependency "rspec", "~> 3.0"
42
41
  end
@@ -1,8 +1,8 @@
1
1
  # First make sure you have installed the `dns-zonefile` gem.
2
- #
2
+ #
3
3
  # Run this script with `ruby basic.rb`
4
4
 
5
- require 'dns/zonefile'
5
+ require "dns/zonefile"
6
6
 
7
7
  zonefile = "example.com.zonefile"
8
8
  zone = DNS::Zonefile.parse(File.read(zonefile))
@@ -1,11 +1,11 @@
1
1
  # First make sure you have installed the `dns-zonefile` gem.
2
- #
2
+ #
3
3
  # Run this script with `ruby basic.rb`
4
4
 
5
- require 'dns/zonefile'
5
+ require "dns/zonefile"
6
6
 
7
7
  zonefile = "example.com.zonefile"
8
- zone = DNS::Zonefile.load(File.read(zonefile), 'example.com.')
8
+ zone = DNS::Zonefile.load(File.read(zonefile), "example.com.")
9
9
 
10
10
  puts zone.soa.origin
11
11
  puts zone.soa.nameserver
@@ -1,86 +1,84 @@
1
- require 'dns/zonefile/version'
2
- require 'treetop'
3
- Treetop.load File.expand_path('../zonefile', __FILE__)
1
+ require "dns/zonefile/version"
2
+ require "treetop"
3
+ Treetop.load File.expand_path("../zonefile", __FILE__)
4
4
 
5
5
  module DNS
6
6
  module Zonefile
7
7
  class << self
8
8
  def parse(zone_string)
9
- parser = ZonefileParser.new
10
- if result = parser.parse(zone_string)
11
- result
12
- else
13
- raise ParsingError, parser.failure_reason
14
- end
9
+ parser = ZonefileParser.new
10
+ result = parser.parse(zone_string)
11
+ return result if result
12
+ raise ParsingError, parser.failure_reason
15
13
  end
16
14
 
17
- def load(zone_string, alternate_origin=nil)
18
- Zone.new(parse(zone_string).entries, alternate_origin)
15
+ def load(zone_string, alternate_origin = nil)
16
+ Zone.new(parse(zone_string).entries, alternate_origin)
19
17
  end
20
18
  end
21
19
 
22
- class ParsingError < RuntimeError ; end
23
- class UnknownRecordType < RuntimeError ; end
20
+ class ParsingError < RuntimeError; end
21
+ class UnknownRecordType < RuntimeError; end
24
22
  class Zone
25
- attr_reader :origin, :soa
23
+ attr_reader :origin
26
24
  attr_reader :records
27
25
 
28
- def initialize(entries, alternate_origin=nil)
29
- alternate_origin ||= '.'
30
- @records = []
31
- @vars = {'origin'=>alternate_origin, :last_host=>'.'}
32
- entries.each do |e|
33
- case e.parse_type
34
- when :variable
35
- case key = e.name.text_value.downcase
36
- when 'ttl'
37
- @vars[key] = e.value.text_value.to_i
38
- else
39
- @vars[key] = e.value.text_value
40
- end
41
- when :soa
42
- @records << SOA.new(@vars, e)
43
- when :record
44
- case e.record_type
45
- when 'A' then @records << A.new(@vars, e)
46
- when 'AAAA' then @records << AAAA.new(@vars, e)
47
- when 'CNAME' then @records << CNAME.new(@vars, e)
48
- when 'MX' then @records << MX.new(@vars, e)
49
- when 'NAPTR' then @records << NAPTR.new(@vars, e)
50
- when 'NS' then @records << NS.new(@vars, e)
51
- when 'PTR' then @records << PTR.new(@vars, e)
52
- when 'SRV' then @records << SRV.new(@vars, e)
53
- when 'SPF' then @records << SPF.new(@vars, e)
54
- when 'SSHFP' then @records << SSHFP.new(@vars, e)
55
- when 'TXT' then @records << TXT.new(@vars, e)
56
- when 'SOA' then ;
57
- else
58
- raise UnknownRecordType, "Unknown record type: #{e.record_type}"
59
- end
60
- end
61
- end
26
+ def initialize(entries, alternate_origin = nil)
27
+ alternate_origin ||= "."
28
+ @records = []
29
+ @vars = {"origin" => alternate_origin, :last_host => "."}
30
+ entries.each do |e|
31
+ case e.parse_type
32
+ when :variable
33
+ key = e.name.text_value.downcase
34
+ @vars[key] = case key
35
+ when "ttl"
36
+ e.value.text_value.to_i
37
+ else
38
+ e.value.text_value
39
+ end
40
+ when :soa
41
+ @records << SOA.new(@vars, e)
42
+ when :record
43
+ case e.record_type
44
+ when "A" then @records << A.new(@vars, e)
45
+ when "AAAA" then @records << AAAA.new(@vars, e)
46
+ when "CAA" then @records << CAA.new(@vars, e)
47
+ when "CNAME" then @records << CNAME.new(@vars, e)
48
+ when "MX" then @records << MX.new(@vars, e)
49
+ when "NAPTR" then @records << NAPTR.new(@vars, e)
50
+ when "NS" then @records << NS.new(@vars, e)
51
+ when "PTR" then @records << PTR.new(@vars, e)
52
+ when "SRV" then @records << SRV.new(@vars, e)
53
+ when "SPF" then @records << SPF.new(@vars, e)
54
+ when "SSHFP" then @records << SSHFP.new(@vars, e)
55
+ when "TXT" then @records << TXT.new(@vars, e)
56
+ when "SOA" then
57
+ # No-op
58
+ else
59
+ raise UnknownRecordType, "Unknown record type: #{e.record_type}"
60
+ end
61
+ end
62
+ end
62
63
  end
63
64
 
64
65
  def soa
65
- records_of(SOA).first
66
+ records_of(SOA).first
66
67
  end
67
68
 
68
69
  def records_of(kl)
69
- @records.select{|r| r.instance_of? kl}
70
+ @records.select { |r| r.instance_of? kl }
70
71
  end
71
72
  end
72
73
 
73
74
  class Record
74
75
  # assign, with handling for global TTL
75
76
  def self.writer_for_ttl(*attribs)
76
- attribs.each do |attrib|
77
- c = <<-MTH
78
- def #{attrib}=(val)
79
- @#{attrib} = val || @vars['ttl']
80
- end
81
- MTH
82
- class_eval c, __FILE__, __LINE__
83
- end
77
+ attribs.each do |attrib|
78
+ define_method "#{attrib}=" do |val|
79
+ instance_variable_set("@#{attrib}", val || @vars["ttl"])
80
+ end
81
+ end
84
82
  end
85
83
 
86
84
  attr_reader :ttl
@@ -88,47 +86,45 @@ module DNS
88
86
  writer_for_ttl :ttl
89
87
 
90
88
  def klass
91
- @klass = nil if @klass == ''
92
- @klass ||= 'IN'
89
+ @klass = nil if @klass == ""
90
+ @klass ||= "IN"
93
91
  end
94
92
 
95
93
  private
94
+
96
95
  def qualify_host(host)
97
- origin = vars['origin']
98
- host = vars[:last_host] if host =~ /^\s*$/
96
+ origin = vars["origin"]
97
+ host = vars[:last_host] if /^\s*$/.match?(host)
99
98
  host = host.gsub(/@/, origin)
100
- if host =~ /\.$/
99
+ if /\.$/.match?(host)
101
100
  host
101
+ elsif /^\./.match?(origin)
102
+ host + origin
102
103
  else
103
- if origin =~ /^\./
104
- host + origin
105
- else
106
- host + "." + origin
107
- end
104
+ host + "." + origin
108
105
  end
109
106
  end
110
107
  attr_accessor :vars
111
-
112
108
  end
113
109
 
114
110
  class SOA < Record
115
111
  attr_accessor :origin, :nameserver, :responsible_party, :serial, :refresh_time, :retry_time, :expiry_time, :nxttl
116
112
 
117
- def initialize(vars, zonefile_soa=nil)
118
- @vars = vars
119
- if zonefile_soa
120
- self.origin = qualify_host(zonefile_soa.origin.to_s)
121
- @vars[:last_host] = self.origin
122
- self.ttl = zonefile_soa.ttl.to_i
123
- self.klass = zonefile_soa.klass.to_s
124
- self.nameserver = qualify_host(zonefile_soa.ns.to_s)
125
- self.responsible_party = qualify_host(zonefile_soa.rp.to_s)
126
- self.serial = zonefile_soa.serial.to_i
127
- self.refresh_time = zonefile_soa.refresh.to_i
128
- self.retry_time = zonefile_soa.reretry.to_i
129
- self.expiry_time = zonefile_soa.expiry.to_i
130
- self.nxttl = zonefile_soa.nxttl.to_i
131
- end
113
+ def initialize(vars, zonefile_soa = nil)
114
+ @vars = vars
115
+ if zonefile_soa
116
+ self.origin = qualify_host(zonefile_soa.origin.to_s)
117
+ @vars[:last_host] = origin
118
+ self.ttl = zonefile_soa.ttl.to_i
119
+ self.klass = zonefile_soa.klass.to_s
120
+ self.nameserver = qualify_host(zonefile_soa.ns.to_s)
121
+ self.responsible_party = qualify_host(zonefile_soa.rp.to_s)
122
+ self.serial = zonefile_soa.serial.to_i
123
+ self.refresh_time = zonefile_soa.refresh.to_i
124
+ self.retry_time = zonefile_soa.reretry.to_i
125
+ self.expiry_time = zonefile_soa.expiry.to_i
126
+ self.nxttl = zonefile_soa.nxttl.to_i
127
+ end
132
128
  end
133
129
  end
134
130
 
@@ -136,69 +132,86 @@ module DNS
136
132
  attr_accessor :host, :address
137
133
 
138
134
  def initialize(vars, zonefile_record)
139
- @vars = vars
140
- if zonefile_record
141
- self.host = qualify_host(zonefile_record.host.to_s)
142
- @vars[:last_host] = self.host
143
- self.ttl = zonefile_record.ttl.to_i
144
- self.klass = zonefile_record.klass.to_s
145
- self.address = zonefile_record.ip_address.to_s
146
- end
135
+ @vars = vars
136
+ if zonefile_record
137
+ self.host = qualify_host(zonefile_record.host.to_s)
138
+ @vars[:last_host] = host
139
+ self.ttl = zonefile_record.ttl.to_i
140
+ self.klass = zonefile_record.klass.to_s
141
+ self.address = zonefile_record.ip_address.to_s
142
+ end
147
143
  end
148
144
  end
149
145
 
150
146
  class AAAA < A
151
147
  end
152
148
 
149
+ class CAA < Record
150
+ attr_accessor :host, :flags, :tag, :value
151
+
152
+ def initialize(vars, zonefile_record)
153
+ @vars = vars
154
+ if zonefile_record
155
+ self.host = qualify_host(zonefile_record.host.to_s)
156
+ @vars[:last_host] = host
157
+ self.ttl = zonefile_record.ttl.to_i
158
+ self.klass = zonefile_record.klass.to_s
159
+ self.flags = zonefile_record.flags.to_i
160
+ self.tag = zonefile_record.tag.to_s
161
+ self.value = zonefile_record.value.to_s
162
+ end
163
+ end
164
+ end
165
+
153
166
  class CNAME < Record
154
167
  attr_accessor :host, :domainname
155
168
 
156
169
  def initialize(vars, zonefile_record)
157
- @vars = vars
158
- if zonefile_record
159
- self.host = qualify_host(zonefile_record.host.to_s)
160
- @vars[:last_host] = self.host
161
- self.ttl = zonefile_record.ttl.to_i
162
- self.klass = zonefile_record.klass.to_s
163
- self.domainname = qualify_host(zonefile_record.target.to_s)
164
- end
170
+ @vars = vars
171
+ if zonefile_record
172
+ self.host = qualify_host(zonefile_record.host.to_s)
173
+ @vars[:last_host] = host
174
+ self.ttl = zonefile_record.ttl.to_i
175
+ self.klass = zonefile_record.klass.to_s
176
+ self.domainname = qualify_host(zonefile_record.target.to_s)
177
+ end
165
178
  end
166
179
 
167
- alias :target :domainname
168
- alias :alias :host
180
+ alias target domainname
181
+ alias alias host
169
182
  end
170
183
 
171
184
  class MX < Record
172
185
  attr_accessor :host, :priority, :domainname
173
186
 
174
187
  def initialize(vars, zonefile_record)
175
- @vars = vars
176
- if zonefile_record
177
- self.host = qualify_host(zonefile_record.host.to_s)
178
- @vars[:last_host] = self.host
179
- self.ttl = zonefile_record.ttl.to_i
180
- self.klass = zonefile_record.klass.to_s
181
- self.priority = zonefile_record.priority.to_i
182
- self.domainname = qualify_host(zonefile_record.exchanger.to_s)
183
- end
188
+ @vars = vars
189
+ if zonefile_record
190
+ self.host = qualify_host(zonefile_record.host.to_s)
191
+ @vars[:last_host] = host
192
+ self.ttl = zonefile_record.ttl.to_i
193
+ self.klass = zonefile_record.klass.to_s
194
+ self.priority = zonefile_record.priority.to_i
195
+ self.domainname = qualify_host(zonefile_record.exchanger.to_s)
196
+ end
184
197
  end
185
198
 
186
- alias :exchange :domainname
187
- alias :exchanger :domainname
199
+ alias exchange domainname
200
+ alias exchanger domainname
188
201
  end
189
202
 
190
203
  class NAPTR < Record
191
204
  attr_accessor :host, :data
192
205
 
193
206
  def initialize(vars, zonefile_record)
194
- @vars = vars
195
- if zonefile_record
196
- self.host = qualify_host(zonefile_record.host.to_s)
197
- @vars[:last_host] = self.host
198
- self.ttl = zonefile_record.ttl.to_i
199
- self.klass = zonefile_record.klass.to_s
200
- self.data = zonefile_record.data.to_s
201
- end
207
+ @vars = vars
208
+ if zonefile_record
209
+ self.host = qualify_host(zonefile_record.host.to_s)
210
+ @vars[:last_host] = host
211
+ self.ttl = zonefile_record.ttl.to_i
212
+ self.klass = zonefile_record.klass.to_s
213
+ self.data = zonefile_record.data.to_s
214
+ end
202
215
  end
203
216
  end
204
217
 
@@ -206,54 +219,54 @@ module DNS
206
219
  attr_accessor :host, :domainname
207
220
 
208
221
  def initialize(vars, zonefile_record)
209
- @vars = vars
210
- if zonefile_record
211
- self.host = qualify_host(zonefile_record.host.to_s)
212
- @vars[:last_host] = self.host
213
- self.ttl = zonefile_record.ttl.to_i
214
- self.klass = zonefile_record.klass.to_s
215
- self.domainname = qualify_host(zonefile_record.nameserver.to_s)
216
- end
222
+ @vars = vars
223
+ if zonefile_record
224
+ self.host = qualify_host(zonefile_record.host.to_s)
225
+ @vars[:last_host] = host
226
+ self.ttl = zonefile_record.ttl.to_i
227
+ self.klass = zonefile_record.klass.to_s
228
+ self.domainname = qualify_host(zonefile_record.nameserver.to_s)
229
+ end
217
230
  end
218
231
 
219
- alias :nameserver :domainname
232
+ alias nameserver domainname
220
233
  end
221
234
 
222
235
  class PTR < Record
223
236
  attr_accessor :host, :domainname
224
237
 
225
238
  def initialize(vars, zonefile_record)
226
- @vars = vars
227
- if zonefile_record
228
- self.host = qualify_host(zonefile_record.host.to_s)
229
- @vars[:last_host] = self.host
230
- self.ttl = zonefile_record.ttl.to_i
231
- self.klass = zonefile_record.klass.to_s
232
- self.domainname = qualify_host(zonefile_record.target.to_s)
233
- end
239
+ @vars = vars
240
+ if zonefile_record
241
+ self.host = qualify_host(zonefile_record.host.to_s)
242
+ @vars[:last_host] = host
243
+ self.ttl = zonefile_record.ttl.to_i
244
+ self.klass = zonefile_record.klass.to_s
245
+ self.domainname = qualify_host(zonefile_record.target.to_s)
246
+ end
234
247
  end
235
248
 
236
- alias :target :domainname
249
+ alias target domainname
237
250
  end
238
251
 
239
252
  class SRV < Record
240
253
  attr_accessor :host, :priority, :weight, :port, :domainname
241
254
 
242
255
  def initialize(vars, zonefile_record)
243
- @vars = vars
244
- if zonefile_record
245
- self.host = qualify_host(zonefile_record.host.to_s)
246
- @vars[:last_host] = self.host
247
- self.ttl = zonefile_record.ttl.to_i
248
- self.klass = zonefile_record.klass.to_s
249
- self.priority = zonefile_record.priority.to_i
250
- self.weight = zonefile_record.weight.to_i
251
- self.port = zonefile_record.port.to_i
252
- self.domainname = qualify_host(zonefile_record.target.to_s)
253
- end
256
+ @vars = vars
257
+ if zonefile_record
258
+ self.host = qualify_host(zonefile_record.host.to_s)
259
+ @vars[:last_host] = host
260
+ self.ttl = zonefile_record.ttl.to_i
261
+ self.klass = zonefile_record.klass.to_s
262
+ self.priority = zonefile_record.priority.to_i
263
+ self.weight = zonefile_record.weight.to_i
264
+ self.port = zonefile_record.port.to_i
265
+ self.domainname = qualify_host(zonefile_record.target.to_s)
266
+ end
254
267
  end
255
268
 
256
- alias :target :domainname
269
+ alias target domainname
257
270
  end
258
271
 
259
272
  class SSHFP < Record
@@ -262,13 +275,13 @@ module DNS
262
275
  def initialize(vars, zonefile_record)
263
276
  @vars = vars
264
277
  if zonefile_record
265
- self.host = qualify_host(zonefile_record.host.to_s)
266
- @vars[:last_host] = self.host
267
- self.ttl = zonefile_record.ttl.to_i
268
- self.klass = zonefile_record.klass.to_s
269
- self.alg = zonefile_record.alg.to_i
270
- self.fptype = zonefile_record.fptype.to_i
271
- self.fp = zonefile_record.fp.to_s
278
+ self.host = qualify_host(zonefile_record.host.to_s)
279
+ @vars[:last_host] = host
280
+ self.ttl = zonefile_record.ttl.to_i
281
+ self.klass = zonefile_record.klass.to_s
282
+ self.alg = zonefile_record.alg.to_i
283
+ self.fptype = zonefile_record.fptype.to_i
284
+ self.fp = zonefile_record.fp.to_s
272
285
  end
273
286
  end
274
287
  end
@@ -277,14 +290,14 @@ module DNS
277
290
  attr_accessor :host, :data
278
291
 
279
292
  def initialize(vars, zonefile_record)
280
- @vars = vars
281
- if zonefile_record
282
- self.host = qualify_host(zonefile_record.host.to_s)
283
- @vars[:last_host] = self.host
284
- self.ttl = zonefile_record.ttl.to_i
285
- self.klass = zonefile_record.klass.to_s
286
- self.data = zonefile_record.data.to_s
287
- end
293
+ @vars = vars
294
+ if zonefile_record
295
+ self.host = qualify_host(zonefile_record.host.to_s)
296
+ @vars[:last_host] = host
297
+ self.ttl = zonefile_record.ttl.to_i
298
+ self.klass = zonefile_record.klass.to_s
299
+ self.data = zonefile_record.data.to_s
300
+ end
288
301
  end
289
302
  end
290
303
 
@@ -53,7 +53,7 @@ grammar Zonefile
53
53
  end
54
54
 
55
55
  rule resource_record
56
- record:(a_record / aaaa_record / cname_record / mx_record / naptr_record / ns_record / ptr_record / srv_record / spf_record / sshfp_record / txt_record / soa_record) space* comment? linebreak {
56
+ record:(a_record / aaaa_record / caa_record / cname_record / mx_record / naptr_record / ns_record / ptr_record / srv_record / spf_record / sshfp_record / txt_record / soa_record) space* comment? linebreak {
57
57
  def zone
58
58
  p = parent
59
59
  while p.respond_to?(:parent) && p.parent
@@ -128,6 +128,28 @@ grammar Zonefile
128
128
  }
129
129
  end
130
130
 
131
+ rule caa_record
132
+ (
133
+ host space ms_age ttl klass "CAA" space flags:integer space tag:unquoted_string space value:caa_value
134
+ ) {
135
+ def to_s
136
+ "#{host} #{ttl} #{klass} CAA #{flags} #{tag} #{value}"
137
+ end
138
+
139
+ def record_type
140
+ "CAA"
141
+ end
142
+ }
143
+ end
144
+
145
+ rule caa_value
146
+ (quoted_string / unquoted_string) {
147
+ def to_s
148
+ text_value
149
+ end
150
+ }
151
+ end
152
+
131
153
  rule cname_record
132
154
  (
133
155
  host space ms_age ttl klass "CNAME" space target:host /
@@ -1,5 +1,5 @@
1
1
  module DNS
2
2
  module Zonefile
3
- VERSION = "1.1.6"
3
+ VERSION = "1.1.9"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dns-zonefile
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.6
4
+ version: 1.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Craig R Webster
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-07-13 00:00:00.000000000 Z
12
+ date: 2020-09-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: treetop
@@ -45,28 +45,28 @@ dependencies:
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '1.11'
48
+ version: '2.1'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '1.11'
55
+ version: '2.1'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: rake
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - "~>"
61
61
  - !ruby/object:Gem::Version
62
- version: '10.0'
62
+ version: '13.0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '10.0'
69
+ version: '13.0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rspec
72
72
  requirement: !ruby/object:Gem::Requirement
@@ -141,8 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
141
  - !ruby/object:Gem::Version
142
142
  version: '0'
143
143
  requirements: []
144
- rubyforge_project:
145
- rubygems_version: 2.5.1
144
+ rubygems_version: 3.1.2
146
145
  signing_key:
147
146
  specification_version: 4
148
147
  summary: Work with zonefiles (RFC 1035 section 5 and RFC 1034 section 3.6.1)