mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-09-20 14:56:20 +08:00
* helpers.js: Refactor addRecord to recordBuilder * Fixed failing dns test * helpers.js: Fixed a typo in SRV handling * helpers.js: Move type to top level argument * Removed support for numeric modifiers * helpers.js: Added IMPORT_TRANSFORM ttl argument back
This commit is contained in:
parent
ad27cc9b3b
commit
73962470bc
|
@ -118,8 +118,14 @@ function DefaultTTL(v) {
|
|||
}
|
||||
}
|
||||
|
||||
function makeCAAFlag(value){
|
||||
return function(record){
|
||||
record.caaflag |= value;
|
||||
};
|
||||
}
|
||||
|
||||
// CAA_CRITICAL: Critical CAA flag
|
||||
var CAA_CRITICAL = 1<<0;
|
||||
var CAA_CRITICAL = makeCAAFlag(1<<0);
|
||||
|
||||
|
||||
// DnsProvider("providerName", 0)
|
||||
|
@ -135,84 +141,71 @@ function DnsProvider(name, nsCount){
|
|||
}
|
||||
|
||||
// A(name,ip, recordModifiers...)
|
||||
function A(name, ip) {
|
||||
var mods = getModifiers(arguments,2)
|
||||
return function(d) {
|
||||
addRecord(d,"A",name,ip,mods)
|
||||
}
|
||||
}
|
||||
var A = recordBuilder('A');
|
||||
|
||||
// AAAA(name,ip, recordModifiers...)
|
||||
function AAAA(name, ip) {
|
||||
var mods = getModifiers(arguments,2)
|
||||
return function(d) {
|
||||
addRecord(d,"AAAA",name,ip,mods)
|
||||
}
|
||||
}
|
||||
var AAAA = recordBuilder('AAAA');
|
||||
|
||||
// ALIAS(name,target, recordModifiers...)
|
||||
function ALIAS(name, target) {
|
||||
var mods = getModifiers(arguments,2)
|
||||
return function(d) {
|
||||
addRecord(d,"ALIAS",name,target,mods)
|
||||
}
|
||||
}
|
||||
var ALIAS = recordBuilder('ALIAS');
|
||||
|
||||
// CAA(name,tag,value, recordModifiers...)
|
||||
function CAA(name, tag, value){
|
||||
checkArgs([_.isString, _.isString, _.isString], arguments, "CAA expects (name, tag, value) plus optional flag as a meta argument")
|
||||
|
||||
var mods = getModifiers(arguments,3)
|
||||
mods.push({caatag: tag});
|
||||
|
||||
return function(d) {
|
||||
addRecord(d,"CAA",name,value,mods)
|
||||
}
|
||||
}
|
||||
|
||||
var CAA = recordBuilder('CAA', {
|
||||
args: [
|
||||
['name', _.isString],
|
||||
['tag', _.isString],
|
||||
['value', _.isString],
|
||||
],
|
||||
transform: function(record, args, modifiers){
|
||||
record.name = args.name;
|
||||
record.caatag = args.tag;
|
||||
record.target = args.value;
|
||||
},
|
||||
modifierNumber: function(record, value){
|
||||
record.caaflags |= value;
|
||||
},
|
||||
});
|
||||
|
||||
// CNAME(name,target, recordModifiers...)
|
||||
function CNAME(name, target) {
|
||||
var mods = getModifiers(arguments,2)
|
||||
return function(d) {
|
||||
addRecord(d,"CNAME",name,target,mods)
|
||||
}
|
||||
}
|
||||
var CNAME = recordBuilder('CNAME');
|
||||
|
||||
// PTR(name,target, recordModifiers...)
|
||||
function PTR(name, target) {
|
||||
var mods = getModifiers(arguments,2)
|
||||
return function(d) {
|
||||
addRecord(d,"PTR",name,target,mods)
|
||||
}
|
||||
}
|
||||
var PTR = recordBuilder('PTR');
|
||||
|
||||
// SRV(name,priority,weight,port,target, recordModifiers...)
|
||||
function SRV(name, priority, weight, port, target) {
|
||||
checkArgs([_.isString, _.isNumber, _.isNumber, _.isNumber, _.isString], arguments, "SRV expects (name, priority, weight, port, target)")
|
||||
var mods = getModifiers(arguments,5)
|
||||
return function(d) {
|
||||
addRecordSRV(d, "SRV", name, priority, weight, port, target, mods)
|
||||
}
|
||||
}
|
||||
var SRV = recordBuilder('SRV', {
|
||||
args: [
|
||||
['name', _.isString],
|
||||
['priority', _.isNumber],
|
||||
['weight', _.isNumber],
|
||||
['port', _.isNumber],
|
||||
['target', _.isString],
|
||||
],
|
||||
transform: function(record, args, modifiers){
|
||||
record.name = args.name;
|
||||
record.srvpriority = args.priority;
|
||||
record.srvweight = args.weight;
|
||||
record.srvport = args.port;
|
||||
record.target = args.target;
|
||||
},
|
||||
});
|
||||
|
||||
// TXT(name,target, recordModifiers...)
|
||||
function TXT(name, target) {
|
||||
var mods = getModifiers(arguments,2)
|
||||
return function(d) {
|
||||
addRecord(d,"TXT",name,target,mods)
|
||||
}
|
||||
}
|
||||
var TXT = recordBuilder('TXT');
|
||||
|
||||
// MX(name,priority,target, recordModifiers...)
|
||||
function MX(name, priority, target) {
|
||||
checkArgs([_.isString, _.isNumber, _.isString], arguments, "MX expects (name, priority, target)")
|
||||
var mods = getModifiers(arguments,3)
|
||||
return function(d) {
|
||||
mods.push(priority);
|
||||
addRecord(d, "MX", name, target, mods)
|
||||
}
|
||||
}
|
||||
var MX = recordBuilder('MX', {
|
||||
args: [
|
||||
['name', _.isString],
|
||||
['priority', _.isNumber],
|
||||
['target', _.isString],
|
||||
],
|
||||
transform: function(record, args, modifiers){
|
||||
record.name = args.name;
|
||||
record.mxpreference = args.priority;
|
||||
record.target = args.target;
|
||||
},
|
||||
});
|
||||
|
||||
function checkArgs(checks, args, desc){
|
||||
if (args.length < checks.length){
|
||||
|
@ -226,12 +219,7 @@ function checkArgs(checks, args, desc){
|
|||
}
|
||||
|
||||
// NS(name,target, recordModifiers...)
|
||||
function NS(name, target) {
|
||||
var mods = getModifiers(arguments,2)
|
||||
return function(d) {
|
||||
addRecord(d,"NS",name,target,mods)
|
||||
}
|
||||
}
|
||||
var NS = recordBuilder('NS');
|
||||
|
||||
// NAMESERVER(name,target)
|
||||
function NAMESERVER(name, target) {
|
||||
|
@ -274,15 +262,19 @@ function format_tt(transform_table) {
|
|||
}
|
||||
|
||||
// IMPORT_TRANSFORM(translation_table, domain)
|
||||
function IMPORT_TRANSFORM(translation_table, domain,ttl) {
|
||||
return function(d) {
|
||||
var rec = addRecord(d, "IMPORT_TRANSFORM", "@", domain, [
|
||||
{'transform_table': format_tt(translation_table)}])
|
||||
if (ttl){
|
||||
rec.ttl = ttl;
|
||||
}
|
||||
}
|
||||
}
|
||||
var IMPORT_TRANSFORM = recordBuilder('IMPORT_TRANSFORM', {
|
||||
args: [
|
||||
['translation_table'],
|
||||
['domain'],
|
||||
['ttl', _.isNumber],
|
||||
],
|
||||
transform: function(record, args, modifiers){
|
||||
record.name = '@';
|
||||
record.target = args.domain;
|
||||
record.meta['transform_table'] = format_tt(args.translation_table);
|
||||
record.ttl = args.ttl;
|
||||
},
|
||||
});
|
||||
|
||||
// PURGE()
|
||||
function PURGE(d) {
|
||||
|
@ -294,6 +286,9 @@ function NO_PURGE(d) {
|
|||
d.KeepUnknown = true
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
function getModifiers(args,start) {
|
||||
var mods = [];
|
||||
for (var i = start;i<args.length; i++) {
|
||||
|
@ -302,6 +297,102 @@ function getModifiers(args,start) {
|
|||
return mods;
|
||||
}
|
||||
|
||||
/**
|
||||
* Record type builder
|
||||
* @param {string} type Record type
|
||||
* @param {string} opts.args[][0] Argument name
|
||||
* @param {function=} opts.args[][1] Optional validator
|
||||
* @param {function=} opts.transform Function to apply arguments to record.
|
||||
* Take (record, args, modifier) as arguments. Any modifiers will be
|
||||
* applied before this function. It should mutate the given record.
|
||||
* @param {function=} opts.applyModifier Function to apply modifiers to the record
|
||||
*/
|
||||
function recordBuilder(type, opts){
|
||||
opts = _.defaults({}, opts, {
|
||||
args: [
|
||||
['name', _.isString],
|
||||
['target'],
|
||||
],
|
||||
|
||||
transform: function(record, args, modifiers) {
|
||||
// record will have modifiers already applied
|
||||
// args will be an object for parameters defined
|
||||
record.name = args.name;
|
||||
if (_.isNumber(args.target)) {
|
||||
record.target = num2dot(args.target);
|
||||
} else {
|
||||
record.target = args.target;
|
||||
}
|
||||
},
|
||||
|
||||
applyModifier: function(record, modifiers) {
|
||||
for (var i = 0; i < modifiers.length; i++) {
|
||||
var mod = modifiers[i];
|
||||
|
||||
if (_.isFunction(mod)) {
|
||||
mod(record);
|
||||
} else if (_.isObject(mod)) {
|
||||
// convert transforms to strings
|
||||
if (mod.transform && _.isArray(mod.transform)) {
|
||||
mod.transform = format_tt(mod.transform);
|
||||
}
|
||||
_.extend(record.meta, mod);
|
||||
} else {
|
||||
throw "ERROR: Unknown modifier type";
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
return function(){
|
||||
var parsedArgs = {};
|
||||
var modifiers = [];
|
||||
|
||||
if (arguments.length < opts.args.length) {
|
||||
var argumentsList = opts.args.map(function(item){
|
||||
return item[0];
|
||||
}).join(', ');
|
||||
throw type + " record requires " + opts.args.length + " arguments (" + argumentsList + "). Only " + arguments.length + " were supplied";
|
||||
return;
|
||||
}
|
||||
|
||||
// collect arguments
|
||||
for (var i = 0; i < opts.args.length; i++) {
|
||||
var argDefinition = opts.args[i];
|
||||
var value = arguments[i];
|
||||
if (argDefinition.length > 1) {
|
||||
// run validator if supplied
|
||||
if(!argDefinition[1](value)){
|
||||
throw type + " record " + argDefinition[0] + " argument validation failed";
|
||||
}
|
||||
}
|
||||
parsedArgs[argDefinition[0]] = value;
|
||||
}
|
||||
|
||||
// collect modifiers
|
||||
for (var i = opts.args.length; i < arguments.length; i++) {
|
||||
modifiers.push(arguments[i]);
|
||||
}
|
||||
|
||||
return function(d){
|
||||
var record = {
|
||||
type: type,
|
||||
meta: {},
|
||||
ttl: d.defaultTTL,
|
||||
};
|
||||
|
||||
opts.applyModifier(record, modifiers);
|
||||
opts.transform(record, parsedArgs, modifiers);
|
||||
|
||||
d.records.push(record);
|
||||
return record;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
function addRecord(d,type,name,target,mods) {
|
||||
// if target is number, assume ip address. convert it.
|
||||
if (_.isNumber(target)) {
|
||||
|
@ -312,40 +403,6 @@ function addRecord(d,type,name,target,mods) {
|
|||
// - Function: call is with the record as the argument
|
||||
// - Object: merge it into the metadata
|
||||
// - Number: IF MX record assume it is priority
|
||||
if (mods) {
|
||||
for (var i = 0; i< mods.length; i++) {
|
||||
var m = mods[i]
|
||||
if (_.isFunction(m)) {
|
||||
m(rec);
|
||||
} else if (_.isObject(m) && m.caatag) {
|
||||
// caatag is a top level object, not in meta
|
||||
rec.caatag = m.caatag;
|
||||
} else if (_.isObject(m)) {
|
||||
//convert transforms to strings
|
||||
if (m.transform && _.isArray(m.transform)){
|
||||
m.transform = format_tt(m.transform)
|
||||
}
|
||||
_.extend(rec.meta,m);
|
||||
_.extend(rec.meta,m);
|
||||
} else if (_.isNumber(m) && type == "MX") {
|
||||
rec.mxpreference = m;
|
||||
} else if (_.isNumber(m) && type == "CAA") {
|
||||
rec.caaflags |= m;
|
||||
} else {
|
||||
console.log("WARNING: Modifier type unsupported:", typeof m, "(Skipping!)");
|
||||
}
|
||||
}
|
||||
}
|
||||
d.records.push(rec);
|
||||
return rec;
|
||||
}
|
||||
|
||||
function addRecordSRV(d,type,name,srvpriority,srvweight,srvport,target,mods) {
|
||||
var rec = {type: type, name: name, srvpriority: srvpriority, srvweight: srvweight, srvport: srvport, target: target, ttl:d.defaultTTL, meta:{}};
|
||||
// for each modifier, decide based on type:
|
||||
// - Function: call is with the record as the argument
|
||||
// - Object: merge it into the metadata
|
||||
// FIXME(tlim): Factor this code out to its own function.
|
||||
if (mods) {
|
||||
for (var i = 0; i< mods.length; i++) {
|
||||
var m = mods[i]
|
||||
|
@ -406,19 +463,32 @@ var CF_PROXY_DEFAULT_OFF = {'cloudflare_proxy_default': 'off'};
|
|||
var CF_PROXY_DEFAULT_ON = {'cloudflare_proxy_default': 'on'};
|
||||
|
||||
// CUSTOM, PROVIDER SPECIFIC RECORD TYPES
|
||||
function CF_REDIRECT(src, dst) {
|
||||
return function(d) {
|
||||
if (src.indexOf(",") !== -1 || dst.indexOf(",") !== -1){
|
||||
throw("redirect src and dst must not have commas")
|
||||
}
|
||||
addRecord(d,"CF_REDIRECT","@",src+","+dst)
|
||||
}
|
||||
}
|
||||
function CF_TEMP_REDIRECT(src, dst) {
|
||||
return function(d) {
|
||||
if (src.indexOf(",") !== -1 || dst.indexOf(",") !== -1){
|
||||
throw("redirect src and dst must not have commas")
|
||||
}
|
||||
addRecord(d,"CF_TEMP_REDIRECT","@",src+","+dst)
|
||||
|
||||
function _validateCloudFlareRedirect(value){
|
||||
if(!_.isString(value)){
|
||||
return false;
|
||||
}
|
||||
return value.indexOf(",") === -1;
|
||||
}
|
||||
|
||||
var CF_REDIRECT = recordBuilder("CF_REDIRECT", {
|
||||
args: [
|
||||
["source", _validateCloudFlareRedirect],
|
||||
["destination", _validateCloudFlareRedirect],
|
||||
],
|
||||
transform: function(record, args, modifiers){
|
||||
record.name = "@";
|
||||
record.target = args.source + "," + args.destination;
|
||||
},
|
||||
});
|
||||
|
||||
var CF_TEMP_REDIRECT = recordBuilder("CF_TEMP_REDIRECT", {
|
||||
args: [
|
||||
["source", _validateCloudFlareRedirect],
|
||||
["destination", _validateCloudFlareRedirect],
|
||||
],
|
||||
transform: function(record, args, modifiers){
|
||||
record.name = "@";
|
||||
record.target = args.source + "," + args.destination;
|
||||
},
|
||||
});
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
var TRANSFORM_INT = [
|
||||
{low: "0.0.0.0", high: "1.1.1.1", newBase: "2.2.2.2" }
|
||||
]
|
||||
D("foo.com","reg",IMPORT_TRANSFORM(TRANSFORM_INT,"foo2.com",60))
|
||||
D("foo.com","reg",IMPORT_TRANSFORM(TRANSFORM_INT,"foo2.com",60))
|
||||
|
|
|
@ -10,8 +10,8 @@
|
|||
{
|
||||
"type": "IMPORT_TRANSFORM",
|
||||
"name": "@",
|
||||
"target": "foo2.com",
|
||||
"ttl": 60,
|
||||
"target": "foo2.com",
|
||||
"ttl": 60,
|
||||
"meta": {
|
||||
"transform_table": "0.0.0.0 ~ 1.1.1.1 ~ 2.2.2.2 ~ "
|
||||
}
|
||||
|
@ -19,4 +19,4 @@
|
|||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,7 +23,8 @@
|
|||
"type":"CAA",
|
||||
"name":"@",
|
||||
"target":"mailto:test@example.com",
|
||||
"caatag":"iodef"
|
||||
"caatag":"iodef",
|
||||
"caaflag":1
|
||||
},
|
||||
{
|
||||
"type":"CAA",
|
||||
|
@ -35,7 +36,8 @@
|
|||
"type":"CAA",
|
||||
"name":"@",
|
||||
"target":"https://example.com",
|
||||
"caatag":"iodef"
|
||||
"caatag":"iodef",
|
||||
"caaflag":1
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
120
pkg/js/static.go
120
pkg/js/static.go
|
@ -190,63 +190,73 @@ var _escData = map[string]*_escFile{
|
|||
|
||||
"/helpers.js": {
|
||||
local: "pkg/js/helpers.js",
|
||||
size: 11743,
|
||||
size: 13440,
|
||||
modtime: 0,
|
||||
compressed: `
|
||||
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
|
||||
O7++e1uMJYj/l2WDLP83AAD//yOh85uANAAA
|
||||
`,
|
||||
},
|
||||
|
||||
|
|
Loading…
Reference in a new issue