summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJouke Witteveen <j.witteveen@gmail.com>2013-10-23 13:31:38 +0200
committerJouke Witteveen <j.witteveen@gmail.com>2013-10-24 00:40:03 +0200
commit120d94020aed8d8b5e1b76dc7ee03fa062fab26c (patch)
tree4b4b054f4e9ddf8444fffb8b62b6cba45065214c
parent2f1ef4d9f87af7112c6bbb7c53bbe7bafe3ef8b1 (diff)
downloadnetctl-120d94020aed8d8b5e1b76dc7ee03fa062fab26c.tar.gz
netctl-120d94020aed8d8b5e1b76dc7ee03fa062fab26c.tar.xz
Overhaul of ppp connection types
- Refactorization of option file generation - Introduction of optional additional pppd options file specification - Introduction of unit specification option for pppoe connections
-rw-r--r--docs/examples/mobile_ppp3
-rw-r--r--docs/netctl.profile.5.txt11
-rw-r--r--src/lib/connections/mobile_ppp118
-rw-r--r--src/lib/connections/pppoe90
4 files changed, 89 insertions, 133 deletions
diff --git a/docs/examples/mobile_ppp b/docs/examples/mobile_ppp
index f3b0b8a..383e000 100644
--- a/docs/examples/mobile_ppp
+++ b/docs/examples/mobile_ppp
@@ -2,9 +2,6 @@ Description='Example PPP mobile connection'
Interface=ttyUSB0
Connection=mobile_ppp
-# Debug pppd / chat output (separately from netctl)
-#PPPDebug=true
-
# Use default route provided by the peer (default: true)
#DefaultRoute=true
# Use DNS provided by the peer (default: true)
diff --git a/docs/netctl.profile.5.txt b/docs/netctl.profile.5.txt
index 1f39361..74bbc6d 100644
--- a/docs/netctl.profile.5.txt
+++ b/docs/netctl.profile.5.txt
@@ -332,12 +332,18 @@ the `pppoe' type:
Use the default route provided by the peer (defaults to `true')
'UsePeerDNS='::
- Use the DNS provided by the peer (defaults to `true')
+ Use the DNS provided by the peer (defaults to `true').
+
+'PPPUnit='::
+ Set the ppp unit number in the interface name (ppp0, ppp1, etc.).
'LCPEchoInterval=' and 'LCPEchoFailure='::
These options override default LCP parameters from
`/etc/ppp/options'.
+'OptionsFile='::
+ A file to read additional pppd options from.
+
The following advanced options are also understood:
'PPPoEService='::
@@ -389,6 +395,9 @@ type:
AT commands specific to certain Huawei modems; all other devices
should use `None'.
+'OptionsFile='::
+ A file to read additional pppd options from.
+
OPTIONS FOR `tunnel' CONNECTIONS
--------------------------------
diff --git a/src/lib/connections/mobile_ppp b/src/lib/connections/mobile_ppp
index b966390..5006c6c 100644
--- a/src/lib/connections/mobile_ppp
+++ b/src/lib/connections/mobile_ppp
@@ -11,18 +11,14 @@ quote_word() {
}
mobile_ppp_up() {
- local cfg
- local chat
-
- mkdir -p "$STATE_DIR/mobile_ppp.${Interface}.${Profile}/"
- chmod 700 "$STATE_DIR/mobile_ppp.${Interface}.${Profile}/"
- cfg="$STATE_DIR/mobile_ppp.${Interface}.${Profile}/options"
+ local options chat
+ options="$STATE_DIR/mobile_ppp.${Interface}.${Profile}/options"
chat="$STATE_DIR/mobile_ppp.${Interface}.${Profile}/modem.chat"
- echo "linkname $(quote_word "${Profile}")" > "${cfg}"
- chmod 600 "${cfg}"
- cat >> "${cfg}" << EOF
-${Interface}
+ mkdir -p "$(dirname "$options")"
+ cat >> "$options" << EOF
+linkname $(quote_word "$Profile")
+$(quote_word "$Interface")
921600
lock
crtscts
@@ -30,61 +26,19 @@ modem
passive
novj
holdoff 10
-maxfail ${MaxFail:-5}
-EOF
-
- # Debug pppd output separately from netctl
- if is_yes "${PPPDebug:-yes}"; then
- echo "debug" >> "${cfg}"
- fi
-
- # Sets up route
- if is_yes "${DefaultRoute:-yes}"; then
- echo "defaultroute" >> "${cfg}"
- else
- echo "nodefaultroute" >> "${cfg}"
- fi
- if is_yes "${UsePeerDNS:-yes}"; then
- echo "usepeerdns" >> "${cfg}"
- fi
- # Writes username and password
- echo "noauth" >> "${cfg}"
- echo "hide-password" >> ${cfg}
- [[ -n ${User} ]] && echo "user $(quote_word "${User}")" >> "${cfg}"
- [[ -n ${Password} ]] && echo "password $(quote_word "${Password}")" >> "${cfg}"
-
- #echo "'OK' @/etc/ppp/chatscripts/pin" >> "${chat}"
- if [ -n "${Pin}" ]; then
- PinStr="'OK' 'AT+CPIN=\"${Pin}\"'"
- else
- PinStr="'OK' 'AT'"
- fi
- report_debug echo $PinStr
-
- # Mode can be one of 3Gpref, 3Gonly, GPRSpref, GPRSonly, None
- # Only works for Huawei modems
- #echo "'OK' @/etc/ppp/chatscripts/mode" >> "${chat}"
- case "${Mode}" in
- 3Gonly)
- ModeStr="'OK' 'AT\^SYSCFG=14,2,3fffffff,0,1'"
- ;;
- 3Gpref)
- ModeStr="'OK' 'AT\^SYSCFG=2,2,3fffffff,0,1'"
- ;;
- GPRSonly)
- ModeStr="'OK' 'AT\^SYSCFG=13,1,3fffffff,0,0'"
- ;;
- GPRSpref)
- ModeStr="'OK' 'AT\^SYSCFG=2,1,3fffffff,0,0'"
- ;;
- *)
- ModeStr="'OK' 'AT'"
- ;;
- esac
+noauth
+$(is_yes "${DefaultRoute:-yes}" || printf no)defaultroute
+maxfail $(quote_word "${MaxFail:-5}")
+$(is_yes "${UsePeerDNS:-yes}" && printf usepeerdns)
+hide-password
+${User:+user $(quote_word "$User")}
+${Password:+password $(quote_word "$Password")}
+connect $(quote_word "/usr/sbin/chat -v -t15 -f $(quote_word "$chat")")
+${OptionsFile:+file $(quote_word "$OptionsFile")}
+EOF
- # Now that we’ve got the ppp configuration set up, write the chat script
- cat >> "${chat}" << EOF
+ cat >> "$chat" << EOF
ECHO ON
ABORT 'BUSY'
ABORT 'NO CARRIER'
@@ -100,40 +54,40 @@ TIMEOUT 6
'OK-AT-OK' 'ATZ'
TIMEOUT 3
'OK' 'AT+CFUN=1'
-${PinStr}
+'OK' 'AT${Pin:++CPIN=$(quote_word "$Pin")}'
'OK\d-AT-OK' 'ATI'
'OK' 'ATZ'
'OK' 'ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0'
-${ModeStr}
-'OK-AT-OK' 'AT+CGDCONT=1,"IP","${AccessPointName}"'
+'OK' 'AT$(case $Mode in
+ 3Gonly) printf "\^SYSCFG=14,2,3fffffff,0,1";;
+ 3Gpref) printf "\^SYSCFG=2,2,3fffffff,0,1";;
+ GPRSonly) printf "\^SYSCFG=13,1,3fffffff,0,0";;
+ GPRSpref) printf "\^SYSCFG=2,1,3fffffff,0,0";;
+esac)'
+'OK-AT-OK' 'AT+CGDCONT=1,"IP",$(quote_word "$AccessPointName")'
'OK' 'ATDT*99#'
TIMEOUT 30
CONNECT ''
EOF
- # Add the chat script line to the configuration
- echo "connect \"/usr/sbin/chat -v -t15 -f ${chat}\"" >> "${cfg}"
-
- if ! $PPPD file "${cfg}"; then
- rmdir "$STATE_DIR/mobile_ppp.${Interface}.${Profile}/"
- report_error "Couldn't make pppd connection."
+ if ! $PPPD file "$options"; then
+ rm "$options" "$chat"
+ rmdir "$(dirname "$options")"
+ report_error "Could not establish a ppp connection for profile '$Profile'."
return 1
fi
}
mobile_ppp_down() {
- local cfg chat pidfile pid
- cfg="$STATE_DIR/mobile_ppp.${Interface}.${Profile}/options"
- chat="$STATE_DIR/mobile_ppp.${Interface}.${Profile}/modem.chat"
- pidfile="/var/run/ppp-${Profile}.pid"
+ local options chat pidfile
+ options="$STATE_DIR/mobile_ppp.$Interface.$Profile/options"
+ chat="$STATE_DIR/mobile_ppp.$Interface.$Profile/modem.chat"
+ pidfile="/var/run/ppp-$Profile.pid"
- if [[ -e $pidfile ]]; then
- read pid < "$pidfile"
- [[ "$pid" ]] && kill "$pid"
- fi
+ [[ -r $pidfile ]] && kill "$(< "$pidfile")"
- rm "${cfg}" "${chat}"
- rmdir "$STATE_DIR/mobile_ppp.${Interface}.${Profile}/"
+ rm "$options" "$chat"
+ rmdir "$(dirname "$options")"
}
diff --git a/src/lib/connections/pppoe b/src/lib/connections/pppoe
index 65fee79..78cc35f 100644
--- a/src/lib/connections/pppoe
+++ b/src/lib/connections/pppoe
@@ -8,7 +8,9 @@ quote_word() {
}
pppoe_up() {
- local cfg
+ local options pidfile pppn
+ options="$STATE_DIR/pppoe.$Interface.$Profile/options"
+ pidfile="/var/run/ppp-$Profile.pid"
if ! is_interface "$Interface"; then
report_error "Interface '$Interface' does not exist"
@@ -19,61 +21,55 @@ pppoe_up() {
return 1
fi
- mkdir -p "$STATE_DIR/pppoe.${Interface}.${Profile}/"
- chmod 700 "$STATE_DIR/pppoe.${Interface}.${Profile}/"
- cfg="$STATE_DIR/pppoe.${Interface}.${Profile}/options"
- echo "linkname $(quote_word "${Profile}")" > "${cfg}"
- chmod 600 "${cfg}"
+ mkdir -p "$(dirname "$options")"
+ cat >> "$options" << EOF
+linkname $(quote_word "$Profile")
+${PPPUnit:+unit $(quote_word "$PPPUnit")}
+updetach
+plugin rp-pppoe.so
+nic-$Interface
- echo "plugin rp-pppoe.so" >> "${cfg}"
- echo "nic-${Interface}" >> "${cfg}"
- echo "noauth" >> "${cfg}"
- if is_yes "${DefaultRoute:-yes}"; then
- echo "defaultroute" >> "${cfg}"
- else
- echo "nodefaultroute" >> "${cfg}"
- fi
- if is_yes "${UsePeerDNS:-yes}"; then
- echo "usepeerdns" >> "${cfg}"
- fi
- echo "maxfail ${MaxFail:-5}" >> "${cfg}"
- echo "updetach" >> "${cfg}"
- if [[ ${ConnectionMode} == demand ]]; then
- echo "demand" >> "${cfg}"
- echo "idle ${IdleTimeout}" >> "${cfg}"
- else
- echo "persist" >> "${cfg}"
- fi
- echo "user $(quote_word "${User}")" >> "${cfg}"
- echo "password $(quote_word "${Password}")" >> "${cfg}"
- [[ -n ${LCPEchoInterval} ]] && echo "lcp-echo-interval ${LCPEchoInterval}" >> "${cfg}"
- [[ -n ${LCPEchoFailure} ]] && echo "lcp-echo-failure ${LCPEchoFailure}" >> "${cfg}"
- [[ -n ${PPPoEService} ]] && echo "rp_pppoe_service $(quote_word "${PPPoEService}")" >> "${cfg}"
- [[ -n ${PPPoEAC} ]] && echo "rp_pppoe_ac $(quote_word "${PPPoEAC}")" >> "${cfg}"
- [[ -n ${PPPoESession} ]] && echo "rp_pppoe_sess $(quote_word "${PPPoESession}")" >> "${cfg}"
- [[ -n ${PPPoEMAC} ]] && echo "pppoe-mac $(quote_word "${PPPoEMAC}")" >> "${cfg}"
- [[ ${PPPoEIP6} == yes ]] && echo "+ipv6" >> "${cfg}"
+noauth
+$(is_yes "${DefaultRoute:-yes}" || printf no)defaultroute
+maxfail $(quote_word "${MaxFail:-5}")
+$(is_yes "${UsePeerDNS:-yes}" && printf usepeerdns)
+$(quote_word "${ConnectionMode:-persist}")
+$([[ $ConnectionMode == demand ]] && printf "idle %s" "$(quote_word "$IdleTimeout")")
+${LCPEchoInterval:+lcp-echo-interval $(quote_word "$LCPEchoInterval")}
+${LCPEchoFailure:+lcp-echo-failure $(quote_word "$LCPEchoFailure")}
+${PPPoEService:+rp_pppoe_service $(quote_word "$PPPoEService")}
+${PPPoEAC:+rp_pppoe_ac $(quote_word "$PPPoEAC")}
+${PPPoESession:+rp_pppoe_sess $(quote_word "$PPPoESession")}
+${PPPoEMAC:+pppoe-mac $(quote_word "$PPPoEMAC")}
+$(is_yes "${PPPoEIP6:-no}" && printf +ipv6)
+$(is_yes "${PPPoEIP6:-yes}" || printf noipv6)
- if ! $PPPD file "${cfg}"; then
- rm "${cfg}"
- rmdir "$STATE_DIR/pppoe.${Interface}.${Profile}/"
- report_error "Couldn't make pppd connection."
+user $(quote_word "$User")
+password $(quote_word "$Password")
+${OptionsFile:+file $(quote_word "$OptionsFile")}
+EOF
+
+ if ! $PPPD file "$options"; then
+ rm "$options"
+ rmdir "$(dirname "$options")"
+ report_error "Could not establish a ppp connection for profile '$Profile'."
return 1
fi
+
+ [[ -r $pidfile ]] || return 0
+ pppn=$(grep -l "$(< "$pidfile")" /var/run/ppp[[:digit:]]*.pid)
+ report_notice "PPP unit for profile '$Profile': ${pppn:9:-4}"
}
pppoe_down() {
- local cfg pidfile pid
- cfg="$STATE_DIR/pppoe.${Interface}.${Profile}/options"
- pidfile="/var/run/ppp-${Profile}.pid"
+ local options pidfile
+ options="$STATE_DIR/pppoe.$Interface.$Profile/options"
+ pidfile="/var/run/ppp-$Profile.pid"
- if [[ -e $pidfile ]]; then
- read pid < "$pidfile"
- [[ "$pid" ]] && kill "$pid"
- fi
+ [[ -r $pidfile ]] && kill "$(< "$pidfile")"
- rm "${cfg}"
- rmdir "$STATE_DIR/pppoe.${Interface}.${Profile}/"
+ rm "$options"
+ rmdir "$(dirname "$options")"
bring_interface_down "$Interface"
}