+val dl = ErrorMsg.dummyLoc
+
+val nsD = (EString Config.defaultNs, dl)
+val serialD = (EVar "serialAuto", dl)
+val refD = (EInt Config.defaultRefresh, dl)
+val retD = (EInt Config.defaultRetry, dl)
+val expD = (EInt Config.defaultExpiry, dl)
+val minD = (EInt Config.defaultMinimum, dl)
+
+val soaD = multiApp ((EVar "soa", dl),
+ dl,
+ [nsD, serialD, refD, retD, expD, minD])
+
+val masterD = (EApp ((EVar "internalMaster", dl),
+ (EString Config.masterNode, dl)),
+ dl)
+
+val slavesD = (EList (map (fn s => (EString s, dl)) Config.slaveNodes), dl)
+
+val _ = Defaults.registerDefault ("Aliases",
+ (TList (TBase "your_domain", dl), dl),
+ (fn () => (EList [], dl)))
+
+val _ = Defaults.registerDefault ("Mailbox",
+ (TBase "email", dl),
+ (fn () => (EString (getUser ()), dl)))
+
+val _ = Defaults.registerDefault ("DNS",
+ (TBase "dnsKind", dl),
+ (fn () => multiApp ((EVar "useDns", dl),
+ dl,
+ [soaD, masterD, slavesD])))
+
+val _ = Defaults.registerDefault ("TTL",
+ (TBase "int", dl),
+ (fn () => (EInt Config.Bind.defaultTTL, dl)))
+
+type soa = {ns : string,
+ serial : int option,
+ ref : int,
+ ret : int,
+ exp : int,
+ min : int}
+
+val serial = fn (EVar "serialAuto", _) => SOME NONE
+ | (EApp ((EVar "serialConst", _), n), _) => Option.map SOME (Env.int n)
+ | _ => NONE
+
+val soa = fn (EApp ((EApp ((EApp ((EApp ((EApp ((EApp
+ ((EVar "soa", _), ns), _),
+ sl), _),
+ rf), _),
+ ret), _),
+ exp), _),
+ min), _) =>
+ (case (Env.string ns, serial sl, Env.int rf,
+ Env.int ret, Env.int exp, Env.int min) of
+ (SOME ns, SOME sl, SOME rf,
+ SOME ret, SOME exp, SOME min) =>
+ SOME {ns = ns,
+ serial = sl,
+ ref = rf,
+ ret = ret,
+ exp = exp,
+ min = min}
+ | _ => NONE)
+ | _ => NONE
+
+datatype master =
+ ExternalMaster of string
+ | InternalMaster of string
+
+val ip = Env.string
+
+val _ = Env.registerFunction ("ip_of_node",
+ fn [(EString node, _)] => SOME (EString (nodeIp node), dl)
+ | _ => NONE)
+
+val master = fn (EApp ((EVar "externalMaster", _), e), _) => Option.map ExternalMaster (ip e)
+ | (EApp ((EVar "internalMaster", _), e), _) => Option.map InternalMaster (Env.string e)
+ | _ => NONE
+
+datatype dnsKind =
+ UseDns of {soa : soa,
+ master : master,
+ slaves : string list}
+ | NoDns
+
+val dnsKind = fn (EApp ((EApp ((EApp
+ ((EVar "useDns", _), sa), _),
+ mstr), _),
+ slaves), _) =>
+ (case (soa sa, master mstr, Env.list Env.string slaves) of
+ (SOME sa, SOME mstr, SOME slaves) =>
+ SOME (UseDns {soa = sa,
+ master = mstr,
+ slaves = slaves})
+ | _ => NONE)
+ | (EVar "noDns", _) => SOME NoDns
+ | _ => NONE
+