dns-zonefile 1.1.6 → 1.1.10

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: e88aecfb00a572044b1e71d5c3bfc9f4fd4fa88d1ee7a2ae85d2127230d483d8
4
+ data.tar.gz: f121b1c044894597fd2c3b9d1e12892efa444179834ec307001060bf650bd302
5
5
  SHA512:
6
- metadata.gz: 4e16724a0649b230bc9fc34a8689f5852c16e08ac415e1f8b419e4950944756c207b3f451333c90b77cb15280e64674c302454aa9982711ab45139519de42bc7
7
- data.tar.gz: d0ff6c4667591e49e23d579078ec584067d436ce3d37fad5d6e7d4b3c088972cdd838c74969732fcac1436d91ae374689cd56b82feda690eb0a338bcafb1db06
6
+ metadata.gz: 871370b42902039616ed6a2fd7d6fc3556f99abe54cb53fa17b3989ac47735c8e4be82a41ff9b2ba551da4352886607d686137018859a87be575407d4ebd1386
7
+ data.tar.gz: 8933e2220b5aa111d6b54e3870c1cbb67c02b213e78faaa328d05339aa367be3837c84e7054c70b7bd08f44c3b0b21a3efeb30edd22afda56968add0697cdb94
@@ -0,0 +1,7 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ open-pull-requests-limit: 10
@@ -0,0 +1,31 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ types:
6
+ - opened
7
+ - reopened
8
+ - synchronize
9
+ - ready_for_review
10
+ push:
11
+ branches: [ main ]
12
+
13
+ concurrency:
14
+ group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
15
+ cancel-in-progress: true
16
+
17
+ jobs:
18
+ test:
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ os: [ubuntu-20.04, ubuntu-latest]
23
+ ruby: ['2.7', '3.0', '3.1', head, jruby, truffleruby]
24
+ runs-on: ${{ matrix.os }}
25
+ steps:
26
+ - uses: actions/checkout@v3
27
+ - uses: ruby/setup-ruby@v1
28
+ with:
29
+ ruby-version: ${{ matrix.ruby }}
30
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
31
+ - run: bundle exec rake
data/CONTRIBUTING.md CHANGED
@@ -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/README.md CHANGED
@@ -24,28 +24,32 @@ Okay, you're ready to move onto the examples now.
24
24
  Using raw data from the parser. Note that "@" isn't translated in this mode.
25
25
  Nor are inherited TTLs interpreted.
26
26
 
27
- zonefile = "/path/to/file.zone"
28
- zone_string = File.read(zonefile)
29
- zone = DNS::Zonefile.parse(zone_string)
27
+ ```ruby
28
+ zonefile = "/path/to/file.zone"
29
+ zone_string = File.read(zonefile)
30
+ zone = DNS::Zonefile.parse(zone_string)
30
31
 
31
- puts zone.soa.origin.to_s
32
- puts zone.soa.ns.to_s
33
- puts zone.rr[0].to_s
32
+ puts zone.soa.origin.to_s
33
+ puts zone.soa.ns.to_s
34
+ puts zone.rr[0].to_s
35
+ ```
34
36
 
35
37
  Using more structure data. @, TTLs, and empty hostname inheritance are all
36
38
  handled in this mode.
37
39
 
38
- zonefile = "/path/to/file.zone"
39
- zone_string = File.read(zonefile)
40
- zone = DNS::Zonefile.load(zone_string)
41
- # or, if no $origin is in the zone file
42
- zone = DNS::Zonefile.load(zone_string, 'example.com.')
40
+ ```ruby
41
+ zonefile = "/path/to/file.zone"
42
+ zone_string = File.read(zonefile)
43
+ zone = DNS::Zonefile.load(zone_string)
44
+ # or, if no $origin is in the zone file
45
+ zone = DNS::Zonefile.load(zone_string, 'example.com.')
43
46
 
44
- puts zone.soa.origin
45
- puts zone.soa.nameserver
46
- puts zone.records[1]
47
- # get all MX records
48
- puts zone.records_of(DNS::Zonefile::MX)
47
+ puts zone.soa.origin
48
+ puts zone.soa.nameserver
49
+ puts zone.records[1]
50
+ # get all MX records
51
+ puts zone.records_of(DNS::Zonefile::MX)
52
+ ```
49
53
 
50
54
  Open the examples in the `./examples` directory to see more examples.
51
55
 
@@ -65,4 +69,4 @@ Craig R Webster <http://barkingiguana.com/>
65
69
 
66
70
  See the TODO. Read CONTRIBUTING.md for more details on how to contribute to this project.
67
71
 
68
- [![Build Status](https://secure.travis-ci.org/craigw/dns-zonefile.png)](http://travis-ci.org/craigw/dns-zonefile)
72
+ [![Build Status](https://secure.travis-ci.org/craigw/dns-zonefile.svg)](http://travis-ci.org/craigw/dns-zonefile)
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
data/dns-zonefile.gemspec CHANGED
@@ -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
data/examples/basic.rb CHANGED
@@ -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,5 +1,5 @@
1
1
  module DNS
2
2
  module Zonefile
3
- VERSION = "1.1.6"
3
+ VERSION = "1.1.10"
4
4
  end
5
5
  end
data/lib/dns/zonefile.rb CHANGED
@@ -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
 
@@ -43,7 +43,10 @@ grammar Zonefile
43
43
  end
44
44
 
45
45
  rule soa
46
- origin space ttl klass "SOA" space ns space rp space "("? multiline_comment* space_or_break* serial multiline_comment* space_or_break refresh multiline_comment* space_or_break reretry multiline_comment* space_or_break expiry multiline_comment* space_or_break nxttl multiline_comment* space_or_break* ")"? {
46
+ (
47
+ origin space ttl klass "SOA" space ns space rp space "("? multiline_comment* space_or_break* serial multiline_comment* space_or_break refresh multiline_comment* space_or_break reretry multiline_comment* space_or_break expiry multiline_comment* space_or_break nxttl multiline_comment* space_or_break* ")"? /
48
+ origin space klass ttl "SOA" space ns space rp space "("? multiline_comment* space_or_break* serial multiline_comment* space_or_break refresh multiline_comment* space_or_break reretry multiline_comment* space_or_break expiry multiline_comment* space_or_break nxttl multiline_comment* space_or_break* ")"?
49
+ ) {
47
50
  def to_s
48
51
  "#{origin} #{ttl} #{klass} SOA #{ns} #{rp} (#{serial} #{refresh} #{reretry} #{expiry} #{nxttl})"
49
52
  end
@@ -53,7 +56,7 @@ grammar Zonefile
53
56
  end
54
57
 
55
58
  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 {
59
+ 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
60
  def zone
58
61
  p = parent
59
62
  while p.respond_to?(:parent) && p.parent
@@ -89,7 +92,10 @@ grammar Zonefile
89
92
  end
90
93
 
91
94
  rule a_record
92
- host space ms_age ttl klass "A" space ip_address {
95
+ (
96
+ host space ms_age ttl klass "A" space ip_address /
97
+ host space ms_age klass ttl "A" space ip_address
98
+ ) {
93
99
  def to_s
94
100
  "#{host} #{ms_age} #{ttl} #{klass} A #{ip_address}"
95
101
  end
@@ -109,7 +115,10 @@ grammar Zonefile
109
115
  end
110
116
 
111
117
  rule aaaa_record
112
- host space ms_age ttl klass "AAAA" space ip_address:ip6_address {
118
+ (
119
+ host space ms_age ttl klass "AAAA" space ip_address:ip6_address /
120
+ host space ms_age klass ttl "AAAA" space ip_address:ip6_address
121
+ ) {
113
122
  def to_s
114
123
  "#{host} #{ttl} #{klass} AAAA #{ip_address}"
115
124
  end
@@ -128,6 +137,29 @@ grammar Zonefile
128
137
  }
129
138
  end
130
139
 
140
+ rule caa_record
141
+ (
142
+ host space ms_age ttl klass "CAA" space flags:integer space tag:unquoted_string space value:caa_value /
143
+ host space ms_age klass ttl "CAA" space flags:integer space tag:unquoted_string space value:caa_value
144
+ ) {
145
+ def to_s
146
+ "#{host} #{ttl} #{klass} CAA #{flags} #{tag} #{value}"
147
+ end
148
+
149
+ def record_type
150
+ "CAA"
151
+ end
152
+ }
153
+ end
154
+
155
+ rule caa_value
156
+ (quoted_string / unquoted_string) {
157
+ def to_s
158
+ text_value
159
+ end
160
+ }
161
+ end
162
+
131
163
  rule cname_record
132
164
  (
133
165
  host space ms_age ttl klass "CNAME" space target:host /
@@ -146,7 +178,10 @@ grammar Zonefile
146
178
  end
147
179
 
148
180
  rule mx_record
149
- host space ttl klass "MX" space priority:integer space exchanger:host {
181
+ (
182
+ host space ttl klass "MX" space priority:integer space exchanger:host /
183
+ host space klass ttl "MX" space priority:integer space exchanger:host
184
+ ) {
150
185
  def to_s
151
186
  "#{host} #{ttl} #{klass} MX #{priority} #{exchanger}"
152
187
  end
@@ -158,7 +193,10 @@ grammar Zonefile
158
193
  end
159
194
 
160
195
  rule naptr_record
161
- host space ms_age ttl klass "NAPTR" space data {
196
+ (
197
+ host space ms_age ttl klass "NAPTR" space data /
198
+ host space ms_age klass ttl "NAPTR" space data
199
+ ) {
162
200
  def to_s
163
201
  "#{host} #{ttl} #{klass} NAPTR #{data}"
164
202
  end
@@ -170,7 +208,10 @@ grammar Zonefile
170
208
  end
171
209
 
172
210
  rule ns_record
173
- host space ms_age ttl klass "NS" space nameserver:host {
211
+ (
212
+ host space ms_age ttl klass "NS" space nameserver:host /
213
+ host space ms_age klass ttl "NS" space nameserver:host
214
+ ) {
174
215
  def to_s
175
216
  "#{host} #{ttl} #{klass} NS #{nameserver}"
176
217
  end
@@ -182,7 +223,10 @@ grammar Zonefile
182
223
  end
183
224
 
184
225
  rule ptr_record
185
- host space ms_age ttl klass "PTR" space target:host {
226
+ (
227
+ host space ms_age ttl klass "PTR" space target:host /
228
+ host space ms_age klass ttl "PTR" space target:host
229
+ ) {
186
230
  def to_s
187
231
  "#{host} #{ttl} #{klass} PTR #{target}"
188
232
  end
@@ -194,7 +238,10 @@ grammar Zonefile
194
238
  end
195
239
 
196
240
  rule soa_record
197
- origin space ms_age ttl klass "SOA" space ns space rp space data {
241
+ (
242
+ origin space ms_age ttl klass "SOA" space ns space rp space data /
243
+ origin space ms_age klass ttl "SOA" space ns space rp space data
244
+ ) {
198
245
  def to_s
199
246
  "#{origin} #{ttl} #{klass} SOA #{ns} #{rp} (#{space})"
200
247
  end
@@ -223,7 +270,10 @@ grammar Zonefile
223
270
  end
224
271
 
225
272
  rule spf_record
226
- host space ms_age ttl klass "SPF" space data:txt_data {
273
+ (
274
+ host space ms_age ttl klass "SPF" space data:txt_data /
275
+ host space ms_age klass ttl "SPF" space data:txt_data
276
+ ) {
227
277
  def to_s
228
278
  "#{host} #{ttl} #{klass} SPF #{data}"
229
279
  end
@@ -235,7 +285,10 @@ grammar Zonefile
235
285
  end
236
286
 
237
287
  rule sshfp_record
238
- host space ms_age ttl klass "SSHFP" space alg:integer space fptype:integer space fp:fingerprint {
288
+ (
289
+ host space ms_age ttl klass "SSHFP" space alg:integer space fptype:integer space fp:fingerprint /
290
+ host space ms_age klass ttl "SSHFP" space alg:integer space fptype:integer space fp:fingerprint
291
+ ) {
239
292
  def to_s
240
293
  "#{host} #{ttl} #{klass} SSHFP #{alg} #{fptype} #{fp}"
241
294
  end
@@ -247,7 +300,10 @@ grammar Zonefile
247
300
  end
248
301
 
249
302
  rule txt_record
250
- host space ms_age ttl klass "TXT" space data:ms_txt_data {
303
+ (
304
+ host space ms_age ttl klass "TXT" space data:ms_txt_data /
305
+ host space ms_age klass ttl "TXT" space data:ms_txt_data
306
+ ) {
251
307
  def to_s
252
308
  "#{host} #{ttl} #{klass} TXT #{data}"
253
309
  end
@@ -505,7 +561,7 @@ grammar Zonefile
505
561
  end
506
562
 
507
563
  rule unquoted_string
508
- [a-zA-Z0-9=_]+ {
564
+ '[a-zA-Z0-9=_\.\-\@\:]+'r {
509
565
  def to_s
510
566
  text_value
511
567
  end
metadata CHANGED
@@ -1,15 +1,15 @@
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.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Craig R Webster
8
8
  - Anthony Eden
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-07-13 00:00:00.000000000 Z
12
+ date: 2022-11-25 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
@@ -96,9 +96,10 @@ executables: []
96
96
  extensions: []
97
97
  extra_rdoc_files: []
98
98
  files:
99
+ - ".github/dependabot.yml"
100
+ - ".github/workflows/ci.yml"
99
101
  - ".gitignore"
100
102
  - ".rspec"
101
- - ".travis.yml"
102
103
  - CONTRIBUTING.md
103
104
  - Dockerfile
104
105
  - Gemfile
@@ -108,7 +109,6 @@ files:
108
109
  - TODO
109
110
  - bin/console
110
111
  - bin/setup
111
- - circle.yml
112
112
  - dns-zonefile.gemspec
113
113
  - doc/example.com.zone
114
114
  - doc/example2.com.zone
@@ -126,7 +126,7 @@ homepage: https://github.com/craigw/dns-zonefile
126
126
  licenses: []
127
127
  metadata:
128
128
  allowed_push_host: https://rubygems.org
129
- post_install_message:
129
+ post_install_message:
130
130
  rdoc_options: []
131
131
  require_paths:
132
132
  - lib
@@ -141,9 +141,8 @@ 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
146
- signing_key:
144
+ rubygems_version: 3.3.7
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)
149
148
  test_files: []
data/.travis.yml DELETED
@@ -1,4 +0,0 @@
1
- language: ruby
2
-
3
- rvm:
4
- - 2.3
data/circle.yml DELETED
@@ -1,6 +0,0 @@
1
- dependencies:
2
- pre:
3
- - gem install bundler --version 1.11
4
- machine:
5
- ruby:
6
- version: 2.3.0