zonefile 1.03 → 1.04

Sign up to get free protection for your applications and to get access to all the features.
@@ -27,6 +27,21 @@
27
27
  # - :name, :ttl, :class, :host
28
28
  # * SRV
29
29
  # - :name, :ttl, :class, :pri, :weight, :port, :host
30
+ # * DS
31
+ # - :name, :ttl, :class, :key_tag, :algorithm, :digest_type, :digest
32
+ # * DNSKEY
33
+ # - :name, :ttl, :class, :flag, :protocol, :algorithm, :public_key
34
+ # * RRSIG
35
+ # - :name, :ttl, :class, :type_covered, :algorithm, :labels, :original_ttl,
36
+ # :expiration, :inception, :key_tag, :signer, :signature
37
+ # * NSEC
38
+ # - :name, :ttl, :class, :next, :types
39
+ # * NSEC3
40
+ # - :name, :ttl, :class, :algorithm, :flags, :iterations, :salt, :next, :types
41
+ # * NSEC3PARAM
42
+ # - :name, :ttl, :class, :algorithm, :flags, :iterations, :salt
43
+ # * NAPTR
44
+ # - :name, :ttl, :class, :order, :preference, :flags, :service, :regexp, :replacement
30
45
  #
31
46
  # == Examples
32
47
  #
@@ -68,14 +83,22 @@
68
83
  # # Print new zonefile
69
84
  # puts "New Zonefile: \n#{zf.output}"
70
85
  #
71
- # == Author
86
+ # == Name attribute magic
87
+ #
88
+ # Since 1.04 the :name attribute is preserved and returned as defined in a previous record if a zonefile entry
89
+ # omits it. This should be the expected behavior for most users.
90
+ # You can switch this off globally by calling Zonefile.preserve_name(false)
91
+ #
92
+ # == Authors
72
93
  #
73
- # Martin Boese, based on Simon Flack Perl library DNS::ZoneParse
94
+ # Martin Boese, based on Simon Flack Perl library DNS::ZoneParse
95
+ #
96
+ # Andy Newton, patch to support various additional records
74
97
  #
75
98
 
76
99
  class Zonefile
77
100
 
78
- RECORDS = %w{ mx a a4 ns cname txt ptr srv soa }
101
+ RECORDS = %w{ mx a a4 ns cname txt ptr srv soa ds dnskey rrsig nsec nsec3 nsec3param naptr }
79
102
  attr :records
80
103
  attr :soa
81
104
  attr :data
@@ -84,6 +107,15 @@ class Zonefile
84
107
  # global $TTL option
85
108
  attr :ttl
86
109
 
110
+ @@preserve_name = true
111
+
112
+ # For compatibility: This can switches off copying of the :name from the
113
+ # previous record in a zonefile if found omitted.
114
+ # This was zonefile's behavior in <= 1.03 .
115
+ def self.preserve_name(do_preserve_name)
116
+ @@preserve_name = do_preserve_name
117
+ end
118
+
87
119
  def method_missing(m, *args)
88
120
  mname = m.to_s.sub("=","")
89
121
  return super unless RECORDS.include?(mname)
@@ -101,7 +133,7 @@ class Zonefile
101
133
  # converts tabs into spaces etc...
102
134
  def self.simplify(zf)
103
135
  # concatenate everything split over multiple lines in parentheses - remove ;-comments in block
104
- zf = zf.gsub(/(\([^\)]*?\))/) { |m| m.split(/\n/).map { |l| l.gsub(/\;.*$/, '') }.join("\n").gsub(/[\r\n]/, '') }
136
+ zf = zf.gsub(/(\([^\)]*?\))/) { |m| m.split(/\n/).map { |l| l.gsub(/\;.*$/, '') }.join("\n").gsub(/[\r\n]/, '').gsub( /[\(\)]/, '') }
105
137
 
106
138
  zf.split(/\n/).map do |line|
107
139
  r = line.gsub(/\t/, ' ')
@@ -145,6 +177,10 @@ class Zonefile
145
177
  end
146
178
 
147
179
  def add_record(type, data= {})
180
+ if @@preserve_name then
181
+ @lastname = data[:name] if data[:name].to_s != ''
182
+ data[:name] = @lastname if data[:name].to_s == ''
183
+ end
148
184
  @records[type.downcase.intern] << data
149
185
  end
150
186
 
@@ -172,6 +208,9 @@ class Zonefile
172
208
  rr_type = /\b(?:NS|A|CNAME)\b/i
173
209
  rr_ttl = /(?:\d+[wdhms]?)+/i
174
210
  ttl_cls = Regexp.new("(?:(#{rr_ttl})\s)?(?:(#{rr_class})\s)?")
211
+ base64 = /([\s\w\+\/]*=*)/i
212
+ hexadeimal = /([\sA-F0-9]*)/i
213
+ quoted = /(\"[^\"]*\")/i
175
214
 
176
215
  data = {}
177
216
  if line =~ /^\$ORIGIN\s*(#{valid_name})/ix then
@@ -206,18 +245,94 @@ class Zonefile
206
245
  /ix
207
246
  add_record('srv', :name => $1, :ttl => $2, :class => $3, :pri => $4, :weight => $5,
208
247
  :port => $6, :host => $7)
248
+ elsif line=~/^(#{valid_name})? \s*
249
+ #{ttl_cls}
250
+ DS \s
251
+ (\d+) \s
252
+ (\w+) \s
253
+ (\d+) \s
254
+ #{hexadeimal}
255
+ /ix
256
+ add_record( 'ds', :name => $1, :ttl => $2, :class => $3, :key_tag => $4.to_i, :algorithm => $5,
257
+ :digest_type => $6.to_i, :digest => $7.gsub( /\s/,'') )
258
+ elsif line=~/^(#{valid_name})? \s*
259
+ #{ttl_cls}
260
+ NSEC \s
261
+ (#{valid_name}) \s
262
+ ([\s\w]*)
263
+ /ix
264
+ add_record( 'nsec', :name => $1, :ttl => $2, :class => $3, :next => $4, :types => $5.strip )
265
+ elsif line=~/^(#{valid_name})? \s*
266
+ #{ttl_cls}
267
+ NSEC3 \s
268
+ (\d+) \s
269
+ (\d+) \s
270
+ (\d+) \s
271
+ (-|[A-F0-9]*) \s
272
+ ([A-Z2-7=]*) \s
273
+ ([\s\w]*)
274
+ /ix
275
+ add_record( 'nsec3', :name => $1, :ttl => $2, :class => $3, :algorithm => $4, :flags => $5,
276
+ :iterations => $6, :salt => $7, :next => $8.strip, :types => $9.strip )
277
+ elsif line=~/^(#{valid_name})? \s*
278
+ #{ttl_cls}
279
+ NSEC3PARAM \s
280
+ (\d+) \s
281
+ (\d+) \s
282
+ (\d+) \s
283
+ (-|[A-F0-9]*)
284
+ /ix
285
+ add_record( 'nsec3param', :name => $1, :ttl => $2, :class => $3, :algorithm => $4, :flags => $5,
286
+ :iterations => $6, :salt => $7 )
287
+ elsif line=~/^(#{valid_name})? \s*
288
+ #{ttl_cls}
289
+ DNSKEY \s
290
+ (\d+) \s
291
+ (\d+) \s
292
+ (\w+) \s
293
+ #{base64}
294
+ /ix
295
+ add_record( 'dnskey', :name => $1, :ttl => $2, :class => $3, :flag => $4.to_i, :protocol => $5.to_i,
296
+ :algorithm => $6, :public_key => $7.gsub( /\s/,'') )
297
+ elsif line=~/^(#{valid_name})? \s*
298
+ #{ttl_cls}
299
+ RRSIG \s
300
+ (\w+) \s
301
+ (\w+) \s
302
+ (\d+) \s
303
+ (\d+) \s
304
+ (\d+) \s
305
+ (\d+) \s
306
+ (\d+) \s
307
+ (#{valid_name}) \s
308
+ #{base64}
309
+ /ix
310
+ add_record( 'rrsig', :name => $1, :ttl => $2, :class => $3, :type_covered => $4, :algorithm => $5,
311
+ :labels => $6.to_i, :original_ttl => $7.to_i, :expiration => $8.to_i, :inception => $9.to_i,
312
+ :key_tag => $10.to_i, :signer => $11, :signature => $12.gsub( /\s/,'') )
313
+ elsif line=~/^(#{valid_name})? \s*
314
+ #{ttl_cls}
315
+ NAPTR \s
316
+ (\d+) \s
317
+ (\d+) \s
318
+ #{quoted} \s
319
+ #{quoted} \s
320
+ #{quoted} \s
321
+ (#{valid_name})
322
+ /ix
323
+ add_record( 'naptr', :name => $1, :ttl => $2, :class => $3, :order => $4.to_i, :preference => $5.to_i,
324
+ :flags => $6, :service => $7, :regexp => $8, :replacement => $9 )
209
325
  elsif line=~/^(#{valid_name}) \s+
210
326
  #{ttl_cls}
211
327
  SOA \s+
212
328
  (#{valid_name}) \s+
213
329
  (#{valid_name}) \s*
214
- \(?\s*
330
+ \s*
215
331
  (#{rr_ttl}) \s+
216
332
  (#{rr_ttl}) \s+
217
333
  (#{rr_ttl}) \s+
218
334
  (#{rr_ttl}) \s+
219
335
  (#{rr_ttl}) \s*
220
- \)?
221
336
  /ix
222
337
  ttl = @soa[:ttl] || $2 || ''
223
338
  @soa[:origin] = $1
@@ -308,7 +423,42 @@ ENDH
308
423
  self.ptr.each do |ptr|
309
424
  out << "#{ptr[:name]} #{ptr[:ttl]} #{ptr[:class]} PTR #{ptr[:host]}\n"
310
425
  end
311
-
426
+
427
+ out << "\n; Zone DS Records\n" unless self.ds.empty?
428
+ self.ds.each do |ds|
429
+ out << "#{ds[:name]} #{ds[:ttl]} #{ds[:class]} DS #{ds[:key_tag]} #{ds[:algorithm]} #{ds[:digest_type]} #{ds[:digest]}\n"
430
+ end
431
+
432
+ out << "\n; Zone NSEC Records\n" unless self.ds.empty?
433
+ self.nsec.each do |nsec|
434
+ out << "#{nsec[:name]} #{nsec[:ttl]} #{nsec[:class]} NSEC #{nsec[:next]} #{nsec[:types]}\n"
435
+ end
436
+
437
+ out << "\n; Zone NSEC3 Records\n" unless self.ds.empty?
438
+ self.nsec3.each do |nsec3|
439
+ out << "#{nsec3[:name]} #{nsec3[:ttl]} #{nsec3[:class]} NSEC3 #{nsec3[:algorithm]} #{nsec3[:flags]} #{nsec3[:iterations]} #{nsec3[:salt]} #{nsec3[:next]} #{nsec3[:types]}\n"
440
+ end
441
+
442
+ out << "\n; Zone NSEC3PARAM Records\n" unless self.ds.empty?
443
+ self.nsec3param.each do |nsec3param|
444
+ out << "#{nsec3param[:name]} #{nsec3param[:ttl]} #{nsec3param[:class]} NSEC3PARAM #{nsec3param[:algorithm]} #{nsec3param[:flags]} #{nsec3param[:iterations]} #{nsec3param[:salt]}\n"
445
+ end
446
+
447
+ out << "\n; Zone DNSKEY Records\n" unless self.ds.empty?
448
+ self.dnskey.each do |dnskey|
449
+ out << "#{dnskey[:name]} #{dnskey[:ttl]} #{dnskey[:class]} DNSKEY #{dnskey[:flag]} #{dnskey[:protocol]} #{dnskey[:algorithm]} #{dnskey[:public_key]}\n"
450
+ end
451
+
452
+ out << "\n; Zone RRSIG Records\n" unless self.ds.empty?
453
+ self.rrsig.each do |rrsig|
454
+ out << "#{rrsig[:name]} #{rrsig[:ttl]} #{rrsig[:class]} RRSIG #{rrsig[:type_covered]} #{rrsig[:algorithm]} #{rrsig[:labels]} #{rrsig[:original_ttl]} #{rrsig[:expiration]} #{rrsig[:inception]} #{rrsig[:key_tag]} #{rrsig[:signer]} #{rrsig[:signature]}\n"
455
+ end
456
+
457
+ out << "\n; Zone NAPTR Records\n" unless self.ds.empty?
458
+ self.naptr.each do |naptr|
459
+ out << "#{naptr[:name]} #{naptr[:ttl]} #{naptr[:class]} NAPTR #{naptr[:order]} #{naptr[:preference]} #{naptr[:flags]} #{naptr[:service]} #{naptr[:regexp]} #{naptr[:replacement]}\n"
460
+ end
461
+
312
462
  out
313
463
  end
314
464
 
data/tests/test-zone.db CHANGED
@@ -32,4 +32,26 @@ txta TXT "t=y; o=-" ; Nasty Comment
32
32
  _kerberos IN TXT maxnet.ao
33
33
  _sip._tcp.example.com. 86400 IN SRV 0 5 5060 sipserver.example.com.
34
34
  12.23.21.23.in-addr.arpa IN PTR www.myhost.example.com.
35
-
35
+ ds1 IN DS 31528 5 1 2274EACD70C5CD6862E1C0262E99D48D9FDEC271
36
+ ds2 IN DS 31528 5 1 ( 2BB183AF5F22588179A53B0A
37
+ 98631FAD1A292118 )
38
+ example.com. 86400 IN DNSKEY 256 3 5 ( AQPSKmynfzW4kyBv015MUG2DeIQ3
39
+ Cbl+BBZH4b/0PY1kxkmvHjcZc8no
40
+ kfzj31GajIQKY+5CptLr3buXA10h
41
+ WqTkF7H6RfoRqXQeogmMHfpftf6z
42
+ Mv1LyBUgia7za6ZEzOJBOztyvhjL
43
+ 742iU/TpPSEDhm2SNKLijfUppn1U
44
+ aNvv4w== )
45
+ example.net. 86400 IN DNSKEY 256 3 5 AQPSKmynfzW4kyBv015MUG2DeIQ3Cbl+BBZH4b/0PY1kxkmvHjcZc8nokfzj31GajIQKY+5CptLr3buXA10hWqTkF7H6RfoRqXQeogmMHfpftf6zMv1LyBUgia7za6ZEzOJBOztyvhjL742iU/TpPSEDhm2SNKLijfUppn1UaNvv4w==
46
+ host.example.com. 86400 IN RRSIG A 5 3 86400 20030322173103 (
47
+ 20030220173103 2642 example.com.
48
+ oJB1W6WNGv+ldvQ3WDG0MQkg5IEhjRip8WTr
49
+ PYGv07h108dUKGMeDPKijVCHX3DDKdfb+v6o
50
+ B9wfuh3DTJXUAfI/M0zmO/zz8bW0Rznl8O3t
51
+ GNazPwQKkRN20XPXV6nwwfoXmJQbsLNrLfkG
52
+ J5D6fwFm8nN+6pBzeDQfsS3Ap3o= )
53
+ alfa.example.com. 86400 IN NSEC host.example.com. (
54
+ A MX RRSIG NSEC TYPE1234 )
55
+ IN NSEC3 1 1 12 aabbccdd ( 2vptu5timamqttgl4luu7kg2leoaor3s A RRSIG )
56
+ IN NSEC3PARAM 1 0 12 aabbccdd
57
+ urn.example.com. IN NAPTR 100 50 "s" "http+N2L+N2C+N2R" "" www.example.com.
data/tests/zonefile.rb CHANGED
@@ -5,6 +5,8 @@ $: << File.expand_path(File.dirname(__FILE__) + '/../lib')
5
5
 
6
6
  require 'zonefile'
7
7
 
8
+ # Zonefile.preserve_name(false)
9
+
8
10
  $zonefile = ARGV[0] || 'test-zone.db'
9
11
 
10
12
  class TC_Zonefile < Test::Unit::TestCase
@@ -60,7 +62,7 @@ class TC_Zonefile < Test::Unit::TestCase
60
62
 
61
63
  a = @zf.a.find { |a| a[:host] == '10.0.0.3'}
62
64
  assert_equal '43200', a[:ttl]
63
- assert_equal '', a[:name].to_s
65
+ assert_equal 'www', a[:name].to_s # name preserved
64
66
 
65
67
  begin
66
68
  @swap_a = true
@@ -68,6 +70,19 @@ class TC_Zonefile < Test::Unit::TestCase
68
70
  test_a
69
71
  end unless @swap_a
70
72
  end
73
+
74
+ def test_preserve_name
75
+ Zonefile.preserve_name(false)
76
+ setup
77
+ a = @zf.a.find { |a| a[:host] == '10.0.0.2'}
78
+ assert_nil a[:name] # no name preserved
79
+ assert_nil @zf.nsec3[0][:name] # same here
80
+ Zonefile.preserve_name(true)
81
+ setup
82
+ a = @zf.a.find { |a| a[:host] == '10.0.0.2'}
83
+ assert_equal 'www', a[:name] # now name IS preserved
84
+ assert_equal 'alfa.example.com.', @zf.nsec3[0][:name] # same here
85
+ end
71
86
 
72
87
  def test_mx
73
88
  assert_equal 2, @zf.mx.size
@@ -164,7 +179,129 @@ class TC_Zonefile < Test::Unit::TestCase
164
179
  test_ptr
165
180
  end unless @swap_ptr
166
181
  end
167
-
182
+
183
+ def test_ds
184
+ assert_equal "ds1", @zf.ds[0][:name]
185
+ assert_equal 31528, @zf.ds[0][:key_tag]
186
+ assert_equal "5", @zf.ds[0][:algorithm]
187
+ assert_equal 1, @zf.ds[0][:digest_type]
188
+ assert_equal "2274EACD70C5CD6862E1C0262E99D48D9FDEC271", @zf.ds[0][:digest]
189
+ assert_equal "ds2", @zf.ds[1][:name]
190
+ assert_equal 31528, @zf.ds[1][:key_tag]
191
+ assert_equal "5", @zf.ds[1][:algorithm]
192
+ assert_equal 1, @zf.ds[1][:digest_type]
193
+ assert_equal "2BB183AF5F22588179A53B0A98631FAD1A292118", @zf.ds[1][:digest]
194
+ begin
195
+ @swap_ds = true
196
+ swap
197
+ test_ds
198
+ end unless @swap_ds
199
+ end
200
+
201
+ def test_nsec
202
+ assert_equal "alfa.example.com.", @zf.nsec[0][:name]
203
+ assert_equal "host.example.com.", @zf.nsec[0][:next]
204
+ assert_equal "A MX RRSIG NSEC TYPE1234", @zf.nsec[0][:types]
205
+ begin
206
+ @swap_nsec = true
207
+ swap
208
+ test_nsec
209
+ end unless @swap_nsec
210
+ end
211
+
212
+ def test_nsec3
213
+ assert_equal "1", @zf.nsec3[0][:algorithm]
214
+ assert_equal "1", @zf.nsec3[0][:flags]
215
+ assert_equal "12", @zf.nsec3[0][:iterations]
216
+ assert_equal "aabbccdd", @zf.nsec3[0][:salt]
217
+ assert_equal "2vptu5timamqttgl4luu7kg2leoaor3s", @zf.nsec3[0][:next]
218
+ assert_equal "A RRSIG", @zf.nsec3[0][:types]
219
+ begin
220
+ @swap_nsec3 = true
221
+ swap
222
+ test_nsec3
223
+ end unless @swap_nsec3
224
+ end
225
+
226
+ def test_nsec3param
227
+ assert_equal "1", @zf.nsec3param[0][:algorithm]
228
+ assert_equal "0", @zf.nsec3param[0][:flags]
229
+ assert_equal "12", @zf.nsec3param[0][:iterations]
230
+ assert_equal "aabbccdd", @zf.nsec3param[0][:salt]
231
+ begin
232
+ @swap_nsec3param = true
233
+ swap
234
+ test_nsec3param
235
+ end unless @swap_nsec3param
236
+ end
237
+
238
+ def test_naptr
239
+ assert_equal "urn.example.com.", @zf.naptr[0][:name]
240
+ assert_equal 100, @zf.naptr[0][:order]
241
+ assert_equal 50, @zf.naptr[0][:preference]
242
+ assert_equal "\"s\"", @zf.naptr[0][:flags]
243
+ assert_equal "\"http+N2L+N2C+N2R\"", @zf.naptr[0][:service]
244
+ assert_equal "\"\"", @zf.naptr[0][:regexp]
245
+ assert_equal "www.example.com.", @zf.naptr[0][:replacement]
246
+ begin
247
+ @swap_natpr = true
248
+ swap
249
+ test_naptr
250
+ end unless @swap_natpr
251
+ end
252
+
253
+ def test_dnskey
254
+ assert_equal "example.com.", @zf.dnskey[0][:name]
255
+ assert_equal 256, @zf.dnskey[0][:flag]
256
+ assert_equal 3, @zf.dnskey[0][:protocol]
257
+ assert_equal "5", @zf.dnskey[0][:algorithm]
258
+ pkey = <<PUBLIC_KEY.gsub( /\s+/,'').strip
259
+ AQPSKmynfzW4kyBv015MUG2DeIQ3
260
+ Cbl+BBZH4b/0PY1kxkmvHjcZc8no
261
+ kfzj31GajIQKY+5CptLr3buXA10h
262
+ WqTkF7H6RfoRqXQeogmMHfpftf6z
263
+ Mv1LyBUgia7za6ZEzOJBOztyvhjL
264
+ 742iU/TpPSEDhm2SNKLijfUppn1U
265
+ aNvv4w==
266
+ PUBLIC_KEY
267
+ assert_equal pkey, @zf.dnskey[0][:public_key]
268
+ assert_equal "example.net.", @zf.dnskey[1][:name]
269
+ assert_equal 256, @zf.dnskey[1][:flag]
270
+ assert_equal 3, @zf.dnskey[1][:protocol]
271
+ assert_equal "5", @zf.dnskey[1][:algorithm]
272
+ assert_equal pkey, @zf.dnskey[1][:public_key]
273
+ begin
274
+ @swap_dnskey = true
275
+ swap
276
+ test_dnskey
277
+ end unless @swap_dnskey
278
+ end
279
+
280
+ def test_rrsig
281
+ assert_equal "host.example.com.", @zf.rrsig[0][:name]
282
+ assert_equal 'A', @zf.rrsig[0][:type_covered]
283
+ assert_equal "5", @zf.rrsig[0][:algorithm]
284
+ assert_equal 3, @zf.rrsig[0][:labels]
285
+ assert_equal 86400, @zf.rrsig[0][:original_ttl]
286
+ assert_equal 20030322173103, @zf.rrsig[0][:expiration]
287
+ assert_equal 20030220173103, @zf.rrsig[0][:inception]
288
+ assert_equal 2642, @zf.rrsig[0][:key_tag]
289
+ assert_equal "example.com.", @zf.rrsig[0][:signer]
290
+ sig = <<SIGNATURE.gsub( /\s+/,'').strip
291
+ oJB1W6WNGv+ldvQ3WDG0MQkg5IEhjRip8WTr
292
+ PYGv07h108dUKGMeDPKijVCHX3DDKdfb+v6o
293
+ B9wfuh3DTJXUAfI/M0zmO/zz8bW0Rznl8O3t
294
+ GNazPwQKkRN20XPXV6nwwfoXmJQbsLNrLfkG
295
+ J5D6fwFm8nN+6pBzeDQfsS3Ap3o=
296
+ SIGNATURE
297
+ assert_equal sig, @zf.rrsig[0][:signature]
298
+ begin
299
+ @swap_rrsig = true
300
+ swap
301
+ test_rrsig
302
+ end unless @swap_rrsig
303
+ end
304
+
168
305
  def test_origin
169
306
  assert_equal 'test-zone.db', @zf.origin
170
307
  swap
metadata CHANGED
@@ -1,12 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zonefile
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
5
- prerelease: false
4
+ hash: 7
5
+ prerelease:
6
6
  segments:
7
7
  - 1
8
- - 3
9
- version: "1.03"
8
+ - 4
9
+ version: "1.04"
10
10
  platform: ruby
11
11
  authors:
12
12
  - Martin Boese
@@ -14,8 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-10-12 00:00:00 +01:00
18
- default_executable:
17
+ date: 2013-02-06 00:00:00 Z
19
18
  dependencies: []
20
19
 
21
20
  description: |-
@@ -35,7 +34,6 @@ files:
35
34
  - tests/test-zone.db
36
35
  - tests/zonefile.rb
37
36
  - CHANGELOG
38
- has_rdoc: true
39
37
  homepage: http://zonefile.rubyforge.org/
40
38
  licenses: []
41
39
 
@@ -65,7 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
63
  requirements: []
66
64
 
67
65
  rubyforge_project: zonefile
68
- rubygems_version: 1.3.7
66
+ rubygems_version: 1.8.24
69
67
  signing_key:
70
68
  specification_version: 3
71
69
  summary: BIND 8/9 Zonefile Reader and Writer