use std::fs;
use std::net::IpAddr;
use ipset::types::{AddOption, BitmapIp, EnvOption, Error, HashIp, IpDataType, ListResult};
use ipset::{IPSet, Session};
fn test_hash_ip() -> Result<(), Error> {
let mut session: Session<HashIp> = Session::new("test".to_string());
if session.exists()? {
println!("already exists destroy now");
session.destroy()?;
}
let ip: IpAddr = "192.168.3.1".parse()?;
session.create(|builder| {
builder
.with_ipv6(false)?
.with_forceadd()?
.with_counters()?
.with_skbinfo()?
.with_comment()?
.build()
})?;
let ret = session.add(ip, &[])?;
println!("add {}", ret);
session.set_option(EnvOption::Exist);
let ret = session.add(
ip,
&[
AddOption::Bytes(10),
AddOption::Packets(20),
AddOption::SkbMark(1, u32::MAX),
AddOption::SkbPrio(10, 1),
AddOption::SkbQueue(3),
AddOption::Comment("hello".to_string()),
],
)?;
session.unset_option(EnvOption::Exist);
println!("add {}", ret);
let exists = session.test(ip)?;
println!("test {}", exists);
let ips = session.list()?;
match ips {
ListResult::Normal(ret) => {
println!("name:{}, type:{}, revision:{}, size_in_memory:{}, references:{}, entry_size:{}, header:{:?}",
ret.name, ret.typ, ret.revision, ret.size_in_memory, ret.references, ret.entry_size, ret.header)
}
ListResult::Terse(names) => {
println!("{:?}", names);
}
}
session.set_option(EnvOption::ListSetName);
let ips = session.list()?;
session.unset_option(EnvOption::ListSetName);
match ips {
ListResult::Normal(ret) => {
println!("name:{}, type:{}, revision:{}, size_in_memory:{}, references:{}, entry_size:{}, header:{:?}",
ret.name, ret.typ, ret.revision, ret.size_in_memory, ret.references, ret.entry_size, ret.header)
}
ListResult::Terse(names) => {
println!("{:?}", names);
}
}
let ret = session.save("test.ipset".to_string())?;
println!("save {}", ret);
let ret = session.del(ip)?;
println!("del {}", ret);
let ret = session.flush()?;
println!("flush {}", ret);
let ret = session.destroy()?;
println!("destroy {}", ret);
Ok(())
}
fn test_bitmap_ip() -> Result<(), Error> {
let mut session: Session<BitmapIp> = Session::new("test".into());
let _ = session.destroy();
let from: IpAddr = "192.168.3.1".parse()?;
let to: IpAddr = "192.168.3.255".parse()?;
let from: IpDataType = from.into();
let to: IpDataType = to.into();
session.create(|builder| builder.with_range(&from, &to)?.build())?;
session.destroy()?;
Ok(())
}
fn main() {
if let Err(err) = test_hash_ip() {
println!("test hash ip failed:{:?}", err);
}
if let Err(err) = test_bitmap_ip() {
println!("test bitmap failed:{:?}", err);
}
if fs::metadata("test.ipset").is_ok() {
let set = IPSet::new();
set.restore("test.ipset".to_string()).unwrap();
println!("restore ok");
fs::remove_file("test.ipset").unwrap();
} else {
println!("test.ipset not found");
}
}