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 ())))
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
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 () => ())
| 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 =
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
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
| 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
(SOME dbtype, SOME passwd) =>
SOME (MsgDbPasswd {dbtype = dbtype, passwd = passwd})
| _ => NONE)
+ | 29 => SOME MsgShutdown
| _ => NONE)
end
(* One line of a response to MsgSmtpLogReq *)
| MsgDbPasswd of {dbtype : string, passwd : string}
(* Change a DBMS user's password *)
+ | MsgShutdown
+ (* Halt the server *)
end