diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/src/lib.rs | 3 | ||||
-rw-r--r-- | server/src/main.rs | 8 | ||||
-rw-r--r-- | server/src/network/register.rs | 80 |
3 files changed, 59 insertions, 32 deletions
diff --git a/server/src/lib.rs b/server/src/lib.rs index a0b02ced..69a9849e 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -21,7 +21,8 @@ let_chains, iterator_try_collect, isqrt, - trait_upcasting + trait_upcasting, + stmt_expr_attributes )] pub mod commands; pub mod data; diff --git a/server/src/main.rs b/server/src/main.rs index d0538126..087bd9d7 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -71,6 +71,12 @@ pub(crate) struct Args { /// Uri for connecting remotely for registry submission #[arg(long)] register_uri: Option<String>, + /// Do not register using IPv4 + #[arg(long)] + register_disable_ip4: bool, + /// Do not register using IPv6 + #[arg(long)] + register_disable_ip6: bool, } fn main() -> Result<()> { @@ -130,6 +136,8 @@ async fn run(args: Args) -> anyhow::Result<()> { args.listen.port(), args.register_uri, state.clone(), + args.register_disable_ip4, + args.register_disable_ip6, ); tokio::task::spawn(r.register_loop()); } diff --git a/server/src/network/register.rs b/server/src/network/register.rs index b26768a2..8e0464fa 100644 --- a/server/src/network/register.rs +++ b/server/src/network/register.rs @@ -18,7 +18,7 @@ use crate::server::Server; use anyhow::{bail, Result}; use hurrycurry_protocol::{registry::Submission, VERSION}; -use log::{info, warn}; +use log::{error, info, warn}; use rand::random; use reqwest::{header::USER_AGENT, Client, Url}; use std::{ @@ -36,9 +36,8 @@ pub struct Register { port: u16, register_uri: Option<String>, state: Arc<RwLock<Server>>, - inet_client: Client, - ip4_client: Client, - ip6_client: Client, + ip4_client: Option<Client>, + ip6_client: Option<Client>, secret: u128, players: usize, } @@ -49,6 +48,8 @@ impl Register { port: u16, register_uri: Option<String>, state: Arc<RwLock<Server>>, + no6: bool, + no4: bool, ) -> Self { Self { name, @@ -57,15 +58,26 @@ impl Register { port, secret: random(), state, - inet_client: Client::new(), - ip4_client: Client::builder() - .local_address(IpAddr::V4(Ipv4Addr::UNSPECIFIED)) - .build() - .unwrap(), - ip6_client: Client::builder() - .local_address(IpAddr::V6(Ipv6Addr::UNSPECIFIED)) - .build() - .unwrap(), + ip4_client: if no4 { + None + } else { + Some( + Client::builder() + .local_address(IpAddr::V4(Ipv4Addr::UNSPECIFIED)) + .build() + .unwrap(), + ) + }, + ip6_client: if no6 { + None + } else { + Some( + Client::builder() + .local_address(IpAddr::V6(Ipv6Addr::UNSPECIFIED)) + .build() + .unwrap(), + ) + }, } } pub async fn register_loop(mut self) { @@ -81,29 +93,36 @@ impl Register { pub async fn register(&self) -> Result<()> { info!("register update"); - if let Some(uri) = &self.register_uri { - self.register_with("uri", &self.inet_client, uri.to_owned()) - .await?; - } else { - let (v4, v6) = tokio::join!( + let [v4, v6] = [&self.ip4_client, &self.ip6_client].map(|client| async { + if let Some(r) = client.as_ref().map(|client| { self.register_with( - "ip4", - &self.ip4_client, - format!("ws://0.0.0.0:{}", self.port), - ), - self.register_with( - "ip6", - &self.ip6_client, - format!("ws://0.0.0.0:{}", self.port), + client, + self.register_uri + .clone() + .unwrap_or(format!("ws://0.0.0.0:{}", self.port)), ) - ); - info!("v4: {v4:?}"); - info!("v6: {v6:?}"); + }) { + Some(r.await) + } else { + None + } + }); + #[rustfmt::skip] + match tokio::join!(v4, v6) { + (None, None) => info!("no registration sent"), + (Some(Ok(())), None) => info!("Registration successful (IPv4)"), + (None, Some(Ok(()))) => info!("Registration successful (IPv6)"), + (Some(Ok(())), Some(Ok(()))) => info!("Registration successful (IPv4 + IPv6)"), + (Some(Err(e)), None) => info!("Registration failed (IPv4): {e}"), + (None, Some(Err(e))) => error!("Registration failed (IPv6): {e}"), + (Some(Err(e1)), Some(Err(e2))) => error!("Registration failed (IPv4 + IPv6): {e1}, {e2}"), + (Some(Ok(())), Some(Err(e))) => warn!("Registration partially failed (IPv4 ok, IPv6 fail): {e}"), + (Some(Err(e)), Some(Ok(()))) => warn!("Registration partially failed (IPv4 fail, IPv6 ok): {e}"), } Ok(()) } // TODO ip v6 - pub async fn register_with(&self, label: &str, client: &Client, uri: String) -> Result<()> { + pub async fn register_with(&self, client: &Client, uri: String) -> Result<()> { let res = client .post(Url::from_str(&format!("{REGISTRY_URI}/v1/register")).unwrap()) .header( @@ -123,7 +142,6 @@ impl Register { let r = res.text().await?; if r == "ok" { - info!("register ok ({label})"); Ok(()) } else { bail!("{r}"); |