blob: c59cc56d20b893e92736d7098d6bc84c96bee8ca (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
#!/bin/bash
# NFT_TEST_REQUIRES(NFT_TEST_HAVE_reset_set)
set -e
trap '[[ $? -eq 0 ]] || echo FAIL' EXIT
RULESET="table t {
set s {
type ipv4_addr . inet_proto . inet_service
flags interval, timeout
counter
timeout 30m
elements = {
1.0.0.1 . udp . 53 counter packets 5 bytes 30 expires 20m,
2.0.0.2 . tcp . 22 counter packets 10 bytes 100 timeout 15m expires 10m
}
}
set s2 {
type ipv4_addr
flags interval, timeout
counter
timeout 30m
elements = {
1.0.0.1 counter packets 5 bytes 30 expires 20m,
1.0.1.1-1.0.1.10 counter packets 5 bytes 30 expires 20m,
2.0.0.2 counter packets 10 bytes 100 timeout 15m expires 10m
}
}
map m {
type ipv4_addr : ipv4_addr
quota 50 bytes
elements = {
1.2.3.4 quota 50 bytes used 10 bytes : 10.2.3.4,
5.6.7.8 quota 100 bytes used 50 bytes : 50.6.7.8
}
}
map m1 {
type ipv4_addr : ipv4_addr
counter
timeout 30m
elements = {
1.2.3.4 counter packets 5 bytes 30 expires 20m : 10.2.3.4,
5.6.7.8 counter packets 10 bytes 100 timeout 15m expires 10m : 50.6.7.8
}
}
map m2 {
type ipv4_addr : ipv4_addr
flags interval, timeout
counter
timeout 30m
elements = {
1.2.3.4-1.2.3.10 counter packets 5 bytes 30 expires 20m : 10.2.3.4,
5.6.7.8-5.6.7.10 counter packets 10 bytes 100 timeout 15m expires 10m : 50.6.7.8
}
}
}"
echo -n "applying test ruleset: "
$NFT -f - <<< "$RULESET"
echo OK
drop_seconds() {
sed 's/[0-9]\+m\?s//g'
}
expires_minutes() {
sed -n 's/.*expires \([0-9]*\)m.*/\1/p'
}
get_and_reset()
{
local setname="$1"
local key="$2"
echo -n "get set elem matches reset set elem in set $setname: "
elem="element t $setname { $key }"
echo $NFT get $elem
$NFT get $elem
[[ $($NFT "get $elem ; reset $elem" | \
grep 'elements = ' | drop_seconds | uniq | wc -l) == 1 ]]
echo OK
echo -n "counters are reset, expiry left alone in set $setname: "
NEW=$($NFT "get $elem")
echo NEW $NEW
grep -q 'counter packets 0 bytes 0' <<< "$NEW"
[[ $(expires_minutes <<< "$NEW") -lt 20 ]]
echo OK
}
get_and_reset "s" "1.0.0.1 . udp . 53"
get_and_reset "s2" "1.0.0.1"
get_and_reset "s2" "1.0.1.1-1.0.1.10"
get_and_reset "m1" "1.2.3.4"
get_and_reset "m2" "1.2.3.4-1.2.3.10"
echo -n "get map elem matches reset map elem: "
elem='element t m { 1.2.3.4 }'
[[ $($NFT "get $elem ; reset $elem" | \
grep 'elements = ' | uniq | wc -l) == 1 ]]
echo OK
echo -n "quota value is reset: "
$NFT get element t m '{ 1.2.3.4 }' | grep -q 'quota 50 bytes : 10.2.3.4'
echo OK
echo -n "other elements remain the same: "
OUT=$($NFT get element t s '{ 2.0.0.2 . tcp . 22 }')
grep -q 'counter packets 10 bytes 100 timeout 15m' <<< "$OUT"
VAL=$(expires_minutes <<< "$OUT")
[[ $val -lt 10 ]]
$NFT get element t m '{ 5.6.7.8 }' | grep -q 'quota 100 bytes used 50 bytes'
echo OK
echo -n "list set matches reset set: "
EXP=$($NFT list set t s | drop_seconds)
OUT=$($NFT reset set t s | drop_seconds)
$DIFF -u <(echo "$EXP") <(echo "$OUT")
echo OK
echo -n "list map matches reset map: "
EXP=$($NFT list map t m)
OUT=$($NFT reset map t m)
$DIFF -u <(echo "$EXP") <(echo "$OUT")
echo OK
echo -n "remaining elements are reset: "
OUT=$($NFT list ruleset)
grep -q '2.0.0.2 . tcp . 22 counter packets 0 bytes 0' <<< "$OUT"
grep -q '5.6.7.8 quota 100 bytes : 50.6.7.8' <<< "$OUT"
echo OK
|