Env.string
validNode
+val _ = Env.registerFunction ("dns_node_to_node",
+ fn [e] => SOME e
+ | _ => NONE)
+
+val _ = Env.registerFunction ("mail_node_to_node",
+ fn [e] => SOME e
+ | _ => NONE)
open Ast
val dl = ErrorMsg.dummyLoc
[nsD, serialD, refD, retD, expD, minD])
val masterD = (EApp ((EVar "internalMaster", dl),
- (EString Config.defaultNode, dl)),
+ (EString Config.masterNode, dl)),
dl)
+val slavesD = (EList (map (fn s => (EString s, dl)) Config.slaveNodes), dl)
+
val _ = Defaults.registerDefault ("Mailbox",
(TBase "email", dl),
(fn () => (EString (getUser ()), dl)))
(TBase "dnsKind", dl),
(fn () => multiApp ((EVar "useDns", dl),
dl,
- [soaD, masterD, (EList [], dl)])))
+ [soaD, masterD, slavesD])))
val _ = Defaults.registerDefault ("TTL",
(TBase "int", dl),
ExternalMaster of string
| InternalMaster of string
-val ip = fn (EApp ((EVar "ip_of_node", _), e), _) => Option.map nodeIp (Env.string e)
- | e => Env.string e
+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 (ip e)
+ | (EApp ((EVar "internalMaster", _), e), _) => Option.map InternalMaster (Env.string e)
| _ => NONE
datatype dnsKind =
"master" => TextIO.output (outf, "\tallow-update { none; };\n")
| _ => (TextIO.output (outf, "\tmasters { ");
TextIO.output (outf, masterIp);
- TextIO.output (outf, " };\n"));
+ TextIO.output (outf, "; };\n"));
TextIO.output (outf, "};\n");
TextIO.closeOut outf
end
fn cl => "Temp file cleanup failed: " ^ cl))
end)
+fun hasPriv priv = Acl.query {user = getUser (), class = "priv", value = "all"}
+ orelse Acl.query {user = getUser (), class = "priv", value = priv}
+
+val _ = Env.type_one "dns_node"
+ Env.string
+ (fn node =>
+ List.exists (fn x => x = node) Config.dnsNodes_all
+ orelse (hasPriv "dns"
+ andalso List.exists (fn x => x = node) Config.dnsNodes_admin))
+
+val _ = Env.type_one "mail_node"
+ Env.string
+ (fn node =>
+ List.exists (fn x => x = node) Config.mailNodes_all
+ orelse (hasPriv "mail"
+ andalso List.exists (fn x => x = node) Config.mailNodes_admin))
+
end