[package] firewall: make invalid redirects and duplicate zones non-fatal, print a...
[openwrt/svn-archive/archive.git] / package / firewall / files / lib / core.sh
index 3fd98d1602ecac2aa986ea80979dc77022d43095..c383597810e38703c7e4ebe95eb1ed4610708df2 100644 (file)
@@ -14,6 +14,7 @@ fw_start() {
                echo "firewall already loaded" >&2
                exit 1
        }
+
        uci_set_state firewall core "" firewall_state
 
        fw_clear DROP
@@ -38,7 +39,7 @@ fw_start() {
        echo "Loading includes"
        config_foreach fw_load_include include
 
-       [ -n "$FW_NOTRACK_DISABLED" ] && {
+       [ -z "$FW_NOTRACK_DISABLED" ] && {
                echo "Optimizing conntrack"
                config_foreach fw_load_notrack_zone zone
        }
@@ -48,6 +49,7 @@ fw_start() {
 
        fw_callback post core
 
+       uci_set_state firewall core zones "$FW_ZONES"
        uci_set_state firewall core loaded 1
 }
 
@@ -56,12 +58,28 @@ fw_stop() {
 
        fw_callback pre stop
 
+       local z n i
+       config_get z core zones
+       for z in $z; do
+               config_get n core "${z}_networks"
+               for n in $n; do
+                       config_get i core "${n}_ifname"
+                       [ -n "$i" ] && env -i ACTION=remove ZONE="$z" \
+                               INTERFACE="$n" DEVICE="$i" /sbin/hotplug-call firewall
+               done
+       done
+
        fw_clear ACCEPT
 
        fw_callback post stop
 
        uci_revert_state firewall
        config_clear
+
+       local h
+       for h in $FW_HOOKS; do unset $h; done
+
+       unset FW_HOOKS
        unset FW_INITIALIZED
 }
 
@@ -75,9 +93,8 @@ fw_reload() {
 }
 
 fw_is_loaded() {
-       local bool
-       config_get_bool bool core loaded 0
-       return $((! $bool))
+       local bool=$(uci_get_state firewall.core.loaded)
+       return $((! ${bool:-0}))
 }
 
 
@@ -90,10 +107,8 @@ fw_die() {
 
 fw_log() {
        local level="$1"
-       [ -n "$2" ] || {
-               shift
-               level=notice
-       }
+       [ -n "$2" ] && shift || level=notice
+       [ "$level" != error ] || echo "Error: $@" >&2
        logger -t firewall -p user.$level "$@"
 }
 
@@ -123,8 +138,10 @@ fw_init() {
                . $file
                for hk in $hooks; do
                        for pp in pre post; do
-                               type ${lib}_${pp}_${hk}_cb >/dev/null &&
+                               type ${lib}_${pp}_${hk}_cb >/dev/null && {
                                        append FW_CB_${pp}_${hk} ${lib}
+                                       append FW_HOOKS FW_CB_${pp}_${hk}
+                               }
                        done
                done
        done