fix: Fix UCI rule deletion to handle index shifting in WAN access

When deleting multiple UCI firewall rules by index, the indices shift
after each deletion. The previous method using section names didn't
work reliably with fw4's anonymous rules.

New approach uses a while loop that:
- Iterates through rules by index
- Deletes matching rule and restarts from beginning
- Continues until no matching rules found

This ensures all secubox_wan_* rules are properly removed before
reapplying new ones.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
CyberMind-FR 2026-01-08 17:34:38 +01:00
parent 4eaf1cb27f
commit bb4ba0e217

View File

@ -12,16 +12,24 @@ RULE_PREFIX="secubox_wan"
# Remove all SecuBox WAN access rules from UCI # Remove all SecuBox WAN access rules from UCI
remove_uci_rules() { remove_uci_rules() {
local changed=0 local changed=0
local sections=""
# Find all secubox_wan rules by name # Keep removing rules until none left (indices shift after each delete)
sections=$(uci show firewall 2>/dev/null | grep "\.name='${RULE_PREFIX}" | cut -d. -f2 | cut -d= -f1) while true; do
local found=0
local i=0
while true; do
local name=$(uci -q get firewall.@rule[$i].name 2>/dev/null)
[ -z "$name" ] && break
for section in $sections; do if echo "$name" | grep -q "^${RULE_PREFIX}"; then
[ -n "$section" ] && { uci delete "firewall.@rule[$i]" 2>/dev/null
uci delete "firewall.$section" 2>/dev/null changed=1
changed=1 found=1
} break # Restart from beginning since indices shifted
fi
i=$((i + 1))
done
[ "$found" -eq 0 ] && break
done done
[ "$changed" -eq 1 ] && uci commit firewall [ "$changed" -eq 1 ] && uci commit firewall