openrc/sh/net.sh

696 lines
15 KiB
Bash
Raw Normal View History

#!/sbin/runscript
# Copyright 1999-2007 Gentoo Foundation
# Copyright 2007 Roy Marples
# All rights reserved
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
MODULESDIR="${RC_LIBDIR}/net"
MODULESLIST="${RC_SVCDIR}/nettree"
_config_vars="config routes"
2007-11-22 18:58:14 +05:30
[ -z "${IN_BACKGROUND}" ] && IN_BACKGROUND="NO"
description="Configures network interfaces."
# Handy var so we don't have to embed new lines everywhere for array splitting
__IFS="
"
_shell_var() {
2007-11-28 21:15:03 +05:30
local rem=$1 c= r= var=
while [ -n "${rem}" ]; do
r=${rem#?}
c=${rem%${r}}
case "${c}" in
2007-11-28 21:15:03 +05:30
[a-zA-Z0-9]);;
*) c=_;;
esac
2007-11-28 21:15:03 +05:30
var=${var}${c}
rem=${r}
done
2007-11-28 21:15:03 +05:30
echo ${var}
}
depend() {
2007-05-02 16:34:52 +05:30
local IFACE=${SVCNAME#*.}
local IFVAR=$(_shell_var "${IFACE}")
2007-05-02 16:34:52 +05:30
need localmount
after bootmisc
2007-05-02 16:34:52 +05:30
provide net
case "${IFACE}" in
2007-11-28 21:15:03 +05:30
lo|lo0);;
*)
after net.lo net.lo0
local prov=
eval prov=\$RC_NEED_${IFVAR}
[ -n "${prov}" ] && need ${prov}
eval prov=\$RC_USE_${IFVAR}
[ -n "${prov}" ] && use ${prov}
eval prov=\$RC_BEFORE_${IFVAR}
[ -n "${prov}" ] && before ${prov}
eval prov=\$RC_AFTER_${IFVAR}
[ -n "${prov}" ] && after ${prov}
eval prov=\$RC_PROVIDE_${IFVAR}
[ -n "${prov}" ] && provide ${prov}
;;
2007-05-02 16:34:52 +05:30
esac
}
# Support bash arrays - sigh
_get_array() {
local _a=
2007-11-28 21:15:03 +05:30
if [ -n "${BASH}" ]; then
case "$(declare -p "$1" 2>/dev/null)" in
2007-05-02 16:34:52 +05:30
"declare -a "*)
eval "set -- \"\${$1[@]}\""
2007-11-29 16:53:06 +05:30
for _a; do
printf "%s\n" "${_a}"
done
return 0
2007-05-02 16:34:52 +05:30
;;
esac
2007-05-02 16:34:52 +05:30
fi
eval _a=\$$1
printf "%s" "${_a}"
printf "\n"
[ -n "${_a}" ]
}
# Flatten bash arrays to simple strings
_flatten_array() {
2007-11-28 21:15:03 +05:30
if [ -n "${BASH}" ]; then
case "$(declare -p "$1" 2>/dev/null)" in
"declare -a "*)
eval "set -- \"\${$1[@]}\""
2007-11-29 16:53:06 +05:30
for x; do
printf "'%s' " "$(printf "$x" | sed "s:':'\\\'':g")"
done
return 0
;;
esac
fi
eval _a=\$$1
printf "%s" "${_a}"
printf "\n"
[ -n "${_a}" ]
}
_wait_for_carrier() {
2007-05-02 16:34:52 +05:30
local timeout= efunc=einfon
2007-05-02 16:34:52 +05:30
_has_carrier && return 0
2007-05-02 16:34:52 +05:30
eval timeout=\$carrier_timeout_${IFVAR}
timeout=${timeout:-${carrier_timeout:-5}}
2007-04-30 18:47:28 +05:30
# Incase users don't want this nice feature ...
[ ${timeout} -le 0 ] && return 0
2007-11-22 19:07:24 +05:30
yesno ${RC_PARALLEL} && efunc=einfo
2007-05-02 16:34:52 +05:30
${efunc} "Waiting for carrier (${timeout} seconds) "
2007-11-28 21:15:03 +05:30
while [ ${timeout} -gt 0 ]; do
sleep 1
2007-11-28 21:15:03 +05:30
if _has_carrier; then
[ "${efunc}" = "einfon" ] && echo
eend 0
2007-05-02 16:34:52 +05:30
return 0
fi
timeout=$((${timeout} - 1))
[ "${efunc}" = "einfon" ] && printf "."
2007-05-02 16:34:52 +05:30
done
[ "${efunc}" = "einfon" ] && echo
eend 1
2007-05-02 16:34:52 +05:30
return 1
}
_netmask2cidr() {
2007-05-02 16:34:52 +05:30
local i= len=0
2007-05-02 16:34:52 +05:30
local IFS=.
for i in $1; do
2007-11-28 21:15:03 +05:30
while [ ${i} != "0" ]; do
2007-05-02 16:34:52 +05:30
len=$((${len} + ${i} % 2))
i=$((${i} >> 1))
done
2007-05-02 16:34:52 +05:30
done
2007-05-02 16:34:52 +05:30
echo "${len}"
}
_configure_variables() {
2007-05-02 16:34:52 +05:30
local var= v= t=
2007-11-28 21:15:03 +05:30
for var in ${_config_vars}; do
local v=
2007-11-29 16:53:06 +05:30
for t; do
2007-05-02 16:34:52 +05:30
eval v=\$${var}_${t}
2007-11-28 21:15:03 +05:30
if [ -n "${v}" ]; then
eval ${var}_${IFVAR}=\$${var}_${t}
continue 2
fi
done
2007-05-02 16:34:52 +05:30
done
}
_show_address() {
2007-05-02 16:34:52 +05:30
einfo "received address $(_get_inet_address "${IFACE}")"
}
# Basically sorts our modules into order and saves the list
_gen_module_list() {
local x= f= force=$1
2007-11-28 21:15:03 +05:30
if ! ${force} && [ -s "${MODULESLIST}" -a "${MODULESLIST}" -nt "${MODULESDIR}" ]; then
local update=false
2007-11-28 21:15:03 +05:30
for x in "${MODULESDIR}"/*; do
2007-05-02 16:34:52 +05:30
[ -e "${x}" ] || continue
2007-11-28 21:15:03 +05:30
if [ "${x}" -nt "${MODULESLIST}" ]; then
update=true
break
2007-05-02 16:34:52 +05:30
fi
done
${update} || return 0
2007-05-02 16:34:52 +05:30
fi
2007-05-02 16:34:52 +05:30
einfo "Caching network module dependencies"
# Run in a subshell to protect the main script
(
after() {
eval ${MODULE}_after="\"\${${MODULE}_after}\${${MODULE}_after:+ }$*\""
2007-05-02 16:34:52 +05:30
}
2007-05-02 16:34:52 +05:30
before() {
local mod=${MODULE}
local MODULE=
2007-11-29 16:53:06 +05:30
for MODULE; do
2007-05-02 16:34:52 +05:30
after "${mod}"
done
2007-05-02 16:34:52 +05:30
}
2007-05-02 16:34:52 +05:30
program() {
2007-11-28 21:15:03 +05:30
if [ "$1" = "start" -o "$1" = "stop" ]; then
2007-05-02 16:34:52 +05:30
local s="$1"
shift
eval ${MODULE}_program_${s}="\"\${${MODULE}_program_${s}}\${${MODULE}_program_${s}:+ }$*\""
else
2007-05-02 16:34:52 +05:30
eval ${MODULE}_program="\"\${${MODULE}_program}\${${MODULE}_program:+ }$*\""
fi
2007-05-02 16:34:52 +05:30
}
2007-05-02 16:34:52 +05:30
provide() {
eval ${MODULE}_provide="\"\${${MODULE}_provide}\${${MODULE}_provide:+ }$*\""
local x
2007-11-28 21:15:03 +05:30
for x in $*; do
2007-05-02 16:34:52 +05:30
eval ${x}_providedby="\"\${${MODULE}_providedby}\${${MODULE}_providedby:+ }${MODULE}\""
done
2007-05-02 16:34:52 +05:30
}
2007-11-28 21:15:03 +05:30
for MODULE in "${MODULESDIR}"/*; do
sh -n "${MODULE}" || continue
. "${MODULE}" || continue
MODULE=${MODULE#${MODULESDIR}/}
MODULE=${MODULE%.sh}
eval ${MODULE}_depend
MODULES="${MODULES} ${MODULE}"
2007-05-02 16:34:52 +05:30
done
2007-05-02 16:34:52 +05:30
VISITED=
SORTED=
visit() {
case " ${VISITED} " in
2007-11-28 21:15:03 +05:30
*" $1 "*) return;;
esac
VISITED="${VISITED} $1"
eval AFTER=\$${1}_after
2007-11-28 21:15:03 +05:30
for MODULE in ${AFTER}; do
2007-05-02 16:34:52 +05:30
eval PROVIDEDBY=\$${MODULE}_providedby
2007-11-28 21:15:03 +05:30
if [ -n "${PROVIDEDBY}" ]; then
for MODULE in ${PROVIDEDBY}; do
2007-05-02 16:34:52 +05:30
visit "${MODULE}"
done
2007-05-02 16:34:52 +05:30
else
visit "${MODULE}"
2007-05-02 16:34:52 +05:30
fi
done
eval PROVIDE=\$${1}_provide
2007-11-28 21:15:03 +05:30
for MODULE in ${PROVIDE}; do
2007-05-02 16:34:52 +05:30
visit "${MODULE}"
done
eval PROVIDEDBY=\$${1}_providedby
[ -z "${PROVIDEDBY}" ] && SORTED="${SORTED} $1"
2007-05-02 16:34:52 +05:30
}
2007-11-28 21:15:03 +05:30
for MODULE in ${MODULES}; do
visit "${MODULE}"
2007-05-02 16:34:52 +05:30
done
2007-09-18 02:29:55 +05:30
printf "" > "${MODULESLIST}"
2007-05-02 16:34:52 +05:30
i=0
2007-11-28 21:15:03 +05:30
for MODULE in ${SORTED}; do
eval PROGRAM=\$${MODULE}_program
eval PROGRAM_START=\$${MODULE}_program_start
eval PROGRAM_STOP=\$${MODULE}_program_stop
eval PROVIDE=\$${MODULE}_provide
echo "module_${i}='${MODULE}'" >> "${MODULESLIST}"
echo "module_${i}_program='${PROGRAM}'" >> "${MODULESLIST}"
echo "module_${i}_program_start='${PROGRAM_START}'" >> "${MODULESLIST}"
echo "module_${i}_program_stop='${PROGRAM_STOP}'" >> "${MODULESLIST}"
echo "module_${i}_provide='${PROVIDE}'" >> "${MODULESLIST}"
i=$((${i} + 1))
2007-05-02 16:34:52 +05:30
done
echo "module_${i}=" >> "${MODULESLIST}"
)
2007-05-02 16:34:52 +05:30
return 0
}
_load_modules() {
2007-05-02 16:34:52 +05:30
local starting=$1 mymods=
# Ensure our list is up to date
_gen_module_list false
2007-11-28 21:15:03 +05:30
if ! . "${MODULESLIST}"; then
_gen_module_list true
. "${MODULESLIST}"
fi
2007-05-02 16:34:52 +05:30
MODULES=
2007-11-28 21:15:03 +05:30
if [ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ]; then
eval mymods=\$modules_${IFVAR}
[ -z "${mymods}" ] && mymods=${modules}
2007-05-02 16:34:52 +05:30
fi
2007-05-02 16:34:52 +05:30
local i=-1 x= mod= f= provides=
2007-11-28 21:15:03 +05:30
while true; do
i=$((${i} + 1))
eval mod=\$module_${i}
[ -z "${mod}" ] && break
[ -e "${MODULESDIR}/${mod}.sh" ] || continue
2007-05-02 16:34:52 +05:30
eval set -- \$module_${i}_program
2007-11-28 21:15:03 +05:30
if [ -n "$1" ]; then
x=
2007-11-29 16:53:06 +05:30
for x; do
[ -x "${x}" ] && break
done
[ -x "${x}" ] || continue
2007-05-02 16:34:52 +05:30
fi
2007-11-28 21:15:03 +05:30
if ${starting}; then
eval set -- \$module_${i}_program_start
else
eval set -- \$module_${i}_program_stop
fi
2007-11-28 21:15:03 +05:30
if [ -n "$1" ]; then
x=
2007-11-29 16:53:06 +05:30
for x; do
[ -x "${x}" ] && break
done
[ -x "${x}" ] || continue
2007-05-02 16:34:52 +05:30
fi
eval provides=\$module_${i}_provide
2007-11-28 21:15:03 +05:30
if ${starting}; then
2007-05-02 16:34:52 +05:30
case " ${mymods} " in
2007-11-28 21:15:03 +05:30
*" !${mod} "*) continue;;
*" !${provides} "*) [ -n "${provides}" ] && continue;;
2007-05-02 16:34:52 +05:30
esac
fi
MODULES="${MODULES}${MODULES:+ }${mod}"
# Now load and wrap our functions
2007-11-28 21:15:03 +05:30
if ! . "${MODULESDIR}/${mod}.sh"; then
2007-05-02 16:34:52 +05:30
eend 1 "${SVCNAME}: error loading module \`${mod}'"
exit 1
fi
[ -z "${provides}" ] && continue
# Wrap our provides
local f=
2007-11-28 21:15:03 +05:30
for f in pre_start start post_start; do
eval "${provides}_${f}() { type ${mod}_${f} >/dev/null 2>&1 || return 0; ${mod}_${f} \"\$@\"; }"
done
eval module_${mod}_provides="${provides}"
eval module_${provides}_providedby="${mod}"
2007-05-02 16:34:52 +05:30
done
2007-05-02 16:34:52 +05:30
# Wrap our preferred modules
2007-11-28 21:15:03 +05:30
for mod in ${mymods}; do
case " ${MODULES} " in
2007-05-02 16:34:52 +05:30
*" ${mod} "*)
eval x=\$module_${mod}_provides
[ -z "${x}" ] && continue
2007-11-28 21:15:03 +05:30
for f in pre_start start post_start; do
eval "${x}_${f}() { type ${mod}_${f} >/dev/null 2>&1 || return 0; ${mod}_${f} \"\$@\"; }"
2007-05-02 16:34:52 +05:30
done
eval module_${x}_providedby="${mod}"
;;
esac
2007-05-02 16:34:52 +05:30
done
2007-05-02 16:34:52 +05:30
# Finally remove any duplicated provides from our list if we're starting
# Otherwise reverse the list
local LIST="${MODULES}" p=
MODULES=
2007-11-28 21:15:03 +05:30
if ${starting}; then
for mod in ${LIST}; do
2007-05-02 16:34:52 +05:30
eval x=\$module_${mod}_provides
2007-11-28 21:15:03 +05:30
if [ -n "${x}" ]; then
eval p=\$module_${x}_providedby
[ "${mod}" != "${p}" ] && continue
2007-05-02 16:34:52 +05:30
fi
MODULES="${MODULES}${MODULES:+ }${mod}"
done
2007-05-02 16:34:52 +05:30
else
2007-11-28 21:15:03 +05:30
for mod in ${LIST}; do
2007-05-02 16:34:52 +05:30
MODULES="${mod}${MODULES:+ }${MODULES}"
done
2007-05-02 16:34:52 +05:30
fi
2007-05-02 16:34:52 +05:30
veinfo "Loaded modules: ${MODULES}"
}
_load_config() {
local config="$(_get_array "config_${IFVAR}")"
local fallback="$(_get_array fallback_${IFVAR})"
config_index=0
local IFS="$__IFS"
set -- ${config}
# We should support a space separated array for cidr configs
if [ $# = 1 ]; then
unset IFS
set -- ${config}
# Of course, we may have a single address added old style.
case "$2" in
netmask|broadcast|brd|brd+)
local IFS="$__IFS"
set -- ${config}
;;
esac
fi
# Ensure that loopback has the correct address
if [ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ]; then
if [ "$1" != "null" ]; then
config_0="127.0.0.1/8"
config_index=1
fi
else
if [ -z "$1" ]; then
ewarn "No configuration specified; defaulting to DHCP"
2007-11-30 15:29:10 +05:30
config_0="dhcp"
config_index=1
fi
fi
2007-05-02 16:34:52 +05:30
# We store our config in an array like vars
# so modules can influence it
for cmd; do
eval config_${config_index}="'${cmd}'"
config_index=$((${config_index} + 1))
2007-05-02 16:34:52 +05:30
done
# Terminate the list
eval config_${config_index}=
2007-05-02 16:34:52 +05:30
config_index=0
for cmd in ${fallback}; do
2007-11-01 23:45:30 +05:30
eval fallback_${config_index}="'${cmd}'"
config_index=$((${config_index} + 1))
2007-05-02 16:34:52 +05:30
done
# Terminate the list
eval fallback_${config_index}=
# Don't set to zero, so any net modules don't have to do anything extra
2007-05-02 16:34:52 +05:30
config_index=-1
}
start() {
2007-05-02 16:34:52 +05:30
local IFACE=${SVCNAME#*.} oneworked=false module=
local IFVAR=$(_shell_var "${IFACE}") cmd= metric=0 our_metric=$metric
2007-05-02 16:34:52 +05:30
einfo "Bringing up interface ${IFACE}"
eindent
2007-11-28 21:15:03 +05:30
if [ -z "${MODULES}" ]; then
local MODULES=
_load_modules true
2007-05-02 16:34:52 +05:30
fi
# We up the iface twice if we have a preup to ensure it's up if
# available in preup and afterwards incase the user inadvertently
# brings it down
2007-11-28 21:15:03 +05:30
if type preup >/dev/null 2>&1; then
_up 2>/dev/null
ebegin "Running preup"
eindent
preup || return 1
eoutdent
2007-05-02 16:34:52 +05:30
fi
_up 2>/dev/null
2007-11-28 21:15:03 +05:30
for module in ${MODULES}; do
if type "${module}_pre_start" >/dev/null 2>&1; then
if ! ${module}_pre_start; then
eend 1
exit 1
2007-05-02 16:34:52 +05:30
fi
fi
2007-05-02 16:34:52 +05:30
done
2007-11-28 21:15:03 +05:30
if ! _exists; then
eerror "ERROR: interface ${IFACE} does not exist"
eerror "Ensure that you have loaded the correct kernel module for your hardware"
return 1
fi
2007-11-28 21:15:03 +05:30
if ! _wait_for_carrier; then
if service_started devd; then
ewarn "no carrier, but devd will start us when we have one"
mark_service_inactive "${SVCNAME}"
else
eerror "no carrier"
fi
return 1
fi
2007-05-02 16:34:52 +05:30
local config= config_index=
_load_config
config_index=0
2007-11-28 21:15:03 +05:30
if [ -n "${our_metric}" ]; then
metric=${our_metric}
2007-11-28 21:15:03 +05:30
elif [ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ]; then
metric=$((${metric} + $(_ifindex)))
2007-05-02 16:34:52 +05:30
fi
2007-11-28 21:15:03 +05:30
while true; do
eval config=\$config_${config_index}
[ -z "${config}" ] && break
2007-11-29 15:15:57 +05:30
set -- ${config}
ebegin "$1"
eindent
case "$1" in
2007-05-02 16:34:52 +05:30
noop)
2007-11-28 21:15:03 +05:30
if [ -n "$(_get_inet_address)" ]; then
oneworked=true
break
2007-05-02 16:34:52 +05:30
fi
;;
2007-11-28 21:15:03 +05:30
null) :;;
[0-9]*|*:*) _add_address ${config};;
2007-05-02 16:34:52 +05:30
*)
2007-11-28 21:15:03 +05:30
if type "${config}_start" >/dev/null 2>&1; then
"${config}"_start
2007-05-02 16:34:52 +05:30
else
eerror "nothing provides \`${config}'"
2007-05-02 16:34:52 +05:30
fi
;;
esac
2007-11-28 21:15:03 +05:30
if eend $?; then
2007-05-02 16:34:52 +05:30
oneworked=true
else
2007-09-18 03:08:58 +05:30
eval config=\$fallback_${config_index}
2007-11-28 21:15:03 +05:30
if [ -n "${config}" ]; then
2007-09-18 03:08:58 +05:30
eoutdent
ewarn "Trying fallback configuration ${config}"
eindent
eval config_${config_index}=\$config
unset fallback_${config_index}
config_index=$((${config_index} - 1))
2007-05-02 16:34:52 +05:30
fi
fi
eoutdent
config_index=$((${config_index} + 1))
2007-05-02 16:34:52 +05:30
done
2007-11-28 21:15:03 +05:30
if ! ${oneworked}; then
if type failup >/dev/null 2>&1; then
ebegin "Running failup"
eindent
failup
eoutdent
2007-05-02 16:34:52 +05:30
fi
return 1
fi
local hidefirstroute=false first=true
local routes="$(_get_array "routes_${IFVAR}")"
2007-11-28 21:15:03 +05:30
if [ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ]; then
if [ "${config_0}" != "null" ]; then
routes="127.0.0.0/8 via 127.0.0.1
${routes}"
hidefirstroute=true
fi
2007-05-02 16:34:52 +05:30
fi
2007-12-04 19:48:41 +05:30
local OIFS="${IFS}" SIFS=${IFS-y}
local IFS="$__IFS"
for cmd in ${routes}; do
unset IFS
if ${first}; then
2007-05-02 16:34:52 +05:30
first=false
einfo "Adding routes"
fi
eindent
2007-11-02 22:33:29 +05:30
ebegin ${cmd}
# Work out if we're a host or a net if not told
case ${cmd} in
2007-11-29 15:15:57 +05:30
-net" "*|-host" "*);;
*" "netmask" "*) cmd="-net ${cmd}";;
2007-11-28 21:15:03 +05:30
*.*.*.*/32) cmd="-host ${cmd}";;
*.*.*.*/*|0.0.0.0|default) cmd="-net ${cmd}";;
*) cmd="-host ${cmd}";;
esac
2007-11-28 21:15:03 +05:30
if ${hidefirstroute}; then
_add_route ${cmd} >/dev/null 2>&1
2007-05-02 16:34:52 +05:30
hidefirstroute=false
else
2007-05-02 16:34:52 +05:30
_add_route ${cmd} >/dev/null
fi
eend $?
eoutdent
2007-05-02 16:34:52 +05:30
done
2007-12-04 19:48:41 +05:30
if [ "${SIFS}" = "y" ]; then
unset IFS
else
IFS="${OIFS}"
fi
2007-11-28 21:15:03 +05:30
for module in ${MODULES}; do
if type "${module}_post_start" >/dev/null 2>&1; then
if ! ${module}_post_start; then
2007-05-02 16:34:52 +05:30
eend 1
exit 1
fi
fi
2007-05-02 16:34:52 +05:30
done
2007-11-28 21:15:03 +05:30
if type postup >/dev/null 2>&1; then
ebegin "Running postup"
eindent
postup
eoutdent
2007-05-02 16:34:52 +05:30
fi
2007-05-02 16:34:52 +05:30
return 0
}
stop() {
2007-05-02 16:34:52 +05:30
local IFACE=${SVCNAME#*.} module=
local IFVAR=$(_shell_var "${IFACE}") opts=
2007-05-02 16:34:52 +05:30
einfo "Bringing down interface ${IFACE}"
eindent
2007-11-28 21:15:03 +05:30
if [ -z "${MODULES}" ]; then
local MODULES=
_load_modules false
2007-05-02 16:34:52 +05:30
fi
2007-11-28 21:15:03 +05:30
if type predown >/dev/null 2>&1; then
ebegin "Running predown"
eindent
predown || return 1
eoutdent
else
if is_net_fs /; then
eerror "root filesystem is network mounted -- can't stop ${IFACE}"
return 1
fi
2007-05-02 16:34:52 +05:30
fi
2007-11-28 21:15:03 +05:30
for module in ${MODULES}; do
if type "${module}_pre_stop" >/dev/null 2>&1; then
if ! ${module}_pre_stop; then
2007-05-02 16:34:52 +05:30
eend 1
exit 1
fi
fi
done
2007-11-28 21:15:03 +05:30
for module in ${MODULES}; do
if type "${module}_stop" >/dev/null 2>&1; then
2007-05-02 16:34:52 +05:30
${module}_stop
fi
2007-05-02 16:34:52 +05:30
done
# Only delete addresses for non PPP interfaces
2007-11-28 21:15:03 +05:30
if ! type is_ppp >/dev/null 2>&1 || ! is_ppp; then
_delete_addresses "${IFACE}"
fi
2007-11-28 21:15:03 +05:30
for module in ${MODULES}; do
if type "${module}_post_stop" >/dev/null 2>&1; then
2007-05-02 16:34:52 +05:30
${module}_post_stop
fi
2007-05-02 16:34:52 +05:30
done
2007-11-22 18:58:14 +05:30
! yesno ${IN_BACKGROUND} && \
2007-05-02 16:34:52 +05:30
[ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ] && \
_down 2>/dev/null
2007-11-28 20:02:24 +05:30
type resolvconf >/dev/null 2>&1 && resolvconf -d "${IFACE}"
2007-11-28 21:15:03 +05:30
if type postdown >/dev/null 2>&1; then
ebegin "Running postdown"
eindent
postdown
eoutdent
2007-05-02 16:34:52 +05:30
fi
2007-05-02 16:34:52 +05:30
return 0
}
2007-05-02 16:34:52 +05:30
# vim: set ts=4 sw=4 :