packages: libs/savedynamic: Add package that uses new modular firewall to save chains...
authorcshore <cshore@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Wed, 5 May 2010 03:53:23 +0000 (03:53 +0000)
committercshore <cshore@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Wed, 5 May 2010 03:53:23 +0000 (03:53 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/packages@21368 3c298f89-4303-0410-b956-a3cf2f4a3e73

libs/savedynamic/files/savedynamic.sh [new file with mode: 0644]

diff --git a/libs/savedynamic/files/savedynamic.sh b/libs/savedynamic/files/savedynamic.sh
new file mode 100644 (file)
index 0000000..32d350f
--- /dev/null
@@ -0,0 +1,72 @@
+#!/bin/sh
+
+. /etc/functions.sh
+
+savedynamic_print_table_chain() {
+       local table="$1"
+       local chain="$2"
+       local fsave="$3"
+       local fsavetmp="$fsave"".tmp"
+       local next_table_line
+       local cur_table_line
+       local table_line
+       table_line="$(($(grep -n "^*$table" "$fsave" | cut -f1 -d: ) + 1))"
+       tail -n+$table_line $fsave >"$fsavetmp"
+       for cur_table_line in $(grep -n "^*" "$fsavetmp"); do
+               [ -z "$next_table_line" ] && {
+                       local lineno="$(echo $cur_table_line | cut -f1 -d:)"
+                       [ -n "$lineno" ] && [ "$lineno" -gt $(($table_line - 1)) ] && {
+                               next_table_line=$lineno
+                       }
+               }
+       done
+       [ -z "$next_table_line" ] && {
+               next_table_line="$(cat $fsavetmp|wc -l)"
+       }
+       next_table_line=$(($next_table_line - 1))
+       head -n $next_table_line "$fsave.tmp" | grep $chain | grep -Ev "^:$chain" 
+        rm -f "$fsavetmp"
+}
+
+savedynamic_save_fw_chain() {
+       local chain
+       local table
+       local fsave="/tmp/.firewall/save"
+
+       config_get chain $1 chain
+       config_get table $1 table filter
+       [ -z "$chain" ] && return 0
+       mkdir -p /tmp/.firewall
+       iptables-save >"$fsave"
+       savedynamic_print_table_chain $table $chain "$fsave" > /tmp/.firewall/save-$table-$chain
+
+}
+
+savedynamic_load_fw_chain() {
+       local chain
+       local table
+
+       config_get chain $1 chain
+       config_get table $1 table filter 
+       [ -e /tmp/.firewall/save-$table-$chain ] && [ "$(cat /tmp/.firewall/save-$table-$chain | wc -l)" -ge 1 ] && {
+               iptables -t $table -N $chain
+               while read line; do
+                       sh -c "iptables -t $table $line"
+               done < /tmp/.firewall/save-$table-$chain
+               rm /tmp/.firewall/save-$table-$chain
+       }
+}
+
+savedynamic_pre_stop_cb() {
+       echo "Saving dynamic firewall chains"
+       config_load firewall
+
+       config_foreach savedynamic_save_fw_chain save
+}
+
+savedynamic_post_core_cb() {
+       echo "Loading dynamic firewall chains"
+
+       config_load firewall
+       config_foreach savedynamic_load_fw_chain save
+}