#![allow(unused_must_use)] #[macro_use] extern crate rocket; #[macro_use] extern crate serde_with; pub mod empty; pub mod garbage; pub mod get_ip; pub mod haversine; pub mod serialized_ip_info; pub mod util; use std::error::Error; use clap::{arg, Command, value_parser}; use rocket::fs::FileServer; use empty::*; use garbage::*; use get_ip::*; use util::Config; #[rocket::main] async fn main() -> Result<(), Box> { let args = Command::new("speedtest-rs") .version("1.0.0") .author("Emmanuel Garette ") .about("Alternative implemention of the Librespeed server API") .arg(arg!(-i --ip ).default_value("127.0.0.1")) .arg(arg!(-p --port ).value_parser(value_parser!(u16)).default_value("8000")) .arg(arg!(-a --assets ).default_value("assets")) .arg(arg!(-t --ipinfo_token ).default_value("")) .arg(arg!(-l --latitude ).value_parser(value_parser!(f64)).default_value("0.0")) .arg(arg!(-o --longitude ).value_parser(value_parser!(f64)).default_value("0.0")) .arg(arg!(--cert ).default_value("")) .arg(arg!(--key ).default_value("")) .arg(arg!(--ca_cert ).default_value("")) .get_matches(); let routes = routes![get_ip::get_ip, get_backend_ip_php]; let garbage_routes = routes![ garbage::garbage, garbage_php, backend_garbage, backend_garbage_php ]; let empty_routes = routes![ empty::empty, backend_empty, get_empty, empty_php, backend_empty_php, get_backend_empty_php ]; let routes = vec![routes, garbage_routes, empty_routes].concat(); let config = Config { ip: args.get_one::("ip").expect("required").to_string(), port: *args.get_one::("port").expect("required"), assets: args.get_one::("assets").expect("required").to_string(), ipinfo_token: args.get_one::("ipinfo_token").expect("required").to_string(), latitude: *args.get_one::("latitude").expect("required"), longitude: *args.get_one::("longitude").expect("required"), tls_cert: args.get_one::("cert").expect("required").to_string(), tls_key: args.get_one::("key").expect("required").to_string(), tls_ca_cert: args.get_one::("ca_cert").expect("required").to_string(), }; let mut figment = rocket::Config::figment() .merge(("address", &config.ip)) .merge(("port", &config.port)); if !config.tls_cert.is_empty() && !config.tls_key.is_empty() { figment = figment.merge(("tls.certs", &config.tls_cert)) .merge(("tls.key", &config.tls_key)); } if !config.tls_ca_cert.is_empty() { figment = figment.merge(("tls.mutual.ca_certs", &config.tls_ca_cert)) .merge(("tls.mutual.mandatory", true)); } let asset_path = std::env::current_dir().unwrap().join(args.get_one::("assets").expect("required")); rocket::custom(figment).mount("/", routes) .manage(config) .mount("/", FileServer::from(asset_path)) .launch().await?; Ok(()) }