diff --git a/src/ip_handler/mod.rs b/src/ip_handler/mod.rs new file mode 100644 index 0000000..e00ec52 --- /dev/null +++ b/src/ip_handler/mod.rs @@ -0,0 +1,54 @@ +use std::fs::File; +use std::io::{Read, Write}; +use std::path::Path; +use serde::{Deserialize, Serialize}; + +const FILE_NAME: &'static str = "ddns_ip"; +const WEBSITE_URL: &'static str = "https://httpbin.org/ip"; + +#[derive(Deserialize)] +struct IP { + origin: String, +} + +pub async fn ip_has_changed() -> bool { + let current_ip = get_current_ip().await.expect("Error getting the current IP."); + + let previous_ip = match check_previous_ip() { + Some(x) => x, + None => String::new() + }; + + println!("Current IP: {}, Previous IP: {}", current_ip, previous_ip); + + current_ip.ne(&previous_ip) +} + +async fn get_current_ip() -> Result> { + let resp = reqwest::get(WEBSITE_URL) + .await? + .json::() + .await?; + + record_current_ip(&resp.origin); + + Ok(resp.origin) +} + +fn record_current_ip(current_ip: &str) { + let mut file = File::create(FILE_NAME).expect("Error creating file."); + file.write_all(current_ip.as_ref()).expect("Error writing file."); +} + +fn check_previous_ip() -> Option { + if !Path::new(FILE_NAME).exists() { + return None; + } + + let mut file = File::open(FILE_NAME).ok()?; + let mut contents = String::new(); + file.read_to_string(&mut contents) + .expect("Error reading file."); + + return Some(contents); +} diff --git a/src/main.rs b/src/main.rs index b2eee5c..ec6e178 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,56 +1,13 @@ -use std::fs::File; -use std::io::prelude::*; -use std::path::Path; -use serde::{Serialize, Deserialize}; +mod ip_handler; -const FILE_NAME: &'static str = "ddns_ip"; - -#[derive(Deserialize)] -struct IP { - origin: String, -} +use ip_handler::ip_has_changed; #[tokio::main] async fn main() -> Result<(), Box> { - let current_ip = get_current_ip().await?; - let previous_ip = match check_previous_ip() { - Some(x) => x, - None => { - let mut file = File::create(FILE_NAME)?; - file.write_all(current_ip.as_ref())?; - - String::new() - } - }; - - println!("Current IP: {}, Previous IP: {}", current_ip, previous_ip); - - if current_ip.ne(&previous_ip) { - println!("Not equal!!!"); - // TODO: GoDaddy connection. + if ip_has_changed().await { + println!("Ip has changed!"); } Ok(()) } - -async fn get_current_ip() -> Result> { - let resp = reqwest::get("https://httpbin.org/ip") - .await? - .json::() - .await?; - - Ok(resp.origin) -} - -fn check_previous_ip() -> Option { - if !Path::new(FILE_NAME).exists() { - return None; - } - - let mut file = File::open(FILE_NAME).ok()?; - let mut contents = String::new(); - file.read_to_string(&mut contents).expect("Error reading file"); - - return Some(contents); -}