diff --git a/src/config/mod.rs b/src/config/mod.rs index e9a4298..4b4d7e6 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -54,6 +54,10 @@ fn default_metrics_whitelist() -> Vec { vec!["127.0.0.1".parse().unwrap(), "::1".parse().unwrap()] } +fn default_unknown_dc_log_path() -> Option { + Some("unknown-dc.txt".to_string()) +} + // ============= Custom Deserializers ============= #[derive(Deserialize)] @@ -242,6 +246,10 @@ pub struct GeneralConfig { #[serde(default)] pub stun_iface_mismatch_ignore: bool, + /// Log unknown (non-standard) DC requests to a file (default: unknown-dc.txt). Set to null to disable. + #[serde(default = "default_unknown_dc_log_path")] + pub unknown_dc_log_path: Option, + #[serde(default)] pub log_level: LogLevel, @@ -263,6 +271,7 @@ impl Default for GeneralConfig { middle_proxy_nat_probe: false, middle_proxy_nat_stun: None, stun_iface_mismatch_ignore: false, + unknown_dc_log_path: default_unknown_dc_log_path(), log_level: LogLevel::Normal, disable_colors: false, } diff --git a/src/proxy/direct_relay.rs b/src/proxy/direct_relay.rs index 9f27b80..ff50bca 100644 --- a/src/proxy/direct_relay.rs +++ b/src/proxy/direct_relay.rs @@ -1,3 +1,5 @@ +use std::fs::OpenOptions; +use std::io::Write; use std::net::SocketAddr; use std::sync::Arc; @@ -113,6 +115,16 @@ fn get_dc_addr_static(dc_idx: i16, config: &ProxyConfig) -> Result { return Ok(SocketAddr::new(datacenters[abs_dc - 1], TG_DATACENTER_PORT)); } + // Unknown DC requested by client without override: log and fall back. + if !config.dc_overrides.contains_key(&dc_key) { + warn!(dc_idx = dc_idx, "Requested non-standard DC with no override; falling back to default cluster"); + if let Some(path) = &config.general.unknown_dc_log_path { + if let Ok(mut file) = OpenOptions::new().create(true).append(true).open(path) { + let _ = writeln!(file, "dc_idx={dc_idx}"); + } + } + } + let default_dc = config.default_dc.unwrap_or(2) as usize; let fallback_idx = if default_dc >= 1 && default_dc <= num_dcs { default_dc - 1