#!/bin/sh -f

po_domain="alterator-net-pppoe"

. alterator-sh-functions
. alterator-net-functions

### shell file helpers

read_connection()
{
	local name="/etc/net/ifaces/$1"

	local info=
	ifcheckup "$1" && info="`_ "connection established"`" || info="`_ "connection failed"`"
	write_string_param info "$info"

	write_string_param iface "$(read_iface_option "$name" HOST)"
	write_string_param login "$(read_ppp_option "$name" user)"

	write_bool_param 'mppe' "$(read_ppp_option1 "$name" 'require-mppe' 'nomppe')"
}

start_connection()
{
    ifup "$1"
}


stop_connection()
{
    ifdown "$1"
}

write_connection()
{
	[ "$1" = "/" ] && return
	local name="/etc/net/ifaces/$1"

	[ -d "$name" ] || mkdir -- "$name"

	[ -n "$in_iface" ] && write_iface_option "$name" HOST "$in_iface"
	
	[ -n "$in_login" ] && write_ppp_option "$name" user "$in_login"
	[ -n "$in_password" ] && write_ppp_option password "$(echo "$in_password"|sed -e 's/["]/\\\\&/g')"

	test_bool "$in_mppe"
	write_ppp_option1 "$name" 'require-mppe' 'nomppe' "$?"
}

new_connection()
{
    local name="/etc/net/ifaces/$1"

    mkdir -p -- "$name"

    write_iface_option "$name" TYPE ppp
    write_iface_option "$name" ONBOOT yes
    write_iface_option "$name" PPPTYPE pppoe
    write_iface_option "$name" PPPPERSIST on
    write_iface_option "$name" PPPMAXFAIL 0

# https://bugzilla.altlinux.org/show_bug.cgi?id=15603
    cat>"$name/pppoptions"<<EOF
defaultroute
mtu 1476
usepeerdns
EOF
    chmod o-rw "$name/pppoptions" # deny others reading the password
}

delete_connection()
{
	[ "$1" = "/" ] && return
	local name="/etc/net/ifaces/$1"

	ifdown "$1"
	rm -rf "$name"
}

on_message()
{
	case "$in_action" in
		##information
		constraints)
			local required="$([ "$in_orig_action" = "new" ] && echo "#t" || echo "#f")"
			echo '('
			printf 'name (required %s match ("^ppp[0-9]+$" "%s" ) default "%s" label "%s")' \
				"$required" \
				"`_ "should be ppp[number]"`" \
				"$(next_ppp)" \
				"`_ "Connection"`"
			printf 'password  (required %s label "%s")' \
				"$required" \
				"`_ "Password"`"
			echo ')'
			;;
		##actions
		list)
			echo '('
			case "$in__objects" in
			    avail_connection)
				list_ppp 'pppoe'|write_enum
				;;
			    avail_iface)
				list_eth|write_enum
				;;
			    avail_state)
				write_enum_item "ignore" "`_ "don't change"`" #'
				write_enum_item "start" "`_ "start"`"
				write_enum_item "stop" "`_ "stop"`"
				write_enum_item "restart" "`_ "restart"`"
				;;
			esac
			echo ')'
			;;
		read)
			echo '('
			local name="$in_name"
			[ -n "$in_new" ] && name="$in_new_name"
			[ -n "$name" ] || name="$(list_ppp 'pppoe'|head -n1)"

			write_string_param new_name "$(next_ppp)"
			write_string_param name "$name"
			[ -n "$name" ] && read_connection "$name"
			echo ')'
			;;
		write) 
			if [ -n "$in_new" ];then
			    [ -n "$in_new_name" ] && new_connection "$in_new_name"
			    write_nop
			elif [ -n "$in_delete" ];then
			    [ -n "$in_name" ] && delete_connection "$in_name"
			    write_nop
			elif [ -n "$in_commit" ];then
			    [ -n "$in_name" ] && write_connection "$in_name"
			    case "$in_status" in
				start) start_connection "$in_name";;
				stop) stop_connection "$in_name";;
				restart)
				    stop_connection "$in_name"
				    start_connection "$in_name"
				    ;;
			    esac
			    write_nop
			else
			    write_nop
			fi
			;;
		*)
			echo '#f'
			;;
	esac
}

message_loop
