chiark / gitweb /
wip mgmt lines
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 22 Jul 2020 00:57:22 +0000 (01:57 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 22 Jul 2020 00:57:22 +0000 (01:57 +0100)
src/cmdlistener.rs
src/commands.rs
src/imports.rs

index 68992b7e9854545bc2df5a4360f54a8a4e0fba78..ef047d92a000ba525d18989568b37f0bdaa401b6 100644 (file)
@@ -12,8 +12,8 @@ use uds::UnixStreamExt;
 //use uds::UnixListenerExt;
 use pwd::Passwd;
 
-use serde_json::ser::Serializer;
-use serde_json::de::{IoRead,Deserializer,StreamDeserializer};
+//use serde_json::ser::Serializer;
+//use serde_json::de::{IoRead,StreamDeserializer};
 
 const SOCKET_PATH : &str = "command.socket"; // xxx
 
@@ -21,19 +21,21 @@ pub struct CommandListener {
   listener : UnixListener,
 }
 
-struct CommandStream<'de> {
+struct CommandStream {
   euid : Result<u32, anyhow::Error>,
-  read : StreamDeserializer<'de,IoRead<BufReader<UnixStream>>,
-                            MgmtCommand>,
+  read : io::Lines<BufReader<UnixStream>>,
   write : UnixStream,
 }
 
 type CSE = anyhow::Error;
 
-impl CommandStream<'_> {
-  pub fn mainloop(self) -> Result<(),CSE> {
-    loop {
-      
+impl CommandStream {
+  #[throws(CSE)]
+  pub fn mainloop(mut self) {
+    for l in &mut self.read {
+      let l = l.context("read")?;
+      let reply = decode_and_process(&l);
+      writeln!(&mut self.write, "Reply: {:?}", &reply)?;
     }
   }
 }
@@ -94,8 +96,7 @@ impl CommandListener {
         let read = conn.try_clone().context("dup the command stream")?;
         let write = conn;
         let read = BufReader::new(read);
-        let read = IoRead::new(read);
-        let read = StreamDeserializer::new(read);
+        let read = read.lines();
 
         let cs = CommandStream { read, write, euid };
         cs.mainloop()?;
index ac607f44e9c07e07b1f7c3af5c591c8752f04552..38e9d1ee435577a04b79d720c53ec805c8bfbaf4 100644 (file)
@@ -1,12 +1,48 @@
 
 use crate::imports::*;
 
-#[derive(Serialize,Deserialize)]
+#[derive(Debug,Serialize,Deserialize)]
 pub enum MgmtCommand {
   Noop { }
 }
 
-#[derive(Serialize,Deserialize)]
+#[derive(Debug,Serialize,Deserialize)]
 pub enum MgmtResponse {
-  Fine { }
+  Fine { },
+  Error(String),
+}
+
+#[derive(Debug,Error)]
+enum MgmtError {
+  ParseFailed(String),
+}
+display_as_debug!{MgmtError}
+type ME = MgmtError;
+
+  use MgmtCommand::*;
+  use MgmtResponse::*;
+  use MgmtError::*;
+
+impl From<serde_json::Error> for MgmtError {
+  fn from(je: serde_json::Error) -> ME {
+    ParseFailed(format!("{}", &je))
+  }
+}
+
+pub fn decode_and_process(s: &str) -> MgmtResponse {
+  self::decode_process_inner(s)
+    .unwrap_or_else(|e| MgmtResponse::Error(format!("{}", e)))
+}
+
+#[throws(ME)]
+fn decode_process_inner(s: &str)-> MgmtResponse {
+  let cmd : MgmtCommand = serde_json::from_str(s)?;
+  execute(cmd)?
+}
+
+#[throws(ME)]
+fn execute(cmd: MgmtCommand) -> MgmtResponse {
+  match cmd {
+    Noop { } => Fine { },
+  }
 }
index 132ac039037ad5d15f99dfe29365d67d6a6171df..0229faad63be860ab95bf43aedf6355994c5c1a5 100644 (file)
@@ -1,6 +1,6 @@
 
 pub use std::io;
-pub use std::io::{BufReader,Read,BufWriter,Write};
+pub use std::io::{BufReader,Read,BufRead,BufWriter,Write};
 pub use std::fmt::Write as _;
 pub use std::fmt::Formatter;
 pub use std::fmt::{self,Display,Debug};