diff options
| author | Eskil Queseth <eskilq@kth.se> | 2020-10-15 22:09:57 +0200 |
|---|---|---|
| committer | Eskil Queseth <eskilq@kth.se> | 2020-10-15 22:09:57 +0200 |
| commit | cfc0ab78a893d6a16d2eedfef290c9e1496a23e1 (patch) | |
| tree | 0ed06065cb937af22ad48a14d49dd1b0035a90b2 | |
| parent | 01b3c75420ec5bf9083dbcf643d3c6087d4f2ce7 (diff) | |
| download | mum-cfc0ab78a893d6a16d2eedfef290c9e1496a23e1.tar.gz | |
add basic error messaging on mumd
| -rw-r--r-- | mumctl/src/main.rs | 7 | ||||
| -rw-r--r-- | mumd/src/command.rs | 6 | ||||
| -rw-r--r-- | mumd/src/main.rs | 8 | ||||
| -rw-r--r-- | mumd/src/state.rs | 31 | ||||
| -rw-r--r-- | mumlib/src/error.rs | 11 | ||||
| -rw-r--r-- | mumlib/src/lib.rs | 1 |
6 files changed, 44 insertions, 20 deletions
diff --git a/mumctl/src/main.rs b/mumctl/src/main.rs index 403447f..9bb96a8 100644 --- a/mumctl/src/main.rs +++ b/mumctl/src/main.rs @@ -1,4 +1,4 @@ -use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; +use ipc_channel::ipc::{self, IpcSender}; use log::*; use mumlib::command::{Command, CommandResponse}; use mumlib::setup_logger; @@ -10,14 +10,13 @@ fn main() { // MUMCTL //temp send command and channel to listener debug!("Creating channel"); - let (tx_client, rx_client): (IpcSender<Result<Option<CommandResponse>, ()>>, - IpcReceiver<Result<Option<CommandResponse>, ()>>) = ipc::channel().unwrap(); + let (tx_client, rx_client) = ipc::channel::<mumlib::error::Result<Option<CommandResponse>>>().unwrap(); let server_name = fs::read_to_string("/var/tmp/mumd-oneshot").unwrap(); //TODO don't panic debug!("Connecting to mumd at {}", server_name); let tx0 = IpcSender::connect(server_name).unwrap(); let connect_command = Command::ServerConnect { - host: "10.0.0.10".to_string(), + host: "icahasse.se".to_string(), port: 64738u16, username: "gustav-mumd".to_string(), accept_invalid_cert: true, diff --git a/mumd/src/command.rs b/mumd/src/command.rs index 9adf7d8..6314870 100644 --- a/mumd/src/command.rs +++ b/mumd/src/command.rs @@ -8,7 +8,7 @@ use tokio::sync::mpsc; pub async fn handle( state: Arc<Mutex<State>>, - mut command_receiver: mpsc::UnboundedReceiver<(Command, IpcSender<Result<Option<CommandResponse>, ()>>)>, + mut command_receiver: mpsc::UnboundedReceiver<(Command, IpcSender<mumlib::error::Result<Option<CommandResponse>>>)>, ) { debug!("Begin listening for commands"); loop { @@ -16,13 +16,17 @@ pub async fn handle( let command = command_receiver.recv().await.unwrap(); debug!("Received command {:?}", command.0); let mut state = state.lock().unwrap(); + debug!("Got mutex lock"); let (wait_for_connected, command_response) = state.handle_command(command.0).await; if wait_for_connected { let mut watcher = state.phase_receiver(); drop(state); + debug!("Waiting to be connected"); while !matches!(watcher.recv().await.unwrap(), StatePhase::Connected) {} } + debug!("Sending response"); command.1.send(command_response).unwrap(); + debug!("Sent response"); } //TODO err if not connected //while let Some(command) = command_receiver.recv().await { diff --git a/mumd/src/main.rs b/mumd/src/main.rs index 8639c35..7ab3c61 100644 --- a/mumd/src/main.rs +++ b/mumd/src/main.rs @@ -27,7 +27,7 @@ async fn main() { // For simplicity we don't deal with re-syncing, real applications would have to. let (crypt_state_sender, crypt_state_receiver) = mpsc::channel::<ClientCryptState>(1); // crypt state should always be consumed before sending a new one let (packet_sender, packet_receiver) = mpsc::unbounded_channel::<ControlPacket<Serverbound>>(); - let (command_sender, command_receiver) = mpsc::unbounded_channel::<(Command, IpcSender<Result<Option<CommandResponse>, ()>>)>(); + let (command_sender, command_receiver) = mpsc::unbounded_channel::<(Command, IpcSender<mumlib::error::Result<Option<CommandResponse>>>)>(); let (connection_info_sender, connection_info_receiver) = watch::channel::<Option<ConnectionInfo>>(None); @@ -62,16 +62,16 @@ async fn main() { } fn receive_oneshot_commands( - command_sender: mpsc::UnboundedSender<(Command, IpcSender<Result<Option<CommandResponse>, ()>>)>, + command_sender: mpsc::UnboundedSender<(Command, IpcSender<mumlib::error::Result<Option<CommandResponse>>>)>, ) { loop { // create listener - let (server, server_name): (IpcOneShotServer<(Command, IpcSender<Result<Option<CommandResponse>, ()>>)>, String) = IpcOneShotServer::new().unwrap(); + let (server, server_name): (IpcOneShotServer<(Command, IpcSender<mumlib::error::Result<Option<CommandResponse>>>)>, String) = IpcOneShotServer::new().unwrap(); fs::write("/var/tmp/mumd-oneshot", &server_name).unwrap(); debug!("Listening for command at {}...", server_name); // receive command and response channel - let (_, conn): (_, (Command, IpcSender<Result<Option<CommandResponse>, ()>>)) = server.accept().unwrap(); + let (_, conn): (_, (Command, IpcSender<mumlib::error::Result<Option<CommandResponse>>>)) = server.accept().unwrap(); debug!("Sending command {:?} to command handler", conn.0); command_sender.send(conn).unwrap(); } diff --git a/mumd/src/state.rs b/mumd/src/state.rs index 0fd814c..0b3663d 100644 --- a/mumd/src/state.rs +++ b/mumd/src/state.rs @@ -9,6 +9,7 @@ use mumlib::command::{Command, CommandResponse}; use mumlib::state::Server; use std::net::ToSocketAddrs; use tokio::sync::{mpsc, watch}; +use mumlib::error::Error; #[derive(Clone, Debug, Eq, PartialEq)] pub enum StatePhase { @@ -50,12 +51,17 @@ impl State { pub async fn handle_command( &mut self, command: Command, - ) -> (bool, Result<Option<CommandResponse>, ()>) { + ) -> (bool, mumlib::error::Result<Option<CommandResponse>>) { match command { Command::ChannelJoin { channel_id } => { if !matches!(*self.phase_receiver().borrow(), StatePhase::Connected) { warn!("Not connected"); - return (false, Err(())); + return (false, Err(Error::DisconnectedError)); + } + if let Some(server) = &self.server { + if !server.channels().contains_key(&channel_id) { + return (false, Err(Error::InvalidChannelIdError)); + } } let mut msg = msgs::UserState::new(); msg.set_session(self.session_id.unwrap()); @@ -66,7 +72,7 @@ impl State { Command::ChannelList => { if !matches!(*self.phase_receiver().borrow(), StatePhase::Connected) { warn!("Not connected"); - return (false, Err(())); + return (false, Err(Error::DisconnectedError)); } ( false, @@ -83,7 +89,7 @@ impl State { } => { if !matches!(*self.phase_receiver().borrow(), StatePhase::Disconnected) { warn!("Tried to connect to a server while already connected"); - return (false, Err(())); + return (false, Err(Error::AlreadyConnectedError)); } self.server = Some(Server::new()); self.username = Some(username); @@ -91,11 +97,14 @@ impl State { .0 .broadcast(StatePhase::Connecting) .unwrap(); - let socket_addr = (host.as_ref(), port) - .to_socket_addrs() - .expect("Failed to parse server address") - .next() - .expect("Failed to resolve server address"); + + let socket_addr = match (host.as_ref(), port).to_socket_addrs().map(|mut e| e.next()) { + Ok(Some(v)) => v, + _ => { + warn!("Error parsing server addr"); + return (false, Err(Error::InvalidServerAddrError)); + } + }; self.connection_info_sender .broadcast(Some(ConnectionInfo::new( socket_addr, @@ -108,13 +117,13 @@ impl State { Command::Status => { if !matches!(*self.phase_receiver().borrow(), StatePhase::Connected) { warn!("Not connected"); - return (false, Err(())); + return (false, Err(Error::DisconnectedError)); } ( false, Ok(Some(CommandResponse::Status { username: self.username.clone(), - server_state: self.server.clone().unwrap(), + server_state: self.server.clone().unwrap(), //guaranteed not to panic because if we are connected, server is guaranteed to be Some })), ) } diff --git a/mumlib/src/error.rs b/mumlib/src/error.rs new file mode 100644 index 0000000..20415b0 --- /dev/null +++ b/mumlib/src/error.rs @@ -0,0 +1,11 @@ +use serde::{Serialize, Deserialize}; + +pub type Result<T> = std::result::Result<T, Error>; + +#[derive(Debug, Serialize, Deserialize)] +pub enum Error { + DisconnectedError, + AlreadyConnectedError, + InvalidChannelIdError, + InvalidServerAddrError, +}
\ No newline at end of file diff --git a/mumlib/src/lib.rs b/mumlib/src/lib.rs index ebf2019..b77653c 100644 --- a/mumlib/src/lib.rs +++ b/mumlib/src/lib.rs @@ -1,5 +1,6 @@ pub mod command; pub mod state; +pub mod error; use colored::*; use log::*; |
