diff --git a/Cargo.lock b/Cargo.lock index e9c60e6..11f53ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -127,9 +127,11 @@ dependencies = [ "serde", "serde_json", "sha2", + "time", "tokio", "tokio-util", "tracing", + "tracing-appender", "tracing-subscriber", "uuid", ] @@ -185,7 +187,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.100", ] [[package]] @@ -209,6 +211,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + [[package]] name = "crypto-common" version = "0.1.6" @@ -232,6 +249,15 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "deranged" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" +dependencies = [ + "powerfmt", +] + [[package]] name = "digest" version = "0.10.6" @@ -329,7 +355,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.100", ] [[package]] @@ -540,6 +566,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num_cpus" version = "1.16.0" @@ -596,20 +628,26 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -697,22 +735,22 @@ checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.100", ] [[package]] @@ -796,15 +834,35 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "thread_local" version = "1.1.7" @@ -815,6 +873,37 @@ dependencies = [ "once_cell", ] +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + [[package]] name = "tokio" version = "1.28.0" @@ -840,7 +929,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.100", ] [[package]] @@ -869,6 +958,18 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.24" @@ -877,7 +978,7 @@ checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.100", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 60afaaa..0b2b8f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,8 +27,10 @@ serde = { version = "1.0.136", features = ["derive"] } serde_json = "1.0.79" sha2 = "0.10.2" tokio = { version = "1.17.0", features = ["rt-multi-thread", "io-util", "macros", "net", "time"] } +time = "0.3.35" tokio-util = { version = "0.7.1", features = ["codec"] } tracing = "0.1.32" +tracing-appender = "0.2.3" tracing-subscriber = "0.3.18" uuid = { version = "1.2.1", features = ["serde", "v4"] } diff --git a/src/main.rs b/src/main.rs index 71429c4..eadd1ee 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,12 +3,15 @@ use std::net::IpAddr; use anyhow::Result; use bore_cli::{client::Client, server::Server}; use clap::{error::ErrorKind, CommandFactory, Parser, Subcommand}; +use tracing; #[derive(Parser, Debug)] #[clap(author, version, about)] struct Args { #[clap(subcommand)] command: Command, + #[arg(long)] + log_path: Option, } #[derive(Subcommand, Debug)] @@ -96,7 +99,33 @@ async fn run(command: Command) -> Result<()> { Ok(()) } +fn setup_logging(log_path: Option<&String>) -> Result { + match log_path { + Some(x) => { + let file_appender = tracing_appender::rolling::daily(x, "bore_server.log"); + let (non_blocking, guard) = tracing_appender::non_blocking(file_appender); + let subscriber = tracing_subscriber::fmt() + .with_writer(non_blocking) + .with_ansi(false) + .finish(); + tracing::subscriber::set_global_default(subscriber) + .expect("setting up trace logging failed"); + Ok(guard) + } + None => { + let (non_blocking, guard) = tracing_appender::non_blocking(std::io::stdout()); + let subscriber = tracing_subscriber::fmt() + .with_writer(non_blocking) + .finish(); + tracing::subscriber::set_global_default(subscriber) + .expect("setting up trace logging failed"); + Ok(guard) + } + } +} + fn main() -> Result<()> { - tracing_subscriber::fmt::init(); + // _ to persist the global logger guard + let _guard = setup_logging(Args::parse().log_path.as_ref()); run(Args::parse().command) } diff --git a/src/server.rs b/src/server.rs index 3c38988..744de58 100644 --- a/src/server.rs +++ b/src/server.rs @@ -116,6 +116,7 @@ impl Server { } async fn handle_connection(&self, stream: TcpStream) -> Result<()> { + let peer_addr = stream.peer_addr().unwrap().to_string(); let mut stream = Delimited::new(stream); if let Some(auth) = &self.auth { if let Err(err) = auth.server_handshake(&mut stream).await { @@ -146,6 +147,7 @@ impl Server { loop { if stream.send(ServerMessage::Heartbeat).await.is_err() { // Assume that the TCP connection has been dropped. + info!(peer_addr, "connection dropped after heartbeat timeout"); return Ok(()); } const TIMEOUT: Duration = Duration::from_millis(500);