#!/bin/sh
# vim: set tabstop=4 shiftwidth=4 expandtab:
#
# $Id$
#

# PROVIDE: ya-fastbone
# REQUIRE: ya-netif ya-routing
# KEYWORD: nojail
# BEFORE: NETWORKING

. /etc/ya.subr
_init_variables

name="ya_fastbone"
rcvar="${name}_enable"
start_cmd="ya_fastbone_start"
stop_cmd="ya_fastbone_stop"

: ${ya_fastbone_enable="YES"}
: ${ya_fb_aliases_enable="NO"}

ya_fastbone_start()
{
    if [ ! -z "${fb_vlans}" ] ; then
        ya_warn "this method is deprecated"
        exit 0
    fi

    echo -n "Starting fastbone:"
    # Configure the vlan(s) and routes
    ya_fastbone_common start
    echo '.'
}

ya_fastbone_stop()
{
    if [ ! -z "${fb_vlans}" ] ; then
        exit 0
    fi

    echo -n "Stopping fastbone:"
    # Deconfigure the vlan(s) and routes
    ya_fastbone_common stop
    echo '.'
}

ya_fastbone_common()
{
    local _action _proto _need_ip _ip _main_if _vlan_if _ret
    local _fb_vlan _fb_ip _fb_defrouter _fb_netmask _fb_networks _fb_netmask_alias _fb_netmask_name

    if [ $# -ne 1 ] || [ -z "$1" ]; then
        ya_err 1 "usage: ya_fastbone_common (start|stop)"
    fi
    _action="$1"
    _main_if=$(ya_interface_get_active)

    # Following block can be replaced with one if
    ### Block start
    # IPv4
    ya_fb_vlan_inet="\$ya_FB_VLAN"
    ya_fb_ip_inet="\$ya_FB_ip"
    ya_fb_defrouter_inet="\$ya_FB_defrouter"
    ya_fb_netmask_inet="\$ya_FB_netmask"
    ya_fb_networks_inet="\$FB_NETWORK"
    ya_fb_net_inet="\$ya_FB_net"
    # IPv6
    ya_fb_vlan_inet6="\$ya_FB_ipv6_VLAN"
    ya_fb_ip_inet6="\$ya_FB_ipv6_ip"
    ya_fb_defrouter_inet6="\$ya_FB_ipv6_defrouter"
    ya_fb_netmask_inet6="\$ya_FB_ipv6_netmask"
    ya_fb_networks_inet6="\$FB_IPV6_NETWORK"
    ya_fb_net_inet6="\$ya_FB_ipv6_net"
    ### Block end
    for _proto in $ya_protocols; do
        _need_ip="yes"
        for _ip in $ipaddr; do
            eval `ya_network_info ${_ip}`
            eval eval _fb_vlan="\$ya_fb_vlan_${_proto}"
            eval eval _fb_ip="\$ya_fb_ip_${_proto}"
            eval eval _fb_defrouter="\$ya_fb_defrouter_${_proto}"
            eval eval _fb_netmask="\$ya_fb_netmask_${_proto}"
            eval eval _fb_networks="\$ya_fb_networks_${_proto}"
	    eval eval _fb_network="\$ya_fb_net_${_proto}"
            
            if [ "${_fb_vlan}" = "XXXX" -o "${_fb_ip}" = "XXXX" -o "${_fb_defrouter}" = "XXXX" -o "${_fb_netmask}" = "XXXX" ]; then
                if [ "${_fb_network}" = "XXXX" ]; then
                    ya_debug "Network which [ ${_ip} ] belongs to does not have a FastBone with proto [ ${_proto} ], skipping..."
                    continue;
                fi
            fi

            if [ "${_action}" = start ]; then
                if ! ya_vlan_manage add "${_main_if}" "${_fb_vlan}"; then
                    ya_warn "Could not add vlan on [ ${_main_if} ] with id [ ${_fb_vlan} ]"
                    return 1
                fi
                if [ "${ya_os}" = "Linux" ] ; then
                    ip link set vlan${_fb_vlan} group fastbone
                fi
            fi
            _vlan_if=vlan${_fb_vlan}

            # Add fb ip as alias if primary address was already added and ya_fb_aliases_enable is set
            # _ya_ip_add() checks if netmask is defined and sets prefix to (/32|/128) if empty
            if ! ya_checkyesno _need_ip && ya_checkyesno ya_fb_aliases_enable; then
                ya_ip_manage "${_action}" "${_vlan_if}" "${_fb_ip}"
            fi
            if ya_checkyesno _need_ip; then
                _need_ip="no"
                if [ "${_fb_network}" = "RA" ]; then
                    if ! ya_fastbone_ra enable ${_fb_vlan}; then
                        ya_warn "Can't enable RA on ${_fb_vlan}"
                    fi
                    for _fb_network in $_fb_networks; do
                        _fb_defrouter="fe80::1%${_vlan_if}"
                        ya_route_manage "${_action}" "${_fb_network}" "${_fb_defrouter}"
                    done
                else
                    ya_ip_manage "${_action}" "${_vlan_if}" "${_fb_ip}" "${_fb_netmask}"
                    for _fb_network in $_fb_networks; do
                        ya_route_manage "${_action}" "${_fb_network}" "${_fb_defrouter}"
                    done
                fi
                if [ "${_action}" = stop ]; then
                    if ya_vlan_manage del "${_vlan_if}"; then
                        ya_debug "We successfully removed vlan along with all IPs. So we should break."
                        break
                    else
                        ya_warn "Could not delete vlan [ ${_vlan_if} ]"
                        _ret=1
                    fi
                fi
            fi
        done
    done
    return $_ret
}

ya_load_config_files $name
ya_run_rc_command $*
