+ fun saveSoa (kind, soa : soa) node =
+ let
+ val outf = domainFile {node = node, name = "soa"}
+ in
+ TextIO.output (outf, kind);
+ TextIO.output (outf, "\n");
+ TextIO.output (outf, Int.toString ttl);
+ TextIO.output (outf, "\n");
+ TextIO.output (outf, #ns soa);
+ TextIO.output (outf, "\n");
+ case #serial soa of
+ NONE => ()
+ | SOME n => TextIO.output (outf, Int.toString n);
+ TextIO.output (outf, "\n");
+ TextIO.output (outf, Int.toString (#ref soa));
+ TextIO.output (outf, "\n");
+ TextIO.output (outf, Int.toString (#ret soa));
+ TextIO.output (outf, "\n");
+ TextIO.output (outf, Int.toString (#exp soa));
+ TextIO.output (outf, "\n");
+ TextIO.output (outf, Int.toString (#min soa));
+ TextIO.output (outf, "\n");
+ TextIO.closeOut outf
+ end
+
+ fun saveNamed (kind, soa : soa, masterIp) node =
+ let
+ val outf = domainFile {node = node, name = "named.conf"}
+ in
+ TextIO.output (outf, "\nzone \"");
+ TextIO.output (outf, dom);
+ TextIO.output (outf, "\" IN {\n\ttype ");
+ TextIO.output (outf, kind);
+ TextIO.output (outf, ";\n\tfile \"");
+ TextIO.output (outf, Config.Bind.zonePath);
+ TextIO.output (outf, "/");
+ TextIO.output (outf, dom);
+ TextIO.output (outf, ".zone\";\n");
+ case kind of
+ "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.closeOut outf
+ end
+ in
+ case kind of
+ NoDns => masterNode := NONE
+ | UseDns dns =>
+ let
+ val masterIp =
+ case #master dns of
+ InternalMaster node => valOf (SM.find (nodeMap, node))
+ | ExternalMaster ip => ip
+ in
+ app (saveSoa ("slave", #soa dns)) (#slaves dns);
+ app (saveNamed ("slave", #soa dns, masterIp)) (#slaves dns);
+ case #master dns of
+ InternalMaster node =>
+ (masterNode := SOME node;
+ saveSoa ("master", #soa dns) node;
+ saveNamed ("master", #soa dns, masterIp) node)
+ | _ => masterNode := NONE;
+ !befores dom
+ end
+ end,
+ fn () => !afters (!current))
+
+val () = Env.registerPreTycheck (fn () => (setUser Config.testUser;
+ Acl.read Config.aclFile;
+ your_doms := Acl.class {user = getUser (),
+ class = "domain"};
+ your_usrs := Acl.class {user = getUser (),
+ class = "user"};
+ your_grps := Acl.class {user = getUser (),
+ class = "group"};
+ your_pths := Acl.class {user = getUser (),
+ class = "path"}))
+
+val () = Env.registerPre (fn () => (ignore (Slave.shellF ([Config.rm, " -rf ", Config.tmpDir, ""],
+ fn cl => "Temp file cleanup failed: " ^ cl));
+ OS.FileSys.mkDir Config.tmpDir;
+ app (fn node => OS.FileSys.mkDir
+ (OS.Path.joinDirFile {dir = Config.tmpDir,
+ file = node}))
+ nodes;
+ app (fn node => OS.FileSys.mkDir
+ (OS.Path.joinDirFile {dir = Config.resultRoot,
+ file = node})
+ handle OS.SysErr _ => ())
+ nodes))
+
+val () = Env.registerPost (fn () =>
+ let
+ val diffs = findAllDiffs ()
+
+ val diffs = map (fn (site, dom, dir, Add' {src, dst}) =>