mirror of
https://github.com/sadoyan/aralez.git
synced 2026-06-10 09:14:18 +08:00
Merge pull request #41 from Taqman-probe/fix/TcpListener-bind
Fix TcpListener binding and port availability check
This commit is contained in:
@@ -18,6 +18,8 @@ use prometheus::{gather, Encoder, TextEncoder};
|
|||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use signal_hook::{consts::SIGQUIT, iterator::Signals};
|
use signal_hook::{consts::SIGQUIT, iterator::Signals};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use std::net::SocketAddr;
|
||||||
|
use std::str::FromStr;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::{Duration, SystemTime, UNIX_EPOCH};
|
use std::time::{Duration, SystemTime, UNIX_EPOCH};
|
||||||
use tokio::net::TcpListener;
|
use tokio::net::TcpListener;
|
||||||
@@ -67,16 +69,14 @@ pub async fn run_server(config: &APIUpstreamProvider, mut to_return: Sender<Conf
|
|||||||
|
|
||||||
let mut static_handle: Option<tokio::task::JoinHandle<()>> = None;
|
let mut static_handle: Option<tokio::task::JoinHandle<()>> = None;
|
||||||
if let (Some(address), Some(folder)) = (&config.file_server_address, &config.file_server_folder) {
|
if let (Some(address), Some(folder)) = (&config.file_server_address, &config.file_server_folder) {
|
||||||
port_is_available("File Server", &address).await;
|
let static_listen = port_is_available("File Server", &address).await;
|
||||||
let static_files = ServeDir::new(folder);
|
let static_files = ServeDir::new(folder);
|
||||||
let static_serve: Router = Router::new().fallback_service(static_files);
|
let static_serve: Router = Router::new().fallback_service(static_files);
|
||||||
let static_listen = TcpListener::bind(address).await.unwrap();
|
|
||||||
// drop(tokio::spawn(async move { axum::serve(static_listen, static_serve).await.unwrap() }));
|
// drop(tokio::spawn(async move { axum::serve(static_listen, static_serve).await.unwrap() }));
|
||||||
static_handle = Some(tokio::spawn(async move { axum::serve(static_listen, static_serve).await.unwrap() }))
|
static_handle = Some(tokio::spawn(async move { axum::serve(static_listen, static_serve).await.unwrap() }))
|
||||||
}
|
}
|
||||||
|
|
||||||
port_is_available("Config API", &config.address).await;
|
let listener = port_is_available("Config API", &config.address).await;
|
||||||
let listener = TcpListener::bind(config.address.clone()).await.unwrap();
|
|
||||||
info!("Starting the API server on: {}", config.address);
|
info!("Starting the API server on: {}", config.address);
|
||||||
let api_server = tokio::spawn(async move { axum::serve(listener, app).await.unwrap() });
|
let api_server = tokio::spawn(async move { axum::serve(listener, app).await.unwrap() });
|
||||||
|
|
||||||
@@ -227,20 +227,19 @@ async fn status(State(st): State<AppState>, Query(params): Query<HashMap<String,
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn port_is_available(name: &str, address: &str) {
|
pub async fn port_is_available(name: &str, address: &str) -> TcpListener {
|
||||||
let addr_port = address.split(":").collect::<Vec<&str>>();
|
let addr = SocketAddr::from_str(address)
|
||||||
|
.unwrap_or_else(|e| panic!("{}: Invalid address format: {:?}", name, e));
|
||||||
let t = Duration::from_secs(2);
|
let t = Duration::from_secs(2);
|
||||||
|
|
||||||
let mut a = addr_port[0];
|
//if addr.ip() == IpAddr::V4(Ipv4Addr::UNSPECIFIED) {
|
||||||
if address == "0.0.0.0" {
|
// addr.set_ip(IpAddr::V4(Ipv4Addr::LOCALHOST));
|
||||||
a = "127.0.0.1";
|
//}
|
||||||
}
|
let p = addr.port();
|
||||||
let p = addr_port[1].parse::<u16>().unwrap();
|
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
match TcpListener::bind((a, p)).await {
|
match TcpListener::bind(addr).await {
|
||||||
Ok(_) => {
|
Ok(listener) => {
|
||||||
break;
|
return listener;
|
||||||
}
|
}
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
warn!("{} port is not available: {} will try again in {:?}", name, p, t);
|
warn!("{} port is not available: {} will try again in {:?}", name, p, t);
|
||||||
|
|||||||
Reference in New Issue
Block a user