X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/954e17ad20c2d086cf1f2af1b4204b2b5d0815d3..4a824a5f575f02dcdb59259a145c4439b93edaec:/src/plugins/mailman.sml diff --git a/src/plugins/mailman.sml b/src/plugins/mailman.sml index aa0b7ee..9f30e72 100644 --- a/src/plugins/mailman.sml +++ b/src/plugins/mailman.sml @@ -20,6 +20,47 @@ structure Mailman :> MAILMAN = struct +open Ast + +val () = Env.type_one "mailman_node" + Env.string + (fn node => Apache.webNode node orelse node = Config.Mailman.node) + +val dl = ErrorMsg.dummyLoc + +val () = Env.registerFunction ("mailman_node", + fn [] => SOME (EString Config.Mailman.node, dl) + | _ => NONE) + +val () = Env.registerFunction ("mailman_node_to_node", + fn [e] => SOME e + | _ => NONE) + +fun mailmanPlace (EApp ((EVar "mailman_place_default", _), (EString node, _)), _) = + SOME (node, Domain.nodeIp node) + | mailmanPlace (EApp ((EApp ((EVar "mailman_place", _), (EString node, _)), _), (EString ip, _)), _) = + SOME (node, ip) + | mailmanPlace _ = NONE + +fun mailmanPlaceDefault node = (EApp ((EVar "mailman_place_default", dl), (EString node, dl)), dl) + +val _ = Env.registerFunction ("mailman_place_to_web_node", + fn [e] => Option.map (fn (node, _) => (EString node, dl)) (mailmanPlace e) + | _ => NONE) + +val _ = Env.registerFunction ("mailman_place_to_node", + fn [e] => Option.map (fn (node, _) => (EString node, dl)) (mailmanPlace e) + | _ => NONE) + +val _ = Env.registerFunction ("mailman_place_to_ip", + fn [e] => Option.map (fn (_, ip) => (EString ip, dl)) (mailmanPlace e) + | _ => NONE) + +val () = Defaults.registerDefault + ("MailmanPlaces", + (TList (TBase "mailman_place", dl), dl), + (fn () => (EList [mailmanPlaceDefault Config.Mailman.node], dl))) + val files = ref ([] : TextIO.outstream list) val write = ref (fn _ : string => ()) @@ -42,7 +83,7 @@ val () = Env.actionV_one "mailmanVhost" ("host", Env.string) (fn (env, host) => let - val nodes = Env.env (Env.list Env.string) (env, "WebNodes") + val places = Env.env (Env.list mailmanPlace) (env, "MailmanPlaces") val ssl = Env.env Apache.ssl (env, "SSL") val user = Env.env Env.string (env, "User") @@ -51,7 +92,7 @@ val () = Env.actionV_one "mailmanVhost" val vhostId = fullHost ^ (if Option.isSome ssl then ".ssl" else "") val confFile = fullHost ^ (if Option.isSome ssl then ".vhost_ssl" else ".vhost") in - app (fn node => + app (fn (node, ip) => let val file = Domain.domainFile {node = node, name = confFile} @@ -63,13 +104,17 @@ val () = Env.actionV_one "mailmanVhost" print user; print "\n"; print " "443" | NONE => "80"); + print ">\n"; + print " ServerName "; + print host; + print "."; + print (Domain.currentDomain ()); print "\n"; - print " ServerName $LISTDOMAIN\n"; print " ServerAdmin "; print user; print "@hcoop.net\n"; @@ -85,7 +130,11 @@ val () = Env.actionV_one "mailmanVhost" print " RewriteEngine on\n"; print "\n"; print " # Default to showing listinfo page\n"; - print " RewriteRule ^/$ http://"; + print " RewriteRule ^/$ http"; + case ssl of + NONE => () + | SOME _ => print "s"; + print "://"; print fullHost; print "/listinfo/\n"; print "\n"; @@ -105,10 +154,15 @@ val () = Env.actionV_one "mailmanVhost" print " Order allow,deny\n"; print " Allow from all\n"; print " \n"; + + Apache.doPre {user = user, nodes = map #1 places, id = vhostId, hostname = fullHost}; + print "\n"; - TextIO.closeOut file - end) nodes + TextIO.closeOut file; + + Apache.doPost () + end) places end) val mailmanChanged = ref false @@ -137,7 +191,7 @@ val () = Slave.registerPostHandler (fn () => val () = Domain.registerDescriber (Domain.considerAll [Domain.Filename {filename = "mailman", - heading = "Mailman web host mapping", + heading = "Mailman web host mapping:", showEmpty = false}]) end