From 2ed6d0e50d89234c3d63c3707e855c922bd49358 Mon Sep 17 00:00:00 2001 From: Adam Chlipala Date: Sun, 6 Aug 2006 02:49:48 +0000 Subject: [PATCH] Better DNS slave handling --- configDefault/domtool.cfg | 2 +- configDefault/domtool.cfs | 2 +- src/domain.sig | 5 ++++ src/domain.sml | 49 +++++++++++++++++++++++++-------------- src/plugins/alias.sml | 2 +- 5 files changed, 39 insertions(+), 21 deletions(-) diff --git a/configDefault/domtool.cfg b/configDefault/domtool.cfg index 20e133f..306eee7 100644 --- a/configDefault/domtool.cfg +++ b/configDefault/domtool.cfg @@ -14,5 +14,5 @@ val defaultRetry = 900 val defaultExpiry = 1209600 val defaultMinimum = 3600 -val nodes = ["this"] +val nodeIps = [("this", "1.2.3.4")] val defaultNode = "this" diff --git a/configDefault/domtool.cfs b/configDefault/domtool.cfs index e7f04aa..e23e55f 100644 --- a/configDefault/domtool.cfs +++ b/configDefault/domtool.cfs @@ -22,5 +22,5 @@ val defaultExpiry : int val defaultMinimum : int (* Names of machines who will receive configuration *) -val nodes : string list +val nodeIps : (string * string) list val defaultNode : string diff --git a/src/domain.sig b/src/domain.sig index c2ebb95..c4fc329 100644 --- a/src/domain.sig +++ b/src/domain.sig @@ -38,4 +38,9 @@ signature DOMAIN = sig val dnsMaster : unit -> string option (* Name of the node that is the DNS master for the current domain, if there * is one *) + + val nodes : string list + (* Names of all system nodes *) + val nodeMap : string Ast.StringMap.map + (* Map node names to IP addresses *) end 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 diff --git a/src/plugins/alias.sml b/src/plugins/alias.sml index 6d6ab43..43e109f 100644 --- a/src/plugins/alias.sml +++ b/src/plugins/alias.sml @@ -48,7 +48,7 @@ fun openInAll base = foldl (fn (node, r) => SM.insert (r, node, Domain.domainFile {node = node, name = base})) - SM.empty Config.nodes + SM.empty Domain.nodes val _ = Domain.registerBefore (fn _ => (aliases := openInAll "aliases"; -- 2.20.1