aboutsummaryrefslogtreecommitdiff
path: root/src/add.rs
blob: 8ccf53b7711f646a879ce537284b1aee093dc9f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use std::{net::Ipv4Addr, str::FromStr, fs::File};
use std::io::Write;
use anyhow::{anyhow, Result};
use crate::wg::{config::WireguardConfig, peer::Peer};

pub fn run(wg_conf: &mut WireguardConfig, wg_conf_path: String, peer_name: &String, ip: Option<&String>) -> Result<()> {
    let ip = match ip {
        Some(s) => {
            Ipv4Addr::from_str(s.as_str())?
        },
        None => {
            match wg_conf.next_free_ip() {
                Ok(i) => i,
                Err(e) => {
                    return Err(e);
                }
            }
        }
    };

    match wg_conf.get_peer(peer_name.as_str()) {
        Some(_) => { return Err(anyhow!("There is already a peer named {}", peer_name)); },
        None => {}
    }

    let p = Peer::new(peer_name.clone(), ip)?;
    wg_conf.peers.push(p);

    let mut f = File::create(wg_conf_path)?;
    write!(f, "{}", wg_conf.gen_config()?)?;

    Ok(())
}