Limited DNS nodes
[hcoop/domtool2.git] / src / domain.sml
index 34d6d10..e09f399 100644 (file)
@@ -49,7 +49,7 @@ val your_pths = ref SS.empty
 fun your_paths () = !your_pths
 
 fun setUser user =
-    (usr := Config.testUser;
+    (usr := user;
      your_doms := Acl.class {user = getUser (),
                             class = "domain"};
      your_usrs := Acl.class {user = getUser (),
@@ -153,6 +153,9 @@ val _ = Env.type_one "node"
        Env.string
        validNode
 
+val _ = Env.registerFunction ("web_node_to_node",
+                             fn [e] => SOME e
+                              | _ => NONE)
 open Ast
 
 val dl = ErrorMsg.dummyLoc
@@ -169,9 +172,11 @@ val soaD = multiApp ((EVar "soa", dl),
                     [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)))
@@ -180,7 +185,7 @@ val _ = Defaults.registerDefault ("DNS",
                                  (TBase "dnsKind", dl),
                                  (fn () => multiApp ((EVar "useDns", dl),
                                                      dl,
-                                                     [soaD, masterD, (EList [], dl)])))
+                                                     [soaD, masterD, slavesD])))
 
 val _ = Defaults.registerDefault ("TTL",
                                  (TBase "int", dl),
@@ -221,7 +226,13 @@ datatype master =
         ExternalMaster of string
        | InternalMaster of string
 
-val master = fn (EApp ((EVar "externalMaster", _), e), _) => Option.map ExternalMaster (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 (Env.string e)
              | _ => NONE
 
@@ -474,7 +485,7 @@ val _ = Env.containerV_one "domain"
                                           TextIO.output (outf, "\" IN {\n\ttype ");
                                           TextIO.output (outf, kind);
                                           TextIO.output (outf, ";\n\tfile \"");
-                                          TextIO.output (outf, Config.Bind.zonePath);
+                                          TextIO.output (outf, Config.Bind.zonePath_real);
                                           TextIO.output (outf, "/");
                                           TextIO.output (outf, dom);
                                           TextIO.output (outf, ".zone\";\n");
@@ -482,7 +493,7 @@ val _ = Env.containerV_one "domain"
                                               "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
@@ -599,4 +610,14 @@ val () = Env.registerPost (fn () =>
                                                     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))
+
 end