diff --git a/rust/agama-server/src/agama-web-server.rs b/rust/agama-server/src/agama-web-server.rs index fd149ba0eb..fde8880307 100644 --- a/rust/agama-server/src/agama-web-server.rs +++ b/rust/agama-server/src/agama-web-server.rs @@ -273,19 +273,29 @@ async fn handle_http_stream( } } +async fn find_listener(addresses: String) -> Option { + let addresses = addresses.split(',').collect::>(); + for addr in addresses { + // see https://github.com/tokio-rs/axum/blob/main/examples/low-level-openssl/src/main.rs + // how to use axum with openSSL + match tokio::net::TcpListener::bind(&addr).await { + Ok(listener) => { + return Some(listener); + } + Err(error) => { + eprintln!("Error: could not listen on {}: {}", &addr, error); + } + } + } + None +} + /// Starts the web server async fn start_server(address: String, service: Router, ssl_acceptor: SslAcceptor) { tracing::info!("Starting Agama web server at {}", address); - // see https://github.com/tokio-rs/axum/blob/main/examples/low-level-openssl/src/main.rs - // how to use axum with openSSL - let listener = tokio::net::TcpListener::bind(&address) - .await - .unwrap_or_else(|error| { - let msg = format!("Error: could not listen on {}: {}", &address, error); - tracing::error!(msg); - panic!("{}", msg) - }); + let opt_listener = find_listener(address).await; + let listener = opt_listener.expect("None of the alternative addresses worked"); pin_mut!(listener); diff --git a/rust/share/agama-web-server.service b/rust/share/agama-web-server.service index b17151987c..de19c89c39 100644 --- a/rust/share/agama-web-server.service +++ b/rust/share/agama-web-server.service @@ -9,7 +9,7 @@ BindsTo=agama.service EnvironmentFile=-/run/agama/environment.conf Environment="AGAMA_LOG=debug,zbus=info" Type=notify -ExecStart=/usr/bin/agama-web-server serve --address :::80 --address2 :::443 +ExecStart=/usr/bin/agama-web-server serve --address :::80,0.0.0.0:80 --address2 :::443,0.0.0.0:443 PIDFile=/run/agama/web.pid User=root TimeoutStopSec=5