Ver Fonte

Add basic logging

Sergey Chushin há 3 anos atrás
pai
commit
1830dba121
5 ficheiros alterados com 142 adições e 23 exclusões
  1. 71 4
      Cargo.lock
  2. 2 0
      Cargo.toml
  3. 23 7
      src/client.rs
  4. 2 0
      src/main.rs
  5. 44 12
      src/server.rs

+ 71 - 4
Cargo.lock

@@ -1,10 +1,12 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
+version = 3
+
 [[package]]
 name = "aes"
-version = "0.7.3"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2333ac5777aaa1beb8589f5374976ae7dc8aa4f09fd21ae3d8662ca97f5247d"
+checksum = "495ee669413bfbe9e8cace80f4d3d78e6d8c8d99579f97fb93bde351b185f2d4"
 dependencies = [
  "cfg-if",
  "cipher",
@@ -12,6 +14,15 @@ dependencies = [
  "opaque-debug",
 ]
 
+[[package]]
+name = "aho-corasick"
+version = "0.7.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
+dependencies = [
+ "memchr",
+]
+
 [[package]]
 name = "ansi_term"
 version = "0.11.0"
@@ -115,9 +126,9 @@ dependencies = [
 
 [[package]]
 name = "cpufeatures"
-version = "0.1.4"
+version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed00c67cb5d0a7d64a44f6ad2668db7e7530311dd53ea79bcd4fb022c64911c8"
+checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef"
 dependencies = [
  "libc",
 ]
@@ -161,6 +172,19 @@ version = "1.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
 
+[[package]]
+name = "env_logger"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3"
+dependencies = [
+ "atty",
+ "humantime",
+ "log",
+ "regex",
+ "termcolor",
+]
+
 [[package]]
 name = "fs2"
 version = "0.4.3"
@@ -210,6 +234,12 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "humantime"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+
 [[package]]
 name = "instant"
 version = "0.1.9"
@@ -467,6 +497,23 @@ dependencies = [
  "bitflags",
 ]
 
+[[package]]
+name = "regex"
+version = "1.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
+
 [[package]]
 name = "remove_dir_all"
 version = "0.5.3"
@@ -498,6 +545,8 @@ dependencies = [
  "aes",
  "bincode",
  "clap",
+ "env_logger",
+ "log",
  "protobuf",
  "protoc-rust",
  "rand",
@@ -615,6 +664,15 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "termcolor"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4"
+dependencies = [
+ "winapi-util",
+]
+
 [[package]]
 name = "textwrap"
 version = "0.11.0"
@@ -792,6 +850,15 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
 [[package]]
 name = "winapi-x86_64-pc-windows-gnu"
 version = "0.4.0"

+ 2 - 0
Cargo.toml

@@ -17,6 +17,8 @@ serde = { version = "1.0.126", features = ["derive"] }
 bincode = "1.3.3"
 aes = "0.7.3"
 rand = "0.8.3"
+log = "0.4.14"
+env_logger = "0.8.4"
 
 [build-dependencies]
 protoc-rust = "2.23.0"

+ 23 - 7
src/client.rs

@@ -3,6 +3,7 @@ use std::sync::Arc;
 use tokio::sync::mpsc;
 use tokio::sync::mpsc::{Receiver, Sender};
 use tokio::task::JoinHandle;
+use log::{info, error};
 
 use crate::client::Error::StreamError;
 use crate::connection::{AudioChannel, AudioChannelSender, ControlChannel, ControlChannelSender};
@@ -37,14 +38,12 @@ pub struct Config {
     pub max_image_message_length: u32,
 }
 
-// from other connected users
 pub enum Message {
     UserConnected(u32),
     UserDisconnected(u32),
     UserTalking(AudioData),
 }
 
-// to other connected users
 pub enum ResponseMessage {
     Disconnected,
     Talking(AudioData),
@@ -181,9 +180,7 @@ impl Client {
             loop {
                 match receiver.receive().await {
                     Ok(packet) => {
-                        if inner_sender.try_send(InnerMessage::Audio(packet)).is_err() {
-                            return;
-                        }
+                        inner_sender.try_send(InnerMessage::Audio(packet));
                     }
                     Err(_) => return,
                 }
@@ -234,12 +231,14 @@ impl Client {
                     InnerMessage::Message(msg) => {
                         let result = handler.handle_message(msg).await;
                         if result.is_err() {
+                            handler.self_disconnected().await;
                             return;
                         }
                     }
                     InnerMessage::Packet(packet) => {
                         let result = handler.handle_mumble_packet(*packet).await;
                         if result.is_err() {
+                            handler.self_disconnected().await;
                             return;
                         }
                     }
@@ -250,6 +249,7 @@ impl Client {
                     InnerMessage::Audio(audio) => {
                         let result = handler.handle_audio_packet(audio).await;
                         if result.is_err() {
+                            handler.self_disconnected().await;
                             return;
                         }
                     }
@@ -320,7 +320,23 @@ impl Handler {
                         .try_send(ResponseMessage::Talking(audio_data));
                 }
             },
-            _ => println!("unimplemented!"),
+            MumblePacket::ChannelRemove(_) => error!("ChannelRemove unimplemented!"),
+            MumblePacket::ChannelState(_) => error!("ChannelState unimplemented!"),
+            MumblePacket::UserRemove(_) => error!("UserRemove unimplemented!"),
+            MumblePacket::UserState(_) => error!("UserState unimplemented!"),
+            MumblePacket::BanList(_) => error!("BanList unimplemented!"),
+            MumblePacket::TextMessage(_) => error!("TextMessage unimplemented!"),
+            MumblePacket::QueryUsers(_) => error!("TextMessage unimplemented!"),
+            MumblePacket::CryptSetup(_) => error!("CryptSetup unimplemented!"),
+            MumblePacket::ContextActionModify(_) => error!("ContextActionModify unimplemented!"),
+            MumblePacket::ContextAction(_) => error!("ContextAction unimplemented!"),
+            MumblePacket::UserList(_) => error!("UserList unimplemented!"),
+            MumblePacket::VoiceTarget(_) => error!("VoiceTarget unimplemented!"),
+            MumblePacket::PermissionQuery(_) => error!("PermissionQuery unimplemented!"),
+            MumblePacket::UserStats(_) => error!("UserStats unimplemented!"),
+            MumblePacket::RequestBlob(_) => error!("RequestBlob unimplemented!"),
+            // The rest is only sent by the server
+            _ => return Err(Error::WrongPacket),
         }
         Ok(())
     }
@@ -352,7 +368,7 @@ impl Handler {
             }
             AudioPacket::AudioData(mut audio_data) => {
                 audio_data.session_id = Some(self.session_id);
-                // It isn't critical to lost some audio packets
+                // It isn't critical to lose some audio packets
                 self.response_sender
                     .try_send(ResponseMessage::Talking(audio_data));
             }

+ 2 - 0
src/main.rs

@@ -15,6 +15,8 @@ mod protocol;
 mod server;
 
 fn main() {
+    env_logger::init();
+
     let matches = App::new("Rumble")
         .version("0.0.1")
         .about("Rumble is a mumble server written in Rust.")

+ 44 - 12
src/server.rs

@@ -17,6 +17,10 @@ use rand::{Rng, SeedableRng};
 
 use tokio::sync::mpsc::{Receiver, Sender};
 
+use log::{debug, info, warn, error};
+use std::io::Error;
+use tokio::sync::mpsc::error::TrySendError;
+
 pub const MAX_UDP_DATAGRAM_SIZE: usize = 1024;
 
 pub struct Config {
@@ -52,17 +56,32 @@ impl Server {
 
     pub async fn run(self: Arc<Self>) {
         let mut tls_config = ServerConfig::new(NoClientAuth::new());
-        tls_config
-            .set_single_cert(
-                vec![self.config.certificate.clone()],
-                self.config.private_key.clone(),
-            )
-            .expect("Invalid private key");
+        let result = tls_config.set_single_cert(
+            vec![self.config.certificate.clone()],
+            self.config.private_key.clone(),
+        );
+        if let Err(err) = result {
+            error!("{}", err);
+            panic!();
+        }
 
         let socket_address = SocketAddr::new(self.config.ip_address, self.config.port);
         let tls_acceptor = TlsAcceptor::from(Arc::new(tls_config));
-        let tcp_listener = TcpListener::bind(socket_address).await.unwrap();
-        let udp_socket = UdpSocket::bind(socket_address).await.unwrap();
+        let tcp_listener = match TcpListener::bind(socket_address).await {
+            Ok(listener) => listener,
+            Err(_) => {
+                error!("Couldn't bind tcp socket to {}", socket_address);
+                panic!();
+            }
+        };
+        let udp_socket = match UdpSocket::bind(socket_address).await {
+            Ok(socket) => socket,
+            Err(_) => {
+                error!("Couldn't bind udp socket to {}", socket_address);
+                panic!();
+            }
+        };
+        info!("Server listening on {}", socket_address);
 
         Arc::clone(&self).run_udp_task(udp_socket).await;
         Arc::clone(&self)
@@ -97,7 +116,7 @@ impl Server {
     async fn send_to_audio_channel(self: &Arc<Self>, buf: &[u8], address: &SocketAddr) -> bool {
         let connected = self.address_to_channel.read().await;
         if let Some(sender) = connected.get(address) {
-            sender.try_send(Vec::from(buf));
+            sender.send(Vec::from(buf)).await;
             return true;
         }
 
@@ -156,20 +175,33 @@ impl Server {
     }
 
     async fn process_new_connection(self: Arc<Self>, stream: TlsStream<TcpStream>) {
+        let address = stream.get_ref().0.peer_addr().unwrap();
+        info!("New connection: {}", address);
+
         let (session_id, mut responder) = match self.new_client(stream).await {
-            Ok(id) => id,
-            Err(_) => unimplemented!(),
+            Ok(id) => {
+                info!("Connection established successfully {}", address);
+                id
+            }
+            Err(_) => {
+                info!("Failed to establish connection {}", address);
+                return;
+            }
         };
 
         loop {
             let message = match responder.recv().await {
                 Some(msg) => msg,
-                None => return,
+                None => {
+                    warn!("Connection closed unexpectedly");
+                    return;
+                }
             };
 
             match message {
                 ResponseMessage::Disconnected => {
                     self.client_disconnected(session_id).await;
+                    info!("Disconnected {}", address);
                     return;
                 }
                 ResponseMessage::Talking(audio_data) => {