openaws-vpn-client 0.1.7

Unofficial open-source AWS VPN client written in Rust
use dirs::config_dir;
use std::fs::{create_dir_all, File};
use std::io::Read;
use std::io::Write;
use std::os::unix::prelude::OsStrExt;
use std::path::{Path, PathBuf};

pub struct LocalConfig {}

impl LocalConfig {
    pub fn read_last_file() -> Option<PathBuf> {
        LocalConfig::config_file("last_ovpn")
            .filter(|f| f.metadata().map(|m| m.len()).unwrap_or(0) > 0)
            .map(|mut f| {
                let mut s = String::new();
                f.read_to_string(&mut s).unwrap();
                s.replace("\n", "")
            })
            .filter(|s| s.len() > 0)
            .map(|s| PathBuf::from(s))
            .filter(|p| p.exists())
    }

    pub fn save_last_file<P: AsRef<Path>>(last: P) {
        let p = LocalConfig::config_file("last_ovpn");

        if let Ok(c) = std::fs::canonicalize(last) {
            if let Some(mut p) = p {
                p.set_len(0).unwrap();
                let os_str = c.into_os_string();
                let all = os_str.as_bytes();
                p.write_all(all).unwrap();
            }
        }
    }

    pub fn read_last_pid() -> Option<u32> {
        LocalConfig::config_file("last_ovpn_pid")
            .filter(|f| f.metadata().map(|m| m.len()).unwrap_or(0) > 0)
            .map(|mut f| {
                let mut s = String::new();
                f.read_to_string(&mut s).unwrap();
                s.replace("\n", "")
            })
            .filter(|s| s.len() > 0)
            .map(|s| s.parse::<u32>())
            .filter(|p| p.is_ok())
            .map(|p| p.unwrap())
    }

    pub fn save_last_pid(last: Option<u32>) {
        let p = LocalConfig::config_file("last_ovpn_pid");

        if let Some(mut p) = p {
            p.set_len(0).unwrap();
            if let Some(last) = last {
                write!(p, "{}", last).unwrap();
            } else {
                write!(p, "").unwrap();
            }
        }
    }

    fn config_file(name: &str) -> Option<File> {
        config_dir()
            .map(|d| d.join("openaws-vpn-client"))
            .map(|d| {
                if !d.exists() {
                    create_dir_all(&d).unwrap();
                }
                d.join(name)
            })
            .map(|d| {
                File::options()
                    .write(true)
                    .read(true)
                    .create(true)
                    .open(&d)
                    .unwrap()
            })
    }
}