dns-zonefile 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -0
- data/.travis.yml +7 -0
- data/{README → README.md} +32 -35
- data/TODO +2 -0
- data/dns-zonefile.gemspec +3 -3
- data/doc/zonefile.treetop +13 -3
- data/lib/dns/zonefile/parser.rb +627 -75
- data/lib/dns/zonefile/version.rb +1 -1
- data/spec/dns/zonefile_spec.rb +41 -3
- metadata +53 -18
- data/Gemfile.lock +0 -32
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/{README → README.md}
RENAMED
@@ -1,65 +1,61 @@
|
|
1
|
-
DNS::Zonefile
|
2
|
-
=============
|
1
|
+
# DNS::Zonefile
|
3
2
|
|
4
3
|
The format of a DNS Zonefile is defined in RFC 1035 section 5 and RFC
|
5
|
-
1034 section 3.6.1. To anyone who's using BIND they'll look very
|
4
|
+
1034 section 3.6.1. To anyone who's using BIND they'll look very
|
6
5
|
familiar.
|
7
6
|
|
8
|
-
This is an attempt to use Ruby parse them into an object graph which can
|
9
|
-
be investigated programatically, manipulated, validated or printed into
|
7
|
+
This is an attempt to use Ruby parse them into an object graph which can
|
8
|
+
be investigated programatically, manipulated, validated or printed into
|
10
9
|
some canonical form.
|
11
10
|
|
12
11
|
|
13
|
-
Getting setup
|
14
|
-
-------------
|
12
|
+
## Getting setup
|
15
13
|
|
16
|
-
Well, you'll need the treetop and polyglot gems installed. They do all
|
14
|
+
Well, you'll need the treetop and polyglot gems installed. They do all
|
17
15
|
the hard work. Thanks!
|
18
16
|
|
19
|
-
|
17
|
+
sudo gem install treetop polyglot
|
20
18
|
|
21
|
-
Now you'll need to generate the Treetop parser from the Zonefile grammar
|
19
|
+
Now you'll need to generate the Treetop parser from the Zonefile grammar
|
22
20
|
that I've hacked together.
|
23
21
|
|
24
|
-
|
22
|
+
rake generate_grammar
|
25
23
|
|
26
24
|
Okay, you're ready to move onto the examples now.
|
27
25
|
|
28
26
|
The above steps should not be necessary if you install the gem via rubygems.
|
29
27
|
|
30
28
|
|
31
|
-
Examples
|
32
|
-
--------
|
29
|
+
## Examples
|
33
30
|
|
34
31
|
Using raw data from the parser. Note that "@" isn't translated in this mode.
|
35
32
|
Nor are inherited TTLs interpreted.
|
36
33
|
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
zonefile = "/path/to/file.zone"
|
35
|
+
zone_string = File.read(zonefile)
|
36
|
+
zone = DNS::Zonefile.parse(zone_string)
|
40
37
|
|
41
|
-
|
42
|
-
|
43
|
-
|
38
|
+
puts zone.soa.origin.to_s
|
39
|
+
puts zone.soa.ns.to_s
|
40
|
+
puts zone.rr[0].to_s
|
44
41
|
|
45
42
|
Using more structure data. @, TTLs, and empty hostname inheritance are all
|
46
43
|
handled in this mode.
|
47
44
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
45
|
+
zonefile = "/path/to/file.zone"
|
46
|
+
zone_string = File.read(zonefile)
|
47
|
+
zone = DNS::Zonefile.load(zone_string)
|
48
|
+
# or, if no $origin is in the zone file
|
49
|
+
zone = DNS::Zonefile.load(zone_string, 'example.com.')
|
53
50
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
51
|
+
puts zone.soa.origin
|
52
|
+
puts zone.soa.nameserver
|
53
|
+
puts zone.records[1]
|
54
|
+
# get all MX records
|
55
|
+
puts zone.records_of(DNS::Zonefile::MX)
|
59
56
|
|
60
57
|
|
61
|
-
Authors
|
62
|
-
-------
|
58
|
+
## Authors
|
63
59
|
|
64
60
|
Original code and concept:
|
65
61
|
Craig R Webster <http://barkingiguana.com/>
|
@@ -68,8 +64,9 @@ Additions:
|
|
68
64
|
t.e.morgan <http://zerigo.com/>
|
69
65
|
|
70
66
|
|
71
|
-
Contributing
|
72
|
-
------------
|
67
|
+
## Contributing
|
73
68
|
|
74
|
-
See the TODO. Send me patches or pull request either by email or on
|
75
|
-
GitHub.
|
69
|
+
See the TODO. Send me patches or pull request either by email or on
|
70
|
+
GitHub.
|
71
|
+
|
72
|
+
[](http://travis-ci.org/craigw/dns-zonefile)
|
data/TODO
CHANGED
@@ -2,3 +2,5 @@
|
|
2
2
|
* Output the zone object-graph as a zone string.
|
3
3
|
* Allow comparison of resource records and zones for checking equality.
|
4
4
|
* Allow unqualified ns and rp in SOA
|
5
|
+
* Implement the changes in the eam pull request for other record types:
|
6
|
+
https://github.com/craigw/dns-zonefile/pull/1
|
data/dns-zonefile.gemspec
CHANGED
@@ -10,11 +10,11 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.homepage = ""
|
11
11
|
s.summary = %q{Work with zonefiles (RFC 1035 section 5 and RFC 1034 section 3.6.1)}
|
12
12
|
s.description = %q{The format of a DNS Zonefile is defined in RFC 1035 section 5 and RFC
|
13
|
-
1034 section 3.6.1. To anyone who's using BIND they'll look very
|
13
|
+
1034 section 3.6.1. To anyone who's using BIND they'll look very
|
14
14
|
familiar.
|
15
15
|
|
16
|
-
This is an attempt to use Ruby parse them into an object graph which can
|
17
|
-
be investigated programatically, manipulated, validated or printed into
|
16
|
+
This is an attempt to use Ruby parse them into an object graph which can
|
17
|
+
be investigated programatically, manipulated, validated or printed into
|
18
18
|
some canonical form.}
|
19
19
|
|
20
20
|
s.rubyforge_project = "dns-zonefile"
|
data/doc/zonefile.treetop
CHANGED
@@ -121,7 +121,12 @@ grammar Zonefile
|
|
121
121
|
end
|
122
122
|
|
123
123
|
rule cname_record
|
124
|
-
|
124
|
+
(
|
125
|
+
host space ttl klass "CNAME" space target:host /
|
126
|
+
host space klass ttl "CNAME" space target:host /
|
127
|
+
host space ttl "CNAME" space target:host /
|
128
|
+
host space klass "CNAME" space target:host
|
129
|
+
) {
|
125
130
|
def to_s
|
126
131
|
"#{host} #{ttl} #{klass} CNAME #{target}"
|
127
132
|
end
|
@@ -169,7 +174,12 @@ grammar Zonefile
|
|
169
174
|
end
|
170
175
|
|
171
176
|
rule srv_record
|
172
|
-
|
177
|
+
(
|
178
|
+
host space ttl klass "SRV" space priority:integer space weight:integer space port:integer space target:host /
|
179
|
+
host space klass ttl "SRV" space priority:integer space weight:integer space port:integer space target:host /
|
180
|
+
host space ttl "SRV" space priority:integer space weight:integer space port:integer space target:host /
|
181
|
+
host space klass "SRV" space priority:integer space weight:integer space port:integer space target:host
|
182
|
+
) {
|
173
183
|
def to_s
|
174
184
|
"#{host} #{ttl} #{klass} SRV #{priority} #{weight} #{port} #{target}"
|
175
185
|
end
|
@@ -249,7 +259,7 @@ grammar Zonefile
|
|
249
259
|
end
|
250
260
|
|
251
261
|
rule rp
|
252
|
-
(("\\." / [a-zA-Z0-9\-)])+ ".")+ {
|
262
|
+
(("\\." / [+a-zA-Z0-9\-)])+ ".")+ {
|
253
263
|
def to_s
|
254
264
|
text_value
|
255
265
|
end
|
data/lib/dns/zonefile/parser.rb
CHANGED
@@ -1082,6 +1082,76 @@ module DNS
|
|
1082
1082
|
end
|
1083
1083
|
|
1084
1084
|
module CnameRecord1
|
1085
|
+
def host
|
1086
|
+
elements[0]
|
1087
|
+
end
|
1088
|
+
|
1089
|
+
def space1
|
1090
|
+
elements[1]
|
1091
|
+
end
|
1092
|
+
|
1093
|
+
def klass
|
1094
|
+
elements[2]
|
1095
|
+
end
|
1096
|
+
|
1097
|
+
def ttl
|
1098
|
+
elements[3]
|
1099
|
+
end
|
1100
|
+
|
1101
|
+
def space2
|
1102
|
+
elements[5]
|
1103
|
+
end
|
1104
|
+
|
1105
|
+
def target
|
1106
|
+
elements[6]
|
1107
|
+
end
|
1108
|
+
end
|
1109
|
+
|
1110
|
+
module CnameRecord2
|
1111
|
+
def host
|
1112
|
+
elements[0]
|
1113
|
+
end
|
1114
|
+
|
1115
|
+
def space1
|
1116
|
+
elements[1]
|
1117
|
+
end
|
1118
|
+
|
1119
|
+
def ttl
|
1120
|
+
elements[2]
|
1121
|
+
end
|
1122
|
+
|
1123
|
+
def space2
|
1124
|
+
elements[4]
|
1125
|
+
end
|
1126
|
+
|
1127
|
+
def target
|
1128
|
+
elements[5]
|
1129
|
+
end
|
1130
|
+
end
|
1131
|
+
|
1132
|
+
module CnameRecord3
|
1133
|
+
def host
|
1134
|
+
elements[0]
|
1135
|
+
end
|
1136
|
+
|
1137
|
+
def space1
|
1138
|
+
elements[1]
|
1139
|
+
end
|
1140
|
+
|
1141
|
+
def klass
|
1142
|
+
elements[2]
|
1143
|
+
end
|
1144
|
+
|
1145
|
+
def space2
|
1146
|
+
elements[4]
|
1147
|
+
end
|
1148
|
+
|
1149
|
+
def target
|
1150
|
+
elements[5]
|
1151
|
+
end
|
1152
|
+
end
|
1153
|
+
|
1154
|
+
module CnameRecord4
|
1085
1155
|
def to_s
|
1086
1156
|
"#{host} #{ttl} #{klass} CNAME #{target}"
|
1087
1157
|
end
|
@@ -1098,46 +1168,180 @@ module DNS
|
|
1098
1168
|
return cached
|
1099
1169
|
end
|
1100
1170
|
|
1101
|
-
i0
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
1105
|
-
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
1111
|
-
|
1112
|
-
|
1113
|
-
|
1171
|
+
i0 = index
|
1172
|
+
i1, s1 = index, []
|
1173
|
+
r2 = _nt_host
|
1174
|
+
s1 << r2
|
1175
|
+
if r2
|
1176
|
+
r3 = _nt_space
|
1177
|
+
s1 << r3
|
1178
|
+
if r3
|
1179
|
+
r4 = _nt_ttl
|
1180
|
+
s1 << r4
|
1181
|
+
if r4
|
1182
|
+
r5 = _nt_klass
|
1183
|
+
s1 << r5
|
1184
|
+
if r5
|
1114
1185
|
if has_terminal?("CNAME", false, index)
|
1115
|
-
|
1186
|
+
r6 = instantiate_node(SyntaxNode,input, index...(index + 5))
|
1116
1187
|
@index += 5
|
1117
1188
|
else
|
1118
1189
|
terminal_parse_failure("CNAME")
|
1119
|
-
|
1190
|
+
r6 = nil
|
1120
1191
|
end
|
1121
|
-
|
1122
|
-
if
|
1123
|
-
|
1124
|
-
|
1125
|
-
if
|
1126
|
-
|
1127
|
-
|
1192
|
+
s1 << r6
|
1193
|
+
if r6
|
1194
|
+
r7 = _nt_space
|
1195
|
+
s1 << r7
|
1196
|
+
if r7
|
1197
|
+
r8 = _nt_host
|
1198
|
+
s1 << r8
|
1128
1199
|
end
|
1129
1200
|
end
|
1130
1201
|
end
|
1131
1202
|
end
|
1132
1203
|
end
|
1133
1204
|
end
|
1134
|
-
if
|
1135
|
-
|
1136
|
-
|
1137
|
-
r0.extend(CnameRecord1)
|
1205
|
+
if s1.last
|
1206
|
+
r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
|
1207
|
+
r1.extend(CnameRecord0)
|
1138
1208
|
else
|
1139
|
-
@index =
|
1140
|
-
|
1209
|
+
@index = i1
|
1210
|
+
r1 = nil
|
1211
|
+
end
|
1212
|
+
if r1
|
1213
|
+
r0 = r1
|
1214
|
+
r0.extend(CnameRecord4)
|
1215
|
+
else
|
1216
|
+
i9, s9 = index, []
|
1217
|
+
r10 = _nt_host
|
1218
|
+
s9 << r10
|
1219
|
+
if r10
|
1220
|
+
r11 = _nt_space
|
1221
|
+
s9 << r11
|
1222
|
+
if r11
|
1223
|
+
r12 = _nt_klass
|
1224
|
+
s9 << r12
|
1225
|
+
if r12
|
1226
|
+
r13 = _nt_ttl
|
1227
|
+
s9 << r13
|
1228
|
+
if r13
|
1229
|
+
if has_terminal?("CNAME", false, index)
|
1230
|
+
r14 = instantiate_node(SyntaxNode,input, index...(index + 5))
|
1231
|
+
@index += 5
|
1232
|
+
else
|
1233
|
+
terminal_parse_failure("CNAME")
|
1234
|
+
r14 = nil
|
1235
|
+
end
|
1236
|
+
s9 << r14
|
1237
|
+
if r14
|
1238
|
+
r15 = _nt_space
|
1239
|
+
s9 << r15
|
1240
|
+
if r15
|
1241
|
+
r16 = _nt_host
|
1242
|
+
s9 << r16
|
1243
|
+
end
|
1244
|
+
end
|
1245
|
+
end
|
1246
|
+
end
|
1247
|
+
end
|
1248
|
+
end
|
1249
|
+
if s9.last
|
1250
|
+
r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
|
1251
|
+
r9.extend(CnameRecord1)
|
1252
|
+
else
|
1253
|
+
@index = i9
|
1254
|
+
r9 = nil
|
1255
|
+
end
|
1256
|
+
if r9
|
1257
|
+
r0 = r9
|
1258
|
+
r0.extend(CnameRecord4)
|
1259
|
+
else
|
1260
|
+
i17, s17 = index, []
|
1261
|
+
r18 = _nt_host
|
1262
|
+
s17 << r18
|
1263
|
+
if r18
|
1264
|
+
r19 = _nt_space
|
1265
|
+
s17 << r19
|
1266
|
+
if r19
|
1267
|
+
r20 = _nt_ttl
|
1268
|
+
s17 << r20
|
1269
|
+
if r20
|
1270
|
+
if has_terminal?("CNAME", false, index)
|
1271
|
+
r21 = instantiate_node(SyntaxNode,input, index...(index + 5))
|
1272
|
+
@index += 5
|
1273
|
+
else
|
1274
|
+
terminal_parse_failure("CNAME")
|
1275
|
+
r21 = nil
|
1276
|
+
end
|
1277
|
+
s17 << r21
|
1278
|
+
if r21
|
1279
|
+
r22 = _nt_space
|
1280
|
+
s17 << r22
|
1281
|
+
if r22
|
1282
|
+
r23 = _nt_host
|
1283
|
+
s17 << r23
|
1284
|
+
end
|
1285
|
+
end
|
1286
|
+
end
|
1287
|
+
end
|
1288
|
+
end
|
1289
|
+
if s17.last
|
1290
|
+
r17 = instantiate_node(SyntaxNode,input, i17...index, s17)
|
1291
|
+
r17.extend(CnameRecord2)
|
1292
|
+
else
|
1293
|
+
@index = i17
|
1294
|
+
r17 = nil
|
1295
|
+
end
|
1296
|
+
if r17
|
1297
|
+
r0 = r17
|
1298
|
+
r0.extend(CnameRecord4)
|
1299
|
+
else
|
1300
|
+
i24, s24 = index, []
|
1301
|
+
r25 = _nt_host
|
1302
|
+
s24 << r25
|
1303
|
+
if r25
|
1304
|
+
r26 = _nt_space
|
1305
|
+
s24 << r26
|
1306
|
+
if r26
|
1307
|
+
r27 = _nt_klass
|
1308
|
+
s24 << r27
|
1309
|
+
if r27
|
1310
|
+
if has_terminal?("CNAME", false, index)
|
1311
|
+
r28 = instantiate_node(SyntaxNode,input, index...(index + 5))
|
1312
|
+
@index += 5
|
1313
|
+
else
|
1314
|
+
terminal_parse_failure("CNAME")
|
1315
|
+
r28 = nil
|
1316
|
+
end
|
1317
|
+
s24 << r28
|
1318
|
+
if r28
|
1319
|
+
r29 = _nt_space
|
1320
|
+
s24 << r29
|
1321
|
+
if r29
|
1322
|
+
r30 = _nt_host
|
1323
|
+
s24 << r30
|
1324
|
+
end
|
1325
|
+
end
|
1326
|
+
end
|
1327
|
+
end
|
1328
|
+
end
|
1329
|
+
if s24.last
|
1330
|
+
r24 = instantiate_node(SyntaxNode,input, i24...index, s24)
|
1331
|
+
r24.extend(CnameRecord3)
|
1332
|
+
else
|
1333
|
+
@index = i24
|
1334
|
+
r24 = nil
|
1335
|
+
end
|
1336
|
+
if r24
|
1337
|
+
r0 = r24
|
1338
|
+
r0.extend(CnameRecord4)
|
1339
|
+
else
|
1340
|
+
@index = i0
|
1341
|
+
r0 = nil
|
1342
|
+
end
|
1343
|
+
end
|
1344
|
+
end
|
1141
1345
|
end
|
1142
1346
|
|
1143
1347
|
node_cache[:cname_record][start_index] = r0
|
@@ -1694,6 +1898,148 @@ module DNS
|
|
1694
1898
|
end
|
1695
1899
|
|
1696
1900
|
module SrvRecord1
|
1901
|
+
def host
|
1902
|
+
elements[0]
|
1903
|
+
end
|
1904
|
+
|
1905
|
+
def space1
|
1906
|
+
elements[1]
|
1907
|
+
end
|
1908
|
+
|
1909
|
+
def klass
|
1910
|
+
elements[2]
|
1911
|
+
end
|
1912
|
+
|
1913
|
+
def ttl
|
1914
|
+
elements[3]
|
1915
|
+
end
|
1916
|
+
|
1917
|
+
def space2
|
1918
|
+
elements[5]
|
1919
|
+
end
|
1920
|
+
|
1921
|
+
def priority
|
1922
|
+
elements[6]
|
1923
|
+
end
|
1924
|
+
|
1925
|
+
def space3
|
1926
|
+
elements[7]
|
1927
|
+
end
|
1928
|
+
|
1929
|
+
def weight
|
1930
|
+
elements[8]
|
1931
|
+
end
|
1932
|
+
|
1933
|
+
def space4
|
1934
|
+
elements[9]
|
1935
|
+
end
|
1936
|
+
|
1937
|
+
def port
|
1938
|
+
elements[10]
|
1939
|
+
end
|
1940
|
+
|
1941
|
+
def space5
|
1942
|
+
elements[11]
|
1943
|
+
end
|
1944
|
+
|
1945
|
+
def target
|
1946
|
+
elements[12]
|
1947
|
+
end
|
1948
|
+
end
|
1949
|
+
|
1950
|
+
module SrvRecord2
|
1951
|
+
def host
|
1952
|
+
elements[0]
|
1953
|
+
end
|
1954
|
+
|
1955
|
+
def space1
|
1956
|
+
elements[1]
|
1957
|
+
end
|
1958
|
+
|
1959
|
+
def ttl
|
1960
|
+
elements[2]
|
1961
|
+
end
|
1962
|
+
|
1963
|
+
def space2
|
1964
|
+
elements[4]
|
1965
|
+
end
|
1966
|
+
|
1967
|
+
def priority
|
1968
|
+
elements[5]
|
1969
|
+
end
|
1970
|
+
|
1971
|
+
def space3
|
1972
|
+
elements[6]
|
1973
|
+
end
|
1974
|
+
|
1975
|
+
def weight
|
1976
|
+
elements[7]
|
1977
|
+
end
|
1978
|
+
|
1979
|
+
def space4
|
1980
|
+
elements[8]
|
1981
|
+
end
|
1982
|
+
|
1983
|
+
def port
|
1984
|
+
elements[9]
|
1985
|
+
end
|
1986
|
+
|
1987
|
+
def space5
|
1988
|
+
elements[10]
|
1989
|
+
end
|
1990
|
+
|
1991
|
+
def target
|
1992
|
+
elements[11]
|
1993
|
+
end
|
1994
|
+
end
|
1995
|
+
|
1996
|
+
module SrvRecord3
|
1997
|
+
def host
|
1998
|
+
elements[0]
|
1999
|
+
end
|
2000
|
+
|
2001
|
+
def space1
|
2002
|
+
elements[1]
|
2003
|
+
end
|
2004
|
+
|
2005
|
+
def klass
|
2006
|
+
elements[2]
|
2007
|
+
end
|
2008
|
+
|
2009
|
+
def space2
|
2010
|
+
elements[4]
|
2011
|
+
end
|
2012
|
+
|
2013
|
+
def priority
|
2014
|
+
elements[5]
|
2015
|
+
end
|
2016
|
+
|
2017
|
+
def space3
|
2018
|
+
elements[6]
|
2019
|
+
end
|
2020
|
+
|
2021
|
+
def weight
|
2022
|
+
elements[7]
|
2023
|
+
end
|
2024
|
+
|
2025
|
+
def space4
|
2026
|
+
elements[8]
|
2027
|
+
end
|
2028
|
+
|
2029
|
+
def port
|
2030
|
+
elements[9]
|
2031
|
+
end
|
2032
|
+
|
2033
|
+
def space5
|
2034
|
+
elements[10]
|
2035
|
+
end
|
2036
|
+
|
2037
|
+
def target
|
2038
|
+
elements[11]
|
2039
|
+
end
|
2040
|
+
end
|
2041
|
+
|
2042
|
+
module SrvRecord4
|
1697
2043
|
def to_s
|
1698
2044
|
"#{host} #{ttl} #{klass} SRV #{priority} #{weight} #{port} #{target}"
|
1699
2045
|
end
|
@@ -1710,51 +2056,52 @@ module DNS
|
|
1710
2056
|
return cached
|
1711
2057
|
end
|
1712
2058
|
|
1713
|
-
i0
|
1714
|
-
|
1715
|
-
|
1716
|
-
|
1717
|
-
|
1718
|
-
|
1719
|
-
|
1720
|
-
|
1721
|
-
|
1722
|
-
|
1723
|
-
|
1724
|
-
|
1725
|
-
|
2059
|
+
i0 = index
|
2060
|
+
i1, s1 = index, []
|
2061
|
+
r2 = _nt_host
|
2062
|
+
s1 << r2
|
2063
|
+
if r2
|
2064
|
+
r3 = _nt_space
|
2065
|
+
s1 << r3
|
2066
|
+
if r3
|
2067
|
+
r4 = _nt_ttl
|
2068
|
+
s1 << r4
|
2069
|
+
if r4
|
2070
|
+
r5 = _nt_klass
|
2071
|
+
s1 << r5
|
2072
|
+
if r5
|
1726
2073
|
if has_terminal?("SRV", false, index)
|
1727
|
-
|
2074
|
+
r6 = instantiate_node(SyntaxNode,input, index...(index + 3))
|
1728
2075
|
@index += 3
|
1729
2076
|
else
|
1730
2077
|
terminal_parse_failure("SRV")
|
1731
|
-
|
2078
|
+
r6 = nil
|
1732
2079
|
end
|
1733
|
-
|
1734
|
-
if
|
1735
|
-
|
1736
|
-
|
1737
|
-
if
|
1738
|
-
|
1739
|
-
|
1740
|
-
if
|
1741
|
-
|
1742
|
-
|
1743
|
-
if
|
1744
|
-
|
1745
|
-
|
1746
|
-
if
|
1747
|
-
|
1748
|
-
|
1749
|
-
if
|
1750
|
-
|
1751
|
-
|
1752
|
-
if
|
1753
|
-
|
1754
|
-
|
1755
|
-
if
|
1756
|
-
|
1757
|
-
|
2080
|
+
s1 << r6
|
2081
|
+
if r6
|
2082
|
+
r7 = _nt_space
|
2083
|
+
s1 << r7
|
2084
|
+
if r7
|
2085
|
+
r8 = _nt_integer
|
2086
|
+
s1 << r8
|
2087
|
+
if r8
|
2088
|
+
r9 = _nt_space
|
2089
|
+
s1 << r9
|
2090
|
+
if r9
|
2091
|
+
r10 = _nt_integer
|
2092
|
+
s1 << r10
|
2093
|
+
if r10
|
2094
|
+
r11 = _nt_space
|
2095
|
+
s1 << r11
|
2096
|
+
if r11
|
2097
|
+
r12 = _nt_integer
|
2098
|
+
s1 << r12
|
2099
|
+
if r12
|
2100
|
+
r13 = _nt_space
|
2101
|
+
s1 << r13
|
2102
|
+
if r13
|
2103
|
+
r14 = _nt_host
|
2104
|
+
s1 << r14
|
1758
2105
|
end
|
1759
2106
|
end
|
1760
2107
|
end
|
@@ -1767,13 +2114,218 @@ module DNS
|
|
1767
2114
|
end
|
1768
2115
|
end
|
1769
2116
|
end
|
1770
|
-
if
|
1771
|
-
|
1772
|
-
|
1773
|
-
r0.extend(SrvRecord1)
|
2117
|
+
if s1.last
|
2118
|
+
r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
|
2119
|
+
r1.extend(SrvRecord0)
|
1774
2120
|
else
|
1775
|
-
@index =
|
1776
|
-
|
2121
|
+
@index = i1
|
2122
|
+
r1 = nil
|
2123
|
+
end
|
2124
|
+
if r1
|
2125
|
+
r0 = r1
|
2126
|
+
r0.extend(SrvRecord4)
|
2127
|
+
else
|
2128
|
+
i15, s15 = index, []
|
2129
|
+
r16 = _nt_host
|
2130
|
+
s15 << r16
|
2131
|
+
if r16
|
2132
|
+
r17 = _nt_space
|
2133
|
+
s15 << r17
|
2134
|
+
if r17
|
2135
|
+
r18 = _nt_klass
|
2136
|
+
s15 << r18
|
2137
|
+
if r18
|
2138
|
+
r19 = _nt_ttl
|
2139
|
+
s15 << r19
|
2140
|
+
if r19
|
2141
|
+
if has_terminal?("SRV", false, index)
|
2142
|
+
r20 = instantiate_node(SyntaxNode,input, index...(index + 3))
|
2143
|
+
@index += 3
|
2144
|
+
else
|
2145
|
+
terminal_parse_failure("SRV")
|
2146
|
+
r20 = nil
|
2147
|
+
end
|
2148
|
+
s15 << r20
|
2149
|
+
if r20
|
2150
|
+
r21 = _nt_space
|
2151
|
+
s15 << r21
|
2152
|
+
if r21
|
2153
|
+
r22 = _nt_integer
|
2154
|
+
s15 << r22
|
2155
|
+
if r22
|
2156
|
+
r23 = _nt_space
|
2157
|
+
s15 << r23
|
2158
|
+
if r23
|
2159
|
+
r24 = _nt_integer
|
2160
|
+
s15 << r24
|
2161
|
+
if r24
|
2162
|
+
r25 = _nt_space
|
2163
|
+
s15 << r25
|
2164
|
+
if r25
|
2165
|
+
r26 = _nt_integer
|
2166
|
+
s15 << r26
|
2167
|
+
if r26
|
2168
|
+
r27 = _nt_space
|
2169
|
+
s15 << r27
|
2170
|
+
if r27
|
2171
|
+
r28 = _nt_host
|
2172
|
+
s15 << r28
|
2173
|
+
end
|
2174
|
+
end
|
2175
|
+
end
|
2176
|
+
end
|
2177
|
+
end
|
2178
|
+
end
|
2179
|
+
end
|
2180
|
+
end
|
2181
|
+
end
|
2182
|
+
end
|
2183
|
+
end
|
2184
|
+
end
|
2185
|
+
if s15.last
|
2186
|
+
r15 = instantiate_node(SyntaxNode,input, i15...index, s15)
|
2187
|
+
r15.extend(SrvRecord1)
|
2188
|
+
else
|
2189
|
+
@index = i15
|
2190
|
+
r15 = nil
|
2191
|
+
end
|
2192
|
+
if r15
|
2193
|
+
r0 = r15
|
2194
|
+
r0.extend(SrvRecord4)
|
2195
|
+
else
|
2196
|
+
i29, s29 = index, []
|
2197
|
+
r30 = _nt_host
|
2198
|
+
s29 << r30
|
2199
|
+
if r30
|
2200
|
+
r31 = _nt_space
|
2201
|
+
s29 << r31
|
2202
|
+
if r31
|
2203
|
+
r32 = _nt_ttl
|
2204
|
+
s29 << r32
|
2205
|
+
if r32
|
2206
|
+
if has_terminal?("SRV", false, index)
|
2207
|
+
r33 = instantiate_node(SyntaxNode,input, index...(index + 3))
|
2208
|
+
@index += 3
|
2209
|
+
else
|
2210
|
+
terminal_parse_failure("SRV")
|
2211
|
+
r33 = nil
|
2212
|
+
end
|
2213
|
+
s29 << r33
|
2214
|
+
if r33
|
2215
|
+
r34 = _nt_space
|
2216
|
+
s29 << r34
|
2217
|
+
if r34
|
2218
|
+
r35 = _nt_integer
|
2219
|
+
s29 << r35
|
2220
|
+
if r35
|
2221
|
+
r36 = _nt_space
|
2222
|
+
s29 << r36
|
2223
|
+
if r36
|
2224
|
+
r37 = _nt_integer
|
2225
|
+
s29 << r37
|
2226
|
+
if r37
|
2227
|
+
r38 = _nt_space
|
2228
|
+
s29 << r38
|
2229
|
+
if r38
|
2230
|
+
r39 = _nt_integer
|
2231
|
+
s29 << r39
|
2232
|
+
if r39
|
2233
|
+
r40 = _nt_space
|
2234
|
+
s29 << r40
|
2235
|
+
if r40
|
2236
|
+
r41 = _nt_host
|
2237
|
+
s29 << r41
|
2238
|
+
end
|
2239
|
+
end
|
2240
|
+
end
|
2241
|
+
end
|
2242
|
+
end
|
2243
|
+
end
|
2244
|
+
end
|
2245
|
+
end
|
2246
|
+
end
|
2247
|
+
end
|
2248
|
+
end
|
2249
|
+
if s29.last
|
2250
|
+
r29 = instantiate_node(SyntaxNode,input, i29...index, s29)
|
2251
|
+
r29.extend(SrvRecord2)
|
2252
|
+
else
|
2253
|
+
@index = i29
|
2254
|
+
r29 = nil
|
2255
|
+
end
|
2256
|
+
if r29
|
2257
|
+
r0 = r29
|
2258
|
+
r0.extend(SrvRecord4)
|
2259
|
+
else
|
2260
|
+
i42, s42 = index, []
|
2261
|
+
r43 = _nt_host
|
2262
|
+
s42 << r43
|
2263
|
+
if r43
|
2264
|
+
r44 = _nt_space
|
2265
|
+
s42 << r44
|
2266
|
+
if r44
|
2267
|
+
r45 = _nt_klass
|
2268
|
+
s42 << r45
|
2269
|
+
if r45
|
2270
|
+
if has_terminal?("SRV", false, index)
|
2271
|
+
r46 = instantiate_node(SyntaxNode,input, index...(index + 3))
|
2272
|
+
@index += 3
|
2273
|
+
else
|
2274
|
+
terminal_parse_failure("SRV")
|
2275
|
+
r46 = nil
|
2276
|
+
end
|
2277
|
+
s42 << r46
|
2278
|
+
if r46
|
2279
|
+
r47 = _nt_space
|
2280
|
+
s42 << r47
|
2281
|
+
if r47
|
2282
|
+
r48 = _nt_integer
|
2283
|
+
s42 << r48
|
2284
|
+
if r48
|
2285
|
+
r49 = _nt_space
|
2286
|
+
s42 << r49
|
2287
|
+
if r49
|
2288
|
+
r50 = _nt_integer
|
2289
|
+
s42 << r50
|
2290
|
+
if r50
|
2291
|
+
r51 = _nt_space
|
2292
|
+
s42 << r51
|
2293
|
+
if r51
|
2294
|
+
r52 = _nt_integer
|
2295
|
+
s42 << r52
|
2296
|
+
if r52
|
2297
|
+
r53 = _nt_space
|
2298
|
+
s42 << r53
|
2299
|
+
if r53
|
2300
|
+
r54 = _nt_host
|
2301
|
+
s42 << r54
|
2302
|
+
end
|
2303
|
+
end
|
2304
|
+
end
|
2305
|
+
end
|
2306
|
+
end
|
2307
|
+
end
|
2308
|
+
end
|
2309
|
+
end
|
2310
|
+
end
|
2311
|
+
end
|
2312
|
+
end
|
2313
|
+
if s42.last
|
2314
|
+
r42 = instantiate_node(SyntaxNode,input, i42...index, s42)
|
2315
|
+
r42.extend(SrvRecord3)
|
2316
|
+
else
|
2317
|
+
@index = i42
|
2318
|
+
r42 = nil
|
2319
|
+
end
|
2320
|
+
if r42
|
2321
|
+
r0 = r42
|
2322
|
+
r0.extend(SrvRecord4)
|
2323
|
+
else
|
2324
|
+
@index = i0
|
2325
|
+
r0 = nil
|
2326
|
+
end
|
2327
|
+
end
|
2328
|
+
end
|
1777
2329
|
end
|
1778
2330
|
|
1779
2331
|
node_cache[:srv_record][start_index] = r0
|
@@ -2380,7 +2932,7 @@ module DNS
|
|
2380
2932
|
if r4
|
2381
2933
|
r3 = r4
|
2382
2934
|
else
|
2383
|
-
if has_terminal?('\G[a-zA-Z0-9\\-)]', true, index)
|
2935
|
+
if has_terminal?('\G[+a-zA-Z0-9\\-)]', true, index)
|
2384
2936
|
r5 = true
|
2385
2937
|
@index += 1
|
2386
2938
|
else
|
data/lib/dns/zonefile/version.rb
CHANGED
data/spec/dns/zonefile_spec.rb
CHANGED
@@ -73,6 +73,19 @@ unquoted TXT some text data
|
|
73
73
|
|
74
74
|
45 IN PTR @
|
75
75
|
|
76
|
+
|
77
|
+
eam 900 IN SRV 5 0 5269 www
|
78
|
+
eam IN 900 SRV 5 0 5269 www
|
79
|
+
eam IN SRV 5 0 5269 www
|
80
|
+
eam 900 SRV 5 0 5269 www
|
81
|
+
eam SRV 5 0 5269 www
|
82
|
+
|
83
|
+
eam 900 IN CNAME www
|
84
|
+
eam IN 900 CNAME www
|
85
|
+
eam IN CNAME www
|
86
|
+
eam 900 CNAME www
|
87
|
+
eam CNAME www
|
88
|
+
|
76
89
|
$ORIGIN test.example.com.
|
77
90
|
$TTL 3600; expire in 1 day.
|
78
91
|
@ A 10.1.0.1 ; Test with alternate origin
|
@@ -114,7 +127,7 @@ ZONE
|
|
114
127
|
|
115
128
|
it "should build the correct number of resource records" do
|
116
129
|
zone = DNS::Zonefile.parse(@zonefile)
|
117
|
-
zone.rr.size.should be(
|
130
|
+
zone.rr.size.should be(43)
|
118
131
|
end
|
119
132
|
|
120
133
|
it "should build the correct NS records" do
|
@@ -188,7 +201,7 @@ ZONE
|
|
188
201
|
it "should build the correct CNAME records" do
|
189
202
|
zone = DNS::Zonefile.load(@zonefile)
|
190
203
|
cname_records = zone.records_of DNS::Zonefile::CNAME
|
191
|
-
cname_records.size.should be(
|
204
|
+
cname_records.size.should be(8)
|
192
205
|
|
193
206
|
cname_records.detect { |cname|
|
194
207
|
cname.host == "www.example.com." && cname.target == "ns.example.com."
|
@@ -201,6 +214,18 @@ ZONE
|
|
201
214
|
cname_records.detect { |cname|
|
202
215
|
cname.host == "www2.example.com." && cname.domainname == "ns.example.com." && cname.ttl == 86400
|
203
216
|
}.should_not be_nil
|
217
|
+
|
218
|
+
eam_records = cname_records.select { |c| c.host =~ /eam\./ }
|
219
|
+
|
220
|
+
eam_records.should have(5).records
|
221
|
+
|
222
|
+
eam_records.each { |cname|
|
223
|
+
cname.target.should == "www.example.com."
|
224
|
+
}
|
225
|
+
|
226
|
+
r = eam_records.group_by { |c| c.ttl }
|
227
|
+
(r[900] || []).should have(3).records
|
228
|
+
(r[86400] || []).should have(2).records
|
204
229
|
end
|
205
230
|
|
206
231
|
it "should build the correct MX records" do
|
@@ -260,11 +285,24 @@ ZONE
|
|
260
285
|
it "should build the correct SRV records" do
|
261
286
|
zone = DNS::Zonefile.load(@zonefile)
|
262
287
|
srv_records = zone.records_of DNS::Zonefile::SRV
|
263
|
-
srv_records.size.should be(
|
288
|
+
srv_records.size.should be(6)
|
264
289
|
|
265
290
|
srv_records.detect { |r|
|
266
291
|
r.host == "_xmpp-server._tcp.example.com." && r.priority == 5 && r.weight == 0 && r.port == 5269 && r.target == 'xmpp-server.l.google.com.' && r.ttl == 86400
|
267
292
|
}.should_not be_nil
|
293
|
+
|
294
|
+
eam_records = srv_records.select { |s| s.host =~ /eam\./ }
|
295
|
+
eam_records.should have(5).records
|
296
|
+
eam_records.each { |srv|
|
297
|
+
srv.target.should == "www.example.com."
|
298
|
+
srv.priority.should == 5
|
299
|
+
srv.port.should == 5269
|
300
|
+
srv.weight.should == 0
|
301
|
+
}
|
302
|
+
|
303
|
+
r = eam_records.group_by { |c| c.ttl }
|
304
|
+
(r[900] || []).should have(3).records
|
305
|
+
(r[86400] || []).should have(2).records
|
268
306
|
end
|
269
307
|
|
270
308
|
it "should build the correct TXT records" do
|
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.0.
|
4
|
+
version: 1.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,22 +9,27 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-10-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- - =
|
19
|
+
- - '='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '2.6'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - '='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.6'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: rake
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '0'
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: treetop
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ! '>='
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '0'
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: polyglot
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,11 +69,25 @@ dependencies:
|
|
54
69
|
version: '0'
|
55
70
|
type: :runtime
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
description: ! 'The format of a DNS Zonefile is defined in RFC 1035 section 5 and
|
79
|
+
RFC
|
80
|
+
|
81
|
+
1034 section 3.6.1. To anyone who''s using BIND they''ll look very
|
82
|
+
|
83
|
+
familiar.
|
84
|
+
|
85
|
+
|
86
|
+
This is an attempt to use Ruby parse them into an object graph which can
|
87
|
+
|
88
|
+
be investigated programatically, manipulated, validated or printed into
|
89
|
+
|
90
|
+
some canonical form.'
|
62
91
|
email:
|
63
92
|
- craig@barkingiguana.com
|
64
93
|
executables: []
|
@@ -66,10 +95,10 @@ extensions: []
|
|
66
95
|
extra_rdoc_files: []
|
67
96
|
files:
|
68
97
|
- .gitignore
|
98
|
+
- .travis.yml
|
69
99
|
- Gemfile
|
70
|
-
- Gemfile.lock
|
71
100
|
- LICENCE
|
72
|
-
- README
|
101
|
+
- README.md
|
73
102
|
- Rakefile
|
74
103
|
- TODO
|
75
104
|
- dns-zonefile.gemspec
|
@@ -95,15 +124,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
95
124
|
- - ! '>='
|
96
125
|
- !ruby/object:Gem::Version
|
97
126
|
version: '0'
|
127
|
+
segments:
|
128
|
+
- 0
|
129
|
+
hash: -1344600706130778289
|
98
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
131
|
none: false
|
100
132
|
requirements:
|
101
133
|
- - ! '>='
|
102
134
|
- !ruby/object:Gem::Version
|
103
135
|
version: '0'
|
136
|
+
segments:
|
137
|
+
- 0
|
138
|
+
hash: -1344600706130778289
|
104
139
|
requirements: []
|
105
140
|
rubyforge_project: dns-zonefile
|
106
|
-
rubygems_version: 1.8.
|
141
|
+
rubygems_version: 1.8.24
|
107
142
|
signing_key:
|
108
143
|
specification_version: 3
|
109
144
|
summary: Work with zonefiles (RFC 1035 section 5 and RFC 1034 section 3.6.1)
|
data/Gemfile.lock
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
dns-zonefile (1.0.2)
|
5
|
-
polyglot
|
6
|
-
treetop
|
7
|
-
|
8
|
-
GEM
|
9
|
-
remote: http://rubygems.org/
|
10
|
-
specs:
|
11
|
-
diff-lcs (1.1.3)
|
12
|
-
polyglot (0.3.3)
|
13
|
-
rake (0.9.2.2)
|
14
|
-
rspec (2.6.0)
|
15
|
-
rspec-core (~> 2.6.0)
|
16
|
-
rspec-expectations (~> 2.6.0)
|
17
|
-
rspec-mocks (~> 2.6.0)
|
18
|
-
rspec-core (2.6.4)
|
19
|
-
rspec-expectations (2.6.0)
|
20
|
-
diff-lcs (~> 1.1.2)
|
21
|
-
rspec-mocks (2.6.0)
|
22
|
-
treetop (1.4.10)
|
23
|
-
polyglot
|
24
|
-
polyglot (>= 0.3.1)
|
25
|
-
|
26
|
-
PLATFORMS
|
27
|
-
ruby
|
28
|
-
|
29
|
-
DEPENDENCIES
|
30
|
-
dns-zonefile!
|
31
|
-
rake
|
32
|
-
rspec (= 2.6)
|