`fwtool' main
[hcoop/domtool2.git] / src / main.sml
index 2800cbd..c95ef31 100644 (file)
@@ -954,6 +954,31 @@ fun requestReUsers () =
        OpenSSL.close bio
     end
 
+fun requestFirewallRegen node = 
+    let
+       val (user, context) = requestContext (fn () => ())
+       val bio = OpenSSL.connect true (context, Domain.nodeIp node ^ ":" ^ Int.toString Config.slavePort)
+       (* Only supporting on slave nodes *)
+                 
+       val _ = Msg.send (bio, MsgFirewallRegen)
+
+       fun handleResult () =
+           case Msg.recv bio of
+               NONE => (print "Server closed connection unexpectedly.\n";
+                        OS.Process.failure)
+             | SOME m =>
+               case m of
+                   MsgOk => (print "Firewall regenerated.\n";
+                             OS.Process.success)
+                 | MsgError s => (print ("Firewall regeneration failed: " ^ s ^ "\n");
+                                  OS.Process.failure)
+                 | _ => (print "Unexpected server reply.\n";
+                         OS.Process.failure)
+    in
+       handleResult()
+       before OpenSSL.close bio
+    end
+
 structure SS = StringSet
 
 fun domainList dname =
@@ -1745,6 +1770,16 @@ fun slave () =
                                                         ("Requested mysql-fixperms, but execution failed!",
                                                          SOME "Script execution failed."))
                                           (fn () => ()))
+                                  | MsgFirewallRegen =>
+                                    doIt (fn () => if Acl.query {user = user, class = "priv", value = "all"} andalso List.exists (fn x => x = host) Config.Firewall.firewallNodes then
+                                                       if (Firewall.generateFirewallConfig (Firewall.parseRules ()) andalso Firewall.publishConfig ())
+                                                       then
+                                                           ("Firewall rules regenerated.", NONE)
+                                                       else
+                                                           ("Rules regeneration failed!", SOME "Script execution failed.")
+                                                   else
+                                                       ("Not authorized to regenerate firewall.", SOME ("Unauthorized user " ^ user ^ "attempted to regenerated firewall")))
+                                         (fn () => ())
 
                                   | _ => (OpenSSL.close bio;
                                           loop ())