aboutsummaryrefslogtreecommitdiffstats
path: root/src/bin
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin')
-rw-r--r--src/bin/tpd.rs26
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}");
}