diff options
author | Roy Marples <roy@marples.name> | 2008-03-26 14:18:01 +0000 |
---|---|---|
committer | Roy Marples <roy@marples.name> | 2008-03-26 14:18:01 +0000 |
commit | ccf238f852fd0463e68d33b91f0dd55000c325e3 (patch) | |
tree | e104640ae7b25be54520c22712b34385b1c030c4 /net/pppd.sh | |
parent | 55858eca2ec678fce14b21df33d08f5aaac94bcf (diff) |
Merge net.OS into net
Diffstat (limited to 'net/pppd.sh')
-rw-r--r-- | net/pppd.sh | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/net/pppd.sh b/net/pppd.sh new file mode 100644 index 00000000..abee058d --- /dev/null +++ b/net/pppd.sh @@ -0,0 +1,243 @@ +# Copyright 2005-2007 Gentoo Foundation +# Copyright 2007-2008 Roy Marples <roy@marples.name> +# All rights reserved. Released under the 2-clause BSD license. + +pppd_depend() +{ + program /usr/sbin/pppd + after interface + before dhcp + provide ppp +} + +is_ppp() +{ + [ -e /var/run/ppp-"${IFACE}".pid ] +} + +requote() +{ + printf "'%s' " "$@" +} + +pppd_pre_start() +{ + # Interface has to be called ppp + [ "${IFACE%%[0-9]*}" = "ppp" ] || return 0 + + # Set our base metric + metric=4000 + + if yesno ${IN_BACKGROUND}; then + local config= + eval config=\$config_${IFVAR} + # If no config for ppp then don't default to DHCP + if [ -z "${config}" ]; then + eval config_${IFVAR}=null + fi + return 0 + fi + + local link= i= unit="${IFACE#ppp}" opts= + + # PPP requires a link to communicate over - normally a serial port + # PPPoE communicates over Ethernet + # PPPoA communicates over ATM + # In all cases, the link needs to be available before we start PPP + eval link=\$link_${IFVAR} + [ -n "${link}" ] || return 0 + + case "${link}" in + /*) + if [ ! -e "${link}" ]; then + eerror "${link} does not exist" + eerror "Please verify hardware or kernel module (driver)" + return 1 + fi + ;; + esac + + if [ -z "${unit}" ]; then + eerror "PPP requires a unit - use net.ppp[0-9] instead of net.ppp" + return 1 + fi + + # We need to flatten the useless array + set -- $(_get_array "pppd_${IFVAR}") + opts="$@" + + local mtu= hasmtu=false hasmru=false hasmaxfail=false haspersist=false + local hasupdetach=false hasdefaultmetric=false + for i in ${opts}; do + case "${i}" in + unit|nodetach|linkname) + eerror "The option \"${i}\" is not allowed in pppd_${IFVAR}" + return 1 + ;; + defaultmetric) hasdefaultmetric=true;; + mtu) hasmtu=true;; + mru) hasmru=true;; + maxfail) hasmaxfail=true;; + persist) haspersist=true;; + updetach) hasupdetach=true;; + esac + done + + # Might be set in conf.d/net + local username= password= passwordset= + eval username=\$username_${IFVAR} + eval password=\$password_${IFVAR} + eval passwordset=\$\{password_${IFVAR}-x\} + if [ -n "${username}" ] \ + && [ -n "${password}" -o -z "${passwordset}" ]; then + opts="${opts} plugin passwordfd.so passwordfd 0" + fi + + if ! ${hasdefaultmetric}; then + local m= + eval m=\$metric_${IFVAR} + [ -z "${m}" ] && m=$((${metric} + $(_ifindex))) + opts="${opts} defaultmetric ${m}" + fi + if [ -n "${mtu}" ]; then + ${hasmtu} || opts="${opts} mtu ${mtu}" + ${hasmru} || opts="${opts} mru ${mtu}" + fi + ${hasmaxfail} || opts="${opts} maxfail 0" + ${haspersist} || opts="${opts} persist" + + # Set linkname because we need /var/run/ppp-${linkname}.pid + # This pidfile has the advantage of being there, + # even if ${IFACE} interface was never started + opts="linkname ${IFACE} ${opts}" + + # Setup auth info + if [ -n "${username}" ]; then + opts="user '${username}' remotename ${IFACE} ${opts}" + fi + + # Load a custom interface configuration file if it exists + [ -f "/etc/ppp/options.${IFACE}" ] \ + && opts="${opts} file '/etc/ppp/options.${IFACE}'" + + # Set unit + opts="unit ${unit} ${opts}" + + # Setup connect script + local chatprog="/usr/sbin/chat -e -E -v" phone= + eval phone=\$phone_number_${IFVAR} + set -- ${phone} + [ -n "$1" ] && chatprog="${chatprog} -T '$1'" + [ -n "$2" ] && chatprog="${chatprog} -U '$2'" + # We need to flatten the useless array + set -- $(_get_array "chat_${IFVAR}") + if [ $# != 0 ]; then + opts="${opts} connect '$(echo ${chatprog} $@ | sed -e "s:':'\\\\'':g")'" + fi + + # Add plugins + local haspppoa=false haspppoe=false plugins="$(_get_array "plugins_${IFVAR}")" + local IFS="$__IFS" + for i in ${plugins}; do + unset IFS + set -- ${i} + case "$1" in + passwordfd) continue;; + pppoa) shift; set -- "pppoatm" "$@";; + pppoe) shift; set -- "rp-pppoe" "$@";; + capi) shift; set -- "capiplugin" "$@";; + esac + case "$1" in + rp-pppoe) haspppoe=true;; + pppoatm) haspppoa=true;; + esac + if [ "$1" = "rp-pppoe" ] || [ "$1" = "pppoatm" -a "${link}" != "/dev/null" ]; then + opts="${opts} connect true" + set -- "$@" "${link}" + fi + opts="${opts} plugin $1.so" + shift + opts="${opts} $@" + done + unset IFS + + #Specialized stuff. Insert here actions particular to connection type (pppoe,pppoa,capi) + local insert_link_in_opts=1 + if ${haspppoe}; then + if [ ! -e /proc/net/pppoe ]; then + # Load the PPPoE kernel module + if ! modprobe pppoe; then + eerror "kernel does not support PPPoE" + return 1 + fi + fi + + # Ensure that the link exists and is up + ( IFACE="${link}"; _exists true && _up ) || return 1 + insert_link_in_opts=0 + fi + + if ${haspppoa}; then + if [ ! -d /proc/net/atm ]; then + # Load the PPPoA kernel module + if ! modprobe pppoatm; then + eerror "kernel does not support PPPoATM" + return 1 + fi + fi + + if [ "${link}" != "/dev/null" ]; then + insert_link_in_opts=0 + else + ewarn "WARNING: An [itf.]vpi.vci ATM address was expected in link_${IFVAR}" + fi + + fi + [ "${insert_link_in_opts}" = "0" ] || opts="${link} ${opts}" + + ebegin "Starting pppd in ${IFACE}" + mark_service_inactive + if [ -n "${username}" ] \ + && [ -n "${password}" -o -z "${passwordset}" ]; then + printf "%s" "${password}" | \ + eval start-stop-daemon --start --exec /usr/sbin/pppd \ + --pidfile "/var/run/ppp-${IFACE}.pid" -- "${opts}" >/dev/null + else + eval start-stop-daemon --start --exec /usr/sbin/pppd \ + --pidfile "/var/run/ppp-${IFACE}.pid" -- "${opts}" >/dev/null + fi + + if ! eend $? "Failed to start PPP"; then + mark_service_stopped + return 1 + fi + + if ${hasupdetach}; then + _show_address + else + einfo "Backgrounding ..." + fi + + # pppd will re-call us when we bring the interface up + exit 0 +} + +# Dummy function for users that still have config_ppp0="ppp" +pppd_start() +{ + return 0 +} + +pppd_stop() +{ + yesno ${IN_BACKGROUND} && return 0 + local pidfile="/var/run/ppp-${IFACE}.pid" + + [ ! -s "${pidfile}" ] && return 0 + + # Give pppd at least 30 seconds do die, #147490 + einfo "Stopping pppd on ${IFACE}" + start-stop-daemon --stop --quiet --exec /usr/sbin/pppd \ + --pidfile "${pidfile}" --retry 30 + eend $? +} |