diff --git a/server/Cargo.lock b/server/Cargo.lock index a089289..314de1c 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -87,6 +87,7 @@ dependencies = [ "tokio-stream", "tonic", "tracing", + "tracing-subscriber", "zeroize", ] @@ -1340,6 +1341,15 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -2393,6 +2403,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", ] [[package]] @@ -2402,12 +2424,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ "matchers", + "nu-ansi-term", "once_cell", "regex-automata", "sharded-slab", + "smallvec", "thread_local", "tracing", "tracing-core", + "tracing-log", ] [[package]] @@ -2480,6 +2505,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + [[package]] name = "vcpkg" version = "0.2.15" diff --git a/server/crates/arbiter-server/Cargo.toml b/server/crates/arbiter-server/Cargo.toml index e947511..f13a07c 100644 --- a/server/crates/arbiter-server/Cargo.toml +++ b/server/crates/arbiter-server/Cargo.toml @@ -21,6 +21,7 @@ diesel-async = { version = "0.7.4", features = [ ed25519-dalek.workspace = true arbiter-proto.path = "../arbiter-proto" tracing.workspace = true +tracing-subscriber = { version = "0.3", features = ["env-filter"] } tonic.workspace = true tokio.workspace = true rustls.workspace = true diff --git a/server/crates/arbiter-server/src/context.rs b/server/crates/arbiter-server/src/context.rs index 6da6a80..fe1d15a 100644 --- a/server/crates/arbiter-server/src/context.rs +++ b/server/crates/arbiter-server/src/context.rs @@ -11,21 +11,15 @@ use thiserror::Error; use tokio::sync::RwLock; use crate::{ - context::{ - bootstrap::{BootstrapActor, generate_token}, - lease::LeaseHandler, - tls::{TlsDataRaw, TlsManager}, - }, - db::{ + actors::bootstrap::{self, BootstrapActor}, context::tls::{TlsDataRaw, TlsManager}, db::{ self, models::ArbiterSetting, schema::{self, arbiter_settings}, - }, + } }; -pub(crate) mod bootstrap; -pub(crate) mod lease; -pub(crate) mod tls; + +pub mod tls; #[derive(Error, Debug, Diagnostic)] pub enum InitError { @@ -78,7 +72,7 @@ impl ServerStateMachineContext for _Context { } } -pub(crate) struct _ServerContextInner { +pub struct _ServerContextInner { pub db: db::DatabasePool, pub state: RwLock>, pub rng: StdRng, @@ -86,7 +80,7 @@ pub(crate) struct _ServerContextInner { pub bootstrapper: ActorRef, } #[derive(Clone)] -pub(crate) struct ServerContext(Arc<_ServerContextInner>); +pub struct ServerContext(Arc<_ServerContextInner>); impl std::ops::Deref for ServerContext { type Target = _ServerContextInner; diff --git a/server/crates/arbiter-server/src/context/tls.rs b/server/crates/arbiter-server/src/context/tls.rs index ce9b1b4..267c8b2 100644 --- a/server/crates/arbiter-server/src/context/tls.rs +++ b/server/crates/arbiter-server/src/context/tls.rs @@ -60,7 +60,7 @@ fn generate_cert(key: &KeyPair) -> Result { } // TODO: Implement cert rotation -pub(crate) struct TlsManager { +pub struct TlsManager { data: TlsData, } diff --git a/server/crates/arbiter-server/src/lib.rs b/server/crates/arbiter-server/src/lib.rs index cd95e23..9d86e27 100644 --- a/server/crates/arbiter-server/src/lib.rs +++ b/server/crates/arbiter-server/src/lib.rs @@ -15,8 +15,8 @@ use crate::{ }; pub mod actors; -mod context; -mod db; +pub mod context; +pub mod db; mod errors; const DEFAULT_CHANNEL_SIZE: usize = 1000; @@ -25,6 +25,12 @@ pub struct Server { context: ServerContext, } +impl Server { + pub fn new(context: ServerContext) -> Self { + Self { context } + } +} + #[async_trait] impl arbiter_proto::proto::arbiter_service_server::ArbiterService for Server { type UserAgentStream = ReceiverStream>; diff --git a/server/crates/arbiter-server/src/main.rs b/server/crates/arbiter-server/src/main.rs new file mode 100644 index 0000000..5e3a3b9 --- /dev/null +++ b/server/crates/arbiter-server/src/main.rs @@ -0,0 +1,34 @@ +use arbiter_proto::proto::arbiter_service_server::ArbiterServiceServer; +use arbiter_server::{Server, context::ServerContext, db}; +use tracing::info; + +#[tokio::main] +async fn main() -> miette::Result<()> { + tracing_subscriber::fmt() + .with_env_filter( + tracing_subscriber::EnvFilter::try_from_default_env() + .unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")), + ) + .init(); + + info!("Starting arbiter server"); + + info!("Initializing database"); + let db = db::create_pool(None).await?; + info!("Database ready"); + + info!("Initializing server context"); + let context = ServerContext::new(db).await?; + info!("Server context ready"); + + let addr = "[::1]:50051".parse().expect("valid address"); + info!(%addr, "Starting gRPC server"); + + tonic::transport::Server::builder() + .add_service(ArbiterServiceServer::new(Server::new(context))) + .serve(addr) + .await + .map_err(|e| miette::miette!("gRPC server error: {e}"))?; + + unreachable!("gRPC server should run indefinitely"); +}