Last active 2 months ago

gistfile1.txt Raw
1function rule::apply() {
2 local rule_name="$1"
3 local client_ip="$2"
4
5 rule::require_exists "$rule_name" || return 1
6
7 # Check if already applied
8 local peer_name
9 peer_name=$(peers::find_by_ip "$client_ip")
10 if [[ -n "$peer_name" ]]; then
11 # Check if already applied via iptables
12 if rule::is_applied "$rule_name" "$client_ip"; then
13 log::wg "Rule '${rule_name}' already applied to: ${client_ip}"
14 return 0
15 fi
16 fi
17
18 local rule_file
19 rule_file="$(ctx::rule::path "${rule_name}.rule")"
20
21 # Process block_ips
22 while IFS= read -r ip; do
23 [[ -z "$ip" ]] && continue
24 firewall::block_ip "$client_ip" "$ip"
25 done < <(rule::get "$rule_name" "block_ips")
26
27 # Process block_ports
28 while IFS= read -r entry; do
29 [[ -z "$entry" ]] && continue
30 local target port proto
31 IFS=":" read -r target port proto <<< "$entry"
32 proto="${proto:-tcp}"
33 firewall::block_port "$client_ip" "$target" "$port" "$proto"
34 done < <(rule::get "$rule_name" "block_ports")
35
36 # Process allow_ips (inserted before blocks)
37 while IFS= read -r ip; do
38 [[ -z "$ip" ]] && continue
39 firewall::allow_ip "$client_ip" "$ip"
40 done < <(rule::get "$rule_name" "allow_ips")
41
42 # allow_ports (inserted last = highest priority)
43 while IFS= read -r entry; do
44 [[ -z "$entry" ]] && continue
45 local target port proto
46 IFS=":" read -r target port proto <<< "$entry"
47 proto="${proto:-tcp}"
48 firewall::allow_port "$client_ip" "$target" "$port" "$proto"
49 done < <(rule::get "$rule_name" "allow_ports")
50
51 # Persist rule assignment in meta
52 log::debug "rule::apply: peer_name=$peer_name ip=$client_ip"
53 if [[ -n "$peer_name" ]]; then
54 peers::set_meta "$peer_name" "rule" "$rule_name"
55 log::debug "rule::apply: set meta rule=$rule_name for $peer_name"
56 fi
57
58 local dns_redirect
59 dns_redirect=$(rule::get "$rule_name" "dns_redirect")
60
61 if [[ "$dns_redirect" == "true" ]]; then
62 local subnet
63 subnet=$(config::subnet_for "$(peers::get_meta "$peer_name" "subtype")")
64 rule::apply_dns_redirect "${subnet}.0/24"
65 fi
66
67 log::wg_preset "Applied rule '${rule_name}' to: ${client_ip}"
68}