aboutsummaryrefslogtreecommitdiff
path: root/net/pppd.sh
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2008-03-26 14:18:01 +0000
committerRoy Marples <roy@marples.name>2008-03-26 14:18:01 +0000
commitccf238f852fd0463e68d33b91f0dd55000c325e3 (patch)
treee104640ae7b25be54520c22712b34385b1c030c4 /net/pppd.sh
parent55858eca2ec678fce14b21df33d08f5aaac94bcf (diff)
Merge net.OS into net
Diffstat (limited to 'net/pppd.sh')
-rw-r--r--net/pppd.sh243
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 $?
+}