diff --git a/Cargo.lock b/Cargo.lock index 678793c..19a7080 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,6 +26,55 @@ dependencies = [ "memchr", ] +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" + +[[package]] +name = "anstyle-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle", + "windows-sys", +] + [[package]] name = "async-trait" version = "0.1.71" @@ -146,6 +195,53 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "clap" +version = "4.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eab9e8ceb9afdade1ab3f0fd8dbce5b1b2f468ad653baf10e771781b2b67b73" +dependencies = [ + "clap_builder", + "clap_derive", + "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f2763db829349bf00cfc06251268865ed4363b93a943174f638daf3ecdba2cd" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "cpufeatures" version = "0.2.9" @@ -175,6 +271,27 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "fnv" version = "1.0.7" @@ -331,6 +448,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.2.6" @@ -340,6 +463,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + [[package]] name = "hex" version = "0.4.3" @@ -420,6 +549,17 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi 0.3.2", + "rustix", + "windows-sys", +] + [[package]] name = "itoa" version = "1.0.8" @@ -454,6 +594,12 @@ version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +[[package]] +name = "linux-raw-sys" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" + [[package]] name = "lock_api" version = "0.4.10" @@ -543,7 +689,7 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] @@ -711,6 +857,7 @@ name = "rieterd" version = "0.1.0" dependencies = [ "axum", + "clap", "futures", "libarchive", "sha256", @@ -729,6 +876,19 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustix" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" +dependencies = [ + "bitflags 2.3.3", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + [[package]] name = "rustversion" version = "1.0.13" @@ -850,6 +1010,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "syn" version = "2.0.25" @@ -1065,6 +1231,12 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "uuid" version = "1.4.0" diff --git a/server/Cargo.toml b/server/Cargo.toml index 2500d62..6fdb837 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -2,11 +2,13 @@ name = "rieterd" version = "0.1.0" edition = "2021" +authors = ["Jef Roosens"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] axum = { version = "0.6.18", features = ["http2"] } +clap = { version = "4.3.12", features = ["env", "derive"] } futures = "0.3.28" libarchive = { path = "../libarchive" } sha256 = "1.1.4" diff --git a/server/src/cli.rs b/server/src/cli.rs new file mode 100644 index 0000000..74e5941 --- /dev/null +++ b/server/src/cli.rs @@ -0,0 +1,73 @@ +use crate::repo::RepoGroupManager; +use crate::{Config, Global}; + +use axum::extract::FromRef; +use axum::Router; +use clap::Parser; +use std::path::PathBuf; +use std::sync::{Arc, RwLock}; +use tower_http::trace::TraceLayer; +use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; + +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +pub struct Cli { + /// Port the server will listen on + #[arg(short, long, value_name = "PORT", default_value_t = 8000)] + pub port: u16, + /// Log levels for the tracing + #[arg( + long, + value_name = "LOG_LEVEL", + default_value = "tower_http=debug,rieterd=debug" + )] + pub log: String, + /// Directory where package archives will be stored + pub pkg_dir: PathBuf, + /// Directory where repository metadata is stored + pub repo_dir: PathBuf, + /// Default architecture to add packages with arch "any" to + pub default_arch: String, +} + +impl FromRef for Arc> { + fn from_ref(global: &Global) -> Self { + Arc::clone(&global.repo_manager) + } +} + +impl Cli { + pub fn init_tracing(&self) { + tracing_subscriber::registry() + .with(tracing_subscriber::EnvFilter::new(self.log.clone())) + .with(tracing_subscriber::fmt::layer()) + .init(); + } + + pub async fn run(&self) { + self.init_tracing(); + + let config = Config { + repo_dir: self.repo_dir.clone(), + pkg_dir: self.pkg_dir.clone(), + }; + let repo_manager = RepoGroupManager::new(&self.repo_dir, &self.pkg_dir, &self.default_arch); + + let global = Global { + config, + repo_manager: Arc::new(RwLock::new(repo_manager)), + }; + + // build our application with a single route + let app = Router::new() + .merge(crate::repo::router(&global)) + .with_state(global) + .layer(TraceLayer::new_for_http()); + + // run it with hyper on localhost:3000 + axum::Server::bind(&format!("0.0.0.0:{}", self.port).parse().unwrap()) + .serve(app.into_make_service()) + .await + .unwrap(); + } +} diff --git a/server/src/main.rs b/server/src/main.rs index 0d841d8..2332b4b 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,19 +1,15 @@ +mod cli; mod error; mod repo; +use clap::Parser; pub use error::{Result, ServerError}; - -use axum::extract::FromRef; -use axum::Router; use repo::RepoGroupManager; use std::path::PathBuf; use std::sync::{Arc, RwLock}; -use tower_http::trace::TraceLayer; -use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; #[derive(Clone)] pub struct Config { - data_dir: PathBuf, repo_dir: PathBuf, pkg_dir: PathBuf, } @@ -24,42 +20,8 @@ pub struct Global { repo_manager: Arc>, } -impl FromRef for Arc> { - fn from_ref(global: &Global) -> Self { - Arc::clone(&global.repo_manager) - } -} - #[tokio::main] async fn main() { - tracing_subscriber::registry() - .with(tracing_subscriber::EnvFilter::new( - std::env::var("RUST_LOG").unwrap_or_else(|_| "tower_http=debug,rieterd=debug".into()), - )) - .with(tracing_subscriber::fmt::layer()) - .init(); - - let config = Config { - data_dir: "./data".into(), - repo_dir: "./data/repos".into(), - pkg_dir: "./data/pkgs".into(), - }; - let repo_manager = RepoGroupManager::new("./data/repos", "./data/pkgs", "x86_64"); - - let global = Global { - config, - repo_manager: Arc::new(RwLock::new(repo_manager)), - }; - - // build our application with a single route - let app = Router::new() - .merge(repo::router(&global)) - .with_state(global) - .layer(TraceLayer::new_for_http()); - - // run it with hyper on localhost:3000 - axum::Server::bind(&"0.0.0.0:3000".parse().unwrap()) - .serve(app.into_make_service()) - .await - .unwrap(); + let cli = cli::Cli::parse(); + cli.run().await; }