+val _ = Env.containerV_one "domain"
+ ("domain", Env.string)
+ (fn (evs, dom) =>
+ let
+ val kind = Env.env dnsKind (evs, "DNS")
+ val ttl = Env.env Env.int (evs, "TTL")
+
+ val path = getPath dom
+
+ val () = (current := dom;
+ currentPath := (fn site => path (Config.tmpDir, site)))
+
+ 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.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}) =>