49 lines
1.1 KiB
Rust
49 lines
1.1 KiB
Rust
|
use std::str::FromStr;
|
||
|
|
||
|
use anyhow::{bail, Result};
|
||
|
use trust_dns_client::client::{Client, SyncClient};
|
||
|
use trust_dns_client::rr::{DNSClass, Name, RData, RecordType};
|
||
|
use trust_dns_client::udp::UdpClientConnection;
|
||
|
|
||
|
fn main() -> Result<()> {
|
||
|
let (port, host) = resolve_dns("daeken.dev")?;
|
||
|
|
||
|
dbg!(port);
|
||
|
dbg!(host);
|
||
|
|
||
|
Ok(())
|
||
|
}
|
||
|
|
||
|
fn resolve_dns(server: &str) -> Result<(u16, String)> {
|
||
|
let name = Name::from_str(&format!("_hypercosm._tls.{}", server))?;
|
||
|
|
||
|
let resp = make_dns_client()?.query(&name, DNSClass::IN, RecordType::SRV)?;
|
||
|
|
||
|
// TODO: Ensure exactly 1 result: I think.
|
||
|
let ans = resp.answers()[0].rdata();
|
||
|
|
||
|
if let RData::SRV(srv) = ans {
|
||
|
// TODO: Handle priority and weight.
|
||
|
|
||
|
let port = srv.port();
|
||
|
|
||
|
// TODO: Should this be ascii or utf8
|
||
|
let name = srv.target().to_ascii();
|
||
|
|
||
|
Ok((port, name))
|
||
|
} else {
|
||
|
bail!("Invalid DNS responce");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn make_dns_client() -> Result<impl Client> {
|
||
|
// TODO: Make this use TLS
|
||
|
|
||
|
let addr = "1.1.1.1:53".parse()?;
|
||
|
let conn = UdpClientConnection::new(addr)?;
|
||
|
|
||
|
let client = SyncClient::new(conn);
|
||
|
|
||
|
Ok(client)
|
||
|
}
|