diff options
| author | murilo ijanc | 2026-03-25 03:46:21 -0300 |
|---|---|---|
| committer | murilo ijanc | 2026-03-25 03:46:21 -0300 |
| commit | ee25588324ca61275782a3628dd1838dae58e69e (patch) | |
| tree | 6be0be73ce906cb0d2d7b95b5a9b4cd8231fef23 /src/bin/tpd.rs | |
| parent | 7aff2e1d279a4e442b32f49ca0a0eca065355787 (diff) | |
| download | tesseras-paste-ee25588324ca61275782a3628dd1838dae58e69e.tar.gz | |
Add DNS SRV bootstrap discovery for automatic peer finding
tpd now queries _tesseras._udp.tesseras.net SRV records to discover
bootstrap peers when no -b flag is given. Add -n flag to disable this
automatic discovery for seed/isolated nodes.
Diffstat (limited to 'src/bin/tpd.rs')
| -rw-r--r-- | src/bin/tpd.rs | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/bin/tpd.rs b/src/bin/tpd.rs index 15e7d9b..2b7fdb2 100644 --- a/src/bin/tpd.rs +++ b/src/bin/tpd.rs @@ -10,6 +10,8 @@ mod base58; mod crypto; #[path = "../daemon.rs"] mod daemon; +#[path = "../dns.rs"] +mod dns; #[path = "../ops.rs"] mod ops; #[path = "../paste.rs"] @@ -35,7 +37,7 @@ fn default_dir() -> PathBuf { fn usage() { eprintln!( "usage: tpd [-p port] [-d dir] [-s sock] \ - [-w http_port] [-g] [-b host:port] [-h]" + [-w http_port] [-g] [-n] [-b host:port] [-h]" ); eprintln!(); eprintln!(" -p port UDP port (0 = random)"); @@ -43,6 +45,7 @@ fn usage() { eprintln!(" -s sock Unix socket path"); eprintln!(" -w port HTTP server port"); eprintln!(" -g global NAT (public server)"); + eprintln!(" -n no auto-bootstrap (skip DNS SRV)"); eprintln!(" -b host:port bootstrap peer (repeatable)"); eprintln!(" -h show this help"); } @@ -62,6 +65,7 @@ fn main() { let mut sock: Option<PathBuf> = None; let mut http_port: Option<u16> = None; let mut global = false; + let mut no_auto_bootstrap = false; let mut bootstrap: Vec<String> = Vec::new(); let args: Vec<String> = std::env::args().collect(); @@ -104,6 +108,7 @@ fn main() { ); } "-g" => global = true, + "-n" => no_auto_bootstrap = true, "-b" => { i += 1; if let Some(addr) = args.get(i) { @@ -181,22 +186,35 @@ fn main() { let id = node.id_hex(); eprintln!("tpd {addr} id={:.8}", id); + // If no explicit peers given and auto-bootstrap is enabled, + // discover peers via DNS SRV (_tesseras._udp.tesseras.net). + if bootstrap.is_empty() && !no_auto_bootstrap { + log::info!("bootstrap: resolving SRV records"); + let srv = dns::lookup_bootstrap(); + if srv.is_empty() { + log::warn!("bootstrap: no SRV records found"); + } + for rec in &srv { + bootstrap.push(format!("{}:{}", rec.host, rec.port)); + } + } + for peer in &bootstrap { let parts: Vec<&str> = peer.rsplitn(2, ':').collect(); if parts.len() != 2 { - eprintln!("warning: bad bootstrap: {peer}"); + eprintln!("warning: bad bootstrap address: {peer}"); continue; } let host = parts[1]; let p: u16 = match parts[0].parse() { Ok(p) => p, Err(_) => { - eprintln!("warning: bad port: {peer}"); + eprintln!("warning: bad bootstrap port: {peer}"); continue; } }; if let Err(e) = node.join(host, p) { - eprintln!("warning: bootstrap {peer}: {e}"); + log::warn!("bootstrap: failed to join {peer}: {e}"); } else { log::info!("bootstrap: connected to {peer}"); } |