#!/bin/sh /etc/rc.common
#
# Opennet Firmware
# 
# Copyright 2010 Rene Ejury <opennet@absorb.it>
# 
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 

START=20

. /usr/bin/on-helper.sh

start() {
    check_firmware_upgrade
	[ -n "$(grep on_ /etc/config/network)" ] || {
		copy_config_presets force;

	    wifi_country=$(uci -q get on-core.defaults.wifi_country)
        wifi_ssid=$(uci -q get on-core.defaults.wifi_ssid)
        wifi_mode=$(uci -q get on-core.defaults.wifi_mode)

        lan_ipaddr=$(uci -q get on-core.defaults.lan_ipaddr)
        lan_netmask=$(uci -q get on-core.defaults.lan_netmask)
        on_ipschema=$(uci -q get on-core.defaults.on_ipschema)
        on_netmask=$(uci -q get on-core.defaults.on_netmask)
        
        local batch
        
        # reconfigure lan
        append batch "delete network.lan.type${N}"
        append batch "set network.lan.proto=static${N}"
        append batch "set network.lan.ipaddr=${lan_ipaddr}${N}"
        append batch "set network.lan.netmask=${lan_netmask}${N}"
        append batch "set network.lan.defaultroute=0${N}"
        append batch "set network.lan.peerdns=0${N}"
        
        # preconfigure some interfaces - not activated
        # configure local wan
        append batch "set network.on_eth=interface${N}"
        append batch "set network.on_eth.ifname=none${N}"
        append batch "set network.on_eth.proto=none${N}"
        append batch "set network.on_eth.defaultroute=0${N}"
        append batch "set network.on_eth.peerdns=0${N}"
        # disable dhcp on on_eth
        append batch "set dhcp.on_eth=dhcp${N}"
        append batch "set dhcp.on_eth.interface=on_eth${N}"
        append batch "set dhcp.on_eth.dynamicdhcp=0${N}"
        append batch "set dhcp.on_eth.ignore=1${N}"
        # configure local wan
        append batch "set network.wan=interface${N}"
        append batch "set network.wan.proto=none${N}"
        append batch "set network.wan.ifname=none${N}"
        append batch "set network.wan.defaultroute=0${N}"
        append batch "set network.wan.peerdns=0${N}"
        # configure local wifi
        append batch "set network.wifi=interface${N}"
        append batch "set network.wifi.proto=none${N}"
        append batch "set network.wifi.ifname=none${N}"
        append batch "set network.wifi.defaultroute=0${N}"
        append batch "set network.wifi.peerdns=0${N}"
        # configure opennet dhcp/wifidog wifi
        append batch "set network.on_free=interface${N}"
        append batch "set network.on_free.proto=none${N}"
        append batch "set network.on_free.ifname=none${N}"
        append batch "set network.on_free.defaultroute=0${N}"
        append batch "set network.on_free.peerdns=0${N}"

        # while reconfiguring, on_id is usually not set. Anyway, just read it...
        on_id=$(uci -q get on-core.settings.on_id)
        if [ -z "$on_id" ]; then on_id=$(uci -q get on-core.defaults.on_id_preset); fi
        # split into two seperate fields
        on_id_1=$(echo $on_id | cut -d"." -f1)
        on_id_2=$(echo $on_id | cut -d"." -f2)
        if [ -z "$on_id_2" ]; then
            on_id_2=on_id_1
            on_id_1=1
        fi
        
        /sbin/wifi detect > /etc/config/wireless

        # use 'no' variable to count interfaces, starting from 0 - this is default in presets
        no=0;
        while [ -n "$(uci -q get wireless.@wifi-iface[${no}])" ]; do
            on_ipaddr=$(eval echo $on_ipschema)
            wifidev="wlan${no}"

            # reconfigure wifi-device - set default to opennet
            append batch "set wireless.@wifi-iface[${no}].network=on_wifi_${no}${N}"
            append batch "set wireless.@wifi-iface[${no}].mode=${wifi_mode}${N}"
            append batch "set wireless.@wifi-iface[${no}].ssid=${wifi_ssid}${N}"
            append batch "set wireless.@wifi-iface[${no}].ifname=${wifidev}${N}"
            
            append batch "set wireless.radio${no}.country=${wifi_country}${N}"
            append batch "delete wireless.radio${no}.disabled${N}"
            append batch "delete wireless.radio${no}.channel${N}"

            # configure on_wifi
            append batch "set network.on_wifi_${no}=interface${N}"
            append batch "set network.on_wifi_${no}.proto=static${N}"
            append batch "set network.on_wifi_${no}.ifname=${wifidev}${N}"
            append batch "set network.on_wifi_${no}.netmask=${on_netmask}${N}"
            append batch "set network.on_wifi_${no}.defaultroute=0${N}"
            append batch "set network.on_wifi_${no}.peerdns=0${N}"
            append batch "set network.on_wifi_${no}.ipaddr=${on_ipaddr}${N}"

            # disable dhcp on on_wifi
            append batch "set dhcp.on_wifi_${no}=dhcp${N}"
            append batch "set dhcp.on_wifi_${no}.interface=on_wifi_${no}${N}"
            append batch "set dhcp.on_wifi_${no}.dynamicdhcp=0${N}"
            append batch "set dhcp.on_wifi_${no}.ignore=1${N}"

            # add networks to firewall
            zoneOpennet="${zoneOpennet} on_wifi_${no}"

            : $((no++))
        done;

        append batch "set firewall.zone_opennet.network='${zoneOpennet## } on_eth'${N}"
        append batch "set olsrd.@Interface[0].interface='${zoneOpennet## } on_eth'${N}"

        logger -t on_config "applying opennet-config to switch ..."
        echo "$batch${N}commit network${N}commit dhcp${N}commit olsrd${N}commit firewall${N}commit wireless" | uci -q batch

        # hack to get rid of the bridge on avila-boards
        brctl delif br-lan $(uci -q get network.lan.ifname) 2>/dev/null
        ifconfig br-lan down 2>/dev/null; ifup lan 2>/dev/null
    }
    exit 0
}
