From 6b909ebf4672447309239a64781cf6f05352ef9a Mon Sep 17 00:00:00 2001 From: Anna Clemens Date: Fri, 20 Jan 2023 15:13:52 -0500 Subject: [PATCH] allow unix sockets --- server/Cargo.lock | 1 + server/Cargo.toml | 1 + server/src/config.rs | 3 +-- server/src/main.rs | 25 +++++++++++++++++++++++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/server/Cargo.lock b/server/Cargo.lock index b890d5a..4bf99bb 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -1050,6 +1050,7 @@ dependencies = [ "sha3", "sqlx", "tokio", + "tokio-stream", "toml", "uuid", "warp", diff --git a/server/Cargo.toml b/server/Cargo.toml index 70f2b27..26cfad4 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -18,5 +18,6 @@ sha3 = "0.10" sqlx = { version = "0.6", features = ["runtime-tokio-rustls", "sqlite", "chrono"] } toml = "0.5" tokio = { version = "1", features = ["rt-multi-thread", "macros"] } +tokio-stream = { version = "0.1", default-features = false, features = ["net"] } uuid = { version = "1", features = ["serde", "v4"] } warp = "0.3" diff --git a/server/src/config.rs b/server/src/config.rs index 880761e..341e648 100644 --- a/server/src/config.rs +++ b/server/src/config.rs @@ -1,11 +1,10 @@ -use std::net::SocketAddr; use std::path::PathBuf; use serde::Deserialize; #[derive(Debug, Deserialize)] pub struct Config { - pub address: SocketAddr, + pub address: String, pub packs: PathBuf, pub database: String, } diff --git a/server/src/main.rs b/server/src/main.rs index 96ea583..1986948 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,14 +1,21 @@ #![feature(drain_filter)] use std::collections::HashMap; +use std::fs::Permissions; +use std::net::SocketAddr; +use std::os::unix::fs::PermissionsExt; +use std::str::FromStr; use std::sync::Arc; use anyhow::{Context, Result}; use sqlx::{Executor, Pool, Sqlite}; use sqlx::migrate::Migrator; use sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions}; +use tokio::fs::File; +use tokio::net::{TcpListener, UnixListener}; use tokio::runtime::Handle; use tokio::sync::RwLock; +use tokio_stream::wrappers::{TcpListenerStream, UnixListenerStream}; use uuid::Uuid; use crate::config::Config; @@ -108,9 +115,23 @@ async fn main() -> Result<()> { state.update_packs().await?; spawn_command_reader(Arc::clone(&state), Handle::current()); - let address = state.config.address; + + + let address = state.config.address.clone(); + let server = warp::serve(web::routes(state)); println!("listening at {}", address); - warp::serve(web::routes(state)).run(address).await; + + if address.starts_with("unix:") { + let listener = UnixListener::bind(&address[5..])?; + let stream = UnixListenerStream::new(listener); + server.run_incoming(stream).await; + } else { + let addr = SocketAddr::from_str(&address)?; + let listener = TcpListener::bind(addr).await?; + let stream = TcpListenerStream::new(listener); + server.run_incoming(stream).await; + } + Ok(()) }