#!/bin/bash
modus=$2
# $3 wird nur vom watchdog mit device besetzt

PATH=/usr/lib/ods-server/bin:$PATH
debug=0
logging=1

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
}

log ":2:called $1, $2, $3"

cd /etc/ppp
if [ -f /var/lock/$1 ]; then 
	DEVICE=`cat /var/lock/$1`
	rm -f /var/lock/$1 /var/lock/$1.*
else 	
	DEVICE=""
fi	

if [ -z "$DEVICE" ]; then
	if [ -e /var/lock/watchdog.$3 ]; then
		log ":2:no provider lock but watchdog pending, continuing"
		DEVICE=$3
	else
		log ":2:provider lock gone, exiting"
		exit 0
	fi
fi

/sbin/route del default
proxy-config offline

case $modus in
1 | 2 )
	# Vorsicht: ip-down ruft dieses Skript direkt auf,
	# damit in jedem Fall die ISDN-Module entladen werden.
	# Damit ip-down und ppp-off nicht Ping-Pong spielen,
	# tut ip-down das nur, wenn dieses Lock nicht existiert:
	echo "" > /var/lock/ppp-off.$1

	# Verbindung trennen, zugehoeriger pppd bekommt HUP
	if [ -r /var/run/$DEVICE.pid ]; then
		log ":2:killing pppd"
		kill `cat /var/run/$DEVICE.pid`
		# bisschen Zeit zum Setzen geben
		sleep 10
		# in jedem Fall das Lock-File wegputzen
		if [ ! "$?" = "0" ]; then
			log ":2:removing stale $DEVICE pid file"
			rm -f /var/run/$DEVICE.pid
		fi
	fi
		
	# ggf. die ISDN-Module rauswerfen 
	# bercksichtigt Vorgabe in /etc/rc.config

	if [ $modus = 2 ]; then
		. /etc/rc.config
		if [ $START_ISDN != "yes" ] ; then 	
			/sbin/unloadisdn	
	 	fi
	fi
		
	# Eintrag ins Log
	if [ -z "$3" ]; then
		log ":1:Verbindungsabbau"
	else
		log ":1:Verbindungsabbruch"
                rm -f /var/lock/$3   
	fi
	;;
3 | 4)
	# Vorsicht: ip-down ruft dieses Skript direkt auf, wenn eine 
	# syncppp-Verbindung auf die Nase faellt. Es tut dies aber nur,
	# wenn nachfolgender Lock nicht existiert -- das stellt sicher,
	# dass ein durch den folgenden Code herbeigefuehrter ip-down bei
	# einer syncppp-Verbindung nicht zu einem nochmaligen Aufruf
	# von ppp-off fuehrt! 
	echo "" > /var/lock/ppp-off.$1

	# erstmal einhaengen
	log ":2:deleting isdn interface"
	/sbin/isdnctrl dialmode $DEVICE manual
	/sbin/isdnctrl hangup $DEVICE 
	if [ $modus = 4 ] ; then
		/sbin/isdnctrl hangup ippp11
	fi

	log ":2:killing ipppd.$DEVICE"
	pid=`cat /var/run/ipppd.$DEVICE.pid`
	kill $pid
        rm -f /var/run/ipppd.$DEVICE.pid
        
	# Zeit zum Sterben geben: In dieser Zeit arbeitet ip-down
	sleep 10
	if [ -e /proc/$pid ]; then
		kill -9 $pid
		sleep 5
	fi
	if [ $modus = 4 ] ; then
		/sbin/isdnctrl delif ippp11 force
		rm -f /var/lock/slave
	fi

	/sbin/ifconfig $DEVICE down
	/sbin/isdnctrl delif $DEVICE force

	# ISDN-Module ggf. (zur Sicherheit) entladen, wenn keine weitere
	# Verbindung besteht (Vorsicht, falls parallel ber eines der
	# ttyIx-Devices gearbeitet wird)!
	# bercksichtigt Vorgabe in /etc/rc.config

	. /etc/rc.config
        if [ $START_ISDN != "yes" ] ; then 
		sleep 3   
		/sbin/unloadisdn
	fi
        
	# Verriegelung (Lock) gegen zweifachen ppp-off-Aufruf aufheben.

	# Eintrag ins Log
	if [ -z "$3" ]; then
		log ":1:Verbindungsabbau"
	else
		log ":1:Verbindungsabbruch"
	fi
	;;
5 )
	# Damit ip-down und ppp-off nicht Ping-Pong spielen,
	# tut ip-down das nur, wenn dieses Lock nicht existiert:
	echo "." > /var/lock/ppp-off.$1

	# Bei ADSL muss adsl-connect ein Signal bekommen
	echo "stop" > /var/run/pppoe.stop

	PIDOEFILE="/var/run/pppoe.pid"
	PIDFILE="/var/run/$DEVICE.pid"
	if [ -r $PIDOEFILE ]; then
		log ":2:killing pppoe"
		PID=`cat $PIDOEFILE`
		kill -0 $PID > /dev/null 2>&1
		if [ $? != 0 ]; then
			log ":1:Der PPPoE ist schon tot!"
		    else
			msg=`kill $PID 2>&1`
			sleep 5
		fi
		rm -f $PIDOEFILE
	fi
	# in jedem Fall das Lock-File wegputzen
	if [ -r $PIDFILE ]; then
		# Wir haben ein Problem: ist der PPP mit DEMAND aktiv?
		PID=`cat $PIDFILE`
		kill -0 $PID >/dev/null 2>&1
		if [ ! "$?" = "0" ]; then
			log ":2:Entferne PID-File von PPPD"
			rm -f $PIDFILE
		    else
			log ":2:PPP mit Demand aktiv. Kille den Prozess"
			kill -HUP $PID
			sleep 8
			PID=`pidof pppd`
			kill $PID
			sleep 2
			PID=`pidof pppoe`
			if ! [ -z "$PID" ]; then
				kill $PID
			fi
		fi
	fi
	# Eintrag ins Log
	if [ -z "$3" ]; then
		log ":1:Verbindungsabbau"
	else
		log ":1:Verbindungsabbruch"
                rm -f /var/lock/$3   
	fi
	;;
esac
# Aufraeumen
rm -f /var/lock/$1 /var/lock/$1.standby /var/lock/$DEVICE
# Lock aufheben
rm -f /var/lock/ppp-off.$1
nameserver -root $1
/usr/lib/ods-server/bin/lock -u $DEVICE
