UNPKG

zonefile

Version:

parser for dns zone files

94 lines (73 loc) 1.6 kB
var RECORD_TYPES = ['A', 'AAAA', 'NS', 'MX', 'CNAME', 'PTR', 'TXT'] function parseZone(data){ zone = { records:[] } data.split('\n').forEach(function(line){ if(!zone.ttl){ zone.ttl = parseTTL(line) } var record = parseLine(line) if(record){ zone.records.push(record) } }) return zone } function parseTTL(line){ if (line.match(/^\$TTL?\s+(.*)$/i)) { return parseInt( line.match(/^\$TTL?\s+(.*)$/i)[1] ); } } function parseLine(line){ var chunks = line.split(' ') var name = chunks[0] if(!name) return null var type = null var re = /.(IN CNAME|IN A|IN AAAA|IN NS|IN AAAA|IN TXT|IN MX|IN PTR)./i; var typeinfo = line.match(re); // unsupported type if(!typeinfo) return null var type = typeinfo[1].split(' ')[1] var index = line.indexOf("IN "+type)+('IN '+type).length var ttl = null for(var c in chunks){ if(c>0){ var reg = /^\d+$/; var chunk = chunks[c] if(chunk!='' && reg.test(chunk) && line.indexOf(chunk)<line.indexOf("IN "+type)){ ttl = parseInt(chunk) } } } var data = line.substr(index) var priority = null if(type=='MX'){ var datachunks = data.split(' ') data ='' datachunks.forEach(function(chunk){ if(chunk && parseInt(chunk)>0 && !priority){ priority = parseInt(chunk) }else{ if(chunk!=''){ data+=chunk } } }) }else{ data = data.replace(/\s+/g, ''); } var record = { name:name, type:type, value:data, ttl:ttl, priority:priority } return record } module.exports = { parseZone:parseZone, parseLine:parseLine, parseTTL:parseTTL }