Full regeneration
[hcoop/domtool2.git] / src / main.sml
index 715b486..f22c430 100644 (file)
@@ -371,10 +371,35 @@ fun requestRmdom dom =
        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
@@ -408,6 +433,7 @@ fun regenerate () =
                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 ()
@@ -584,7 +610,7 @@ fun service () =
                              | 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 =>
@@ -661,6 +687,8 @@ fun slave () =
                                        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