wireguard-uapi 3.0.1

Control WireGuard interfaces.
Documentation
#[cfg(target_os = "linux")]
use {
    colored::*,
    wireguard_uapi::get::{AllowedIp, Device, Peer},
};

fn main() -> anyhow::Result<()> {
    #[cfg(target_os = "linux")]
    return main_linux();

    #[cfg(not(target_os = "linux"))]
    return Err(anyhow::anyhow!("This binary only runs on Linux"));
}

#[cfg(target_os = "linux")]
fn main_linux() -> anyhow::Result<()> {
    let device_names = wireguard_uapi::RouteSocket::connect()?.list_device_names()?;

    let mut wg = wireguard_uapi::WgSocket::connect()?;
    for device_name in &device_names {
        let device = wg.get_device(wireguard_uapi::DeviceInterface::from_name(device_name))?;
        print_device(&device);

        if Some(device_name) != device_names.last() {
            println!();
        }
    }

    Ok(())
}

#[cfg(target_os = "linux")]
fn print_device(device: &Device) {
    println!("{}: {}", "interface".green(), device.ifname.green());
    if let Some(public_key) = &device.public_key {
        println!(
            "  {}: {}",
            "public key".black().bold(),
            base64::encode(public_key)
        );
    }

    if device.listen_port != 0 {
        println!("  {}: {}", "listen port".black().bold(), device.listen_port);
    }

    for peer in &device.peers {
        println!();
        print_peer(peer);
    }
}

#[cfg(target_os = "linux")]
fn print_peer(peer: &Peer) {
    println!(
        "{}: {}",
        "peer".yellow(),
        base64::encode(peer.public_key).yellow()
    );
    if let Some(endpoint) = peer.endpoint {
        println!("  {}: {}", "endpoint".black().bold(), endpoint);
    }

    print!("  {}: ", "allowed ips".black().bold());
    for (i, allowed_ip) in peer.allowed_ips.iter().enumerate() {
        print_allowed_ip(allowed_ip);
        if i < peer.allowed_ips.len() - 1 {
            print!(", ");
        }
    }
    println!();
}

#[cfg(target_os = "linux")]
fn print_allowed_ip(allowed_ip: &AllowedIp) {
    print!(
        "{}{}{}",
        allowed_ip.ipaddr,
        "/".cyan(),
        allowed_ip.cidr_mask
    );
}