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