#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2011 OpenWrt.org

START=99

config_name="syskey"

EXTRA_COMMANDS="setValue"

start() {
    config_load "$config_name"
    sections=$(foreach ${config_name} cfg | tr '\n' ' ')

    for section in ${sections}
    do
        handle_section ${section}
    done

    uci commit $config_name
}

load_ebtalbe() {
    local kernel_version=$(ls /lib/modules/)
    [ -d /sys/module/ebtables ] || insmod /lib/modules/${kernel_version}/ebtables.ko
    [ -d /sys/module/ebtable_broute ] || insmod /lib/modules/${kernel_version}/ebtable_broute.ko
    [ -d /sys/module/ebtable_filter ] || insmod /lib/modules/${kernel_version}/ebtable_filter.ko
    [ -d /sys/module/ebtable_nat ] || insmod /lib/modules/${kernel_version}/ebtable_nat.ko
    [ -d /sys/module/ebt_ip ] || insmod /lib/modules/${kernel_version}/ebt_ip.ko
    [ -d /sys/module/ebt_snat ] || insmod /lib/modules/${kernel_version}/ebt_snat.ko
}

unload_ebtable() {
    [ -d /sys/module/ebt_snat ] && rmmod ebt_snat
    [ -d /sys/module/ebt_ip ] && rmmod ebt_ip
    [ -d /sys/module/ebtable_nat ] && rmmod ebtable_nat
    [ -d /sys/module/ebtable_filter ] && rmmod ebtable_filter
    [ -d /sys/module/ebtable_broute ] && rmmod ebtable_broute
    [ -d /sys/module/ebtables ] && rmmod ebtables
}

switch_ebtables() {
    local is_enable="$1"
    if [ "$is_enable" = "0" ]; then
        unload_ebtable
    else
        load_ebtalbe
    fi
}

check_ebtables_set_value() {
    local listValue=$(echo $1 | awk -F ':' '{print $2}')
    local section=$2
    local default=$3

    if [ "$listValue" != "$default" ]
    then
        echo "$listValue"
    fi
}

handle_set_list_option() {
    local listValue=$(echo $1 | awk -F ':' '{print $2}')
    local section=$2
    local default=$3
    local action=$4
    local value=$listValue

    if [ "$listValue" != "$default" ]
    then
        eval $action
    fi
}

handle_section() {
    config_load "$config_name"

    config_get default "${section}" "default" 0
    config_get action "${section}" "action" "echo donothing"

    local section=$1
    local value="${default}"

    if [ "$section" = "ebtables" ]; then
        local is_ebtables_enable=$(config_list_foreach "$section" 'set' check_ebtables_set_value "$section" "$default")
        switch_ebtables "${is_ebtables_enable:-0}"
    else
        eval $action
        config_list_foreach "$section" 'set' handle_set_list_option "$section" "$default" "$action"
    fi
}

deleteExistListOption() {
    local listValue="$1"
    local optionSetBy=$(echo $1 | awk -F ':' '{print $1}')
    local section="$2"
    local setBy="$3"

    if [ "$optionSetBy" = "$setBy" ]
    then
        uci del_list syskey.${section}.set="$listValue"
    fi
}

# /etc/init.d/syskey setValue ${section} ${setBy} ${value}
setValue() {
    config_load "$config_name"

    local section="$1"
    local setBy="$2"
    local value="$3"

    config_list_foreach "$section" 'set' deleteExistListOption "$section" "$setBy"

    uci add_list syskey.${section}.set="${setBy}:${value}"

    uci commit syskey
}
