4 releases

0.2.1 Jan 11, 2025
0.2.0 Apr 7, 2024
0.1.1 Nov 1, 2023
0.1.0 Aug 5, 2023

#1716 in Network programming

Download history 21/week @ 2024-10-20 76/week @ 2024-10-27 17/week @ 2024-11-03 1/week @ 2024-11-10 10/week @ 2024-11-17 43/week @ 2024-11-24 11/week @ 2024-12-01 35/week @ 2024-12-08 4/week @ 2024-12-15 74/week @ 2024-12-22 49/week @ 2024-12-29 75/week @ 2025-01-05 78/week @ 2025-01-12 41/week @ 2025-01-19 5/week @ 2025-01-26 11/week @ 2025-02-02

203 downloads per month
Used in upnp-daemon

WTFPL license

18KB
162 lines

easy-upnp

badge github badge crates.io badge docs.rs badge license

Easily open and close UPnP ports.

A minimalistic wrapper around IGD to open and close network ports via UPnP. Mainly this library is used in the CLI application upnp-daemon, but it can also be used as a library in other crates that just want to open and close ports with minimal possible configuration.

Example

Here is a hands-on example to demonstrate the usage. It will add some ports and immediately remove them again.

use std::error::Error;
use log::error;
use easy_upnp::{add_ports, delete_ports, Ipv4Cidr, PortMappingProtocol, UpnpConfig};

fn get_configs() -> Result<[UpnpConfig; 3], Box<dyn Error>> {
    let config_no_address = UpnpConfig {
        address: None,
        port: 80,
        protocol: PortMappingProtocol::TCP,
        duration: 3600,
        comment: "Webserver".to_string(),
    };

    let config_specific_address = UpnpConfig {
        address: Some(Ipv4Cidr::from_str("192.168.0.10/24")?),
        port: 8080,
        protocol: PortMappingProtocol::TCP,
        duration: 3600,
        comment: "Webserver alternative".to_string(),
    };

    let config_address_range = UpnpConfig {
        address: Some(Ipv4Cidr::from_str("192.168.0")?),
        port: 8081,
        protocol: PortMappingProtocol::TCP,
        duration: 3600,
        comment: "Webserver second alternative".to_string(),
    };

    Ok([
        config_no_address,
        config_specific_address,
        config_address_range,
    ])
}

fn main() -> Result<(), Box<dyn Error>> {
    for result in add_ports(get_configs()?) {
        if let Err(err) = result {
            error!("{}", err);
        }
    }

    for result in delete_ports(get_configs()?) {
        if let Err(err) = result {
            error!("{}", err);
        }
    }

    Ok(())
}

Dependencies

~6–8.5MB
~151K SLoC