@@ -15,28 +15,56 @@ root=$(cd "$(dirname "$0")/.." && pwd)
1515group=" localai-test-$$ "
1616cgroup=" /sys/fs/cgroup/$group "
1717parent_cgroup=" /sys/fs/cgroup$( awk -F: ' $1 == "0" {print $3}' /proc/self/cgroup) "
18+ chain=" LAI_TEST_$$ "
1819
1920sudo mkdir " $cgroup "
2021cleanup () {
2122 echo $$ | sudo tee " $parent_cgroup /cgroup.procs" > /dev/null 2>&1 || true
22- sudo iptables -D OUTPUT -m cgroup --path " $group " -j REJECT 2> /dev/null || true
23- sudo iptables -D OUTPUT -m cgroup --path " $group " -d 192.168.0.0/16 -j ACCEPT 2> /dev/null || true
24- sudo iptables -D OUTPUT -m cgroup --path " $group " -d 172.16.0.0/12 -j ACCEPT 2> /dev/null || true
25- sudo iptables -D OUTPUT -m cgroup --path " $group " -d 10.0.0.0/8 -j ACCEPT 2> /dev/null || true
26- sudo iptables -D OUTPUT -m cgroup --path " $group " -d 127.0.0.0/8 -j ACCEPT 2> /dev/null || true
27- sudo ip6tables -D OUTPUT -m cgroup --path " $group " -d ::1/128 -j ACCEPT 2> /dev/null || true
28- sudo ip6tables -D OUTPUT -m cgroup --path " $group " -j REJECT 2> /dev/null || true
23+ sudo iptables -D OUTPUT -m cgroup --path " $group " -j " $chain " 2> /dev/null || true
24+ sudo iptables -F " $chain " 2> /dev/null || true
25+ sudo iptables -X " $chain " 2> /dev/null || true
26+ sudo ip6tables -D OUTPUT -m cgroup --path " $group " -j " $chain " 2> /dev/null || true
27+ sudo ip6tables -F " $chain " 2> /dev/null || true
28+ sudo ip6tables -X " $chain " 2> /dev/null || true
2929 sudo rmdir " $cgroup " 2> /dev/null || true
3030}
3131trap cleanup EXIT INT TERM
3232
33- sudo iptables -I OUTPUT 1 -m cgroup --path " $group " -j REJECT
34- sudo iptables -I OUTPUT 1 -m cgroup --path " $group " -d 192.168.0.0/16 -j ACCEPT
35- sudo iptables -I OUTPUT 1 -m cgroup --path " $group " -d 172.16.0.0/12 -j ACCEPT
36- sudo iptables -I OUTPUT 1 -m cgroup --path " $group " -d 10.0.0.0/8 -j ACCEPT
37- sudo iptables -I OUTPUT 1 -m cgroup --path " $group " -d 127.0.0.0/8 -j ACCEPT
38- sudo ip6tables -I OUTPUT 1 -m cgroup --path " $group " -j REJECT
39- sudo ip6tables -I OUTPUT 1 -m cgroup --path " $group " -d ::1/128 -j ACCEPT
33+ sudo iptables -N " $chain "
34+ sudo iptables -A " $chain " -d 127.0.0.0/8 -j ACCEPT
35+ sudo iptables -A " $chain " -d 10.0.0.0/8 -j ACCEPT
36+ sudo iptables -A " $chain " -d 172.16.0.0/12 -j ACCEPT
37+ sudo iptables -A " $chain " -d 192.168.0.0/16 -j ACCEPT
38+ sudo iptables -A " $chain " -j REJECT
39+ sudo iptables -I OUTPUT 1 -m cgroup --path " $group " -j " $chain "
40+
41+ sudo ip6tables -N " $chain "
42+ sudo ip6tables -A " $chain " -d ::1/128 -j ACCEPT
43+ sudo ip6tables -A " $chain " -j REJECT
44+ sudo ip6tables -I OUTPUT 1 -m cgroup --path " $group " -j " $chain "
4045echo $$ | sudo tee " $cgroup /cgroup.procs" > /dev/null
4146
47+ set +e
4248LOCALAI_TEST_KERNEL_ACTIVE=1 " $root /scripts/run-test-offline.sh" " $@ "
49+ command_status=$?
50+ set -e
51+
52+ # The final rule in each private chain is the external-egress REJECT. Reading
53+ # its counter makes even an optional probe that swallows its network error a
54+ # hard, visible test failure. Report aggregate counters only: packet-by-packet
55+ # kernel logging can itself exhaust CI logs when a client retries aggressively.
56+ ipv4_blocked=$( sudo iptables -L " $chain " -v -x -n | awk ' $3 == "REJECT" { print $1; exit }' )
57+ ipv6_blocked=$( sudo ip6tables -L " $chain " -v -x -n | awk ' $3 == "REJECT" { print $1; exit }' )
58+ ipv4_blocked=${ipv4_blocked:- 0}
59+ ipv6_blocked=${ipv6_blocked:- 0}
60+
61+ if (( ipv4 _blocked > 0 || ipv6 _blocked > 0 )) ; then
62+ {
63+ echo ' offline-test: external network access was attempted and blocked'
64+ echo " offline-test: blocked packets: ipv4=$ipv4_blocked ipv6=$ipv6_blocked "
65+ echo ' offline-test: replace real network clients with fixtures or injected test doubles'
66+ } >&2
67+ exit 1
68+ fi
69+
70+ exit " $command_status "
0 commit comments