2023-08-29 21:34:00 +02:00
|
|
|
use packager::{auth, routing, sqlite, AppState, ClientState, StartError};
|
2023-05-10 00:42:42 +02:00
|
|
|
|
2023-08-29 21:34:00 +02:00
|
|
|
use std::net::{IpAddr, SocketAddr};
|
|
|
|
|
use std::str::FromStr;
|
2023-05-08 00:05:45 +02:00
|
|
|
|
2023-08-29 21:34:00 +02:00
|
|
|
use clap::Parser;
|
|
|
|
|
|
|
|
|
|
#[derive(Parser, Debug)]
|
|
|
|
|
#[command(author, version, about, long_about = None)]
|
|
|
|
|
struct Args {
|
|
|
|
|
#[arg(long)]
|
2023-08-29 21:34:00 +02:00
|
|
|
database_url: String,
|
|
|
|
|
#[arg(long, default_value_t = 3000)]
|
|
|
|
|
port: u16,
|
2023-08-29 21:34:00 +02:00
|
|
|
#[arg(long)]
|
|
|
|
|
bind: String,
|
2023-08-29 21:34:00 +02:00
|
|
|
#[arg(long, name = "USERNAME")]
|
|
|
|
|
disable_auth_and_assume_user: Option<String>,
|
2023-08-29 21:34:00 +02:00
|
|
|
}
|
|
|
|
|
|
2023-05-08 00:05:45 +02:00
|
|
|
#[tokio::main]
|
2023-08-29 21:34:00 +02:00
|
|
|
async fn main() -> Result<(), StartError> {
|
2023-05-08 22:31:01 +02:00
|
|
|
tracing_subscriber::fmt()
|
|
|
|
|
.with_max_level(tracing::Level::DEBUG)
|
|
|
|
|
.init();
|
|
|
|
|
|
2023-08-29 21:34:00 +02:00
|
|
|
let args = Args::parse();
|
|
|
|
|
|
2023-08-29 21:34:00 +02:00
|
|
|
let database_pool = sqlite::init_database_pool(&args.database_url).await?;
|
2023-08-29 21:34:00 +02:00
|
|
|
sqlite::migrate(&database_pool).await?;
|
2023-08-29 21:33:59 +02:00
|
|
|
|
2023-05-10 00:42:42 +02:00
|
|
|
let state = AppState {
|
|
|
|
|
database_pool,
|
|
|
|
|
client_state: ClientState::new(),
|
2023-08-29 21:34:00 +02:00
|
|
|
auth_config: if let Some(assume_user) = args.disable_auth_and_assume_user {
|
2023-08-29 21:34:00 +02:00
|
|
|
auth::AuthConfig::Disabled { assume_user }
|
2023-08-29 21:34:00 +02:00
|
|
|
} else {
|
2023-08-29 21:34:00 +02:00
|
|
|
auth::AuthConfig::Enabled
|
2023-08-29 21:34:00 +02:00
|
|
|
},
|
2023-05-10 00:42:42 +02:00
|
|
|
};
|
|
|
|
|
|
2023-05-08 00:05:45 +02:00
|
|
|
// build our application with a route
|
2023-08-29 21:34:00 +02:00
|
|
|
let app = routing::router(state);
|
2023-08-29 21:34:00 +02:00
|
|
|
let addr = SocketAddr::from((
|
|
|
|
|
IpAddr::from_str(&args.bind)
|
|
|
|
|
.map_err(|error| format!("error parsing bind address {}: {}", &args.bind, error))
|
|
|
|
|
.unwrap(),
|
|
|
|
|
args.port,
|
|
|
|
|
));
|
2023-05-08 00:05:45 +02:00
|
|
|
tracing::debug!("listening on {}", addr);
|
2023-08-29 21:34:00 +02:00
|
|
|
axum::Server::try_bind(&addr)
|
|
|
|
|
.map_err(|error| format!("error binding to {}: {}", addr, error))
|
|
|
|
|
.unwrap()
|
2023-05-08 00:05:45 +02:00
|
|
|
.serve(app.into_make_service())
|
|
|
|
|
.await
|
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|