#!/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
#TCPMSS=`uci get pptpd_config.pptpd.pptp_mss`
GAP=1000
VPN_LAST_LOG="/tmp/vpn_last_log"
VPN_LAST_LOG_MAX=20
PPP_FLUSH_MEM=150
PPP_FLUSH_MEM_INTERVAL=60
NETBIOS_RELAY="/tmp/netbios_relay"

LOCAL_SUBNET=`uci get pptp_l2l_dout.$linkname.localsubnet`

PPPD_PID=`head /var/run/ppp-$linkname.pid -n 1`
json set pptp_l2l.$linkname ppp_if=$pppX
json set pptp_l2l.$linkname pid=$PPPD_PID
json set pptp_l2l.$linkname l_subnet=$LOCAL_SUBNET
#json set pptp_l2l.$linkname mss=$TCPMSS
ROUTE_TABLE_ID=`json -f /var/pptp_rt_id get policy_rt.table_map.$linkname`
routername=`uci get syslogd.syslogd.routername`
# add tcp mss rule
#/usr/sbin/iptables -t mangle -I $IPTABLES_MSS_CHAIN -p tcp --tcp-flags SYN,RST SYN -i $pppX -j TCPMSS --set-mss $TCPMSS
#/usr/sbin/iptables -t mangle -I $IPTABLES_MSS_CHAIN -p tcp --tcp-flags SYN,RST SYN -o $pppX -j TCPMSS --set-mss $TCPMSS

# add routing rule
/usr/sbin/ip route add default dev $pppX table $ROUTE_TABLE_ID
/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 -I exception_subnet -s $(uci get pptp_l2l_dout.$linkname.localsubnet) -o $pppX -j RETURN	# INSERT return to go MASQUERADE
	/usr/sbin/iptables -t nat -A nat_post_route -s $(uci get pptp_l2l_dout.$linkname.localsubnet) -o $pppX -j MASQUERADE
else
	/usr/sbin/iptables -t nat -D exception_subnet -s $(uci get pptp_l2l_dout.$linkname.localsubnet) -o $pppX -j RETURN	# remove if MASQUERADE for NAT mode found
fi

# flush route cache of remote subnet
remote_subn=`uci get pptp_l2l_dout.$linkname.remotesubnet`
[ "$remote_subn" ] && {
	for subn in $remote_subn ; do
		/usr/sbin/flush_route_cache.sh "ip-up-pptp-l2l" all $subn
	done
}

# pptp acceleration
cmm -c set pptp $pppX

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 "PPP IFACE=$1 TTY=$2 SPEED=$3 LOCAL=$4 REMOTE=$5 IPPARAM=$6"
logger -p local1.notice "[L2L][UP][PPTP][@$pptp_pro_idx:$linkname]"
logger -p local1.alert "[L2L][UP][PPTP][@$pptp_pro_idx:$linkname]"
pptp_alert_date=$(date +"%Y-%m-%d %H:%M:%S")
sh /sbin/SendAlert.sh "4" "[L2L][UP][PPTP][@$pptp_pro_idx:$linkname] from $routername is Up $pptp_alert_date" >/dev/console
sh /sbin/MailSendAlert.sh "4" "[L2L][UP][PPTP][@$pptp_pro_idx:$linkname] from $routername is Up $pptp_alert_date" >/dev/console
echo "$pptp_alert_date -- UpVPN() L2L PPTP : Profile Index = $pptp_pro_idx, Name = $linkname" >> /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) UP $pptp_alert_date" >> $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) UP $pptp_alert_date" >> $VPN_LAST_LOG/$linkname
fi
date +%s > /var/run/$pppX.stime

# udp udp-broadcast-relay for netbios name
nbns_pass=$(uci -q get pptp_l2l_dout.$linkname.nbns_pass)
if [ "$nbns_pass" == "enable" ]; then
	bcast=$(ipcalc -b $(uci -q get pptp_l2l_dout.$linkname.remotesubnet) | cut -d '=' -f 2)
	echo "pptp_${pppX}_$bcast" >> $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 joined; Resetting UDP Broadcast Relay on port 137: lan-${localif} ${all_ppp}"
	/usr/sbin/udp-broadcast-relay -f 1 137 lan-$localif $all_ppp
fi

ppp_num=$(ps | grep ppp -c)
if [ $ppp_num -gt $PPP_FLUSH_MEM ]; then
        if [ -f /tmp/do_ppp_flush_mem_cache ]; then
                flush_now=$(date +"%s")
                flush_last=$(cat /tmp/do_ppp_flush_mem_cache)
                flush_interval=`expr $flush_now - $flush_last`
                if [ $flush_interval -ge $PPP_FLUSH_MEM_INTERVAL ]; then
                        echo "$(date +"%s")" > /tmp/do_ppp_flush_mem_cache
                        logger -p local1.notice "PPP total number $ppp_num, release MEM Cache"
                        /sbin/sysctl -w vm.drop_caches=3
                fi
        else
                echo "$(date +"%s")" > /tmp/do_ppp_flush_mem_cache
                logger -p local1.notice "PPP total number $ppp_num, release MEM Cache"
                /sbin/sysctl -w vm.drop_caches=3
        fi
fi

