src/plugins/*.sig src/plugins/*.sml \
src/mail/*.sig src/mail/*.sml
+MLTON := mlton -link-opt -ldl
+
+ifdef DEBUG
+ MLTON += -const 'Exn.keepHistory true'
+endif
+
bin/domtool-server: $(COMMON_MLTON_DEPS) src/domtool-server.mlb
- mlton -output bin/domtool-server -link-opt -ldl src/domtool-server.mlb
+ $(MLTON) -output bin/domtool-server src/domtool-server.mlb
bin/domtool-client: $(COMMON_MLTON_DEPS) src/domtool-client.mlb
- mlton -output bin/domtool-client -link-opt -ldl src/domtool-client.mlb
+ $(MLTON) -output bin/domtool-client src/domtool-client.mlb
bin/domtool-slave: $(COMMON_MLTON_DEPS) src/domtool-slave.mlb
- mlton -output bin/domtool-slave -link-opt -ldl src/domtool-slave.mlb
+ $(MLTON) -output bin/domtool-slave src/domtool-slave.mlb
bin/domtool-admin: $(COMMON_MLTON_DEPS) src/domtool-admin.mlb
- mlton -output bin/domtool-admin -link-opt -ldl src/domtool-admin.mlb
+ $(MLTON) -output bin/domtool-admin src/domtool-admin.mlb
bin/domtool-doc: $(COMMON_MLTON_DEPS) src/domtool-doc.mlb
- mlton -output bin/domtool-doc -link-opt -ldl src/domtool-doc.mlb
+ $(MLTON) -output bin/domtool-doc src/domtool-doc.mlb
bin/dbtool: $(COMMON_MLTON_DEPS) src/dbtool.mlb
- mlton -output bin/dbtool -link-opt -ldl src/dbtool.mlb
+ $(MLTON) -output bin/dbtool src/dbtool.mlb
bin/vmail: $(COMMON_MLTON_DEPS) src/vmail.mlb
- mlton -output bin/vmail -link-opt -ldl src/vmail.mlb
+ $(MLTON) -output bin/vmail src/vmail.mlb
bin/setsa: $(COMMON_MLTON_DEPS) src/setsa.mlb
- mlton -output bin/setsa -link-opt -ldl src/setsa.mlb
+ $(MLTON) -output bin/setsa -ldl src/setsa.mlb
bin/smtplog: $(COMMON_MLTON_DEPS) src/smtplog.mlb
- mlton -output bin/smtplog -link-opt -ldl src/smtplog.mlb
+ $(MLTON) -output bin/smtplog src/smtplog.mlb
install:
cp scripts/domtool-publish /usr/local/sbin/
val slavesD = (EList (map (fn s => (EString s, dl)) Config.slaveNodes), dl)
+val _ = Defaults.registerDefault ("Aliases",
+ (TList (TBase "your_domain", dl), dl),
+ (fn () => (EList [], dl)))
+
val _ = Defaults.registerDefault ("Mailbox",
(TBase "email", dl),
(fn () => (EString (getUser ()), dl)))
val current = ref ""
val currentPath = ref (fn (_ : string) => "")
+val currentPathAli = ref (fn (_ : string, _ : string) => "")
val scratch = ref ""
fun currentDomain () = !current
+val currentsAli = ref ([] : string list)
+
+fun currentAliasDomains () = !currentsAli
+fun currentDomains () = currentDomain () :: currentAliasDomains ()
+
fun domainFile {node, name} = ((*print ("Opening " ^ !currentPath node ^ name ^ "\n");*)
TextIO.openOut (!currentPath node ^ name))
+type files = {write : string -> unit,
+ writeDom : unit -> unit,
+ close : unit -> unit}
+
+fun domainsFile {node, name} =
+ let
+ val doms = currentDomains ()
+ val files = map (fn dom => (dom, TextIO.openOut (!currentPathAli (dom, node) ^ name))) doms
+ in
+ {write = fn s => app (fn (_, outf) => TextIO.output (outf, s)) files,
+ writeDom = fn () => app (fn (dom, outf) => TextIO.output (outf, dom)) files,
+ close = fn () => app (fn (_, outf) => TextIO.closeOut outf) files}
+ end
+
fun getPath domain =
let
val toks = String.fields (fn ch => ch = #".") domain
let
val kind = Env.env dnsKind (evs, "DNS")
val ttl = Env.env Env.int (evs, "TTL")
+ val aliases = Env.env (Env.list Env.string) (evs, "Aliases")
val path = getPath dom
val () = (current := dom;
- currentPath := (fn site => path (Config.tmpDir, site)))
+ currentsAli := Slave.remove (Slave.removeDups aliases, dom);
+ currentPath := (fn site => path (Config.tmpDir, site));
+ currentPathAli := (fn (dom, site) => getPath dom (Config.tmpDir, site)))
fun saveSoa (kind, soa : soa) node =
let
- val outf = domainFile {node = node, name = "soa"}
+ val {write, writeDom, close} = domainsFile {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");
+ write kind;
+ write "\n";
+ write (Int.toString ttl);
+ write "\n";
+ write (#ns soa);
+ write "\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
+ | SOME n => write (Int.toString n);
+ write "\n";
+ write (Int.toString (#ref soa));
+ write "\n";
+ write (Int.toString (#ret soa));
+ write "\n";
+ write (Int.toString (#exp soa));
+ write "\n";
+ write (Int.toString (#min soa));
+ write "\n";
+ close ()
end
fun saveNamed (kind, soa : soa, masterIp) node =
if dom = "localhost" then
()
else let
- val outf = domainFile {node = node, name = "named.conf"}
+ val {write, writeDom, close} = domainsFile {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_real);
- TextIO.output (outf, "/");
- TextIO.output (outf, dom);
- TextIO.output (outf, ".zone\";\n");
+ write "\nzone \"";
+ writeDom ();
+ write "\" IN {\n\ttype ";
+ write kind;
+ write ";\n\tfile \"";
+ write Config.Bind.zonePath_real;
+ write "/";
+ writeDom ();
+ write ".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
+ "master" => write "\tallow-update { none; };\n"
+ | _ => (write "\tmasters { ";
+ write masterIp;
+ write "; };\n");
+ write "};\n";
+ close ()
end
in
case kind of