#!/bin/sh


#################################################################
########		L I N U X			#########
#################################################################
init_pppd_scripts ()
{
	if [ $OS_SYSTEM != "Linux" ]; then
		return 1;
	fi 


	if [ $PROTOCOL = WAN_ADSL ]; then

		get_string "Please specify PAP/CHAP User Name" ""  
		PAPCHAP_UNAME=$($GET_RC)

		get_string "Please specify PAP/CHAP Password" ""  
		PAPCHAP_PASSWD=$($GET_RC)

		warning "PAPCHAP_SECRETS_UPDATE"
		if [ $? -eq 0 ]; then
	
			if [ ! -d /etc/ppp/ ]; then
				warning "PPP_DIR_NOT_FOUND"
				if [ $? -eq 0 ]; then
					\mkdir -p /etc/ppp
				else
					return 1;
				fi	
			fi
		
			if [ -e /etc/ppp/pap-secrets ]; then
				mv /etc/ppp/pap-secrets /etc/ppp/pap-secrets.orig
			fi
			if [ -e /etc/ppp/chap-secrets ]; then
				mv /etc/ppp/chap-secrets /etc/ppp/chap-secrets.orig
			fi

			echo -e "\"$PAPCHAP_UNAME\"\t*\t$PAPCHAP_PASSWD\t*" > /etc/ppp/pap-secrets
			chmod 600 /etc/ppp/pap-secrets
			echo -e "\"$PAPCHAP_UNAME\"\t*\t$PAPCHAP_PASSWD\t*" > /etc/ppp/chap-secrets
			chmod 600 /etc/ppp/chap-secrets
		fi
		
	PPPD_OPTION="
# ---------------------------------------------
# PPPD Daemon SYNC configuration file
# ---------------------------------------------
# options.ttyWP$TTY_MINOR
#
#  - PPPD daemon must bind to device /dev/ttyWP$TTY_MINOR
#  - The /dev/ttyWP$TTY_MINOR is binded to wanpipe$DEVICE_NUM
#
# Created automatically by /usr/sbin/wancfg
# Date: `date`
#
name \"$PAPCHAP_UNAME\"
debug 

-detach

noipdefault
defaultroute
ipcp-accept-remote
ipcp-accept-local
nobsdcomp
nodeflate
nopcomp
novj
novjccomp
noaccomp -am
"

	PPPD_CALL="
#------------------------------------------------
# PPPD Call SYNC Script
#------------------------------------------------
# This call script will call /etc/ppp/options.ttyWP$TTY_MINOR
# to setup the PPPD dameon.
#
# It will start PPPD SYNC protocol.
#
# Created automatically by /usr/local/wanrouter/wancfg
# Date: `date`
#
ttyWP$TTY_MINOR		#Bind to WANPIPE device wanpipe3
sync			#Connect in sync mode
lcp-echo-failure 0	#No link verification messages
"
		return 0;
	fi


	MULTILINK=NO
	MULTILINK_MODE=SLAVE

	warning "MULTILINK_OPT"
	if [ $? -eq 0 ]; then
		MULTILINK=YES

		warning "MULTILINK_MASTER"
		if [ $? -eq 0 ]; then
			MULTILINK_MODE=MASTER
		fi
	fi

	if [ $TTY_MODE = Sync ]; then

	PPPD_OPTION="
# ---------------------------------------------
# PPPD Daemon SYNC configuration file
# ---------------------------------------------
# options.ttyWP$TTY_MINOR
#
#  - PPPD daemon must bind to device /dev/ttyWP$TTY_MINOR
#  - The /dev/ttyWP$TTY_MINOR is binded to wanpipe$DEVICE_NUM
#
# Created automatically by /usr/sbin/wancfg
# Date: `date`
#
asyncmap 0

debug		#PPPD will output connection information

nodetach	#Do not detach into background

defaultroute	#This interface will be a default gateway.

nodeflate	#Do not use compression
nobsdcomp	#Do not use bsd compression
noccp		#Disable CCP (Compression Control Protocol)
noaccomp	#Disable  Address/Control compression
nopcomp		#Disable  protocol  field compres.
novj		#Disable Van Jacobson TCP/IP header compres.
novjccomp	#Disable the connection-ID compression
nopredictor1	#Do not accept or agree to Predictor-1 compres.


# Read pppd(8) for more information.
# Read /usr/local/wanrouter/PPP-HOWTO for more info.
"

	PPPD_CALL="
#------------------------------------------------
# PPPD Call SYNC Script
#------------------------------------------------
# This call script will call /etc/ppp/options.ttyWP$TTY_MINOR
# to setup the PPPD dameon.
#
# It will start PPPD SYNC protocol.
#
# Created automatically by /usr/local/wanrouter/wancfg
# Date: `date`
#
ttyWP$TTY_MINOR		#Bind to WANPIPE device wanpipe$DEVICE_NUM
sync		#Connect in sync mode
lcp-echo-failure 0	#No link verification messages
"

	if [ $MULTILINK = YES ]; then
		PPPD_CALL=$PPPD_CALL"
multilink	#Enable Multilink Protocol
"

		if [ $MULTILINK_MODE = SLAVE ]; then
			PPPD_CALL=$PPPD_CALL"
noip 		#No IP addresses for a slave
"
		fi

	fi

	if [ $MULTILINK = NO ] || [ $MULTILINK_MODE = MASTER ]; then

		get_string "Please specify the Local IP Address" "" "IP_ADDR" 
		L_IP=$($GET_RC)

		get_string "Please specify the Point-to-Point IP Address" "" "IP_ADDR" 
		R_IP=$($GET_RC)

		PPPD_CALL=$PPPD_CALL"
$L_IP:$R_IP	#Local and remote IP addresses
			#STATIC IP mode.
"
	fi

else

	PPPD_OPTION="
# ---------------------------------------------
# PPPD Daemon ASYNC configuration file
# ---------------------------------------------
# options.ttyWP$TTY_MINOR
#
#  - PPPD daemon must bind to device /dev/ttyWP$TTY_MINOR
#  - The /dev/ttyWP$TTY_MINOR is binded to wanpipe$DEVICE_NUM
#
# Created automatically by /usr/local/wanrouter/wancfg
# Date: `date`
#
asyncmap 0

modem		#Interface to a modem

debug		#PPPD will output connection information

crtscts		#Enable hardware flow control

noipdefault	#Enable dynamice IP addressing
	        #Obtaint Local and Remote IP addresses from
		#peer.

-detach		#Do not detach into background

defaultroute	#This interface will be a default gateway.

#nodeflate	#Do not use compression
#nobsdcomp	#Do not use bsd compression
#noccp		#Disable CCP (Compression Control Protocol)
#noaccomp	#Disable  Address/Control compression
#nopcomp		#Disable  protocol  field compres.
#novj		#Disable Van Jacobson TCP/IP header compres.
#novjccomp	#Disable the connection-ID compression
#nopredictor1	#Do not accept or agree to Predictor-1 compres.


persist		#If the link goes down, keep retrying to connect 



# Read pppd(8) for more information.
# Read /usr/local/wanrouter/PPP-HOWTO for more info.
"

	get_integer "Please specify the Baud Rate in bps" "38400" "64" "4096000" "device_setup_help get_baudrate"
	BAUDRATE=$($GET_RC)

	PPPD_CALL="
#------------------------------------------------
# PPPD Call ASYNC Script
#------------------------------------------------
# This call script will call /etc/ppp/options.ttyWP$TTY_MINOR
# to setup the PPPD dameon.
#
# It will start PPPD ASYNC protocol.
#
# Created automatically by /usr/local/wanrouter/wancfg
# Date: `date`
#
ttyWP$TTY_MINOR		#Bind to WANPIPE device wanpipe$DEVICE_NUM
$BAUDRATE		#Baud rate of the PPP link
connect '/etc/ppp/redialer'
"

	if [ $MULTILINK = YES ]; then
		PPPD_CALL=$PPPD_CALL"
multilink	#Enable Multilink Protocol
"

		if [ $MULTILINK_MODE = SLAVE ]; then
			PPPD_CALL=$PPPD_CALL"
noip 		#No IP addresses for a slave
"
		fi

	fi
fi

	return 0;
}

function create_multilink_ppp_linux_cfg() {

	if [ ! -e "/dev/ttyWP$TTY_MINOR" ]; then
		warning "CREATE_TTYDEV"
		if [ $? -eq 0 ]; then
			eval "mknod -m 666 /dev/ttyWP$TTY_MINOR c 240 $TTY_MINOR 2> /dev/null"
			if [ $? -eq 0 ]; then 
				error "CREATE_TTYOK"
			else	
				error "CREATE_TTYFAIL"
			fi
		fi
	fi

	warning "CREATE_PPPDOPT"
	if [ $? -eq 0 ]; then
		if [ -f "/etc/ppp/options.ttyWP$TTY_MINOR" ]; then
			mv /etc/ppp/options.ttyWP$TTY_MINOR /etc/ppp/options.ttyWP$TTY_MINOR.old
		fi

		if [ "$TTY_MODE" = Sync ] || [ $PROTOCOL = WAN_ADSL ]; then
			init_pppd_scripts
			if [ $? -eq 0 ]; then
				echo "$PPPD_OPTION" > /etc/ppp/options.ttyWP$TTY_MINOR
				echo "$PPPD_CALL"   > /etc/ppp/peers/isp_wanpipe$DEVICE_NUM
			fi
		else
			eval "$PPPCONFIG --ttyport /dev/ttyWP$TTY_MINOR --provider isp_wanpipe$DEVICE_NUM"
		fi

		error "CREATE_PPPDOK"
	fi

}

#################################################################
########	F R E E B S D / O P E N B S D		#########
#################################################################
MPD_CONF_DIR="/usr/local/etc/mpd"
MPD_CONF="mpd.conf"
MPD_LINKS="mpd.links"
MPD_SECRET="mpd.secret"
MPD_SCRIPT="mpd.script"

# Function: parse_mpd_conf_file
# $1 - bundle name
# $2 - link name
# $3 - auto bundle loading (YES|NO)
function parse_mpd_conf_file() {

	local bundle_config=$1_config
	local bundle_configured=0
	local bundle_configuring=0
	local new_cmd_bundle=0
	local set_iface_addr_cmd=0
	local lip
	local rip

	if [ ! -f $MPD_CONF_DIR/$MPD_CONF ]; then
		cat << EOM >> $MPD_CONF_DIR/$MPD_CONF
#################################################################
#
#	MPD configuration file
#
# This file defines the configuration for mpd: what the
# bundles are, what the links are in those bundles, how
# the interface should be configured, various PPP parameters,
# etc. It contains commands just as you would type them
# in at the console. A blank line ends an entry. Lines
# starting with a "#" are comments and get completely
# ignored.
#
# $Id: mlinkppp_lib.sh,v 1.2 2004/01/28 17:14:48 sangoma Exp $
#
#################################################################

EOM
	fi

	while read line
	do
		if [ $bundle_configuring -eq 0 ]; then
			if [ "$line" = "$bundle_config:" ]; then
				# Bundle already configured
				bundle_configured=1
				bundle_configuring=1
				echo "$line" >> tmp.$$
			else
				cmd=`echo $line | cut -d' ' -f1`
				case $cmd in
				[#]*)
					echo "$line" >> tmp.$$
					;;
				[a-zA-Z0-9]*:)
					echo "$line" >> tmp.$$
					;;
				*)
					echo "    $line" >> tmp.$$
					;;
				esac
			fi
		else
			cmd=`echo $line | cut -d' ' -f1`
			case $cmd in
			[#]*)
				echo "$line" >> tmp.$$	
				;;
			[a-zA-Z0-9]*:)
				# End of bundle configuration
				bundle_configuring=0
				echo "    $line" >> tmp.$$	
				;;
			new*)
				new_cmd_bundle=1
				line1=${line/$2/""}
				if [ "$line1" = "$line" ]; then
					echo "    $line $2" >> tmp.$$
				else
					echo "    $line" >> tmp.$$
				fi
				;;
			*)
				echo "    $line" >> tmp.$$	
				;;
			esac
		fi


	done < $MPD_CONF_DIR/$MPD_CONF

	if [ $bundle_configured -eq 0 ]; then
		get_string "Please specify the Local IP Address for the Bundle $1" "" "IP_ADDR" 
		lip=$($GET_RC)
		get_string "Please specify the Point-to-Point IP Address for the Bundle $1" "" "IP_ADDR"
		rip=$($GET_RC)
		cat << EOM >> tmp.$$


$bundle_config:
    new $1 $2
    set iface addrs $lip $rip
    open iface
EOM
	fi
	mv tmp.$$ $MPD_CONF_DIR/$MPD_CONF
}

# Function: parse_mpd_links_file
# $1 - link name
# $2 - device number
function parse_mpd_links_file() {

	local nodename=wanpipe$2
	local link_configured=0
	local link_configuring=0

	if [ ! -f $MPD_CONF_DIR/$MPD_LINKS ]; then
		cat << EOM > $MPD_CONF_DIR/$MPD_LINKS
#################################################################
#
#	MPD links file
#
# In this file you define the various "links" that comprise
# a bundle. Each link corresponds to a single serial device.
# These are commands that could be typed into the console directly.
#
# This file should only contain configuration for a link if
# that configuration is specific to that particular link. That
# is, things like device name and bandwidth. Other generic link
# options like LCP parameters belong in "mpd.conf".
#
# The first command for each link should be "set link type ..."
#
# $Id: mlinkppp_lib.sh,v 1.2 2004/01/28 17:14:48 sangoma Exp $
#
#################################################################


EOM
	fi

	while read line
	do
		if [ $link_configuring -eq 0 ]; then
			if [ "$line" = "$1:" ]; then
				# Bundle already configured
				link_configured=1
				link_configuring=1
				echo "$line" >> tmp.$$
			else
				cmd=`echo $line | cut -d' ' -f1`
				case $cmd in
				[#]*)
					echo "$line" >> tmp.$$
					;;
				[a-zA-Z0-9]*:)
					echo "$line" >> tmp.$$
					;;
				*)
					echo "    $line" >> tmp.$$
					;;
				esac
			fi
		else
			cmd=`echo $line | cut -d' ' -f1`
			case $cmd in
			[#]*)
				echo "$line" >> tmp.$$
				;;				
			[a-zA-Z0-9]*:)
				# End of links configuration
				link_configuring=0
				echo "$line" >> tmp.$$
				;;				
			*)	
				line1=${line#set[ ]*ng[ ]*node[ ]*}
				if [ "$line1" != "$line" ]; then
					line2=${line1/$nodename:/""}
					if [ "$line1" = "$line2" ]; then
						echo "    set ng node $nodename:" >> tmp.$$
					else
						echo "    $line" >> tmp.$$
					fi
				else
					echo "    $line" >> tmp.$$
				fi
			esac
		fi

	done < $MPD_CONF_DIR/$MPD_LINKS

	if [ $link_configured -eq 0 ]; then
		cat << EOM >> tmp.$$

$1:
    set link type ng
    set ng node $nodename:
    set ng hook rawdata
EOM
	fi

	mv tmp.$$ $MPD_CONF_DIR/$MPD_LINKS
}


# Function: create_multilink_ppp_bsd_cfg
# $1 - device number
function create_multilink_ppp_bsd_cfg() {

	local auto_bundle_load
	local bundle_name
	local link_name
	local lip
	local rip

	get_string "Please specify the MPD configuration directory" "$MPD_CONF_DIR"
	MPD_CONF_DIR=$($GET_RC)

	# Make current bundle default 
	#warning mlinkppp_bundle
	#if [ $? -eq 0 ]; then
	#	auto_bundle_load=YES
	#else
	#	auto_bundle_load=NO
	#fi

	get_string "Please specify Bundle Name" ""
	bundle_name=$($GET_RC)

	get_string "Please specify Link Name" ""
	link_name=$($GET_RC)

	parse_mpd_conf_file $bundle_name $link_name $auto_bundle_load
	parse_mpd_links_file $link_name $1

	# Create security file

	return 0
}


function create_multilink_ppp_cfg() {

	local err

	if [ $OS_SYSTEM = "Linux" ]; then
		create_multilink_ppp_linux_cfg $1
	elif [ $OS_SYSTEM = "FreeBSD" ]; then
		create_multilink_ppp_bsd_cfg $1
	fi
	
	return 0
}



