config file and skeleton
This commit is contained in:
		
							
								
								
									
										0
									
								
								src/cloudflare.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/cloudflare.rs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										48
									
								
								src/config.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/config.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
use dirs;
 | 
			
		||||
use log::warn;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
use std::{env, fs, path::PathBuf};
 | 
			
		||||
 | 
			
		||||
use crate::PROGRAM_NAME;
 | 
			
		||||
 | 
			
		||||
#[derive(Deserialize, Serialize, Debug)]
 | 
			
		||||
pub struct Config {
 | 
			
		||||
    pub cloudflare_zone_id: Box<str>,
 | 
			
		||||
    pub cloudflare_api_key: Box<str>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn get_config_path() -> Option<PathBuf> {
 | 
			
		||||
    match env::current_dir() {
 | 
			
		||||
        Ok(current_dir) => {
 | 
			
		||||
            let cwd_config = current_dir.join(format!("{}.toml", PROGRAM_NAME));
 | 
			
		||||
            if let Ok(meta) = fs::metadata(&cwd_config) {
 | 
			
		||||
                if meta.is_file() {
 | 
			
		||||
                    return Some(cwd_config);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        Err(e) => {
 | 
			
		||||
            warn!("Failed to get current directory {:?}", &e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    match dirs::config_dir() {
 | 
			
		||||
        Some(config_dir) => {
 | 
			
		||||
            let config_file = config_dir.join(PROGRAM_NAME).join("config.toml");
 | 
			
		||||
            if let Ok(meta) = fs::metadata(&config_file) {
 | 
			
		||||
                if meta.is_file() {
 | 
			
		||||
                    return Some(config_file);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        None => {}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    None
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn read_config(path: PathBuf) -> Option<Config>{
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    None
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								src/lib.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/lib.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
mod cloudflare;
 | 
			
		||||
mod config;
 | 
			
		||||
pub use config::{Config, get_config_path};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
pub const PROGRAM_NAME: &'static str = "dynip-cloudflare";
 | 
			
		||||
							
								
								
									
										10
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/main.rs
									
									
									
									
									
								
							@@ -7,6 +7,8 @@ use netlink_packet_route::RouteNetlinkMessage as RtnlMessage;
 | 
			
		||||
use netlink_sys::{AsyncSocket, SocketAddr};
 | 
			
		||||
use rtnetlink::new_connection;
 | 
			
		||||
 | 
			
		||||
use dynip_cloudflare::{get_config_path, Config};
 | 
			
		||||
 | 
			
		||||
const RTNLGRP_LINK: u32 = 1;
 | 
			
		||||
const RTNLGRP_IPV4_IFADDR: u32 = 5;
 | 
			
		||||
 | 
			
		||||
@@ -24,6 +26,14 @@ const fn nl_mgrp(group: u32) -> u32 {
 | 
			
		||||
#[tokio::main]
 | 
			
		||||
async fn main() -> Result<()> {
 | 
			
		||||
    env_logger::init();
 | 
			
		||||
    let config_path = match get_config_path() {
 | 
			
		||||
        Some(cp) => cp,
 | 
			
		||||
        None => {
 | 
			
		||||
            error!("Failed to find any config file");
 | 
			
		||||
            return Ok(());
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let (mut conn, mut _handle, mut messages) = new_connection().map_err(|e| anyhow!(e))?;
 | 
			
		||||
    let groups = nl_mgrp(RTNLGRP_LINK) | nl_mgrp(RTNLGRP_IPV4_IFADDR);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user