refactor to work as a lib
This commit is contained in:
5
Cargo.lock
generated
5
Cargo.lock
generated
@@ -174,9 +174,8 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "dns-update"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "42788b21a1231c646c46508c406db9bf628342a781c24888bf60e1a29396deb2"
|
||||
version = "0.1.6"
|
||||
source = "git+ssh://git@github.com/groche97/dns-update.git#a72bdf31817f27b9e5fea22fa7e3690749b6c380"
|
||||
dependencies = [
|
||||
"hickory-client",
|
||||
"reqwest",
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
[zone]
|
||||
root_domain = "root.domain.example"
|
||||
|
||||
[[server]]
|
||||
conection_str = "tcp://127.0.0.1:53"
|
||||
[[dns_server]]
|
||||
connection_str = "tcp://127.0.0.1:53"
|
||||
|
||||
[server.key]
|
||||
name = "key name"
|
||||
value = "key in base64"
|
||||
[dns_server.key]
|
||||
name = "key 0 name"
|
||||
value = "key 0 in base64"
|
||||
|
||||
[[server]]
|
||||
conection_str = "udp://192.168.1.1:53"
|
||||
[[dns_server]]
|
||||
connection_str = "udp://192.168.1.1:53"
|
||||
|
||||
[server.key]
|
||||
name = "key name"
|
||||
value = "key in base64"
|
||||
[dns_server.key]
|
||||
name = "key 1 name"
|
||||
value = "key 1 in base64"
|
||||
|
||||
@@ -4,6 +4,6 @@ version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
dns-update = "0.1"
|
||||
dns-update = { git = "ssh://git@github.com/groche97/dns-update.git" }
|
||||
base64 = "*"
|
||||
dns-config = {path = "../dns-config"}
|
||||
|
||||
@@ -38,21 +38,25 @@ impl DnsManager {
|
||||
|
||||
pub async fn add_domain(
|
||||
&self,
|
||||
domain_name: &String,
|
||||
domain_name: &str,
|
||||
domain_ip: Ipv4Addr,
|
||||
) -> Result<(), dns_update::Error> {
|
||||
let domain = format!("{}.{}", domain_name, self.zone);
|
||||
let domain = self.get_full_domain(domain_name);
|
||||
for dns_updater in &self.dns_updaters {
|
||||
utils::add_domain(dns_updater, &domain, &self.zone, domain_ip).await?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn del_domain(&self, domain_name: &String) -> Result<(), dns_update::Error> {
|
||||
let domain = format!("{}.{}", domain_name, self.zone);
|
||||
pub async fn del_domain(&self, domain_name: &str) -> Result<(), dns_update::Error> {
|
||||
let domain = self.get_full_domain(domain_name);
|
||||
for dns_updater in &self.dns_updaters {
|
||||
utils::del_domain(dns_updater, &domain, &self.zone).await?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn get_full_domain(&self, domain_name: &str) -> String {
|
||||
format!("{}.{}", domain_name, self.zone)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,25 +1,27 @@
|
||||
use std::{error::Error, fs::read_to_string, io};
|
||||
use toml::{Table, Value};
|
||||
use toml::Table;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct ZoneConnectionData {
|
||||
pub conection_str: String,
|
||||
pub key_name: String,
|
||||
pub key: String,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct ServerZonesConnection {
|
||||
pub root_domain: String,
|
||||
pub servers_data: Vec<ZoneConnectionData>,
|
||||
}
|
||||
|
||||
impl ZoneConnectionData {
|
||||
pub fn get_config(file_name: &String) -> Result<Vec<Self>, Box<dyn Error>> {
|
||||
pub fn get_config(file_name: &str) -> Result<Vec<Self>, Box<dyn Error>> {
|
||||
let mut ret = Vec::new();
|
||||
let key_toml = read_to_string(file_name)?.parse::<Table>()?;
|
||||
|
||||
for servers in key_toml["server"]
|
||||
for servers in key_toml["dns_server"]
|
||||
.as_array()
|
||||
.ok_or(generate_toml_parser_error_in_field("server"))?
|
||||
.ok_or(generate_toml_parser_error_in_field("dns_server"))?
|
||||
{
|
||||
let conection_str: String = servers["connection_str"]
|
||||
.as_str()
|
||||
@@ -44,12 +46,12 @@ impl ZoneConnectionData {
|
||||
}
|
||||
|
||||
impl ServerZonesConnection {
|
||||
pub fn get_config(file_name: &String) -> Result<Self, Box<dyn Error>> {
|
||||
let root_domain: String =
|
||||
read_to_string(file_name)?.parse::<Table>()?["zone"]["root_domain"]
|
||||
.as_str()
|
||||
.ok_or(generate_toml_parser_error_in_field("zone root_domain"))?
|
||||
.to_string();
|
||||
pub fn get_config(file_name: &str) -> Result<Self, Box<dyn Error>> {
|
||||
let root_domain: String = read_to_string(file_name)?.parse::<Table>()?["zone"]
|
||||
["root_domain"]
|
||||
.as_str()
|
||||
.ok_or(generate_toml_parser_error_in_field("zone root_domain"))?
|
||||
.to_string();
|
||||
|
||||
Ok(Self {
|
||||
root_domain,
|
||||
|
||||
2
src/lib.rs
Normal file
2
src/lib.rs
Normal file
@@ -0,0 +1,2 @@
|
||||
pub use dns_comunications::DnsManager;
|
||||
pub use dns_config::ServerZonesConnection;
|
||||
19
src/main.rs
19
src/main.rs
@@ -1,19 +0,0 @@
|
||||
use std::{net::Ipv4Addr, str::FromStr};
|
||||
|
||||
use dns_comunications;
|
||||
use dns_config;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let zone_data =
|
||||
dns_config::ServerZonesConnection::get_config(&"config.toml".to_string()).unwrap();
|
||||
let dns_manager = dns_comunications::DnsManager::new(zone_data).unwrap();
|
||||
|
||||
_ = dns_manager
|
||||
.add_domain(
|
||||
&"testzone".to_string(),
|
||||
Ipv4Addr::from_str("1.1.1.1").unwrap(),
|
||||
)
|
||||
.await;
|
||||
_ = dns_manager.del_domain(&"testzone".to_string()).await;
|
||||
}
|
||||
20
tests/test_config.rs
Normal file
20
tests/test_config.rs
Normal file
@@ -0,0 +1,20 @@
|
||||
use dns_config;
|
||||
|
||||
#[test]
|
||||
fn test_config() {
|
||||
let zone_data =
|
||||
dns_config::ServerZonesConnection::get_config(&"config_template.toml".to_string()).unwrap();
|
||||
assert_eq!(zone_data.root_domain, "root.domain.example");
|
||||
assert_eq!(
|
||||
zone_data.servers_data.get(1).unwrap().conection_str,
|
||||
"udp://192.168.1.1:53"
|
||||
);
|
||||
assert_eq!(
|
||||
zone_data.servers_data.get(0).unwrap().key,
|
||||
"key 0 in base64"
|
||||
);
|
||||
assert_eq!(
|
||||
zone_data.servers_data.get(1).unwrap().key_name,
|
||||
"key 1 name"
|
||||
);
|
||||
}
|
||||
27
tests/test_management.rs
Normal file
27
tests/test_management.rs
Normal file
@@ -0,0 +1,27 @@
|
||||
use std::{net::Ipv4Addr, str::FromStr};
|
||||
|
||||
use dns_comunications::DnsManager;
|
||||
|
||||
fn get_manager() -> DnsManager {
|
||||
dns_comunications::DnsManager::new(
|
||||
dns_config::ServerZonesConnection::get_config(&"config.toml".to_string()).unwrap(),
|
||||
)
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_creating_zone() {
|
||||
let res = get_manager()
|
||||
.add_domain(
|
||||
&"testzone".to_string(),
|
||||
Ipv4Addr::from_str("1.1.1.1").unwrap(),
|
||||
)
|
||||
.await;
|
||||
assert!(res.is_ok());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_deleting_zone() {
|
||||
let res = get_manager().del_domain(&"testzone".to_string()).await;
|
||||
assert!(res.is_ok());
|
||||
}
|
||||
Reference in New Issue
Block a user