#!/bin/bash # Copyright (c) 2004-2005 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ # function rename wrapper - remove for baselayout-1.12.x if [[ $( type -t bash_variable ) != "function" ]] ; then bash_variable() { interface_variable "$*" } fi # char* pppd_provides(void) # # Returns a string to change module definition for starting up pppd_provides() { echo "ppp" } # void pppd_depend(void) # # Sets up the dependancies for the module pppd_depend() { after interface before dhcp } # bool pppd_check_installed(void) # # Returns 1 if pppd is installed, otherwise 0 pppd_check_installed() { if [[ ! -x /usr/sbin/pppd ]]; then ${1:-false} && eerror "For PPP support, emerge net-dialup/ppp" return 1 fi return 0 } # bool pppd_check_depends(void) # # Checks to see if we have the needed functions pppd_check_depends() { return 0 } # bool pppd_update_secrets_file(char* filepath, char* username, \ # char* remotename, char* password) # # Add/update PAP/CHAP authentication information pppd_update_secrets_file() { local file="$1" user="$2" remote="$3" password="$4" local tmpfile="/tmp/ppp-secret.$$" touch "${tmpfile}" || return 1 chmod 0600 "${tmpfile}" || return 1 if [[ -e "${file}" ]]; then # Build a egrep to find all possible entries in the secrets file do_quote() { echo "^[ \t]*$1$2$1[ \t]*$3$4$3[ \t]" } local e="$( do_quote "" "${user}" "" "${remote}" )" e="${e}|$( do_quote '"' "${user}" "" "${remote}" )" e="${e}|$( do_quote '"' "${user}" '"' "${remote}" )" e="${e}|$( do_quote "" "${user}" '"' "${remote}" )" e="${e}|$( do_quote "'" "${user}" "" "${remote}" )" e="${e}|$( do_quote "'" "${user}" "'" "${remote}" )" e="${e}|$( do_quote "" "${user}" "'" "${remote}" )" unset -f do_quote egrep -v "${e}" "${file}" > "${tmpfile}" fi echo "\"${user}\"\t\"${remote}\"\t\"${password}\"" >> "${tmpfile}" [[ -e ${file} ]] && vewarn "Authentication info has been added to ${file}" mv "${tmpfile}" "${file}" || return 1 return 0 } # bool pppd_start(char *iface) # # Start PPP on an interface by calling pppd # # Returns 0 (true) when successful, otherwise 1 pppd_start() { local iface="$1" ifvar=$( bash_variable "$1" ) opts="" link if [[ ${iface%%[0-9]*} != "ppp" ]]; then eerror "PPP can only be invoked from net.ppp[0-9]" return 1 fi local unit="${iface#ppp}" if [[ -z ${unit} ]] ; then eerror "PPP requires a unit - use net.ppp[0-9] instead of net.ppp" return 1 fi # PPP requires a link to communictate over - normally a serial port # PPPoE communicates over ethernet # PPPoA communictes over ATM # In all cases, the link needs to be available before we start PPP eval link=\"\$\{link_${ifvar}\}\" if [[ -z ${link} ]]; then eerror "link_${ifvar} has not been set in /etc/conf.d/net" return 1 fi # Might or might not be set in conf.d/net local user password i eval username=\"\$\{username_${ifvar}\}\" eval password=\"\$\{password_${ifvar}\}\" #Add/update info in PAP/CHAP secrets files if [[ -n ${username} && -n ${password} ]]; then if ! pppd_update_secrets_file "/etc/ppp/pap-secrets" \ "${username}" "${link}" "${password}" ; then eerror "Failed to update ${file}" return 1 fi if ! pppd_update_secrets_file "/etc/ppp/chap-secrets" \ "${username}" "${link}" "${password}" ; then eerror "Failed to update ${file}" return 1 fi fi local -a plugins eval plugins=( \"\$\{plugins_${ifvar}\}\" ) for (( i=0; i<${#plugins[@]}; i++ )); do local -a plugin=( ${plugins[i]} ) # Bound to be some users who do this [[ ${plugin[0]} == "pppoe" ]] && plugin[0]="rp-pppoe" [[ ${plugin[0]} == "pppoa" ]] && plugin[0]="pppoatm" [[ ${plugin[0]} == "rp-pppoe" ]] && opts="${opts} connect true" opts="${opts} plugin ${plugin[0]}.so ${plugin[@]:1}" done if [[ " ${opts} " == *" plugin rp-pppoe.so "* ]]; then # Ensure that the link exists and is up interface_exists "${link}" true || return 1 interface_up "${link}" # Load the pppoe kernel module - if this fails, we have to hope # that pppoe support is compiled into the kernel modprobe pppoe 2>/dev/null # Default pppoe options - the user can override these using # pppd_ppp0="..." opts="${opts} noaccomp noccp nobsdcomp nodeflate \ nopcomp novj novjccomp" fi # Load any commandline options eval opts=\"\$\{opts\} \$\{pppd_${ifvar}\} unit ${unit} \" # Check for mtu/mru local mtu eval mtu=\"\$\{mtu_${ifvar}:-1492\}\" [[ " ${opts} " != *" mtu "* ]] && opts="${opts} mtu ${mtu}" [[ " ${opts} " != *" mru "* ]] && opts="${opts} mru ${mtu}" # Don't detach if we're not idling [[ " ${opts} " != *" idle "* && " ${opts} " != *" nodetach "* \ && " ${opts} " != *" updetach "* ]] \ && opts="${opts} nodetach" [[ -n ${username} ]] && opts="${opts} user ${username}" ebegin "Running pppd" i=$( /usr/sbin/pppd persist maxfail 0 ${opts} \ remotename "${link}" linkname "${iface}" ipparam "${link}" ) eend $? "${i}" || return 1 } # bool pppd_stop(char *iface) # # Stop PPP link by killing the associated pppd process # # Returns 0 (true) if no process to kill or it terminates successfully, # otherwise non-zero (false) pppd_stop() { local iface="$1" pidfile="/var/run/ppp-$1.pid" [[ ! -s ${pidfile} ]] && return 0 local pid=$( head -n 1 "${pidfile}" ) einfo "Stopping pppd on ${iface}" kill -s TERM "${pid}" process_finished "${pid}" /usr/sbin/pppd eend $? }