summaryrefslogtreecommitdiff
path: root/src/daemon_network.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon_network.rs')
-rw-r--r--src/daemon_network.rs47
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,