UNPKG

dnsz

Version:

Generic DNS zone file parser and stringifier

131 lines (105 loc) 4.26 kB
# dnsz [![](https://img.shields.io/npm/v/dnsz.svg?style=flat)](https://www.npmjs.org/package/dnsz) [![](https://img.shields.io/npm/dm/dnsz.svg)](https://www.npmjs.org/package/dnsz) [![](https://img.shields.io/bundlephobia/minzip/dnsz.svg)](https://bundlephobia.com/package/dnsz) [![](https://packagephobia.com/badge?p=dnsz)](https://packagephobia.com/result?p=dnsz) [![](https://depx.co/api/badge/dnsz)](https://depx.co/pkg/dnsz) > Generic DNS zone file parser and stringifier All current and future record types are supported as the module makes no effort to parse a record's content. It is highly configurable and has no dependencies. ## Usage ```bash npm i dnsz ``` ```js import {parseZone, stringifyZone} from "dnsz"; const data = parseZone("example.com 60 IN A 1.2.3.4"); // => {records: [{name: "example.com", ttl: 60, class: "IN", type: "A", content: "1.2.3.4"}]} stringifyZone(data); // => ";; A Records\nexample.com.\t60\tIN\tA\t1.2.3.4\n" ``` ## API ### parseZone(str, [opts]) Parse a string of a DNS zone file and returns a `data` object. - `opts.replaceOrigin` *string*: When specified, replaces any `@` in `name` or `content` with it. Default: `null`. - `opts.crlf` *boolean*: When true, emit `\r\n` instead of `\n` in `header`. Default: `false`. - `opts.defaultTTL` *number*: Default TTL when absent and `$TTL` is not present. Default: `60`. - `opts.defaultClass` *string*: Default class when absent. Default: `"IN"`. - `opts.dots` *boolean*: Ensure trailing dots on FQDNs in content. Supports a limited amount of record types. Default: `false`. ### stringifyZone(data, [opts]) Parse a `data` object and return a string with the zone file contents. - `opts.sections` *boolean*: Whether to group records into sections. Default: `true`. - `opts.crlf` *boolean*: When `true`, emit `\r\n` instead of `\n` for the resulting zone file. Default: `false`. - `opts.dots` *boolean*: Ensure trailing dots on FQDNs in content. Supports a limited amount of record types. Default: `false`. ### `data` object - `records`: Array of `record` with these props: - `name`: The lowercase DNS name without a trailing dot, e.g. `"example.com"`. - `ttl`: The TTL in seconds, e.g. `60`. - `class`: The DNS class, e.g. `"IN"`. - `type`: The record type, e.g. `"A"`. - `content`: The record content, e.g. `"2001:db8::1"` or `"example.com."`. - `comment`: A comment, e.g. `"a comment"`, `null` if absent. - `origin`: The value of `$ORIGIN` in the zone file. - `ttl`: The value of `$TTL` in the zone file. - `header`: An optional header at the start of the file. Can be multiline. Does not include comment markers. If `data.origin` is specified, the following things happen in the zone file output: - A `$ORIGIN` variable is added. - All occurences of `data.origin` within `content` are replaced with `@`. - If `data.origin` matches the `name` of a `record`, `name` is replaced with `@`. ### Example zone file ``` ini $ORIGIN originzone.com. ;; SOA Records @ 3600 IN SOA originzone.com. root.originzone.com. 2031242781 7200 3600 86400 3600 ;; A Records @ 60 IN A 1.2.3.4 ; a comment mx 60 IN A 1.2.3.4 ; another comment ;; AAAA Records @ 120 IN AAAA 2001:db8::1 mx 120 IN AAAA 2001:db8::1 ``` ### Example data object ``` json { "origin": "originzone.com", "records": [ { "name": "originzone.com", "ttl": 3600, "class": "IN", "type": "SOA", "content": "originzone.com. root.originzone.com. 2031242781 7200 3600 86400 3600", "comment": null }, { "name": "originzone.com", "ttl": 60, "class": "IN", "type": "A", "content": "1.2.3.4", "comment": "a comment" }, { "name": "mx", "ttl": 60, "class": "IN", "type": "A", "content": "1.2.3.4", "comment": "another comment" }, { "name": "originzone.com", "ttl": 120, "class": "IN", "type": "AAAA", "content": "2001:db8::1", "comment": null }, { "name": "mx", "ttl": 120, "class": "IN", "type": "AAAA", "content": "2001:db8::1", "comment": null } ] } ``` ## License © [silverwind](https://github.com/silverwind), distributed under BSD licence