| Crates.io | interface-rs |
| lib.rs | interface-rs |
| version | 0.3.0 |
| created_at | 2024-08-24 04:36:01.528236+00 |
| updated_at | 2026-01-15 06:14:27.059056+00 |
| description | Library for reading and writing Linux interfaces(5) files |
| homepage | https://interface-rs.com |
| repository | https://github.com/wiggels/interface-rs |
| max_upload_size | |
| id | 1349811 |
| size | 105,156 |
A Rust library for parsing and manipulating an interfaces(5) file.
This library provides structs and functions to load, parse, modify, and save network interface configurations in the Debian-style interfaces(5) file format. The interfaces(5) file is typically found at /etc/network/interfaces on Debian-based systems but may be located elsewhere depending on your system configuration.
interfaces(5) file.interfaces(5) file format.Family), configuration methods (Method), and interface options (InterfaceOption).Add interface-rs to your Cargo.toml:
[dependencies]
interface-rs = "0.2"
Then run:
cargo build
use interface_rs::NetworkInterfaces;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Load the interfaces file
let net_ifaces = NetworkInterfaces::load("/etc/network/interfaces")?;
// Iterate over interfaces
for (name, iface) in net_ifaces.iter() {
println!("Found interface: {}", name);
}
Ok(())
}
use interface_rs::NetworkInterfaces;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let net_ifaces = NetworkInterfaces::load("/etc/network/interfaces")?;
// Get a specific interface
if let Some(iface) = net_ifaces.get_interface("eth0") {
println!("Interface {} found.", iface.name);
println!("Auto: {}", iface.auto);
println!("Method: {:?}", iface.method);
} else {
println!("Interface eth0 not found.");
}
Ok(())
}
use interface_rs::NetworkInterfaces;
use interface_rs::interface::{Interface, Family, Method, InterfaceOption};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut net_ifaces = NetworkInterfaces::load("/etc/network/interfaces")?;
// Create a new interface using the builder pattern with typed options
let new_iface = Interface::builder("swp1")
.with_auto(true)
.with_allow("hotplug")
.with_family(Family::Inet)
.with_method(Method::Static)
.with_typed_option(InterfaceOption::Address("192.168.100.1".to_string()))
.with_typed_option(InterfaceOption::Netmask("255.255.255.0".to_string()))
.build();
// Add the new interface to the collection
net_ifaces.add_interface(new_iface);
// Save changes back to the file
net_ifaces.save()?;
Ok(())
}
use interface_rs::NetworkInterfaces;
use interface_rs::interface::{Interface, Family, Method, InterfaceOption};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut net_ifaces = NetworkInterfaces::load("/etc/network/interfaces")?;
// Retrieve and modify an existing interface using the builder pattern
if let Some(iface) = net_ifaces.get_interface("eth0") {
let modified_iface = iface.edit()
.with_method(Method::Static)
.with_typed_option(InterfaceOption::Address("192.168.1.50".to_string()))
.with_typed_option(InterfaceOption::Netmask("255.255.255.0".to_string()))
.build();
// Replace the existing interface with the modified one
net_ifaces.add_interface(modified_iface);
// Save changes back to the file
net_ifaces.save()?;
} else {
println!("Interface eth0 not found.");
}
Ok(())
}
use interface_rs::NetworkInterfaces;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut net_ifaces = NetworkInterfaces::load("/etc/network/interfaces")?;
// Delete an interface by name
net_ifaces.delete_interface("eth0");
// Save changes back to the file
net_ifaces.save()?;
println!("Interface eth0 has been deleted.");
Ok(())
}
use interface_rs::NetworkInterfaces;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut net_ifaces = NetworkInterfaces::load("/etc/network/interfaces")?;
// Make changes to interfaces...
// Save changes back to the file
net_ifaces.save()?;
println!("Changes saved successfully.");
Ok(())
}
The library supports all standard address families defined in interfaces(5):
Family::Inet - IPv4 networkingFamily::Inet6 - IPv6 networkingFamily::IpX - IPX networkingFamily::Can - CAN (Controller Area Network)Common methods are provided as enum variants for type safety:
Method::Static - Static IP configurationMethod::Dhcp - DHCP client configurationMethod::Loopback - Loopback interfaceMethod::Manual - Manual configurationMethod::Other(String) - Any other method (e.g., ppp, tunnel, bootp)The InterfaceOption enum provides strongly-typed variants for common interface options:
InterfaceOption::Address(String) - IP addressInterfaceOption::Netmask(String) - Network maskInterfaceOption::Gateway(String) - Default gatewayInterfaceOption::Mtu(u16) - Maximum Transmission UnitInterfaceOption::BridgePorts(Vec<String>) - Bridge member portsInterfaceOption::BridgeVlanAware(bool) - VLAN-aware bridge settingInterfaceOption::VlanId(u16) - VLAN IDInterfaceOption::Vrf(String) - VRF nameInterfaceOption::PostUp(String) - Post-up scriptInterfaceOption::PreDown(String) - Pre-down scriptInterfaceOption::Other(String, String) - Any other option as key-value pairFor more detailed information, please refer to the API documentation.
Contributions are welcome! If you'd like to contribute to interface-rs, please follow these steps:
main branch of the original repository.Please ensure your code adheres to the project's coding standards and includes appropriate tests.
This project is licensed under the MIT License. See the LICENSE file for details.
Note: This library is intended for use on systems that utilize the Debian-style interfaces(5) file format. It may not be compatible with other network configuration systems.
For any issues or feature requests, please open an issue on the GitHub repository.