From 6b95e59acf70972894f806eaf16eb0b3211b502f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Ml=C3=A1dek?= Date: Mon, 27 Dec 2021 11:58:01 +0100 Subject: [PATCH] try next port if taken --- src/main.rs | 71 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 25 deletions(-) diff --git a/src/main.rs b/src/main.rs index f47d7af..c3778d1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -109,12 +109,11 @@ fn main() -> Result<()> { #[cfg(not(feature = "thumbnails"))] let thumbnail_store = None; - let bind: SocketAddr = matches + let mut bind: SocketAddr = matches .value_of("BIND") .unwrap() .parse() .expect("Incorrect bind format."); - info!("Starting server at: {}", &bind); let state = routes::State { upend: upend.clone(), @@ -141,32 +140,54 @@ fn main() -> Result<()> { warn!("No Web UI directory present ({:?}), disabling...", ui_path); } let ui_enabled = ui_path.exists() && !matches.is_present("NO_UI"); - HttpServer::new(move || { - let app = App::new() - .data(state.clone()) - .wrap(middleware::Logger::default().exclude("/api/jobs")) - .service(routes::get_raw) - .service(routes::get_thumbnail) - .service(routes::get_query) - .service(routes::get_object) - .service(routes::put_object) - .service(routes::delete_object) - .service(routes::api_refresh) - .service(routes::list_hier) - .service(routes::list_hier_roots) - .service(routes::latest_files) - .service(routes::get_file) - .service(routes::get_jobs) - .service(routes::get_info); - if ui_enabled { - app.service(actix_files::Files::new("/", &ui_path).index_file("index.html")) + let mut cnt = 0; + let server = loop { + let state = state.clone(); + let ui_path = ui_path.clone(); + + let server = HttpServer::new(move || { + let app = App::new() + .data(state.clone()) + .wrap(middleware::Logger::default().exclude("/api/jobs")) + .service(routes::get_raw) + .service(routes::get_thumbnail) + .service(routes::get_query) + .service(routes::get_object) + .service(routes::put_object) + .service(routes::delete_object) + .service(routes::api_refresh) + .service(routes::list_hier) + .service(routes::list_hier_roots) + .service(routes::latest_files) + .service(routes::get_file) + .service(routes::get_jobs) + .service(routes::get_info); + + if ui_enabled { + app.service(actix_files::Files::new("/", &ui_path).index_file("index.html")) + } else { + app + } + }); + + let bind_result = server.bind(&bind); + if let Ok(server) = bind_result { + break server; } else { - app + warn!("Failed to bind at {:?}, trying next port number...", bind); + bind.set_port(bind.port() + 1); } - }) - .bind(&bind)? - .run(); + + if cnt > 10 { + panic!("Couldn't start server.") + } else { + cnt += 1; + } + }; + + info!("Starting server at: {}", &bind); + server.run(); if !matches.is_present("NO_INITIAL_UPDATE") { info!("Running initial update...");