summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/src/lib.rs3
-rw-r--r--server/src/main.rs8
-rw-r--r--server/src/network/register.rs80
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}");