X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/e0b0abd209a1ecbd9266cfcf8735af171f96869b..2ed6d0e50d89234c3d63c3707e855c922bd49358:/src/domain.sml diff --git a/src/domain.sml b/src/domain.sml index d2dfbde..6a70c72 100644 --- a/src/domain.sml +++ b/src/domain.sml @@ -20,6 +20,12 @@ structure Domain :> DOMAIN = struct +structure SM = DataStructures.StringMap + +val nodes = map #2 Config.nodeIps +val nodeMap = foldl (fn ((node, ip), mp) => SM.insert (mp, node, ip)) + SM.empty Config.nodeIps + fun validIp s = case map Int.fromString (String.fields (fn ch => ch = #".") s) of [SOME n1, SOME n2, SOME n3, SOME n4] => @@ -36,7 +42,7 @@ fun validDomain s = size s > 0 andalso size s < 100 andalso List.all validHost (String.fields (fn ch => ch = #".") s) -fun validNode s = List.exists (fn s' => s = s') Config.nodes +fun validNode s = List.exists (fn s' => s = s') nodes val _ = Env.type_one "ip" Env.string @@ -199,7 +205,7 @@ fun getPath domain = handle OS.SysErr _ => OS.FileSys.mkDir tmpPath end in - app doNode Config.nodes; + app doNode nodes; elems end) [] toks in @@ -361,7 +367,7 @@ val _ = Env.containerV_one "domain" TextIO.closeOut outf end - fun saveNamed (kind, soa : soa) node = + fun saveNamed (kind, soa : soa, masterIp) node = let val outf = domainFile {node = node, name = "named.conf"} in @@ -376,25 +382,32 @@ val _ = Env.containerV_one "domain" TextIO.output (outf, ".zone\";\n"); case kind of "master" => TextIO.output (outf, "\tallow-update { none; };\n") - | _ => TextIO.output (outf, "\tmasters { 1.2.3.4; };\n"); - TextIO.output (outf, "}\n"); + | _ => (TextIO.output (outf, "\tmasters { "); + TextIO.output (outf, masterIp); + TextIO.output (outf, " };\n")); + TextIO.output (outf, "};\n"); TextIO.closeOut outf end - - fun saveBoth ks = (saveSoa ks; saveNamed ks) in case kind of NoDns => masterNode := NONE | UseDns dns => - (app (saveSoa ("slave", #soa dns)) (#slaves dns); - app (saveNamed ("slave", #soa dns)) (#slaves dns); - case #master dns of - InternalMaster node => - (masterNode := SOME node; - saveSoa ("master", #soa dns) node; - saveNamed ("master", #soa dns) node) - | _ => masterNode := NONE); - !befores dom + 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)) @@ -404,12 +417,12 @@ val () = Env.registerPre (fn () => (ignore (Slave.shellF ([Config.rm, " -rf ", C app (fn node => OS.FileSys.mkDir (OS.Path.joinDirFile {dir = Config.tmpDir, file = node})) - Config.nodes; + nodes; app (fn node => OS.FileSys.mkDir (OS.Path.joinDirFile {dir = Config.resultRoot, file = node}) handle OS.SysErr _ => ()) - Config.nodes)) + nodes)) val () = Env.registerPost (fn () => let