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}