2026-02-17 16:28:50 +00:00
|
|
|
mod action;
|
|
|
|
|
mod auth;
|
2026-02-13 13:59:44 +00:00
|
|
|
mod config;
|
|
|
|
|
mod management;
|
2026-02-17 16:28:50 +00:00
|
|
|
mod policy;
|
2026-03-14 15:20:30 +00:00
|
|
|
mod error;
|
2026-02-13 13:59:44 +00:00
|
|
|
mod server;
|
|
|
|
|
mod storage;
|
|
|
|
|
mod xml_response;
|
|
|
|
|
|
|
|
|
|
use clap::Parser;
|
|
|
|
|
|
|
|
|
|
#[derive(Parser)]
|
2026-03-14 15:20:30 +00:00
|
|
|
#[command(name = "ruststorage", about = "High-performance S3-compatible storage server")]
|
2026-02-13 13:59:44 +00:00
|
|
|
struct Cli {
|
|
|
|
|
/// Run in management mode (IPC via stdin/stdout)
|
|
|
|
|
#[arg(long)]
|
|
|
|
|
management: bool,
|
|
|
|
|
|
|
|
|
|
/// Log level
|
|
|
|
|
#[arg(long, default_value = "info")]
|
|
|
|
|
log_level: String,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[tokio::main]
|
|
|
|
|
async fn main() -> anyhow::Result<()> {
|
|
|
|
|
let cli = Cli::parse();
|
|
|
|
|
|
|
|
|
|
if cli.management {
|
|
|
|
|
// Init tracing to stderr only (stdout reserved for IPC)
|
|
|
|
|
tracing_subscriber::fmt()
|
|
|
|
|
.with_writer(std::io::stderr)
|
|
|
|
|
.with_env_filter(
|
|
|
|
|
tracing_subscriber::EnvFilter::try_new(&cli.log_level)
|
|
|
|
|
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")),
|
|
|
|
|
)
|
|
|
|
|
.init();
|
|
|
|
|
|
|
|
|
|
management::management_loop().await?;
|
|
|
|
|
} else {
|
2026-03-14 15:20:30 +00:00
|
|
|
eprintln!("ruststorage: use --management flag for IPC mode");
|
2026-02-13 13:59:44 +00:00
|
|
|
std::process::exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|