#!/bin/sh
pppX="$1"
tty="$2"
speed="$3"
local_ip="$4"
remote_ip="$5"
linkname="$6"
dns1="$7"
dns2="$8"
IPTABLES_MSS_CHAIN=PPTP_TCPMSS
GAP=1000
VPN_LAST_LOG="/tmp/vpn_last_log"
VPN_LAST_LOG_MAX=20
NETBIOS_RELAY="/tmp/netbios_relay"

LOCAL_SUBNET=`json get pptp_l2l.$linkname.l_subnet`
#TCPMSS=`json get pptp_l2l.$linkname.mss`

ROUTE_TABLE_ID=`json -f /var/pptp_rt_id get policy_rt.table_map.$linkname`
routername=`uci get syslogd.syslogd.routername`
# delete tcp mss rule
#/usr/sbin/iptables -t mangle -D $IPTABLES_MSS_CHAIN -p tcp --tcp-flags SYN,RST SYN -i $pppX -j TCPMSS --set-mss $TCPMSS
#/usr/sbin/iptables -t mangle -D $IPTABLES_MSS_CHAIN -p tcp --tcp-flags SYN,RST SYN -o $pppX -j TCPMSS --set-mss $TCPMSS

# delete routing rule
/usr/sbin/ip route del default dev $pppX table $ROUTE_TABLE_ID
rm /var/run/$pppX.dev 2>/dev/null
/usr/sbin/check_policy_rt.sh pptp $linkname &

# for NAT mode
nat_mode=`uci -q get pptp_l2l_dout.$linkname.natmode || echo 0`
if [ "$nat_mode" = "1" ]; then
	/usr/sbin/iptables -t nat -D exception_subnet -s $(uci get pptp_l2l_dout.$linkname.localsubnet) -o $pppX -j RETURN	# INSERT return to go MASQUERADE
	/usr/sbin/iptables -t nat -D nat_post_route -s $(uci get pptp_l2l_dout.$linkname.localsubnet) -o $pppX -j MASQUERADE
fi

# flush route cache
#/usr/sbin/flush_route_cache.sh "ip-down-pptp-l2l#1"
#/usr/sbin/ip route flush cache #Comment off by Vincent F. 2013/02/01
#Following commands already clear route cache, not necessary to flush cache here.
#1. ip route flush/replace
#2. ip route flush/replace table
#3. ip addr flush dev
#4. ip link set device down

PROCESS_PID=`json get pptp_l2l.$linkname.pid`
always_on=`uci get pptp_l2l_dout.$linkname.always_on`
PID_alive=`ps | grep $PROCESS_PID | grep -q -v grep && echo 1 || echo 0`
if [ "$PID_alive" == "1" ]; then	# dial on demand and link down from remote peer?
	[ -d "/tmp/pptp_l2l_pid" ] || mkdir /tmp/pptp_l2l_pid
	echo "$linkname $PROCESS_PID" > /tmp/pptp_l2l_pid/$PROCESS_PID # parent pppd should be killed later
	if [ "$always_on" != "enable" ]; then
		remote_subnet=`uci get pptp_l2l_dout.$linkname.remotesubnet`
		if [ "$remote_subnet" != "" ]; then	# restore routing for packet trigger...
			for subnet_token in $remote_subnet
			do
				/usr/sbin/ip route add $subnet_token dev ppp$ROUTE_TABLE_ID
			done
			#/usr/sbin/flush_route_cache.sh "ip-down-pptp-l2l#2"
			#/usr/sbin/ip route flush cache
		fi
	fi
fi

#vpn syslog and mail alert
pptp_alert_date=$(date +"%Y-%m-%d %H:%M:%S")
conn_time=""
[ -f /var/run/$pppX.stime ] && {
	stime=$(cat /var/run/$pppX.stime)
	ntime=$(date +%s)
	
	dtime=`expr $ntime - $stime`
	ss=`expr $dtime % 60`
	mm=`expr $dtime / 60 % 60`
	hh=`expr $dtime / 3600`
	
	conn_time="(total time connected : $hh hours $mm minutes $ss seconds)"
	rm /var/run/$pppX.stime 2>/dev/null
}
pptp_pro_idx=$(cat /etc/config/pptp_l2l_dout | grep pptp-l2l-dout | grep pptp-l2l-dout -n | grep $linkname | awk -F":" '{print $1}')
logger -p local1.notice "[L2L][DOWN][PPTP][@$pptp_pro_idx:$linkname]"
logger -p local1.alert "[L2L][DOWN][PPTP][@$pptp_pro_idx:$linkname]"
sh /sbin/SendAlert.sh "3" "[L2L][DOWN][PPTP][@$pptp_pro_idx:$linkname] from $routername is Down $pptp_alert_date $conn_time" >/dev/console
sh /sbin/MailSendAlert.sh "3" "[L2L][DOWN][PPTP][@$pptp_pro_idx:$linkname] from $routername is Down $pptp_alert_date $conn_time" >/dev/console
echo "$pptp_alert_date -- DropVPN() L2L PPTP : Profile Index = $pptp_pro_idx, Name = $linkname $conn_time" >> /tmp/vpn_mailalert
/etc/mailtest.sh vpn &
if [ $(sort $VPN_LAST_LOG/$linkname 2>/dev/null | wc -l) -lt $VPN_LAST_LOG_MAX ]; then
	[ -d $VPN_LAST_LOG ] || mkdir $VPN_LAST_LOG
	echo "$linkname PPTP $(uci get pptp_l2l_dout.$linkname.server_ip) DOWN $pptp_alert_date $conn_time" >> $VPN_LAST_LOG/$linkname
else
	lastnum=`expr $VPN_LAST_LOG_MAX - 1`
	tail -$lastnum $VPN_LAST_LOG/$linkname > /tmp/tmp_vpn_last_log
	cat /tmp/tmp_vpn_last_log > $VPN_LAST_LOG/$linkname
	echo "$linkname PPTP $(uci get pptp_l2l_dout.$linkname.server_ip) DOWN $pptp_alert_date $conn_time" >> $VPN_LAST_LOG/$linkname
fi

json delete pptp_l2l.$linkname

if [ "$(pidof udp-broadcast-relay)" ] 
then
	sed -i "/$pppX/d" $NETBIOS_RELAY
	killall udp-broadcast-relay
	all_ppp=$(cat $NETBIOS_RELAY 2>/dev/null)
	localif=$(uci -q get pptpd_config.pptpd.localif || echo 'lan1')
	logger -p local1.notice "PPTP client left; Resetting UDP Broadcast Relay on port 137"
	[ -n "$all_ppp" ] && /usr/sbin/udp-broadcast-relay -f 1 137 lan-$localif $all_ppp
fi
