#!/bin/sh
# shellcheck source=/dev/null

_functions_loaded 2> /dev/null || . "${ROOTACT}/lrr/com/_functions.sh"

# Set routes for the failover interface (a.k.a the rescue interface) in table 100
ipRuleSet()
{
   interface_ip_rule=$1
   Log "Ip rules renewed on interface $interface_ip_rule"
   remove_old_ip_rules
   add_ip_rules "$interface_ip_rule"
}

remove_old_ip_rules()
{
   # If ip rule available use table for better routing
   if ip rule > /dev/null 2>&1; then
       ip route flush table 100
       while ip rule del table 100 ; do
           true
       done
   else
       ip route del default metric 10
   fi
}

add_ip_rules()
{
    itf=$1

    # Get IP addr and cidr mask for interface $itf. e.g: "10.100.84.21/23"
    local_ip_cidr=$(ip addr show dev "$itf" 2> /dev/null |\
                        sed -n 's#^[[:space:]]*inet \([0-9\./]\+\) .*$#\1#p')

    # If interface does not exist or no cidr is available (PtP)
    #   we need to bail
    if [ -z "$local_ip_cidr" ]; then
        return 0
    fi

    # Split ip addr and cidr mask
    local_ip_address=$(echo "$local_ip_cidr" | cut -f1 -d'/')
    local_cidr=$(echo "$local_ip_cidr" | cut -f2 -d'/')

    if echo "$itf" | grep -Eq "(eth|wlan|wwan)[0-9]" ; then
        gateway_address=$(cat "/run/gwip.$itf")
    elif echo "$itf" | grep -Eq "ppp0" ; then
        gateway_address="$local_ip_address"
        local_cidr="32"  # PtP
    else
        Log "Ip rule cannot be set. Unknow interface $itf"
        return 1
    fi

    [ -z "${gateway_address}" ] && Log "Ip rules cannot be fully set. No gateway address for interface ${itf}"
    local_network=$(network_calculator "$local_ip_address" "$local_cidr")

    # If ip rule available use table for better routing
    if ip rule > /dev/null 2>&1; then
        ip route add "$local_network/$local_cidr" dev "$itf" \
           src "$local_ip_address" table 100
        ip route add default via "$gateway_address" dev "$itf" table 100
        ip rule add from "$local_ip_address/32" table 100
        ip rule add to "$local_ip_address/32" table 100

    else
        if ! ip route show to default dev "$itf" | grep -q metric ; then
            ip route add default via "$gateway_address" metric 10 dev "$itf"
        fi

    fi
    return 0
}
