@nictool/dns-resource-record 1.5.0 → 1.6.0
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.
- package/CHANGELOG.md +13 -0
- package/README.md +48 -42
- package/lib/readme.js +84 -0
- package/lib/tinydns.js +10 -0
- package/package.json +2 -1
- package/rr/a.js +8 -0
- package/rr/aaaa.js +10 -2
- package/rr/caa.js +4 -0
- package/rr/cert.js +13 -0
- package/rr/cname.js +17 -0
- package/rr/dname.js +10 -0
- package/rr/dnskey.js +17 -0
- package/rr/ds.js +17 -0
- package/rr/hinfo.js +15 -0
- package/rr/https.js +16 -0
- package/rr/ipseckey.js +5 -1
- package/rr/key.js +13 -0
- package/rr/loc.js +10 -0
- package/rr/mx.js +11 -1
- package/rr/naptr.js +16 -1
- package/rr/ns.js +18 -0
- package/rr/nsec.js +15 -0
- package/rr/nsec3.js +19 -0
- package/rr/nsec3param.js +17 -0
- package/rr/nxt.js +15 -0
- package/rr/openpgpkey.js +14 -0
- package/rr/ptr.js +18 -0
- package/rr/rp.js +4 -0
- package/rr/rrsig.js +22 -0
- package/rr/sig.js +23 -1
- package/rr/smimea.js +17 -0
- package/rr/soa.js +30 -0
- package/rr/spf.js +14 -0
- package/rr/srv.js +17 -0
- package/rr/sshfp.js +16 -0
- package/rr/svcb.js +12 -0
- package/rr/tlsa.js +18 -1
- package/rr/tsig.js +16 -0
- package/rr/txt.js +36 -1
- package/rr/uri.js +12 -0
- package/rr/wks.js +16 -0
- package/rr.js +57 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,18 @@ Notable changes to this project are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
#### Unreleased
|
|
6
6
|
|
|
7
|
+
### [1.6.0] - 2026-03-26
|
|
8
|
+
|
|
9
|
+
#### Changed
|
|
10
|
+
|
|
11
|
+
- feat(getCanonical): added to RRs where missing
|
|
12
|
+
- feat(toWire): added wire format export
|
|
13
|
+
- feat: add getTags() to all RR types
|
|
14
|
+
- values: common, obsolete, security, dnssec
|
|
15
|
+
- doc(README): categorize RR types.
|
|
16
|
+
- added RFCs to: AAAA 5952, NAPTR 4848, SIG 3755, TLSA 7671
|
|
17
|
+
- TXT: 4408, 6376, 7208
|
|
18
|
+
|
|
7
19
|
### [1.5.0] - 2026-03-22
|
|
8
20
|
|
|
9
21
|
- feat(RRSIG, SIG, TSIG): added toBind, toTinydns, fromTinydns
|
|
@@ -366,3 +378,4 @@ Notable changes to this project are documented in this file.
|
|
|
366
378
|
[1.3.1]: https://github.com/NicTool/dns-resource-record/releases/tag/v1.3.1
|
|
367
379
|
[1.4.0]: https://github.com/NicTool/dns-resource-record/releases/tag/v1.4.0
|
|
368
380
|
[1.5.0]: https://github.com/NicTool/dns-resource-record/releases/tag/v1.5.0
|
|
381
|
+
[1.6.0]: https://github.com/NicTool/dns-resource-record/releases/tag/v1.6.0
|
package/README.md
CHANGED
|
@@ -186,48 +186,54 @@ This module intends to support all current (ie, not officially deprecated) DNS R
|
|
|
186
186
|
|
|
187
187
|
PRs are welcome, especially PRs with tests.
|
|
188
188
|
|
|
189
|
-
| **RR** |
|
|
190
|
-
| :------------: |
|
|
191
|
-
|
|
|
192
|
-
|
|
|
193
|
-
| **
|
|
194
|
-
|
|
|
195
|
-
|
|
|
196
|
-
|
|
|
197
|
-
|
|
|
198
|
-
|
|
|
199
|
-
|
|
|
200
|
-
|
|
|
201
|
-
|
|
|
202
|
-
| **
|
|
203
|
-
|
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
|
207
|
-
| **
|
|
208
|
-
| **
|
|
209
|
-
|
|
|
210
|
-
|
|
|
211
|
-
| **
|
|
212
|
-
|
|
|
213
|
-
|
|
|
214
|
-
| **
|
|
215
|
-
|
|
|
216
|
-
| **
|
|
217
|
-
|
|
|
218
|
-
|
|
|
219
|
-
|
|
|
220
|
-
| **
|
|
221
|
-
| **
|
|
222
|
-
|
|
|
223
|
-
|
|
|
224
|
-
|
|
|
225
|
-
| **
|
|
226
|
-
|
|
|
227
|
-
|
|
|
228
|
-
|
|
|
229
|
-
|
|
|
230
|
-
| **
|
|
189
|
+
| **RR** | **BIND / RFC 1035** | **Tinydns** |
|
|
190
|
+
| :------------: | :-----------------: | :----------------: |
|
|
191
|
+
| _Common_ |
|
|
192
|
+
| **A** | :white_check_mark: | :white_check_mark: |
|
|
193
|
+
| **AAAA** | :white_check_mark: | :white_check_mark: |
|
|
194
|
+
| **CNAME** | :white_check_mark: | :white_check_mark: |
|
|
195
|
+
| **HTTPS** | :white_check_mark: | :white_check_mark: |
|
|
196
|
+
| **MX** | :white_check_mark: | :white_check_mark: |
|
|
197
|
+
| **NS** | :white_check_mark: | :white_check_mark: |
|
|
198
|
+
| **PTR** | :white_check_mark: | :white_check_mark: |
|
|
199
|
+
| **SRV** | :white_check_mark: | :white_check_mark: |
|
|
200
|
+
| **TXT** | :white_check_mark: | :white_check_mark: |
|
|
201
|
+
| _Less Common_ |
|
|
202
|
+
| **APL** | :white_check_mark: | :white_check_mark: |
|
|
203
|
+
| **CERT** | :white_check_mark: | :white_check_mark: |
|
|
204
|
+
| **DHCID** | :white_check_mark: | :white_check_mark: |
|
|
205
|
+
| **DNAME** | :white_check_mark: | :white_check_mark: |
|
|
206
|
+
| **HIP** | :white_check_mark: | :white_check_mark: |
|
|
207
|
+
| **KEY** | :white_check_mark: | :white_check_mark: |
|
|
208
|
+
| **KX** | :white_check_mark: | :white_check_mark: |
|
|
209
|
+
| **LOC** | :white_check_mark: | :white_check_mark: |
|
|
210
|
+
| **NAPTR** | :white_check_mark: | :white_check_mark: |
|
|
211
|
+
| **SOA** | :white_check_mark: | :white_check_mark: |
|
|
212
|
+
| **SVCB** | :white_check_mark: | :white_check_mark: |
|
|
213
|
+
| **TSIG** | :white_check_mark: | :white_check_mark: |
|
|
214
|
+
| **URI** | :white_check_mark: | :white_check_mark: |
|
|
215
|
+
| _Security_ |
|
|
216
|
+
| **CAA** | :white_check_mark: | :white_check_mark: |
|
|
217
|
+
| **IPSECKEY** | :white_check_mark: | :white_check_mark: |
|
|
218
|
+
| **OPENPGPKEY** | :white_check_mark: | :white_check_mark: |
|
|
219
|
+
| **SMIMEA** | :white_check_mark: | :white_check_mark: |
|
|
220
|
+
| **SSHFP** | :white_check_mark: | :white_check_mark: |
|
|
221
|
+
| **TLSA** | :white_check_mark: | :white_check_mark: |
|
|
222
|
+
| _DNSSEC_ |
|
|
223
|
+
| **DNSKEY** | :white_check_mark: | :white_check_mark: |
|
|
224
|
+
| **DS** | :white_check_mark: | :white_check_mark: |
|
|
225
|
+
| **NSEC** | :white_check_mark: | :white_check_mark: |
|
|
226
|
+
| **NSEC3** | :white_check_mark: | :white_check_mark: |
|
|
227
|
+
| **NSEC3PARAM** | :white_check_mark: | :white_check_mark: |
|
|
228
|
+
| **RRSIG** | :white_check_mark: | :white_check_mark: |
|
|
229
|
+
| _Deprecated_ |
|
|
230
|
+
| **NXT** | :white_check_mark: | :white_check_mark: |
|
|
231
|
+
| **SPF** | :white_check_mark: | :white_check_mark: |
|
|
232
|
+
| _Obsolete_ |
|
|
233
|
+
| **HINFO** | :white_check_mark: | :white_check_mark: |
|
|
234
|
+
| **RP** | :white_check_mark: | :white_check_mark: |
|
|
235
|
+
| **SIG** | :white_check_mark: | :white_check_mark: |
|
|
236
|
+
| **WKS** | :white_check_mark: | :white_check_mark: |
|
|
231
237
|
|
|
232
238
|
## TIPS
|
|
233
239
|
|
package/lib/readme.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Regenerates the Supported Records table in README.md using getTags() from each RR class.
|
|
3
|
+
|
|
4
|
+
import { readFileSync, writeFileSync } from 'fs'
|
|
5
|
+
import { fileURLToPath } from 'url'
|
|
6
|
+
import { dirname, join } from 'path'
|
|
7
|
+
|
|
8
|
+
import * as RR from '../index.js'
|
|
9
|
+
|
|
10
|
+
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
11
|
+
|
|
12
|
+
const tagToGroup = {
|
|
13
|
+
common: 'Common',
|
|
14
|
+
security: 'Security',
|
|
15
|
+
dnssec: 'DNSSEC',
|
|
16
|
+
deprecated: 'Deprecated',
|
|
17
|
+
obsolete: 'Obsolete',
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const groupOrder = ['Common', 'Less Common', 'Security', 'DNSSEC', 'Deprecated', 'Obsolete']
|
|
21
|
+
|
|
22
|
+
function getGroup(instance) {
|
|
23
|
+
const tags = instance.getTags()
|
|
24
|
+
for (const [tag, group] of Object.entries(tagToGroup)) {
|
|
25
|
+
if (tags.includes(tag)) return group
|
|
26
|
+
}
|
|
27
|
+
return 'Less Common'
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const groups = {}
|
|
31
|
+
for (const name of groupOrder) groups[name] = []
|
|
32
|
+
|
|
33
|
+
for (const [name, cls] of Object.entries(RR)) {
|
|
34
|
+
if (name === 'typeMap' || name === 'default') continue
|
|
35
|
+
if (typeof cls !== 'function') continue
|
|
36
|
+
const instance = new cls(null)
|
|
37
|
+
const group = getGroup(instance)
|
|
38
|
+
groups[group].push(name)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const check = ':white_check_mark:'
|
|
42
|
+
const rows = []
|
|
43
|
+
for (const groupName of groupOrder) {
|
|
44
|
+
const names = groups[groupName]
|
|
45
|
+
if (!names.length) continue
|
|
46
|
+
rows.push(`| *${groupName}* |`)
|
|
47
|
+
for (const name of names.sort()) {
|
|
48
|
+
const cls = RR[name]
|
|
49
|
+
const hasToBind = typeof cls.prototype.toBind === 'function'
|
|
50
|
+
const hasFromBind = typeof cls.prototype.fromBind === 'function'
|
|
51
|
+
const hasToTinydns = typeof cls.prototype.toTinydns === 'function'
|
|
52
|
+
const hasFromTinydns = typeof cls.prototype.fromTinydns === 'function'
|
|
53
|
+
|
|
54
|
+
const bind = hasToBind && hasFromBind ? check : ''
|
|
55
|
+
const tinydns = hasToTinydns && hasFromTinydns ? check : ''
|
|
56
|
+
|
|
57
|
+
rows.push(`| **${name}** | ${bind} | ${tinydns} |`)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const table = [
|
|
62
|
+
`| **RR** | **BIND / RFC 1035** | **Tinydns** |`,
|
|
63
|
+
`| :------------: | :-------------------: | :-----------------: |`,
|
|
64
|
+
...rows,
|
|
65
|
+
].join('\n')
|
|
66
|
+
|
|
67
|
+
const readmePath = join(__dirname, '..', 'README.md')
|
|
68
|
+
const readme = readFileSync(readmePath, 'utf-8')
|
|
69
|
+
|
|
70
|
+
// Replace from the table header line up to (but not including) the ## TIPS section
|
|
71
|
+
const tableHeaderMarker = '\n| **RR** |'
|
|
72
|
+
const tipsSectionMarker = '\n\n## TIPS'
|
|
73
|
+
|
|
74
|
+
const tableStart = readme.indexOf(tableHeaderMarker)
|
|
75
|
+
const tipsStart = readme.indexOf(tipsSectionMarker)
|
|
76
|
+
|
|
77
|
+
if (tableStart === -1 || tipsStart === -1) {
|
|
78
|
+
console.error('Could not locate table boundaries in README.md')
|
|
79
|
+
process.exit(1)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const newReadme = readme.slice(0, tableStart + 1) + table + '\n' + readme.slice(tipsStart)
|
|
83
|
+
writeFileSync(readmePath, newReadme)
|
|
84
|
+
console.log('README.md updated successfully')
|
package/lib/tinydns.js
CHANGED
|
@@ -196,6 +196,16 @@ export function octalToIPv4(str) {
|
|
|
196
196
|
return [24, 16, 8, 0].map((n) => (asInt >> n) & 0xff).join('.')
|
|
197
197
|
}
|
|
198
198
|
|
|
199
|
+
export function ipv6toOctal(ip) {
|
|
200
|
+
return packHex(ip.replace(/:/g, ''))
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export function octalToIPv6(str) {
|
|
204
|
+
return octalToHex(str)
|
|
205
|
+
.match(/(.{4})/g)
|
|
206
|
+
.join(':')
|
|
207
|
+
}
|
|
208
|
+
|
|
199
209
|
export function base64toOctal(str) {
|
|
200
210
|
const bytes = Buffer.from(str, 'base64')
|
|
201
211
|
let escaped = ''
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nictool/dns-resource-record",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "DNS Resource Records",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"files": [
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
],
|
|
12
12
|
"type": "module",
|
|
13
13
|
"scripts": {
|
|
14
|
+
"build": "node lib/readme.js",
|
|
14
15
|
"format:check": "npm run prettier; npm run lint",
|
|
15
16
|
"format": "npm run prettier -- --write && npm run lint:fix",
|
|
16
17
|
"lint": "npx eslint **/*.js",
|
package/rr/a.js
CHANGED
|
@@ -16,6 +16,10 @@ export default class A extends RR {
|
|
|
16
16
|
return 'Address'
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
getTags() {
|
|
20
|
+
return ['common']
|
|
21
|
+
}
|
|
22
|
+
|
|
19
23
|
getRdataFields(arg) {
|
|
20
24
|
return ['address']
|
|
21
25
|
}
|
|
@@ -66,6 +70,10 @@ export default class A extends RR {
|
|
|
66
70
|
}
|
|
67
71
|
|
|
68
72
|
/****** EXPORTERS *******/
|
|
73
|
+
getWireRdata() {
|
|
74
|
+
return Buffer.from(this.get('address').split('.').map(Number))
|
|
75
|
+
}
|
|
76
|
+
|
|
69
77
|
toTinydns() {
|
|
70
78
|
return `+${this.getTinyFQDN('owner')}:${this.get('address')}:${this.getTinydnsPostamble()}\n`
|
|
71
79
|
}
|
package/rr/aaaa.js
CHANGED
|
@@ -22,12 +22,16 @@ export default class AAAA extends RR {
|
|
|
22
22
|
return 'Address IPv6'
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
getTags() {
|
|
26
|
+
return ['common']
|
|
27
|
+
}
|
|
28
|
+
|
|
25
29
|
getRdataFields(arg) {
|
|
26
30
|
return ['address']
|
|
27
31
|
}
|
|
28
32
|
|
|
29
33
|
getRFCs() {
|
|
30
|
-
return [3596]
|
|
34
|
+
return [3596, 5952]
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
getTypeId() {
|
|
@@ -40,7 +44,7 @@ export default class AAAA extends RR {
|
|
|
40
44
|
address: '2001:0db8:0020:000a:0000:0000:0000:0004',
|
|
41
45
|
class: 'IN',
|
|
42
46
|
ttl: 3600,
|
|
43
|
-
type: '
|
|
47
|
+
type: 'AAAA',
|
|
44
48
|
}
|
|
45
49
|
}
|
|
46
50
|
|
|
@@ -138,6 +142,10 @@ export default class AAAA extends RR {
|
|
|
138
142
|
}
|
|
139
143
|
|
|
140
144
|
/****** EXPORTERS *******/
|
|
145
|
+
getWireRdata() {
|
|
146
|
+
return Buffer.from(this.expand(this.get('address'), ''), 'hex')
|
|
147
|
+
}
|
|
148
|
+
|
|
141
149
|
toBind(zone_opts) {
|
|
142
150
|
return `${this.getPrefix(zone_opts)}\t${this.getCompressed()}\n`
|
|
143
151
|
}
|
package/rr/caa.js
CHANGED
package/rr/cert.js
CHANGED
|
@@ -97,6 +97,19 @@ export default class CERT extends RR {
|
|
|
97
97
|
return 37
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
+
getCanonical() {
|
|
101
|
+
return {
|
|
102
|
+
owner: 'mail.example.com.',
|
|
103
|
+
ttl: 3600,
|
|
104
|
+
class: 'IN',
|
|
105
|
+
type: 'CERT',
|
|
106
|
+
'cert type': 'PGP',
|
|
107
|
+
'key tag': 0,
|
|
108
|
+
algorithm: 0,
|
|
109
|
+
certificate: 'hexidecimalkeystring1',
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
100
113
|
/****** IMPORTERS *******/
|
|
101
114
|
|
|
102
115
|
fromTinydns({ tinyline }) {
|
package/rr/cname.js
CHANGED
|
@@ -25,6 +25,10 @@ export default class CNAME extends RR {
|
|
|
25
25
|
return 'Canonical Name'
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
getTags() {
|
|
29
|
+
return ['common']
|
|
30
|
+
}
|
|
31
|
+
|
|
28
32
|
getRdataFields(arg) {
|
|
29
33
|
return ['cname']
|
|
30
34
|
}
|
|
@@ -37,6 +41,16 @@ export default class CNAME extends RR {
|
|
|
37
41
|
return 5
|
|
38
42
|
}
|
|
39
43
|
|
|
44
|
+
getCanonical() {
|
|
45
|
+
return {
|
|
46
|
+
owner: 'www.example.com.',
|
|
47
|
+
ttl: 3600,
|
|
48
|
+
class: 'IN',
|
|
49
|
+
type: 'CNAME',
|
|
50
|
+
cname: 'web.example.com.',
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
40
54
|
/****** IMPORTERS *******/
|
|
41
55
|
fromTinydns({ tinyline }) {
|
|
42
56
|
// Cfqdn:p:ttl:timestamp:lo
|
|
@@ -65,6 +79,9 @@ export default class CNAME extends RR {
|
|
|
65
79
|
}
|
|
66
80
|
|
|
67
81
|
/****** EXPORTERS *******/
|
|
82
|
+
getWireRdata() {
|
|
83
|
+
return this.wirePackDomain(this.get('cname'))
|
|
84
|
+
}
|
|
68
85
|
|
|
69
86
|
toTinydns() {
|
|
70
87
|
return `C${this.getTinyFQDN('owner')}:${this.get('cname')}:${this.getTinydnsPostamble()}\n`
|
package/rr/dname.js
CHANGED
|
@@ -35,6 +35,16 @@ export default class DNAME extends RR {
|
|
|
35
35
|
return 39
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
getCanonical() {
|
|
39
|
+
return {
|
|
40
|
+
owner: 'example.com.',
|
|
41
|
+
ttl: 3600,
|
|
42
|
+
class: 'IN',
|
|
43
|
+
type: 'DNAME',
|
|
44
|
+
target: 'example.net.',
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
38
48
|
/****** IMPORTERS *******/
|
|
39
49
|
fromTinydns({ tinyline }) {
|
|
40
50
|
// DNAME via generic, :fqdn:n:rdata:ttl:timestamp:lo
|
package/rr/dnskey.js
CHANGED
|
@@ -79,6 +79,10 @@ export default class DNSKEY extends RR {
|
|
|
79
79
|
return 'DNS Public Key'
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
getTags() {
|
|
83
|
+
return ['dnssec']
|
|
84
|
+
}
|
|
85
|
+
|
|
82
86
|
getRdataFields(arg) {
|
|
83
87
|
return ['flags', 'protocol', 'algorithm', 'publickey']
|
|
84
88
|
}
|
|
@@ -91,6 +95,19 @@ export default class DNSKEY extends RR {
|
|
|
91
95
|
return 48
|
|
92
96
|
}
|
|
93
97
|
|
|
98
|
+
getCanonical() {
|
|
99
|
+
return {
|
|
100
|
+
owner: 'example.com.',
|
|
101
|
+
ttl: 3600,
|
|
102
|
+
class: 'IN',
|
|
103
|
+
type: 'DNSKEY',
|
|
104
|
+
flags: 256,
|
|
105
|
+
protocol: 3,
|
|
106
|
+
algorithm: 5,
|
|
107
|
+
publickey: 'AQPSKAsj8...',
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
94
111
|
/****** IMPORTERS *******/
|
|
95
112
|
|
|
96
113
|
fromBind({ bindline }) {
|
package/rr/ds.js
CHANGED
|
@@ -50,6 +50,10 @@ export default class DS extends RR {
|
|
|
50
50
|
return 'Delegation Signer'
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
getTags() {
|
|
54
|
+
return ['dnssec']
|
|
55
|
+
}
|
|
56
|
+
|
|
53
57
|
getRdataFields(arg) {
|
|
54
58
|
return ['key tag', 'algorithm', 'digest type', 'digest']
|
|
55
59
|
}
|
|
@@ -62,6 +66,19 @@ export default class DS extends RR {
|
|
|
62
66
|
return 43
|
|
63
67
|
}
|
|
64
68
|
|
|
69
|
+
getCanonical() {
|
|
70
|
+
return {
|
|
71
|
+
owner: 'example.com.',
|
|
72
|
+
ttl: 3600,
|
|
73
|
+
class: 'IN',
|
|
74
|
+
type: 'DS',
|
|
75
|
+
'key tag': 12345,
|
|
76
|
+
algorithm: 5,
|
|
77
|
+
'digest type': 1,
|
|
78
|
+
digest: 'ABCDEF123...',
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
65
82
|
/****** IMPORTERS *******/
|
|
66
83
|
|
|
67
84
|
fromBind({ bindline }) {
|
package/rr/hinfo.js
CHANGED
|
@@ -22,6 +22,10 @@ export default class HINFO extends RR {
|
|
|
22
22
|
return 'Host Info'
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
getTags() {
|
|
26
|
+
return ['obsolete']
|
|
27
|
+
}
|
|
28
|
+
|
|
25
29
|
getRdataFields(arg) {
|
|
26
30
|
return ['cpu', 'os']
|
|
27
31
|
}
|
|
@@ -34,6 +38,17 @@ export default class HINFO extends RR {
|
|
|
34
38
|
return 13
|
|
35
39
|
}
|
|
36
40
|
|
|
41
|
+
getCanonical() {
|
|
42
|
+
return {
|
|
43
|
+
owner: 'test.example.com.',
|
|
44
|
+
ttl: 3600,
|
|
45
|
+
class: 'IN',
|
|
46
|
+
type: 'HINFO',
|
|
47
|
+
cpu: 'DEC-2060',
|
|
48
|
+
os: 'TOPS20',
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
37
52
|
getQuotedFields() {
|
|
38
53
|
return ['cpu', 'os']
|
|
39
54
|
}
|
package/rr/https.js
CHANGED
|
@@ -32,6 +32,10 @@ export default class HTTPS extends RR {
|
|
|
32
32
|
return 'HTTP Semantics'
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
getTags() {
|
|
36
|
+
return ['common']
|
|
37
|
+
}
|
|
38
|
+
|
|
35
39
|
getRdataFields(arg) {
|
|
36
40
|
return ['priority', 'target name', 'params']
|
|
37
41
|
}
|
|
@@ -44,6 +48,18 @@ export default class HTTPS extends RR {
|
|
|
44
48
|
return 65
|
|
45
49
|
}
|
|
46
50
|
|
|
51
|
+
getCanonical() {
|
|
52
|
+
return {
|
|
53
|
+
owner: 'example.com.',
|
|
54
|
+
ttl: 3600,
|
|
55
|
+
class: 'IN',
|
|
56
|
+
type: 'HTTPS',
|
|
57
|
+
priority: 1,
|
|
58
|
+
'target name': 'example.com.',
|
|
59
|
+
params: 'alpn="h2,h3"',
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
47
63
|
/****** IMPORTERS *******/
|
|
48
64
|
|
|
49
65
|
fromBind({ bindline }) {
|
package/rr/ipseckey.js
CHANGED
|
@@ -71,6 +71,10 @@ export default class IPSECKEY extends RR {
|
|
|
71
71
|
return 'IPsec Keying'
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
+
getTags() {
|
|
75
|
+
return ['security']
|
|
76
|
+
}
|
|
77
|
+
|
|
74
78
|
getRdataFields(arg) {
|
|
75
79
|
return ['precedence', 'gateway type', 'algorithm', 'gateway', 'publickey']
|
|
76
80
|
}
|
|
@@ -134,7 +138,7 @@ export default class IPSECKEY extends RR {
|
|
|
134
138
|
octalKey = rdata.slice(28)
|
|
135
139
|
break
|
|
136
140
|
case 2: // 16-byte IPv6
|
|
137
|
-
gateway = TINYDNS.
|
|
141
|
+
gateway = TINYDNS.octalToIPv6(rdata.slice(12, 76))
|
|
138
142
|
octalKey = rdata.slice(76)
|
|
139
143
|
break
|
|
140
144
|
case 3: // wire encoded domain name
|
package/rr/key.js
CHANGED
|
@@ -63,6 +63,19 @@ export default class KEY extends RR {
|
|
|
63
63
|
return 25
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
getCanonical() {
|
|
67
|
+
return {
|
|
68
|
+
owner: 'example.com.',
|
|
69
|
+
ttl: 3600,
|
|
70
|
+
class: 'IN',
|
|
71
|
+
type: 'KEY',
|
|
72
|
+
flags: 256,
|
|
73
|
+
protocol: 3,
|
|
74
|
+
algorithm: 5,
|
|
75
|
+
publickey: 'AQPSKAsj8...',
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
66
79
|
/****** IMPORTERS *******/
|
|
67
80
|
|
|
68
81
|
fromBind({ bindline }) {
|
package/rr/loc.js
CHANGED
|
@@ -48,6 +48,16 @@ export default class LOC extends RR {
|
|
|
48
48
|
return 29
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
getCanonical() {
|
|
52
|
+
return {
|
|
53
|
+
owner: 'example.com.',
|
|
54
|
+
ttl: 3600,
|
|
55
|
+
class: 'IN',
|
|
56
|
+
type: 'LOC',
|
|
57
|
+
address: '52 22 23.000 N 4 53 32.000 E 10m 100m 10m 2m',
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
51
61
|
parseLoc(string) {
|
|
52
62
|
// d1 [m1 [s1]]
|
|
53
63
|
const dms = '(\\d+)\\s+(?:(\\d+)\\s+)?(?:([\\d.]+)\\s+)?'
|
package/rr/mx.js
CHANGED
|
@@ -29,6 +29,10 @@ export default class MX extends RR {
|
|
|
29
29
|
return 'Mail Exchanger'
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
getTags() {
|
|
33
|
+
return ['common']
|
|
34
|
+
}
|
|
35
|
+
|
|
32
36
|
getRdataFields(arg) {
|
|
33
37
|
return ['preference', 'exchange']
|
|
34
38
|
}
|
|
@@ -47,7 +51,7 @@ export default class MX extends RR {
|
|
|
47
51
|
ttl: 43200,
|
|
48
52
|
class: 'IN',
|
|
49
53
|
type: 'MX',
|
|
50
|
-
preference:
|
|
54
|
+
preference: 10,
|
|
51
55
|
exchange: 'mail.example.com.',
|
|
52
56
|
}
|
|
53
57
|
}
|
|
@@ -84,6 +88,12 @@ export default class MX extends RR {
|
|
|
84
88
|
}
|
|
85
89
|
|
|
86
90
|
/****** EXPORTERS *******/
|
|
91
|
+
getWireRdata() {
|
|
92
|
+
const pref = Buffer.alloc(2)
|
|
93
|
+
pref.writeUInt16BE(this.get('preference'))
|
|
94
|
+
return Buffer.concat([pref, this.wirePackDomain(this.get('exchange'))])
|
|
95
|
+
}
|
|
96
|
+
|
|
87
97
|
toBind(zone_opts) {
|
|
88
98
|
return `${this.getPrefix(zone_opts)}\t${this.get('preference')}\t${this.getFQDN('exchange', zone_opts)}\n`
|
|
89
99
|
}
|
package/rr/naptr.js
CHANGED
|
@@ -21,13 +21,28 @@ export default class NAPTR extends RR {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
getRFCs() {
|
|
24
|
-
return [2915, 3403]
|
|
24
|
+
return [2915, 3403, 4848]
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
getTypeId() {
|
|
28
28
|
return 35
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
getCanonical() {
|
|
32
|
+
return {
|
|
33
|
+
owner: 'cid.urn.arpa.',
|
|
34
|
+
ttl: 3600,
|
|
35
|
+
class: 'IN',
|
|
36
|
+
type: 'NAPTR',
|
|
37
|
+
order: 100,
|
|
38
|
+
preference: 10,
|
|
39
|
+
flags: 'S',
|
|
40
|
+
service: 'z3950+N2L+N2R',
|
|
41
|
+
regexp: '',
|
|
42
|
+
replacement: 'gatekeeper.example.com.',
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
31
46
|
/****** Resource record specific setters *******/
|
|
32
47
|
setOrder(val) {
|
|
33
48
|
this.is16bitInt('NAPTR', 'order', val)
|
package/rr/ns.js
CHANGED
|
@@ -21,6 +21,10 @@ export default class NS extends RR {
|
|
|
21
21
|
return 'Name Server'
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
getTags() {
|
|
25
|
+
return ['common']
|
|
26
|
+
}
|
|
27
|
+
|
|
24
28
|
getRdataFields(arg) {
|
|
25
29
|
return ['dname']
|
|
26
30
|
}
|
|
@@ -33,6 +37,16 @@ export default class NS extends RR {
|
|
|
33
37
|
return 2
|
|
34
38
|
}
|
|
35
39
|
|
|
40
|
+
getCanonical() {
|
|
41
|
+
return {
|
|
42
|
+
owner: 'example.com.',
|
|
43
|
+
ttl: 3600,
|
|
44
|
+
class: 'IN',
|
|
45
|
+
type: 'NS',
|
|
46
|
+
dname: 'ns1.example.com.',
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
36
50
|
/****** IMPORTERS *******/
|
|
37
51
|
fromTinydns({ tinyline }) {
|
|
38
52
|
// &fqdn:ip:x:ttl:timestamp:lo
|
|
@@ -63,6 +77,10 @@ export default class NS extends RR {
|
|
|
63
77
|
}
|
|
64
78
|
|
|
65
79
|
/****** EXPORTERS *******/
|
|
80
|
+
getWireRdata() {
|
|
81
|
+
return this.wirePackDomain(this.get('dname'))
|
|
82
|
+
}
|
|
83
|
+
|
|
66
84
|
toBind(zone_opts) {
|
|
67
85
|
return `${this.getPrefix(zone_opts)}\t${this.getFQDN('dname', zone_opts)}\n`
|
|
68
86
|
}
|