Add shutdown command
authorAdam Chlipala <adamc@hcoop.net>
Sun, 11 Feb 2007 22:12:07 +0000 (22:12 +0000)
committerAdam Chlipala <adamc@hcoop.net>
Sun, 11 Feb 2007 22:12:07 +0000 (22:12 +0000)
src/main-admin.sml
src/main.sig
src/main.sml
src/msg.sml
src/msgTypes.sml

index e3dc67b..1eda532 100644 (file)
@@ -30,7 +30,8 @@ fun requestPerms user =
 
 val _ =
     case CommandLine.arguments () of
-       ["grant", user, class, value] => Main.requestGrant {user = user, class = class, value = value}
+       ["shutdown"] => Main.requestShutdown ()
+      | ["grant", user, class, value] => Main.requestGrant {user = user, class = class, value = value}
       | ["revoke", user, class, value] => Main.requestRevoke {user = user, class = class, value = value}
       | ["perms", user] => requestPerms user
       | ["perms"] => requestPerms (Posix.SysDB.Passwd.name (Posix.SysDB.getpwuid (Posix.ProcEnv.getuid ())))
index ca699b8..87f3028 100644 (file)
@@ -34,6 +34,7 @@ signature MAIN = sig
     val request : string -> unit
     val requestDir : string -> unit
 
+    val requestShutdown : unit -> unit
     val requestGrant : Acl.acl -> unit
     val requestRevoke : Acl.acl -> unit
     val requestListPerms : string -> (string * string list) list option
index 7403743..8bb2d4e 100644 (file)
@@ -275,6 +275,21 @@ fun requestDir dname =
     end
     handle ErrorMsg.Error => ()
 
+fun requestShutdown () =
+    let
+       val (_, bio) = requestBio (fn () => ())
+    in
+       Msg.send (bio, MsgShutdown);
+       case Msg.recv bio of
+           NONE => print "Server closed connection unexpectedly.\n"
+         | SOME m =>
+           case m of
+               MsgOk => print "Shutdown begun.\n"
+             | MsgError s => print ("Shutdown failed: " ^ s ^ "\n")
+             | _ => print "Unexpected server reply.\n";
+       OpenSSL.close bio
+    end
+
 fun requestGrant acl =
     let
        val (user, bio) = requestBio (fn () => ())
@@ -643,7 +658,7 @@ fun service () =
              | SOME bio =>
                let
                    val user = OpenSSL.peerCN bio
-                   val () = print ("\nConnection from " ^ user ^ "\n")
+                   val () = print ("\nConnection from " ^ user ^ " at " ^ Date.toString (Date.fromTimeUniv (Time.now ())) ^ "\n")
                    val () = Domain.setUser user
 
                    fun doIt f cleanup =
@@ -729,6 +744,14 @@ fun service () =
                                MsgConfig code => doConfig [code]
                              | MsgMultiConfig codes => doConfig codes
 
+                             | MsgShutdown =>
+                               if Acl.query {user = user, class = "priv", value = "shutdown"} then
+                                   print ("Domtool dispatcher shutting down at " ^ Date.toString (Date.fromTimeUniv (Time.now ())) ^ "\n")
+                               else
+                                   (OpenSSL.close bio
+                                    handle OpenSSL.OpenSSL _ => ();
+                                    loop ())
+
                              | MsgGrant acl =>
                                doIt (fn () =>
                                         if Acl.query {user = user, class = "priv", value = "all"} then
@@ -977,6 +1000,7 @@ fun service () =
                            handle OpenSSL.OpenSSL _ => ();
                            loop ())
     in
+       print ("Domtool dispatcher starting up at " ^ Date.toString (Date.fromTimeUniv (Time.now ())) ^ "\n");
        print "Listening for connections....\n";
        loop ();
        OpenSSL.shutdown sock
index a9063aa..f05d012 100644 (file)
@@ -169,6 +169,7 @@ fun send (bio, m) =
       | MsgDbPasswd {dbtype, passwd} => (OpenSSL.writeInt (bio, 28);
                                         OpenSSL.writeString (bio, dbtype);
                                         OpenSSL.writeString (bio, passwd))
+      | MsgShutdown => OpenSSL.writeInt (bio, 29)
 
 fun checkIt v =
     case v of
@@ -263,6 +264,7 @@ fun recv bio =
                                (SOME dbtype, SOME passwd) =>
                                SOME (MsgDbPasswd {dbtype = dbtype, passwd = passwd})
                              | _ => NONE)
+                  | 29 => SOME MsgShutdown
                   | _ => NONE)
         
 end
index 445f8af..3003a39 100644 (file)
@@ -81,5 +81,7 @@ datatype msg =
        (* One line of a response to MsgSmtpLogReq *)
        | MsgDbPasswd of {dbtype : string, passwd : string}
        (* Change a DBMS user's password *)
+       | MsgShutdown
+       (* Halt the server *)
 
 end