Skip to content

Instantly share code, notes, and snippets.

@toke
Created May 5, 2010 19:52
Show Gist options
  • Save toke/391332 to your computer and use it in GitHub Desktop.
Save toke/391332 to your computer and use it in GitHub Desktop.
CouchDB Bind zone file generation as an example (CouchDB show function)
function(doc, req) {
// bind zone file generation as an example (CouchDB show function)
// see http://blog.fupps.com/2010/05/03/dns-backed-by-couchdb-redux/
// reused some code by the original author Jan-Piet Mens
// Warning very raw code below. It may eat your pants.
var soa_rr = function (mname, rname, serial, refresh, retry, expire, minimum){
return ("@ IN SOA " + mname + ". " + rname + ". ("+ serial+" "+ refresh + " "+ retry + " "+ expire +" "+ minimum +")\n\n");
};
var zone = "";
var zonettl = doc.default_ttl ? doc.default_ttl : 86400;
var soa = doc.soa;
var mname = (soa.mname) ? soa.mname : 'dns.' + doc.zone;
var rname = (soa.rname) ? soa.rname : 'hostmaster.' + doc.zone;
var serial = (soa.serial) ? soa.serial : doc['_rev'].replace(/-.*/, "");
var refresh = (soa.refresh) ? soa.refresh : 86400;
var retry = (soa.retry) ? soa.retry : 7200;
var expire = (soa.expire) ? soa.expire : 3600000;
var minimum = (soa.minimum) ? soa.minimum : 172800;
zone += "$TTL " + zonettl + "\n";
zone += soa_rr(mname, rname, serial, refresh, retry, expire, minimum);
if (doc.ns && doc.ns.length > 0) {
doc.ns.forEach(function(addr) {
zone += "\tIN NS " + addr + ".\n";
});
}
zone += "\n";
if (doc.rr && doc.rr.length > 0) {
for (var i = 0; i < doc.rr.length; i++) {
var rr = doc.rr[i];
var rr_type = rr.type.toUpperCase();
var ttl = (rr.ttl) ? rr.ttl : zonettl;
var fqdn = (rr.name) ? rr.name + '.' : '';
if (rr_type === "MX" && rr.priority){
var rr_data = rr.priority + " " + rr.data;
} else {
var rr_data = rr.data;
if (rr_type === "TXT"){
// Quote here
rr_data = "\""+rr_data+"\"";
}
}
fqdn += doc.zone;
zone += fqdn +".\t"+ ttl +" IN " + rr_type + " " + rr_data + "\n";
}
}
return (zone);
}
{
"_id": "toke.de",
"_rev": "3-7afba84bc6321db26925987ff15f1111",
"default_ttl": 1801,
"ns": [
"a.ns.kerpe.net",
"b.ns.kerpe.net"
],
"rr": [
{
"data": [
"20 a.mx.kerpe.net"
],
"type": "mx"
},
{
"data": [
"v=spf1 ptr mx a:a.mx.kerpe.net a:mail.kerpe.net -all"
],
"type": "txt",
"name": "www",
"ttl": 60
},
{
"data": [
"a.web.toke.de."
],
"type": "cname",
"name": "www",
"ttl": 3600
},
{
"data": [
"188.40.41.113"
],
"type": "a",
"name": "a.web"
},
{
"data": [
"2001:6f8:1039::3"
],
"type": "aaaa",
"name": "a.web"
}
],
"soa": {
"retry": 1800,
"mname": "toke.de",
"minimum": 86400,
"refresh": 10800,
"xserial": 69,
"expire": 604800
},
"type": "zone",
"zone": "toke.de"
}
Example output of the above function and document https://127.0.0.1:5984/dns/_design/dns/_show/bindzone/toke.de
$TTL 1801
@ IN SOA toke.de. hostmaster.toke.de. (3 10800 1800 604800 86400)
IN NS a.ns.kerpe.net.
IN NS b.ns.kerpe.net.
toke.de. 1801 IN MX 20 a.mx.kerpe.net
www.toke.de. 60 IN TXT "v=spf1 ptr mx a:a.mx.kerpe.net a:mail.kerpe.net -all"
www.toke.de. 3600 IN CNAME a.web.toke.de.
a.web.toke.de. 1801 IN A 188.40.41.113
a.web.toke.de. 1801 IN AAAA 2001:6f8:1039::3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment