interface-rs 0.2.10

Library for reading and writing Linux interfaces(5) files
Documentation
# interface-rs

[![Crates.io](https://img.shields.io/crates/v/interface-rs.svg)](https://crates.io/crates/interface-rs)
[![Documentation](https://docs.rs/interface-rs/badge.svg)](https://docs.rs/interface-rs)
[![License](https://img.shields.io/crates/l/interface-rs.svg)](https://github.com/wiggels/interface-rs/blob/main/LICENSE)

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.

---

## Table of Contents

- [Features]#features
- [Installation]#installation
- [Usage]#usage
  - [Loading Interfaces]#loading-interfaces
  - [Retrieving an Interface]#retrieving-an-interface
  - [Adding a New Interface]#adding-a-new-interface
  - [Modifying an Existing Interface]#modifying-an-existing-interface
  - [Deleting an Interface]#deleting-an-interface
  - [Saving Changes]#saving-changes
- [Documentation]#documentation
- [Contributing]#contributing
- [License]#license
- [Acknowledgments]#acknowledgments

---

## Features

- **Load and parse** existing configurations from an `interfaces(5)` file.
- **Modify** network interface configurations programmatically.
- **Add or remove** network interfaces.
- **Save** changes back to the file system.
- **Fluent API** using the builder pattern for creating and modifying interfaces.
- **Display** interfaces in the correct `interfaces(5)` file format.

---

## Installation

Add `interface-rs` to your `Cargo.toml`:

```toml
[dependencies]
interface-rs = "0.2.0"
```

Then run:

```shell
cargo build
```

---

## Usage

### Loading Interfaces

```rust
use interface_rs::NetworkInterfaces;

fn main() -> std::io::Result<()> {
    // Load the interfaces file
    let net_ifaces = NetworkInterfaces::load("/path/to/interfaces")?;

    // Iterate over interfaces
    for iface in net_ifaces.interfaces.values() {
        println!("Found interface: {}", iface.name);
    }

    Ok(())
}
```

### Retrieving an Interface

```rust
use interface_rs::NetworkInterfaces;

fn main() -> std::io::Result<()> {
    let net_ifaces = NetworkInterfaces::load("/path/to/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(())
}
```

### Adding a New Interface

```rust
use interface_rs::NetworkInterfaces;
use interface_rs::interface::{Interface, Family};

fn main() -> std::io::Result<()> {
    let mut net_ifaces = NetworkInterfaces::load("/path/to/interfaces")?;

    // Create a new interface using the builder pattern
    let new_iface = Interface::builder("swp1")
        .with_auto(true)
        .with_allow("hotplug")
        .with_family(Family::Inet)
        .with_method("static")
        .with_option("address", "192.168.100.1")
        .with_option("netmask", "255.255.255.0")
        .build();

    // Add the new interface to the collection
    net_ifaces.add_interface(new_iface);

    // Save changes back to the file
    net_ifaces.save()?;

    Ok(())
}
```

### Modifying an Existing Interface

```rust
use interface_rs::NetworkInterfaces;
use interface_rs::interface::{Interface, Family};

fn main() -> std::io::Result<()> {
    let mut net_ifaces = NetworkInterfaces::load("/path/to/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("static")
            .with_option("address", "192.168.1.50")
            .with_option("netmask", "255.255.255.0")
            .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(())
}
```

### Deleting an Interface

```rust
use interface_rs::NetworkInterfaces;

fn main() -> std::io::Result<()> {
    let mut net_ifaces = NetworkInterfaces::load("/path/to/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(())
}
```

### Saving Changes

```rust
use interface_rs::NetworkInterfaces;

fn main() -> std::io::Result<()> {
    let mut net_ifaces = NetworkInterfaces::load("/path/to/interfaces")?;

    // Make changes to interfaces...

    // Save changes back to the file
    net_ifaces.save()?;

    println!("Changes saved successfully.");

    Ok(())
}
```

---

## Documentation

For more detailed information, please refer to the [API documentation](https://docs.rs/interface-rs).

---

## Contributing

Contributions are welcome! If you'd like to contribute to `interface-rs`, please follow these steps:

1. **Fork** the repository on GitHub.
2. **Clone** your forked repository locally.
3. **Create** a new branch for your feature or bugfix.
4. **Commit** your changes with clear and descriptive messages.
5. **Push** your changes to your fork.
6. **Submit** a Pull Request to the `main` branch of the original repository.

Please ensure your code adheres to the project's coding standards and includes appropriate tests.

---

## License

This project is licensed under the MIT License. See the [LICENSE](https://github.com/wiggels/interface-rs/blob/main/LICENSE) file for details.

---

## Acknowledgments

- Inspired by the need for programmatically managing network interface configurations on Debian-based systems.
- Thanks to the Rust community for their excellent tools and documentation.

---

**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](https://github.com/wiggels/interface-rs).

---