summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/rp-pppoe/scripts/adsl-connect.in
blob: 85dfb3d8d1bb10da45eb38b6c2c12fa79a46d467 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#!/bin/sh
# @configure_input@
#***********************************************************************
#
# adsl-connect
#
# Shell script to connect to an ADSL provider using PPPoE
#
# Copyright (C) 2000 Roaring Penguin Software Inc.
#
# $Id$
#
# This file may be distributed under the terms of the GNU General
# Public License.
#
# Usage: adsl-connect [config_file]
#        adsl-connect interface user [config_file]
# Second form overrides USER and ETH from config file.
# If config_file is omitted, defaults to /etc//ppp/pppoe.conf
#
#***********************************************************************

# From AUTOCONF
prefix=@prefix@
exec_prefix=@exec_prefix@
localstatedir=/var

# Paths to programs
IFCONFIG=/sbin/ifconfig
PPPD=@PPPD@
SETSID=@SETSID@
PPPOE=@sbindir@/pppoe
LOGGER="/usr/bin/logger -t `basename $0`"

# Must be root
if test "`@ID@ -u`" != 0 ; then
    echo "$0: You must be root to run this script" >& 2
    exit 1
fi

if test "$SETSID" != "" -a ! -x "$SETSID"; then
    SETSID=""
fi

CONFIG=/etc//ppp/pppoe.conf
USER=""
ETH=""

# Sort out command-line arguments
case "$#" in
    1)
	CONFIG="$1"
	;;
    3)
	CONFIG="$3"
	;;
esac

if test ! -f "$CONFIG" -o ! -r "$CONFIG" ; then
    echo "$0: Cannot read configuration file '$CONFIG'" >& 2
    exit 1
fi

. $CONFIG

PPPOE_PIDFILE="$PIDFILE.pppoe"
PPPD_PIDFILE="$PIDFILE.pppd"

# Check for command-line overriding of ETH and USER
case "$#" in
    2|3)
	ETH="$1"
	USER="$2"
	;;
esac

# Check that config file is sane
if test "$USER" = "" ; then
    echo "$0: Check '$CONFIG' -- no setting for USER" >& 2
    exit 1
fi
if test "$ETH" = "" ; then
    echo "$0: Check '$CONFIG' -- no setting for ETH" >& 2
    exit 1
fi

PPPD_PID=0

# Catch common error
if test "$DEBUG" = "1" ; then
    echo "*** If you want to use DEBUG, invoke adsl-start, not adsl-connect."
    exit 1
fi

if test "$DEBUG" != "" ; then
    if test "$LINUX_PLUGIN" != "" ; then
	echo "Cannot use DEBUG mode and LINUX_PLUGIN at the same time."
	echo "Kernel-mode PPPoE is experimental and unsupported."
	exit 1
    fi
    echo "* The following section identifies your Ethernet interface" >> $DEBUG
    echo "* and user name.  Some ISP's need 'username'; others" >> $DEBUG
    echo "* need 'username@isp.com'.  Try both" >> $DEBUG
    echo "ETH=$ETH; USER=$USER" >> $DEBUG
    echo "---------------------------------------------" >> $DEBUG
fi

# MTU of Ethernet card attached to modem MUST be 1500.  This apparently
# fails on some *BSD's, so we'll only do it under Linux

if test `uname -s` = Linux ; then
    $IFCONFIG $ETH up mtu 1500
    # For 2.4 kernels.  Will fail on 2.2.x, but who cares?
    modprobe ppp_generic > /dev/null 2>&1
    modprobe ppp_async > /dev/null 2>&1
    modprobe ppp_synctty > /dev/null 2>&1
    if test -n "$LINUX_PLUGIN" ; then
	modprobe pppox > /dev/null 2>&1
	modprobe pppoe > /dev/null 2>&1
    fi
fi

if test "$SYNCHRONOUS" = "yes" ; then
	PPPOE_SYNC=-s
	PPPD_SYNC=sync
	# Increase the chances of it working on Linux...
	if test `uname -s` = Linux ; then
	    modprobe n_hdlc > /dev/null 2>&1
	fi
else
	PPPOE_SYNC=""
	PPPD_SYNC=""
fi

if test -n "$ACNAME" ; then
    ACNAME="-C $ACNAME"
fi

if test -n "$SERVICENAME" ; then
    SERVICENAME="-S $SERVICENAME"
fi

if test "$CLAMPMSS" = "no" ; then
	CLAMPMSS=""
else
	CLAMPMSS="-m $CLAMPMSS"
fi

# If DNSTYPE is SERVER, we must use "usepeerdns" option to pppd.
if test "$DNSTYPE" = "SERVER" ; then
	USEPEERDNS=yes
fi

if test "$USEPEERDNS" = "yes" ; then
	USEPEERDNS="usepeerdns"
else
	USEPEERDNS=""
fi

# Backward config file compatibility
if test "$DEMAND" = "" ; then
	DEMAND=no
fi

if test "$DEMAND" = "no" ; then
	DEMAND=""
else
	DEMAND="demand persist idle $DEMAND 10.112.112.112:10.112.112.113 ipcp-accept-remote ipcp-accept-local connect true noipdefault ktune"
fi

case "$FIREWALL" in
    STANDALONE)
	. /etc/ppp/firewall-standalone
	;;
    MASQUERADE)
	. /etc/ppp/firewall-masq
	;;
esac

# If we're using kernel-mode PPPoE on Linux...
if test "$LINUX_PLUGIN" != "" ; then
    PLUGIN_OPTS="plugin $LINUX_PLUGIN $ETH"
    modprobe pppoe > /dev/null 2>&1
fi

# Standard PPP options we always use
PPP_STD_OPTIONS="$PLUGIN_OPTS noipdefault noauth default-asyncmap defaultroute hide-password nodetach $USEPEERDNS local mtu 1492 mru 1492 noaccomp noccp nobsdcomp nodeflate nopcomp novj novjccomp user $USER lcp-echo-interval $LCP_INTERVAL lcp-echo-failure $LCP_FAILURE $PPPD_EXTRA"

# Jigger DNS if required...
if test "$DNSTYPE" = "SERVER" ; then
    # Sorry, dude...
    rm -f /etc/resolv.conf
    ln -s /etc/ppp/resolv.conf /etc/resolv.conf
elif test "$DNSTYPE" = "SPECIFY" ; then
    # Sorry, dude...
    rm -f /etc/resolv.conf
    echo "nameserver $DNS1" > /etc/resolv.conf
    if test -n "$DNS2" ; then
	echo "nameserver $DNS2" >> /etc/resolv.conf
    fi
fi

# PPPoE invocation
PPPOE_CMD="$PPPOE -p $PPPOE_PIDFILE -I $ETH -T $PPPOE_TIMEOUT -U $PPPOE_SYNC $CLAMPMSS $ACNAME $SERVICENAME $PPPOE_EXTRA"
if test "$DEBUG" != "" ; then
    if test "$DEMAND" != "" ; then
	echo "(Turning off DEMAND for debugging purposes)"
	DEMAND=""
    fi
    echo "* The following section shows the pppd command we will invoke" >> $DEBUG
    echo "pppd invocation" >> $DEBUG
    echo "$SETSID $PPPD pty '$PPPOE_CMD' $PPP_STD_OPTIONS $PPPD_SYNC debug" >> $DEBUG
    echo "---------------------------------------------" >> $DEBUG
    $SETSID $PPPD pty "$PPPOE_CMD -D $DEBUG-0" \
	$PPP_STD_OPTIONS \
	$PPPD_SYNC \
	debug >> $DEBUG 2>&1
    echo "---------------------------------------------" >> $DEBUG
    echo "* The following section is an extract from your log." >> $DEBUG
    echo "* Look for error messages from pppd, such as" >> $DEBUG
    echo "* a lack of kernel support for PPP, authentication failure" >> $DEBUG
    echo "* etc." >> $DEBUG
    echo "Extract from /var/log/messages" >> $DEBUG
    grep 'ppp' /var/log/messages | tail -150 >> $DEBUG
    date >> $DEBUG
    echo "---------------------------------------------" >> $DEBUG
    echo "* The following section is a dump of the packets" >> $DEBUG
    echo "* sent and received by rp-pppoe.  If you don't see" >> $DEBUG
    echo "* any output, it's an Ethernet driver problem.  If you only" >> $DEBUG
    echo "* see three PADI packets and nothing else, check your cables" >> $DEBUG
    echo "* and modem.  Make sure the modem lights flash when you try" >> $DEBUG
    echo "* to connect.  Check that your Ethernet card is in" >> $DEBUG
    echo "* half-duplex, 10Mb/s mode.  If all else fails," >> $DEBUG
    echo "* try using pppoe-sniff." >> $DEBUG
    echo "rp-pppoe debugging dump" >> $DEBUG
    cat $DEBUG-0 >> $DEBUG
    rm -f $DEBUG-0
    for i in 1 2 3 4 5 6 7 8 9 10 ; do
    echo ""
    echo ""
    echo ""
    done
    echo "*** Finished debugging run.  Please review the file"
    echo "*** '$DEBUG' and try to"
    echo "*** figure out what is going on."
    echo "***"
    echo "*** Unfortunately, we can NO LONGER accept debugging"
    echo "*** output for analysis.  Please do not send this to"
    echo "*** Roaring Penguin; it is too time-consuming for"
    echo "*** us to deal with all the analyses we have been sent."
    exit 0
fi

echo $$ > $PIDFILE

while [ true ] ; do
    if test "$LINUX_PLUGIN" != "" ; then
	$SETSID $PPPD $PPP_STD_OPTIONS $DEMAND &
	echo "$!" > $PPPD_PIDFILE
    else
	$SETSID $PPPD pty "$PPPOE_CMD" \
	    $PPP_STD_OPTIONS \
	    $DEMAND \
	    $PPPD_SYNC &
	echo "$!" > $PPPD_PIDFILE
    fi
    wait

    # Run /etc/ppp/adsl-lost if it exists
    test -x /etc/ppp/adsl-lost && /etc/ppp/adsl-lost

    # Re-establish the connection
    $LOGGER -p daemon.notice \
        "ADSL connection lost; attempting re-connection."

    # Wait a bit in case a problem causes tons of log messages :-)
    sleep 5
done