nomilo/src/main.rs

47 lines
1.4 KiB
Rust
Raw Normal View History

2021-03-20 02:31:41 +00:00
#![feature(proc_macro_hygiene, decl_macro)]
use std::str::FromStr;
#[macro_use] extern crate rocket;
use rocket::State;
use rocket_contrib::json::Json;
use trust_dns_client::client::{Client, SyncClient};
use trust_dns_client::tcp::TcpClientConnection;
use trust_dns_client::op::DnsResponse;
use trust_dns_client::rr::{DNSClass, Name, Record, RecordType};
mod types;
mod config;
#[get("/zones/<zone>/records")]
fn zone_records(client: State<SyncClient<TcpClientConnection>>, zone: String) -> Json<Vec<types::dns::Record>> {
// TODO: Implement FromParam for Name
let name = Name::from_str(&zone).unwrap();
let response: DnsResponse = client.query(&name, DNSClass::IN, RecordType::AXFR).unwrap();
2021-03-20 02:31:41 +00:00
let answers: &[Record] = response.answers();
let mut records: Vec<_> = answers.to_vec().into_iter()
.map(|record| types::dns::Record::from(record))
.filter(|record| match record.rdata {
types::dns::RData::NULL { .. } | types::dns::RData::DNSSEC(_) => false,
_ => true,
}).collect();
// AXFR response ends with SOA, we remove it so it is not doubled in the response.
records.pop();
2021-03-20 02:31:41 +00:00
Json(records)
}
fn main() {
let app_config = config::load("config.toml".into());
let conn = TcpClientConnection::new(app_config.dns_server.address).unwrap();
let client = SyncClient::new(conn);
rocket::ignite()
.manage(client)
.mount("/api/v1", routes![zone_records]).launch();
}