#!/bin/bash

########################################################################
# Begin /lib/services/ipv4-static-route
#
# Description : IPV4 Static Route Script
#
# Authors     : Kevin P. Fleming - kpfleming@linuxfromscratch.org
#               DJ Lucas - dj@linuxfromscratch.org
# Update      : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version     : LFS 7.0
#
# Adapted by  : CacheGuard Technologies for CacheGuard-OS
#
########################################################################

. /lib/lsb/init-functions
. ${IFCONFIG}

case "${TYPE}" in
   ("" | "network")
      need_ip=1
      need_gateway=1
      desc="network"
   ;;

   ("default")
      need_gateway=1
      args="${args} default"
      desc="default"
   ;;

   ("local-default")
       args="${args} local default dev ${1}"
       desc="local default"
   ;;

   ("host")
       need_ip=1
       args="${args} dev ${1}"
       desc="host"
   ;;

   ("unreachable")
      need_ip=1
      args="${args} unreachable"
      desc="unreachable"
   ;;

   (*)
      log_failure_msg "Unknown route type (${TYPE}) in ${IFCONFIG}, cannot continue."
      exit 1
   ;;
esac

if [ -n "${GATEWAY}" ]; then
   MSG="The GATEWAY variable cannot be set in ${IFCONFIG} for static routes.\n"
   log_failure_msg "$MSG Use STATIC_GATEWAY(S) only, cannot continue"
   exit 1
fi

if [ -n "${need_ip}" ]; then
   if [ -z "${IP}" ]; then
      log_failure_msg "IP variable missing from ${IFCONFIG}, cannot continue."
      exit 1
   fi

   if [ -z "${PREFIX}" ]; then
      log_failure_msg "PREFIX variable missing from ${IFCONFIG}, cannot continue."
      exit 1
   fi

   args="${args} ${IP}/${PREFIX}"
   desc="${desc} ${IP}/${PREFIX}"
fi

if [ -n "${need_gateway}" ]; then
    if [ -z "${STATIC_GATEWAY}" -a -z "${STATIC_GATEWAYS}" ]; then
	log_failure_msg "STATIC_GATEWAY(S) variable missing from ${IFCONFIG}, cannot continue."
	exit 1
    fi
    if [ -z "${STATIC_GATEWAYS}" ]; then
	args="${args} via ${STATIC_GATEWAY} dev ${1}"
    else
	i=0
	for elt in ${STATIC_GATEWAYS}
	do
	    range=$[${i} % 3]
	    case ${range} in
		0)
		    gw=${elt}
		    ;;
		1)
		    weight=${elt}
		    ;;
		2)
		    test ${weight} == 0 || args="${args} nexthop via ${gw} dev ${1} weight ${weight}"
		    ;;
		*)
		    return 255
		    ;;
	    esac
	    ((i++))
	done
    fi
fi

if [ -n "${SOURCE}" -a -z "${STATIC_GATEWAYS}" ]; then
        args="${args} src ${SOURCE}"
fi

if [ -n "${TABLE}" ]; then
    args="${args} table ${TABLE}"
fi

case "${2}" in
   up)
      log_info_msg "Adding '${desc}' route to the ${1} interface..."
      ip route add ${args}
      evaluate_retval
   ;;

   down)
      log_info_msg "Removing '${desc}' route from the ${1} interface..."
      ip route del ${args}
      evaluate_retval
   ;;

   *)
      echo "Usage: ${0} [interface] {up|down}"
      exit 1
   ;;
esac

# End /lib/services/ipv4-static-route
