Blob Blame History Raw
# 36_teaming.sh
#
# record teaming information (network and routing) for Relax-and-Recover
#
#    Relax-and-Recover is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.

#    Relax-and-Recover is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.

#    You should have received a copy of the GNU General Public License
#    along with Relax-and-Recover; if not, write to the Free Software
#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

# BUG: Supports Ethernet only (so far)

# where to build networking configuration
netscript=$ROOTFS_DIR/etc/scripts/system-setup.d/63-teaming.sh

### Skip netscript if noip is configured on the command line
cat <<EOT >> ${netscript}
if [[ -e /proc/cmdline ]] ; then
    if grep -q 'noip' /proc/cmdline ; then
        return
    fi
fi
EOT

# add a line at the top of netscript to skip if dhclient will be used
cat - <<EOT > ${netscript}
# if USE_DHCLIENT=y then use DHCP instead and skip 60-network-devices.sh
[[ ! -z "\$USE_DHCLIENT" && -z "\$USE_STATIC_NETWORKING" ]] && return
# if IPADDR=1.2.3.4 has been defined at boot time via ip=1.2.3.4 then configure
if [[ "\$IPADDR" ]] && [[ "\$NETMASK" ]] ; then
    device=\${NETDEV:-eth0}
    ip link set dev "\$device" up
    ip addr add "\$IPADDR"/"\$NETMASK" dev "\$device"
    if [[ "\$GATEWAY" ]] ; then
        ip route add default via "\$GATEWAY"
    fi
    return
fi
EOT

# store virtual devices, because teaming interfaces are declared as virtual
VIRTUAL_DEVICES=$(ls /sys/devices/virtual/net)

TEAMINGS=()

# check if virtual interface is a teaming interface
for VIRT_DEV in ${VIRTUAL_DEVICES}
do
    if ethtool -i ${VIRT_DEV} | grep -w "driver:" | grep -qw team
    then
        TEAMINGS+=($VIRT_DEV)
    fi

done

for TEAM in "${TEAMINGS[@]}"
do
    # catch all ip-addresses for the teaming interface
    ADDR=()
    for x in $(ip ad show dev ${TEAM} scope global | grep "inet.*\ " | tr -s " " | cut -d " " -f 3)
    do
        ADDR+=($x)
    done

    # create netscript only when the interface has at least one configured ip
    # to simplify we attach the configured ip-addresses to the first teaming-member
    if [[ ${ADDR[*]} ]]
    then
        # find out one member interface. Greping for "active port:" will not work for all possible teaming configs (e.g. roundrobin, loadbalance, ...)
        FIRST_PORT=$(teamdctl ${TEAM} state | grep -A1 -w ports: | tail -1  | sed 's/[[:blank:]]*//g')

        for TEAM_IP in ${ADDR[@]}
        do
            echo "ip addr add ${TEAM_IP} dev ${FIRST_PORT}" >>${netscript}
        done

        echo "ip link set dev ${FIRST_PORT} up" >>${netscript}

        PORT_MTU="$(cat /sys/class/net/${FIRST_PORT}/mtu)"
        echo "ip link set dev ${FIRST_PORT} mtu ${PORT_MTU}" >>${netscript}
    fi

    # catch the routing for the teaming interface as we disabled it in 35_routing.sh
    for table in $( { echo "254     main" ; cat /etc/iproute2/rt_tables ; } |\
            grep -E '^[0-9]+' |\
                tr -s " \t" " " |\
                cut -d " " -f 2 | sort -u | grep -Ev '(local|default|unspec)' ) ;
        do
            ip route list table $table |\
                grep -Ev 'scope (link|host)' |\
                while read destination via gateway dev device junk;
                do
            if [[ "${device}" == "${TEAM}" ]]
            then
                echo "ip route add ${destination} ${via} ${gateway} ${dev} ${FIRST_PORT} table ${table}" >>${netscript}
            fi
        done
    done
done