This crate provides methods to manipulate networking resources (links, addresses, arp tables,
route tables) via the netlink protocol.
It can be used on its own for simple needs, but it is possible to tweak any netlink request.
See this link creation snippet for example.
Example: listing links
extern crate futures;
extern crate iproute2;
extern crate tokio_core;
use futures::Future;
use iproute2::new_connection;
use tokio_core::reactor::Core;
fn main() {
let (connection, handle) = new_connection().unwrap();
let mut core = Core::new().unwrap();
core.handle().spawn(connection.map_err(|_| ()));
let request = handle.link().get().execute().and_then(|links| {
println!("{:#?}", links);
Ok(())
});
core.run(request).unwrap();
}
Example: creating a veth pair
extern crate futures;
extern crate iproute2;
extern crate tokio_core;
use std::thread::spawn;
use futures::Future;
use tokio_core::reactor::Core;
use iproute2::new_connection;
fn main() {
let (connection, handle) = new_connection().unwrap();
spawn(move || Core::new().unwrap().run(connection));
handle
.link()
.add()
.veth("veth-rs-1".into(), "veth-rs-2".into())
.execute()
.wait()
.unwrap();
}
Example: deleting a link by name
extern crate futures;
extern crate iproute2;
extern crate tokio_core;
use std::env;
use std::thread::spawn;
use futures::Future;
use tokio_core::reactor::Core;
use iproute2::new_connection;
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() != 2 { panic!("expected one link name as argument"); }
let link_name = &args[1];
let (connection, handle) = new_connection().unwrap();
spawn(move || Core::new().unwrap().run(connection));
let links = handle.link().get().execute().wait().unwrap();
for link in links {
if link.name().unwrap() == link_name {
handle.link().del(link.index()).execute().wait().unwrap();
}
}
}