Full regeneration
authorAdam Chlipala <adamc@hcoop.net>
Sat, 16 Dec 2006 00:29:12 +0000 (00:29 +0000)
committerAdam Chlipala <adamc@hcoop.net>
Sat, 16 Dec 2006 00:29:12 +0000 (00:29 +0000)
src/domain.sig
src/domain.sml
src/main.sml
src/plugins/apache.sml
src/plugins/bind.sml
src/plugins/webalizer.sml

index 1d708f5..a937624 100644 (file)
@@ -27,6 +27,15 @@ signature DOMAIN = sig
 
     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
index 0354944..9913dfc 100644 (file)
@@ -276,6 +276,27 @@ fun registerAfter f =
        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) => "")
 
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
index 83a8ce8..65ba7fb 100644 (file)
@@ -739,4 +739,7 @@ val () = Env.action_one "readmeName"
                      write name;
                      write "\n"))
 
+val () = Domain.registerResetLocal (fn () =>
+                                      ignore (OS.Process.system (Config.rm ^ " -rf /var/domtool/vhosts/*")))
+
 end
index 217ef45..9c72152 100644 (file)
@@ -266,4 +266,8 @@ val () = Slave.registerPostHandler
                                 fn cl => "Error reloading bind with " ^ cl)
                  else
                      ()))
+
+val () = Domain.registerResetLocal (fn () =>
+                                      ignore (OS.Process.system (Config.rm ^ " -rf /var/domtool/zones/*")))
+
 end
index c6043af..7ac523b 100644 (file)
@@ -116,4 +116,10 @@ val () = Slave.registerFileHandler (fn fs =>
                                             | _ => ()
                                       end)
 
+val () = Domain.registerResetLocal (fn () =>
+                                      app (fn (node, _) =>
+                                              ignore (OS.Process.system (Config.rm ^ " -rf "
+                                                                         ^ Config.Webalizer.configDir ^ "/"
+                                                                         ^ node ^ "/*"))) Config.nodeIps)
+
 end