fun requestApt {node, pkg} =
let
- val (_, bio) = requestBio (fn () => ())
+ val (user, context) = requestContext (fn () => ())
+ val bio = OpenSSL.connect (context, if node = Config.masterNode then
+ dispatcher
+ else
+ Domain.nodeIp node ^ ":" ^ Int.toString Config.slavePort)
- val _ = Msg.send (bio, MsgApt pkg)
+ val _ = Msg.send (bio, MsgQuery (QApt pkg))
fun loop () =
case Msg.recv bio of
fun now () = Date.toString (Date.fromTimeUniv (Time.now ()))
+fun answerQuery q =
+ case q of
+ QApt pkg => if Apt.installed pkg then MsgYes else MsgNo
+
+fun describeQuery q =
+ case q of
+ QApt pkg => "Requested installation status of package " ^ pkg
+
fun service () =
let
val () = Acl.read Config.aclFile
NONE)))
(fn () => ())
- | MsgApt pkg =>
- doIt (fn () => (Msg.send (bio, if Apt.installed pkg then
- MsgYes
- else
- MsgNo);
- ("User requested installation status of package " ^ pkg,
+ | MsgQuery q =>
+ doIt (fn () => (Msg.send (bio, answerQuery q);
+ (describeQuery q,
NONE)))
(fn () => ())
| _ => (OpenSSL.close bio;
loop ())
else
- (print "Not authorized!\n";
- OpenSSL.close bio;
- loop ())
+ case Msg.recv bio of
+ SOME (MsgQuery q) => (print (describeQuery q ^ "\n");
+ Msg.send (bio, answerQuery q);
+ ignore (OpenSSL.readChar bio);
+ OpenSSL.close bio;
+ loop ())
+ | _ => (OpenSSL.close bio;
+ loop ())
end handle OpenSSL.OpenSSL s =>
(print ("OpenSSL error: "^ s ^ "\n");
OpenSSL.close bio
| SOME 1 => SOME true
| _ => NONE
+fun sendQuery (bio, q) =
+ case q of
+ QApt s => (OpenSSL.writeInt (bio, 0);
+ OpenSSL.writeString (bio, s))
+
+fun recvQuery bio =
+ case OpenSSL.readInt bio of
+ SOME n =>
+ (case n of
+ 0 => Option.map QApt (OpenSSL.readString bio)
+ | _ => NONE)
+ | NONE => NONE
+
fun send (bio, m) =
case m of
MsgOk => OpenSSL.writeInt (bio, 1)
| MsgShutdown => OpenSSL.writeInt (bio, 29)
| MsgYes => OpenSSL.writeInt (bio, 30)
| MsgNo => OpenSSL.writeInt (bio, 31)
- | MsgApt s => (OpenSSL.writeInt (bio, 32);
- OpenSSL.writeString (bio, s))
+ | MsgQuery q => (OpenSSL.writeInt (bio, 32);
+ sendQuery (bio, q))
fun checkIt v =
case v of
| 29 => SOME MsgShutdown
| 30 => SOME MsgYes
| 31 => SOME MsgNo
- | 32 => Option.map MsgApt (OpenSSL.readString bio)
+ | 32 => Option.map MsgQuery (recvQuery bio)
| _ => NONE)
end
structure MsgTypes = struct
+datatype query =
+ QApt of string
+ (* Is this apt package installed? *)
+
datatype msg =
MsgOk
(* Your request was processed successfully. *)
| MsgYes
| MsgNo
(* Answers to boolean queries *)
- | MsgApt of string
- (* Is this apt package installed on your host? *)
+ | MsgQuery of query
+ (* Ask for host-specific information *)
end