Compare commits

..

4 Commits

Author SHA1 Message Date
8bee3e48d3 logging 2024-07-14 16:35:07 +02:00
087eaa04fa logging 2024-07-14 16:32:07 +02:00
78c0fbf83b debug 2024-07-14 16:27:19 +02:00
8a9da6e8da cloudflareresponse 2024-07-14 16:24:25 +02:00
2 changed files with 46 additions and 29 deletions

View File

@ -34,6 +34,14 @@ struct DnsRecord {
meta: HashMap<Box<str>, serde_json::Value>, meta: HashMap<Box<str>, serde_json::Value>,
} }
#[derive(Serialize, Deserialize, Debug)]
struct CloudflareResponse {
success: bool,
errors: Vec<HashMap<String, serde_json::Value>>,
messages: Vec<HashMap<String, serde_json::Value>>,
result: Option<Vec<DnsRecord>>,
}
impl CloudflareClient { impl CloudflareClient {
pub async fn new(api_key: Box<str>, zone_id: Box<str>, domains: Vec<Box<str>>) -> Result<Self> { pub async fn new(api_key: Box<str>, zone_id: Box<str>, domains: Vec<Box<str>>) -> Result<Self> {
let force_ipv4 = IpAddr::from([0, 0, 0, 0]); let force_ipv4 = IpAddr::from([0, 0, 0, 0]);
@ -57,10 +65,11 @@ impl CloudflareClient {
pub async fn check(&mut self) -> Result<()> { pub async fn check(&mut self) -> Result<()> {
let new_ip = get_current_public_ipv4(&self.client).await?; let new_ip = get_current_public_ipv4(&self.client).await?;
if new_ip == self.current_ip { if new_ip == self.current_ip {
info!("IP '{}' is already set", new_ip);
return Ok(()); return Ok(());
} }
info!( info!(
"Ip has changed from '{}' -> '{}'", "IP has changed from '{}' -> '{}'",
&self.current_ip, &new_ip &self.current_ip, &new_ip
); );
self.update_dns_records(new_ip).await?; self.update_dns_records(new_ip).await?;
@ -75,7 +84,7 @@ impl CloudflareClient {
Ok(r) => r, Ok(r) => r,
Err(e) => { Err(e) => {
error!( error!(
"Could not getch dns records for domain '{}': {:?}", "Could not fetch DNS records for domain '{}': {:?}",
&domain, &e &domain, &e
); );
continue; continue;
@ -85,6 +94,10 @@ impl CloudflareClient {
let new_ip_s = new_ip.to_string().into_boxed_str(); let new_ip_s = new_ip.to_string().into_boxed_str();
for mut record in records.into_iter() { for mut record in records.into_iter() {
if record.content == new_ip_s { if record.content == new_ip_s {
info!(
"On {}, ip already updated to '{}'",
&record.name, &record.content
);
continue; continue;
} }
info!( info!(
@ -109,7 +122,8 @@ impl CloudflareClient {
"https://api.cloudflare.com/client/v4/zones/{}/dns_records?type=A&name={}", "https://api.cloudflare.com/client/v4/zones/{}/dns_records?type=A&name={}",
self.zone_id, domain self.zone_id, domain
); );
let mut response = self
let response = self
.client .client
.get(&url) .get(&url)
.header("Authorization", format!("Bearer {}", self.api_key)) .header("Authorization", format!("Bearer {}", self.api_key))
@ -117,12 +131,23 @@ impl CloudflareClient {
.send() .send()
.await? .await?
.error_for_status()? .error_for_status()?
.json::<HashMap<String, Vec<DnsRecord>>>() .text()
.await?; .await?;
response let cloudflare_response: CloudflareResponse =
.remove("result") serde_json::from_str(&response).context("Failed to deserialize Cloudflare response")?;
.context("Key result not in return")
if !cloudflare_response.success {
error!(
"Cloudflare API returned errors: {:?}",
cloudflare_response.errors
);
return Err(anyhow::anyhow!("Cloudflare API returned errors"));
}
cloudflare_response
.result
.context("Key 'result' not found in response")
} }
async fn update_dns_record(&self, record: &mut DnsRecord, ip_content: Box<str>) -> Result<()> { async fn update_dns_record(&self, record: &mut DnsRecord, ip_content: Box<str>) -> Result<()> {

View File

@ -1,6 +1,6 @@
use std::fmt; use std::fmt;
use log::{debug, error, info, log_enabled, Level}; use log::{debug, error, info};
use netlink_packet_core::{NetlinkMessage, NetlinkPayload}; use netlink_packet_core::{NetlinkMessage, NetlinkPayload};
use netlink_packet_route::RouteNetlinkMessage as RtnlMessage; use netlink_packet_route::RouteNetlinkMessage as RtnlMessage;
@ -38,9 +38,7 @@ impl<'a> MessageHandler<'a> {
.await .await
} }
_ => { _ => {
if log_enabled!(Level::Debug) {
debug!("Unhandled message payload: {:?}", message.payload); debug!("Unhandled message payload: {:?}", message.payload);
}
Some(()) Some(())
} }
} }
@ -51,10 +49,8 @@ impl<'a> MessageHandler<'a> {
D: fmt::Display + ?Sized, D: fmt::Display + ?Sized,
M: fmt::Debug, M: fmt::Debug,
{ {
if log_enabled!(Level::Debug) {
debug!("{}: {:?}", log_msg, msg);
} else {
info!("{}", log_msg); info!("{}", log_msg);
debug!("{}: {:?}", log_msg, msg);
if let Err(e) = self.cloudflare.check().await { if let Err(e) = self.cloudflare.check().await {
self.errs_counter += 1; self.errs_counter += 1;
error!( error!(
@ -65,16 +61,12 @@ impl<'a> MessageHandler<'a> {
return None; return None;
} }
} }
}
Some(()) Some(())
} }
async fn log_info<M: fmt::Debug>(&self, log_msg: &str, msg: &M) -> Option<()> { async fn log_info<M: fmt::Debug>(&self, log_msg: &str, msg: &M) -> Option<()> {
if log_enabled!(Level::Debug) {
debug!("{:?} message: {:?}", log_msg, msg);
} else {
info!("{}", log_msg); info!("{}", log_msg);
} debug!("{:?} message: {:?}", log_msg, msg);
Some(()) Some(())
} }
} }