usage/
usage.rs

1use std::fs;
2use std::net::IpAddr;
3
4use ipset::types::{AddOption, BitmapIp, EnvOption, Error, HashIp, IpDataType, ListResult};
5use ipset::{IPSet, Session};
6
7fn test_hash_ip() -> Result<(), Error> {
8    let mut session: Session<HashIp> = Session::new("test".to_string());
9    if session.exists()? {
10        println!("already exists destroy now");
11        session.destroy()?;
12    }
13
14    let ip: IpAddr = "192.168.3.1".parse()?;
15    session.create(|builder| {
16        builder
17            .with_ipv6(false)?
18            .with_forceadd()?
19            .with_counters()?
20            .with_skbinfo()?
21            .with_comment()?
22            .build()
23    })?;
24
25    let ret = session.add(ip, &[])?;
26    println!("add {}", ret);
27
28    session.set_option(EnvOption::Exist);
29    let ret = session.add(
30        ip,
31        &[
32            AddOption::Bytes(10),
33            AddOption::Packets(20),
34            AddOption::SkbMark(1, u32::MAX),
35            AddOption::SkbPrio(10, 1),
36            AddOption::SkbQueue(3),
37            AddOption::Comment("hello".to_string()),
38        ],
39    )?;
40    session.unset_option(EnvOption::Exist);
41    println!("add {}", ret);
42
43    let exists = session.test(ip)?;
44    println!("test {}", exists);
45
46    let ips = session.list()?;
47    match ips {
48        ListResult::Normal(ret) => {
49            println!("name:{}, type:{}, revision:{}, size_in_memory:{}, references:{}, entry_size:{}, header:{:?}",
50                     ret.name, ret.typ, ret.revision, ret.size_in_memory, ret.references, ret.entry_size, ret.header)
51        }
52        ListResult::Terse(names) => {
53            println!("{:?}", names);
54        }
55    }
56    session.set_option(EnvOption::ListSetName);
57    let ips = session.list()?;
58    session.unset_option(EnvOption::ListSetName);
59    match ips {
60        ListResult::Normal(ret) => {
61            println!("name:{}, type:{}, revision:{}, size_in_memory:{}, references:{}, entry_size:{}, header:{:?}",
62                     ret.name, ret.typ, ret.revision, ret.size_in_memory, ret.references, ret.entry_size, ret.header)
63        }
64        ListResult::Terse(names) => {
65            println!("{:?}", names);
66        }
67    }
68
69    let ret = session.save("test.ipset".to_string())?;
70    println!("save {}", ret);
71
72    let ret = session.del(ip)?;
73    println!("del {}", ret);
74
75    let ret = session.flush()?;
76    println!("flush {}", ret);
77
78    let ret = session.destroy()?;
79    println!("destroy {}", ret);
80
81    Ok(())
82}
83
84fn test_bitmap_ip() -> Result<(), Error> {
85    let mut session: Session<BitmapIp> = Session::new("test".into());
86    let _ = session.destroy();
87    let from: IpAddr = "192.168.3.1".parse()?;
88    let to: IpAddr = "192.168.3.255".parse()?;
89    let from: IpDataType = from.into();
90    let to: IpDataType = to.into();
91    session.create(|builder| builder.with_range(&from, &to)?.build())?;
92    session.destroy()?;
93    Ok(())
94}
95
96fn main() {
97    if let Err(err) = test_hash_ip() {
98        println!("test hash ip failed:{:?}", err);
99    }
100
101    if let Err(err) = test_bitmap_ip() {
102        println!("test bitmap failed:{:?}", err);
103    }
104
105    if fs::metadata("test.ipset").is_ok() {
106        let set = IPSet::new();
107        set.restore("test.ipset".to_string()).unwrap();
108        println!("restore ok");
109        fs::remove_file("test.ipset").unwrap();
110    } else {
111        println!("test.ipset not found");
112    }
113}