diff options
-rwxr-xr-x | sh/net.sh | 478 |
1 files changed, 239 insertions, 239 deletions
@@ -9,13 +9,13 @@ _config_vars="config routes" [ -z "${IN_BACKGROUND}" ] && IN_BACKGROUND=false depend() { - local IFACE=${SVCNAME#*.} - local IFVAR=$(echo -n "${IFACE}" | sed -e 's/[^[:alnum:]]/_/g') + local IFACE=${SVCNAME#*.} + local IFVAR=$(echo -n "${IFACE}" | sed -e 's/[^[:alnum:]]/_/g') - need localmount + need localmount after bootmisc - provide net - case "${IFACE}" in + provide net + case "${IFACE}" in lo|lo0) ;; *) after net.lo net.lo0 @@ -31,189 +31,189 @@ depend() { eval prov=\$RC_PROVIDE_${IFVAR} [ -n "${prov}" ] && provide ${prov} ;; - esac + esac } _shell_var() { - echo -n "$1" | sed -e 's/[^[:alnum:]]/_/g' + echo -n "$1" | sed -e 's/[^[:alnum:]]/_/g' } # Credit to David Leverton for this function which handily maps a bash array # structure to positional parameters so existing configs work :) # We'll deprecate arrays at some point though. _get_array() { - if [ -n "${BASH}" ] ; then + if [ -n "${BASH}" ] ; then case "$(declare -p "$1" 2>/dev/null)" in - "declare -a "*) - echo "set -- \"\${$1[@]}\"" - return - ;; + "declare -a "*) + echo "set -- \"\${$1[@]}\"" + return + ;; esac - fi + fi - echo "eval set -- \"\$$1\"" + echo "eval set -- \"\$$1\"" } _wait_for_carrier() { - local timeout= efunc=einfon + local timeout= efunc=einfon - _has_carrier && return 0 + _has_carrier && return 0 - eval timeout=\$carrier_timeout_${IFVAR} - timeout=${timeout:-${carrier_timeout:-5}} + eval timeout=\$carrier_timeout_${IFVAR} + timeout=${timeout:-${carrier_timeout:-5}} # Incase users don't want this nice feature ... [ ${timeout} -le 0 ] && return 0 - [ -n "${RC_EBUFFER}" -o "${RC_PREFIX}" = "yes" ] && efunc=einfo - ${efunc} "Waiting for carrier (${timeout} seconds) " - while [ ${timeout} -gt 0 ] ; do + [ -n "${RC_EBUFFER}" -o "${RC_PREFIX}" = "yes" ] && efunc=einfo + ${efunc} "Waiting for carrier (${timeout} seconds) " + while [ ${timeout} -gt 0 ] ; do sleep 1 if _has_carrier ; then - [ -z "${RC_EBUFFER}" ] && echo + [ -z "${RC_EBUFFER}" ] && echo eend 0 - return 0 + return 0 fi timeout=$((${timeout} - 1)) [ -z "${RC_EBUFFER}" -a "${RC_PREFIX}" != "yes" ] && printf "." - done + done - [ -z "${RC_EBUFFER}" -a "${RC_PREFIX}" != "yes" ] && echo + [ -z "${RC_EBUFFER}" -a "${RC_PREFIX}" != "yes" ] && echo eend 1 - return 1 + return 1 } _netmask2cidr() { - local i= len=0 + local i= len=0 - local IFS=. - for i in $1; do + local IFS=. + for i in $1; do while [ ${i} != "0" ] ; do - len=$((${len} + ${i} % 2)) - i=$((${i} >> 1)) + len=$((${len} + ${i} % 2)) + i=$((${i} >> 1)) done - done + done - echo "${len}" + echo "${len}" } _configure_variables() { - local var= v= t= + local var= v= t= - for var in ${_config_vars} ; do + for var in ${_config_vars} ; do local v= for t in "$@" ; do - eval v=\$${var}_${t} - if [ -n "${v}" ] ; then + eval v=\$${var}_${t} + if [ -n "${v}" ] ; then eval ${var}_${IFVAR}=\$${var}_${t} continue 2 fi done - done + done } _show_address() { - einfo "received address $(_get_inet_address "${IFACE}")" + einfo "received address $(_get_inet_address "${IFACE}")" } # Basically sorts our modules into order and saves the list _gen_module_list() { - local x= f= - if [ -s "${MODULESLIST}" -a "${MODULESLIST}" -nt "${MODULESDIR}" ] ; then + local x= f= + if [ -s "${MODULESLIST}" -a "${MODULESLIST}" -nt "${MODULESDIR}" ] ; then local update=false for x in "${MODULESDIR}"/* ; do - [ -e "${x}" ] || continue - if [ "${x}" -nt "${MODULESLIST}" ] ; then + [ -e "${x}" ] || continue + if [ "${x}" -nt "${MODULESLIST}" ] ; then update=true break - fi + fi done ${update} || return 0 - fi + fi - einfo "Caching network module dependencies" - # Run in a subshell to protect the main script - ( - after() { + einfo "Caching network module dependencies" + # Run in a subshell to protect the main script + ( + after() { eval ${MODULE}_after="\"\${${MODULE}_after}\${${MODULE}_after:+ }$*\"" - } + } - before() { + before() { local mod=${MODULE} local MODULE= for MODULE in "$@" ; do - after "${mod}" + after "${mod}" done - } + } - program() { + program() { if [ "$1" = "start" -o "$1" = "stop" ] ; then - local s="$1" - shift - eval ${MODULE}_program_${s}="\"\${${MODULE}_program_${s}}\${${MODULE}_program_${s}:+ }$*\"" + local s="$1" + shift + eval ${MODULE}_program_${s}="\"\${${MODULE}_program_${s}}\${${MODULE}_program_${s}:+ }$*\"" else - eval ${MODULE}_program="\"\${${MODULE}_program}\${${MODULE}_program:+ }$*\"" + eval ${MODULE}_program="\"\${${MODULE}_program}\${${MODULE}_program:+ }$*\"" fi - } + } - provide() { + provide() { eval ${MODULE}_provide="\"\${${MODULE}_provide}\${${MODULE}_provide:+ }$*\"" local x for x in $* ; do - eval ${x}_providedby="\"\${${MODULE}_providedby}\${${MODULE}_providedby:+ }${MODULE}\"" + eval ${x}_providedby="\"\${${MODULE}_providedby}\${${MODULE}_providedby:+ }${MODULE}\"" done - } + } - for MODULE in "${MODULESDIR}"/* ; do + for MODULE in "${MODULESDIR}"/* ; do sh -n "${MODULE}" || continue . "${MODULE}" || continue MODULE=${MODULE#${MODULESDIR}/} MODULE=${MODULE%.sh} eval ${MODULE}_depend MODULES="${MODULES} ${MODULE}" - done + done - VISITED= - SORTED= - visit() { + VISITED= + SORTED= + visit() { case " ${VISITED} " in - *" $1 "*) return ;; + *" $1 "*) return ;; esac VISITED="${VISITED} $1" eval AFTER=\$${1}_after for MODULE in ${AFTER} ; do - eval PROVIDEDBY=\$${MODULE}_providedby - if [ -n "${PROVIDEDBY}" ] ; then + eval PROVIDEDBY=\$${MODULE}_providedby + if [ -n "${PROVIDEDBY}" ] ; then for MODULE in ${PROVIDEDBY} ; do - visit "${MODULE}" + visit "${MODULE}" done - else + else visit "${MODULE}" - fi + fi done eval PROVIDE=\$${1}_provide for MODULE in ${PROVIDE} ; do - visit "${MODULE}" + visit "${MODULE}" done eval PROVIDEDBY=\$${1}_providedby [ -z "${PROVIDEDBY}" ] && SORTED="${SORTED} $1" - } + } - for MODULE in ${MODULES} ; do + for MODULE in ${MODULES} ; do visit "${MODULE}" - done + done - > "${MODULESLIST}" - i=0 - for MODULE in ${SORTED} ; do + > "${MODULESLIST}" + i=0 + for MODULE in ${SORTED} ; do eval PROGRAM=\$${MODULE}_program eval PROGRAM_START=\$${MODULE}_program_start eval PROGRAM_STOP=\$${MODULE}_program_stop #for x in ${PROGRAM} ; do - # [ -x "${x}" ] || continue 2 + # [ -x "${x}" ] || continue 2 #done eval PROVIDE=\$${MODULE}_provide echo "module_${i}='${MODULE}'" >> "${MODULESLIST}" @@ -222,41 +222,41 @@ _gen_module_list() { echo "module_${i}_program_stop='${PROGRAM_STOP}'" >> "${MODULESLIST}" echo "module_${i}_provide='${PROVIDE}'" >> "${MODULESLIST}" i=$((${i} + 1)) - done - echo "module_${i}=" >> "${MODULESLIST}" - ) + done + echo "module_${i}=" >> "${MODULESLIST}" + ) - return 0 + return 0 } _load_modules() { - # Ensure our list is up to date - _gen_module_list + # Ensure our list is up to date + _gen_module_list - local starting=$1 mymods= + local starting=$1 mymods= - MODULES= - if [ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ] ; then + MODULES= + if [ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ] ; then eval mymods=\$modules_${IFVAR} [ -z "${mymods}" ] && mymods=${modules} - fi + fi - . "${MODULESLIST}" - local i=-1 x= mod= f= provides= - while true ; do + . "${MODULESLIST}" + local i=-1 x= mod= f= provides= + while true ; do i=$((${i} + 1)) eval mod=\$module_${i} [ -z "${mod}" ] && break [ -e "${MODULESDIR}/${mod}.sh" ] || continue - eval set -- \$module_${i}_program + eval set -- \$module_${i}_program if [ -n "$1" ] ; then x= for x in "$@" ; do [ -x "${x}" ] && break done [ -x "${x}" ] || continue - fi + fi if ${starting} ; then eval set -- \$module_${i}_program_start else @@ -268,21 +268,21 @@ _load_modules() { [ -x "${x}" ] && break done [ -x "${x}" ] || continue - fi + fi eval provides=\$module_${i}_provide if ${starting} ; then - case " ${mymods} " in + case " ${mymods} " in *" !${mod} "*) continue ;; *" !${provides} "*) [ -n "${provides}" ] && continue ;; - esac + esac fi MODULES="${MODULES}${MODULES:+ }${mod}" # Now load and wrap our functions if ! . "${MODULESDIR}/${mod}.sh" ; then - eend 1 "${SVCNAME}: error loading module \`${mod}'" - exit 1 + eend 1 "${SVCNAME}: error loading module \`${mod}'" + exit 1 fi [ -z "${provides}" ] && continue @@ -290,112 +290,112 @@ _load_modules() { # Wrap our provides local f= for f in pre_start start post_start ; do - eval "${provides}_${f}() { type ${mod}_${f} >/dev/null 2>/dev/null || return 0; ${mod}_${f} \"\$@\"; }" + eval "${provides}_${f}() { type ${mod}_${f} >/dev/null 2>/dev/null || return 0; ${mod}_${f} \"\$@\"; }" done eval module_${mod}_provides="${provides}" eval module_${provides}_providedby="${mod}" - done + done - # Wrap our preferred modules - for mod in ${mymods} ; do + # Wrap our preferred modules + for mod in ${mymods} ; do case " ${MODULES} " in - *" ${mod} "*) - eval x=\$module_${mod}_provides - [ -z "${x}" ] && continue - for f in pre_start start post_start ; do - eval "${x}_${f}() { type ${mod}_${f} >/dev/null 2>/dev/null || return 0; ${mod}_${f} \"\$@\"; }" - done - eval module_${x}_providedby="${mod}" - ;; + *" ${mod} "*) + eval x=\$module_${mod}_provides + [ -z "${x}" ] && continue + for f in pre_start start post_start ; do + eval "${x}_${f}() { type ${mod}_${f} >/dev/null 2>/dev/null || return 0; ${mod}_${f} \"\$@\"; }" + done + eval module_${x}_providedby="${mod}" + ;; esac - done + done - # Finally remove any duplicated provides from our list if we're starting - # Otherwise reverse the list - local LIST="${MODULES}" p= - MODULES= - if ${starting} ; then + # Finally remove any duplicated provides from our list if we're starting + # Otherwise reverse the list + local LIST="${MODULES}" p= + MODULES= + if ${starting} ; then for mod in ${LIST} ; do - eval x=\$module_${mod}_provides - if [ -n "${x}" ] ; then + eval x=\$module_${mod}_provides + if [ -n "${x}" ] ; then eval p=\$module_${x}_providedby [ "${mod}" != "${p}" ] && continue - fi - MODULES="${MODULES}${MODULES:+ }${mod}" + fi + MODULES="${MODULES}${MODULES:+ }${mod}" done - else + else for mod in ${LIST} ; do - MODULES="${mod}${MODULES:+ }${MODULES}" + MODULES="${mod}${MODULES:+ }${MODULES}" done - fi + fi - veinfo "Loaded modules: ${MODULES}" + veinfo "Loaded modules: ${MODULES}" } _load_config() { - eval "$(_get_array "config_${IFVAR}")" - if [ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ] ; then + eval "$(_get_array "config_${IFVAR}")" + if [ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ] ; then set -- "127.0.0.1/8" "$@" - else + else if [ $# -eq 0 ] ; then - ewarn "No configuration specified; defaulting to DHCP" - set -- "dhcp" + ewarn "No configuration specified; defaulting to DHCP" + set -- "dhcp" fi - fi + fi - # We store our config in an array like vars - # so modules can influence it - config_index=0 - for cmd in "$@" ; do + # We store our config in an array like vars + # so modules can influence it + config_index=0 + for cmd in "$@" ; do eval config_${config_index}="'${cmd}'" config_index=$((${config_index} + 1)) - done - # Terminate the list - eval config_${config_index}= + done + # Terminate the list + eval config_${config_index}= - config_index=0 - eval $(_get_array fallback_${IFVAR}) - for cmd in "$@" ; do + config_index=0 + eval $(_get_array fallback_${IFVAR}) + for cmd in "$@" ; do eval fallback_${config_index}="'${cmd}'" config_index=$((${config_index} + 1)) - done - # Terminate the list - eval fallback_${config_index}= + done + # Terminate the list + eval fallback_${config_index}= # Don't set to zero, so any net modules don't have to do anything extra - config_index=-1 + config_index=-1 } start() { - local IFACE=${SVCNAME#*.} oneworked=false module= - local IFVAR=$(_shell_var "${IFACE}") cmd= metric=0 our_metric=$metric + local IFACE=${SVCNAME#*.} oneworked=false module= + local IFVAR=$(_shell_var "${IFACE}") cmd= metric=0 our_metric=$metric - einfo "Bringing up interface ${IFACE}" - eindent + einfo "Bringing up interface ${IFACE}" + eindent - if [ -z "${MODULES}" ] ; then + if [ -z "${MODULES}" ] ; then local MODULES= _load_modules true - fi + fi - _up 2>/dev/null + _up 2>/dev/null - if type preup >/dev/null 2>/dev/null ; then + if type preup >/dev/null 2>/dev/null ; then ebegin "Running preup" eindent preup || return 1 eoutdent - fi + fi - for module in ${MODULES} ; do + for module in ${MODULES} ; do if type "${module}_pre_start" >/dev/null 2>/dev/null ; then - if ! ${module}_pre_start ; then + if ! ${module}_pre_start ; then eend 1 exit 1 - fi + fi fi - done + done if ! _exists ; then eerror "ERROR: interface ${IFACE} does not exist" @@ -413,17 +413,17 @@ start() { return 1 fi - local config= config_index= - _load_config + local config= config_index= + _load_config config_index=0 - if [ -n "${our_metric}" ] ; then + if [ -n "${our_metric}" ] ; then metric=${our_metric} - elif [ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ] ; then + elif [ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ] ; then metric=$((${metric} + $(_ifindex))) - fi + fi - while true ; do + while true ; do eval config=\$config_${config_index} [ -z "${config}" ] && break @@ -431,160 +431,160 @@ start() { ebegin "$1" eindent case "$1" in - noop) - if [ -n "$(_get_inet_address)" ] ; then + noop) + if [ -n "$(_get_inet_address)" ] ; then oneworked=true break - fi - ;; - null) : ;; - [0-9]*|*:*) _add_address ${config} ;; - *) - if type "${config}_start" >/dev/null 2>/dev/null ; then + fi + ;; + null) : ;; + [0-9]*|*:*) _add_address ${config} ;; + *) + if type "${config}_start" >/dev/null 2>/dev/null ; then "${config}"_start - else + else eerror "nothing provides \`${config}'" - fi - ;; + fi + ;; esac if eend $? ; then - oneworked=true + oneworked=true else - eval config=\$fallback_${IFVAR} - if [ -n "${config}" ] ; then + eval config=\$fallback_${IFVAR} + if [ -n "${config}" ] ; then einfo "Trying fallback configuration" eval config_${config_index}=\$fallback_${IFVAR} eval fallback_${config_index}= config_index=$((${config_index} - 1)) - fi + fi fi eoutdent config_index=$((${config_index} + 1)) - done + done if ! ${oneworked} ; then - if type failup >/dev/null 2>/dev/null ; then + if type failup >/dev/null 2>/dev/null ; then ebegin "Running failup" eindent failup eoutdent - fi + fi return 1 fi - local hidefirstroute=false first=true routes= - eval "$(_get_array "routes_${IFVAR}")" - if [ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ] ; then + local hidefirstroute=false first=true routes= + eval "$(_get_array "routes_${IFVAR}")" + if [ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ] ; then set -- "127.0.0.0/8 via 127.0.0.1" "$@" hidefirstroute=true - fi - for cmd in "$@" ; do + fi + for cmd in "$@" ; do if ${first} ; then - first=false - einfo "Adding routes" + first=false + einfo "Adding routes" fi eindent ebegin "${cmd}" # Work out if we're a host or a net if not told case "${cmd}" in - *" -net "*|*" -host "*) ;; - *" netmask "*) cmd="-net ${cmd}" ;; - *) - case "${cmd%% *}" in + *" -net "*|*" -host "*) ;; + *" netmask "*) cmd="-net ${cmd}" ;; + *) + case "${cmd%% *}" in *.*.*.*/32) cmd="-host ${cmd}" ;; *.*.*.*/*|0.0.0.0|default) cmd="-net ${cmd}" ;; *) cmd="-host ${cmd}" ;; - esac - ;; + esac + ;; esac if ${hidefirstroute} ; then - _add_route ${cmd} >/dev/null 2>/dev/null - hidefirstroute=false + _add_route ${cmd} >/dev/null 2>/dev/null + hidefirstroute=false else - _add_route ${cmd} >/dev/null + _add_route ${cmd} >/dev/null fi eend $? eoutdent - done + done - for module in ${MODULES} ; do + for module in ${MODULES} ; do if type "${module}_post_start" >/dev/null 2>/dev/null ; then - if ! ${module}_post_start ; then - eend 1 - exit 1 - fi + if ! ${module}_post_start ; then + eend 1 + exit 1 + fi fi - done + done - if type postup >/dev/null 2>/dev/null ; then + if type postup >/dev/null 2>/dev/null ; then ebegin "Running postup" eindent postup eoutdent - fi + fi - return 0 + return 0 } stop() { - local IFACE=${SVCNAME#*.} module= - local IFVAR=$(_shell_var "${IFACE}") opts= + local IFACE=${SVCNAME#*.} module= + local IFVAR=$(_shell_var "${IFACE}") opts= - einfo "Bringing down interface ${IFACE}" - eindent + einfo "Bringing down interface ${IFACE}" + eindent - if [ -z "${MODULES}" ] ; then + if [ -z "${MODULES}" ] ; then local MODULES= _load_modules false - fi + fi - if type predown >/dev/null 2>/dev/null ; then + if type predown >/dev/null 2>/dev/null ; then ebegin "Running predown" eindent predown || return 1 eoutdent - fi + fi - for module in ${MODULES} ; do + for module in ${MODULES} ; do if type "${module}_pre_stop" >/dev/null 2>/dev/null ; then - if ! ${module}_pre_stop ; then - eend 1 - exit 1 - fi - fi - done + if ! ${module}_pre_stop ; then + eend 1 + exit 1 + fi + fi + done - for module in ${MODULES} ; do + for module in ${MODULES} ; do if type "${module}_stop" >/dev/null 2>/dev/null ; then - ${module}_stop + ${module}_stop fi - done + done # Only delete addresses for non PPP interfaces if ! type is_ppp >/dev/null 2>/dev/null || ! is_ppp ; then _delete_addresses "${IFACE}" fi - for module in ${MODULES} ; do + for module in ${MODULES} ; do if type "${module}_post_stop" >/dev/null 2>/dev/null ; then - ${module}_post_stop + ${module}_post_stop fi - done + done - [ "${IN_BACKGROUND}" != "true" ] && \ - [ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ] && \ - _down 2>/dev/null + [ "${IN_BACKGROUND}" != "true" ] && \ + [ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ] && \ + _down 2>/dev/null - [ -x /sbin/resolvconf ] && resolvconf -d "${IFACE}" + [ -x /sbin/resolvconf ] && resolvconf -d "${IFACE}" - if type postdown >/dev/null 2>/dev/null ; then + if type postdown >/dev/null 2>/dev/null ; then ebegin "Running postdown" eindent postdown eoutdent - fi + fi - return 0 + return 0 } -# vim: set ts=4 : +# vim: set ts=4 sw=4 : |