diff options
Diffstat (limited to 'src/daemon_network.rs')
-rw-r--r-- | src/daemon_network.rs | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/src/daemon_network.rs b/src/daemon_network.rs index 97349c8..5dd003a 100644 --- a/src/daemon_network.rs +++ b/src/daemon_network.rs @@ -1,10 +1,10 @@ use defguard_wireguard_rs::{ - host::Peer, key::Key, InterfaceConfiguration, WGApi, WireguardInterfaceApi, + host::Peer, key::Key, net::IpAddrMask, InterfaceConfiguration, WGApi, WireguardInterfaceApi, }; //use log::{debug, error, info, warn}; use std::{ collections::{BTreeSet, HashMap}, - net::ToSocketAddrs, + net::{SocketAddr, ToSocketAddrs}, sync::Arc, }; use tokio::{net::TcpListener, sync::RwLock}; @@ -12,6 +12,43 @@ use tokio::{net::TcpListener, sync::RwLock}; use crate::daemon::*; use crate::daemon_config::*; +fn get_one_address(pair: &(String, u16)) -> Option<SocketAddr> { + pair.to_socket_addrs() + .ok() + .map(|mut it| it.next()) + .flatten() +} + +pub async fn add_peer( + api: &WGApi, + key: Key, + psk: Option<Key>, + endpoint: Option<Endpoint>, + ips: Vec<IpAddrMask>, +) -> Result<(), DaemonError> { + let endpoint = endpoint + .map(|ep| match ep { + Endpoint::Ip(addr) => Some(addr), + Endpoint::Domain(s, p) => get_one_address(&(s, p)), + }) + .flatten(); + let peer = Peer { + public_key: key, + preshared_key: psk, + protocol_version: None, + endpoint: endpoint, + last_handshake: None, + tx_bytes: 0, + rx_bytes: 0, + persistent_keepalive_interval: None, + allowed_ips: ips, + }; + + api.configure_peer(&peer)?; + + Ok(()) +} + pub async fn add_network( name: String, privkey: String, @@ -33,11 +70,7 @@ pub async fn add_network( .clone() .map(|e| match e { Endpoint::Ip(ep) => Some(ep), - Endpoint::Domain(s, p) => (s, p) - .to_socket_addrs() - .ok() - .map(|mut it| it.next()) - .flatten(), + Endpoint::Domain(s, p) => get_one_address(&(s, p)), }) .flatten(), last_handshake: None, |