#!/bin/bash
#
#	/etc/ppp/ppp-on
#
#	Set up a PPP link
#	Dies ist die ODS-Version.  Sie kommt u.U. mit
#	mehreren Modems zurecht.
#
#	Anpassung: Reiner Klaproth, Klaus Werner 1999
#       Einbau ADSL: Reiner Klaproth, 16.9.2000

debug=0
logging=1

# Parameter holen
. /etc/rc.config

function log {
	if [ `echo $1 | cut -d: -f2` = "1" ]; then
		if [ -n "$logging" ]; then
			/usr/bin/logger -i -p daemon.notice `echo "$1" | cut -d: -f3`
		fi
	fi
	if [ `echo $1 | cut -d: -f2` = "2" ]; then
		if [ -n "$debug" ]; then
			/usr/bin/logger -i -p local0.debug "("`basename $0`") "`echo "$1" | cut -d: -f3`
		fi
	fi
}

cd /etc/ppp
PATH=/usr/lib/ods-server/bin:/usr/sbin:/etc/ppp:$PATH
provider=$1
pppauth=$2
username=$3
modus=$4
phone=$5

log ":2: $1, $2, $3, $4, $5"

if [ -z "$provider" ]; then
	echo "Kein Provider angegeben." 1>&2
	exit 1
fi

PID=$$

case $modus in
1)	
	# analoge Modems
	x="`modem -l $provider $PID`"
	if [ -z "$x" ]; then
		echo "Kein Modem frei" 1>&2
		exit 1
	fi
	DEVICE=`echo $x | cut -d" " -f1`
        stty 115200 clocal crtscts </dev/$DEVICE
	chat -v -t 10 -f /etc/ppp/atz-chat </dev/$DEVICE >/dev/$DEVICE ;;
2)	
	# ISDN ueber Terminal-Device (X.75)
	# "locking" fuer die Schnittstellen
	DEVICES="ttyI0 ttyI1"
	DEVICE=""
	for f in $DEVICES; do
		if /usr/lib/ods-server/bin/lock -l $f 2>/dev/null; then
			DEVICE=$f
			break;
		fi
	done
	if [ -z $DEVICE ]; then
		echo "Kein Terminal-Port frei" 1>&2
		exit 1
	fi

	# ISDN-Treiber laden
	/sbin/loadisdn
	if [ $? = 1 ]; then
		lock -u $DEVICE
                log ":2:could not load ISDN"
                exit 1
        fi
	# die Module sollen sich erstmal setzen
	sleep 3	

	# muss vor dem Einstellen der MSN passieren !!!
	log ":2:starting init chat on $DEVICE"
	/usr/sbin/chat -v -t 10 -f /etc/ppp/atz-chat </dev/$DEVICE >/dev/$DEVICE
	log ":2:starting MSN chat on $DEVICE"
	/usr/sbin/chat -v -t 10 -f /etc/ppp/x75-prechat </dev/$DEVICE >/dev/$DEVICE
	x="$DEVICE T dummy" ;;
3 | 4)
	# ISDN ueber Netzwerkinterface (syncPPP/HDLC)
	test -z $MSN_OUT && MSN_OUT=1

	log ":2:Starte syncPPP-Verbindung mit $MSN_OUT"
	# "locking" fuer die Schnittstellen
	DEVICES="ippp0 ippp1"
	DEVICE=""
	for f in $DEVICES; do
		if /usr/lib/ods-server/bin/lock -l $f 2>/dev/null; then
			DEVICE=$f
			break;
		fi
	done
	if [ -z $DEVICE ]; then
		echo "Kein Kanal frei" 1>&2
		log ":1:Kein Kanal frei"
		exit 1
	fi

	# Die ISDN-Module sollen ggf. nur aktiv sein, wenn eine Verbindung
	# besteht. Solange keine Schnittstellen konfiguriert sind,
	# sind auch die Module nicht da:
	/sbin/loadisdn
        if [ $? = 1 ]; then
		lock -u $DEVICE
                log ":2:could not load ISDN"
                exit 1
            fi

	# Normalerweise erstellen die Chat-Skripte eine Datei mit dem
	# Namen des Geraetes, in die der Provider-Name gelegt wird.
	# Hier passiert das von Hand.
	echo $provider > /var/lock/$DEVICE

	# eigentlicher Verbindungsaufbau
	/sbin/isdnctrl addif $DEVICE
	/sbin/isdnctrl addphone $DEVICE out $phone
	/sbin/isdnctrl eaz $DEVICE $MSN_OUT
	/sbin/isdnctrl l2_prot $DEVICE hdlc
	/sbin/isdnctrl l3_prot $DEVICE trans
	/sbin/isdnctrl encap $DEVICE syncppp
	/sbin/isdnctrl secure $DEVICE on
	/sbin/isdnctrl huptimeout $DEVICE 600
	/sbin/isdnctrl dialmode $DEVICE auto
	# wichtig, sonst koennten falsche chap/pap-secrets beim
	# jeweiligen ipppd landen
	/sbin/isdnctrl pppbind $DEVICE `echo -n $DEVICE | cut -b5`

	if [ $modus = "4" ] ; then
		# Sonderbehandlung fr MPPP
		DEVICE1=ippp11		# zweites Interface
		echo $DEVICE > /var/lock/slave
		/sbin/isdnctrl addslave $DEVICE $DEVICE1
	        /sbin/isdnctrl addphone $DEVICE1 out $phone
	        /sbin/isdnctrl eaz $DEVICE1 $MSN_OUT
        	/sbin/isdnctrl l2_prot $DEVICE1 hdlc
	        /sbin/isdnctrl l3_prot $DEVICE1 trans
	        /sbin/isdnctrl encap $DEVICE1 syncppp
	        /sbin/isdnctrl secure $DEVICE1 on
	        /sbin/isdnctrl huptimeout $DEVICE1 596
		/sbin/isdnctrl chargehup $DEVICE1 off
		/sbin/isdnctrl chargehup $DEVICE off
	        /sbin/isdnctrl dialmode $DEVICE1 auto
		# und nun den ipppd-Daemon anwerfen:
		/sbin/ifconfig $DEVICE 192.168.99.1 pointopoint 192.168.99.2 metric 1
                /sbin/ipppd remotename $provider name $username \
                ipcp-accept-local ipcp-accept-remote noipdefault defaultroute \
                ipparam $modus +mp /dev/$DEVICE /dev/$DEVICE1  

		log ":1:Verbindungsaufbau mit MPPP zu $provider"

	   else
		# jetzt den eigentlichen PPP-Daemonen anwerfen
		/sbin/ifconfig $DEVICE 192.168.99.1 pointopoint 192.168.99.2 metric 1
		/sbin/ipppd remotename $provider name $username defaultroute \
	        ipcp-accept-local ipcp-accept-remote noipdefault \
	        ipparam $modus /dev/$DEVICE 

		log ":1:Verbindungsaufbau zu $provider"
	fi
	sleep 1
	/etc/ppp/watchdog $DEVICE $provider $modus &
	/sbin/isdnctrl dial $DEVICE
	exit 0 ;;
5)
	# ADSL-Verbindung: Den eigentlichen Aufbau stecken wir in ein
	# anderes Script, das aktiv bleibt!
	# Doch zuerst testen, ob pppoe schon luft:
	PIDFILE=/var/run/pppoe.pid
	if [ -r $PIDFILE ]; then
		PID=`pidof pppoe`
		if ! [ -z $PID ]; then
			echo "ADSL noch aktiv!" 1>&2
			log ":1:ADSL noch aktiv! - Abgebrochen!"
			exit 1
		    else
			rm -f $PIDFILE
		fi
	fi
	/sbin/ifconfig > /var/log/interfaces
	DEVICES="ppp0 ppp1"
	DEVICE=""
	for f in $DEVICES; do
		if ! grep -q "^$f:" /var/log/interfaces ; then
			DEVICE=$f
			break;
		fi
	done
	rm -f /var/log/interfaces /var/run/pppoe.stop
	if [ -z "$DEVICE" ]; then
		echo "Kein Kanal frei" 1>&2
		log ":1:Kein Kanal frei"
		exit 1
	fi
	echo $provider > /var/lock/$DEVICE
	log ":2:Verbindungsaufbau auf $DEVICE"
	#
	# Jetzt werfen wir die Verbindung an!
	( /etc/ppp/adsl-ppp $username >/dev/null 2>&1 & )
	/etc/ppp/watchdog $DEVICE $provider $modus &
	exit 0
	;;
esac


# in einer Subshell, damit pppd nicht die 
# von chat aufgebaute Verbindung erhaengt
(
    log ":2:starting dial chat"
    /etc/ppp/ppp-chat $x $provider
    chatcode=$?
    if [ $chatcode = 0 ]; then 
	if [ $modus = 1 ]; then
     	   stty 115200 clocal crtscts < /dev/$DEVICE
           pppoptions="115200 crtscts lock idle 600"
        else
           pppoptions="lock idle 600"
        fi
	log ":2:starting pppd on $DEVICE"
	log ":1:Verbindungsaufbau zu $provider"
	if [ $pppauth = 0 ]; then
 		pppd ipparam $modus $pppoptions noipdefault defaultroute /dev/$DEVICE &
	else
		pppd ipparam $modus $pppoptions noipdefault name $username remotename $provider defaultroute /dev/$DEVICE &
	fi
    fi

    # exit-Code zurueck in Main-Shell expedieren.
    log ":2:sub-shell terminating"
    if [ $chatcode = 0 ]; then
	exit 0
    fi
    exit 1
) </dev/$DEVICE >/dev/$DEVICE
    
# Watchdog nach erfolgreichem Chat anwerfen.
# pppd wirft keinen vernuenftigen Return-Code ab.
if [ $? = 0 ]; then
	/etc/ppp/watchdog $DEVICE $provider $modus &
	exit 0
else
	# Im chat-Fehlerfalle Locks wegraeumen, 
	lock -u $DEVICE 
	
	# ggf. ISDN raus
       	if [ $modus = 2 -a $START_ISDN != "yes" ]; then
		/sbin/unloadisdn
	fi
	echo "PPP Chat fehlgeschlagen" 1>&2 
	log ":2:dial chat failed"
	log ":1:Verbindungsaufbau gescheitert"
	rm -f /var/lock/vialock 1>&2
	exit 1
fi
