Skip to content

Commit

Permalink
refactor: add Clone trait to Host struct (#20)
Browse files Browse the repository at this point in the history
* add Clone to Host struct

* make specific interfaces also Clone

* update dependencies

* update server example

---------

Co-authored-by: Maciej Wójcik <wojcik91@gmail.com>
  • Loading branch information
wojcik91 and Maciej Wójcik committed Oct 9, 2023
1 parent d38e147 commit a11893a
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 23 deletions.
16 changes: 8 additions & 8 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

50 changes: 36 additions & 14 deletions examples/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,51 +6,73 @@ use defguard_wireguard_rs::{
use x25519_dalek::{EphemeralSecret, PublicKey};

fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create new api object for interface
// Create new api object for interface management
let ifname: String = if cfg!(target_os = "linux") || cfg!(target_os = "freebsd") {
"wg0".into()
} else {
"utun3".into()
};
let wgapi = WGApi::new(ifname.clone(), false)?;

// create interface
// create host interface
wgapi.create_interface()?;

// read current interface data
// read current interface status
let host = wgapi.read_interface_data()?;
println!("WireGuard interface: {host:#?}");
println!("WireGuard interface before configuration: {host:#?}");

// prepare peer configuration
// store peer keys to remove peers later
let mut peer_keys = Vec::new();

// prepare initial WireGuard interface configuration with one client
let secret = EphemeralSecret::random();
let key = PublicKey::from(&secret);
let peer_key: Key = key.as_ref().try_into().unwrap();
let mut peer = Peer::new(peer_key.clone());
let addr = IpAddrMask::from_str("10.20.30.40/24").unwrap();
peer_keys.push(peer_key.clone());
let mut peer = Peer::new(peer_key);
let addr = IpAddrMask::from_str("10.20.30.2/32").unwrap();
peer.allowed_ips.push(addr);

// Configure host interface
let interface_config = InterfaceConfiguration {
name: ifname.clone(),
prvkey: "AAECAwQFBgcICQoLDA0OD/Dh0sO0pZaHeGlaSzwtHg8=".to_string(),
address: "10.6.0.30".to_string(),
port: 12345,
peers: vec![peer],
};

// apply initial interface configuration
wgapi.configure_interface(&interface_config)?;

// Create peers
for _ in 0..32 {
// read current interface status
let host = wgapi.read_interface_data()?;
println!("WireGuard interface initial config: {host:#?}");

// add more WireGuard clients
for peer_id in 3..13 {
let secret = EphemeralSecret::random();
let key = PublicKey::from(&secret);
let peer = Peer::new(key.as_ref().try_into().unwrap());
let peer_key: Key = key.as_ref().try_into().unwrap();
peer_keys.push(peer_key.clone());
let mut peer = Peer::new(peer_key);
let addr = IpAddrMask::from_str(&format!("10.20.30.{peer_id}/32")).unwrap();
peer.allowed_ips.push(addr);
// add peer to WireGuard interface
wgapi.configure_peer(&peer)?;
wgapi.remove_peer(&peer.public_key)?;
}

// read current interface data
// read current interface status
let host = wgapi.read_interface_data()?;
println!("WireGuard interface with peers: {host:#?}");

// remove all peers
for peer_key in peer_keys {
wgapi.remove_peer(&peer_key)?;
}

// read current interface status
let host = wgapi.read_interface_data()?;
println!("WireGuard interface: {host:#?}");
println!("WireGuard interface without peers: {host:#?}");

// remove interface
wgapi.remove_interface()?;
Expand Down
2 changes: 1 addition & 1 deletion src/host.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ impl Peer {
}

/// WireGuard host representation.
#[derive(Debug, Default)]
#[derive(Debug, Default, Clone)]
pub struct Host {
pub listen_port: u16,
pub private_key: Option<Key>,
Expand Down
1 change: 1 addition & 0 deletions src/wgapi_freebsd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use std::{process::Command, str::FromStr};
/// Manages interfaces created with FreeBSD kernel WireGuard module.
///
/// Requires FreeBSD version 14+.
#[derive(Clone)]
pub struct WireguardApiFreebsd {
ifname: String,
}
Expand Down
1 change: 1 addition & 0 deletions src/wgapi_linux.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use std::str::FromStr;
///
/// Communicates with kernel module using `Netlink` IPC protocol.
/// Requires Linux kernel version 5.6+.
#[derive(Clone)]
pub struct WireguardApiLinux {
ifname: String,
}
Expand Down
1 change: 1 addition & 0 deletions src/wgapi_userspace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ const USERSPACE_EXECUTABLE: &str = "wireguard-go";
///
/// We assume that `wireguard-go` executable is managed externally and available in `PATH`.
/// Currently works on Unix platforms.
#[derive(Clone)]
pub struct WireguardApiUserspace {
ifname: String,
}
Expand Down

0 comments on commit a11893a

Please sign in to comment.