val ip : string Env.arg
+ val registerResetGlobal : (unit -> unit) -> unit
+ val registerResetLocal : (unit -> unit) -> unit
+ (* Register functions for clearing out all Domtool configuration at the global
+ * (AFS) and local levels, respectively. *)
+
+ val resetGlobal : unit -> unit
+ val resetLocal : unit -> unit
+ (* Call all registered functions *)
+
val registerBefore : (string -> unit) -> unit
val registerAfter : (string -> unit) -> unit
(* Register handlers to run just before and after entering a domain
afters := (fn x => (old x; f x))
end
+val globals = ref (fn () => ())
+val locals = ref (fn () => ())
+
+fun registerResetGlobal f =
+ let
+ val old = !globals
+ in
+ globals := (fn x => (old x; f x))
+ end
+
+fun registerResetLocal f =
+ let
+ val old = !locals
+ in
+ locals := (fn x => (old x; f x))
+ end
+
+fun resetGlobal () = (!globals ();
+ ignore (OS.Process.system (Config.rm ^ " -rf " ^ Config.resultRoot ^ "/*")))
+fun resetLocal () = !locals ()
+
val current = ref ""
val currentPath = ref (fn (_ : string) => "")
OpenSSL.close bio
end
-fun regenerate () =
+fun regenerate context =
let
val b = basis ()
- val _ = Tycheck.disallowExterns ()
+ val () = Tycheck.disallowExterns ()
+
+ val () = Domain.resetGlobal ()
+
+ fun contactNode (node, ip) =
+ if node = Config.defaultNode then
+ Domain.resetLocal ()
+ else let
+ val bio = OpenSSL.connect (context,
+ ip
+ ^ ":"
+ ^ Int.toString Config.slavePort)
+ in
+ Msg.send (bio, MsgRegenerate);
+ case Msg.recv bio of
+ NONE => print "Slave closed connection unexpectedly\n"
+ | SOME m =>
+ case m of
+ MsgOk => print ("Slave " ^ node ^ " pre-regeneration finished\n")
+ | MsgError s => print ("Slave " ^ node
+ ^ " returned error: " ^
+ s ^ "\n")
+ | _ => print ("Slave " ^ node
+ ^ " returned unexpected command\n");
+ OpenSSL.close bio
+ end
fun doUser user =
let
handle IO.Io _ => ()
| OS.SysErr (s, _) => print ("System error processing user " ^ user ^ ": " ^ s ^ "\n")
in
+ app contactNode Config.nodeIps;
Env.pre ();
app doUser (Acl.users ());
Env.post ()
| MsgRegenerate =>
if Acl.query {user = user, class = "priv", value = "regen"}
orelse Acl.query {user = user, class = "priv", value = "all"} then
- ((regenerate ();
+ ((regenerate context;
Msg.send (bio, MsgOk);
print "Regenerated all configuration.\n")
handle OpenSSL.OpenSSL s =>
MsgFile file => loop' (file :: files)
| MsgDoFiles => (Slave.handleChanges files;
Msg.send (bio, MsgOk))
+ | MsgRegenerate => (Domain.resetLocal ();
+ Msg.send (bio, MsgOk))
| _ => (print "Dispatcher sent unexpected command\n";
Msg.send (bio, MsgError "Unexpected command"))
in