#!/bin/sh /etc/rc.common

START=88
STOP=15
USE_PROCD=1

NAME=tinyfecvpn

_log() {
	logger -p "daemon.$1" -t "$NAME" "$2"
}

has_valid_server() {
	local server
	for server in $@; do
		[ "$(uci_get $NAME $server)" = "servers" ] && return 0
	done
	return 1
}

create_config() {
	local config_file="$1"
	echo "# auto-generated config file from /etc/config/tinyfecvpn" > $config_file

	echo "-c" >> $config_file
	echo "-r ${server_addr}:${server_port}" >> $config_file

        [ -n "$sub_net" ] && echo "--sub-net ${sub_net}" >> $config_file
	[ -n "$key" ] && echo "-k ${key}" >> $config_file
        [ -n "$tun_dev" ] && echo "--tun-dev ${tun_dev}" >> $config_file
        [ -n "$fec" ] && echo "-f ${fec}" >> $config_file
        [ -n "$report" ] && echo "--report ${report}" >> $config_file
        [ -n "$timeout" ] && echo "--timeout ${timeout}" >> $config_file
	echo "--keep-reconnect" >> $config_file

        [ -n "$mode" ] && echo "--mode ${mode}" >> $config_file
        [ $mode -eq 1 -a  -n $mtu ] && echo "--mtu ${mtu}" >> $config_file

        [ -n "$sock_buf" ] && echo "--sock-buf ${sock_buf}" >> $config_

        [ $disable_fec -eq 1 ] && echo "--disable-fec" >> $config_file

	[ -n "$log_level" ] && echo "--log-level ${log_level}" >> $config_file
	echo "--disable-color" >> $config_file
}

validate_config_section() {
	uci_validate_section "$NAME" general "$1" \
		             'server:uciname' \
		             'daemon_user:string:root' \
                             'client_file:string:tinyvpn' \
                             'log:bool:0'
}

validate_server_section() {
	uci_validate_section "$NAME" servers "$1" \
		'server_addr:host' \
		'server_port:port:8080' \
		'sub_net:host' \
		'key:string' \
                'tun_dev:string' \
                'fec:string' \
                'report:string' \
		'timeout:string' \
                'mode:range(0,1)' \
                'mtu:string' \
                'sock_buf:range(10,10240)' \
                'disable_fec:bool:0' \
		'log_level:range(0,6)'
}

start_instance() {
	local server="$1"

	if [ -z "$server" -o "$server" == "nil" ]; then
		return 0
	elif ! validate_server_section "$server"; then
		_log "err" "Server config validation failed."
		return 1
	fi

	/sbin/validate_data "ipaddr" "$server_addr" >/dev/null 2>&1
	[ $? -ne 0 ] && server_addr=$(nslookup "$server_addr" | \
		sed -n 's/^Address[[:space:]]*[0-9]*:[[:space:]]*\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\)$/\1/p')
	if [ -z "$server_addr" ]; then
		_log "err" "Server address validation failed."
		return 1
	fi

	[ -d /var/etc ] || mkdir -p /var/etc
	local config_file="/var/etc/${NAME}.${server}.conf"
	create_config "$config_file" || return 1

        _log "info" "client_file $client_file log $log"
	procd_open_instance

        cmd=$client_file
        while read line; do
            [[ ${line:0:1} == - ]] && cmd="${cmd} ${line}"
        done < "$config_file"

	procd_set_param command $cmd
	procd_set_param respawn
	procd_set_param file "$config_file"
	[ -n "$daemon_user" ] && procd_set_param user "$daemon_user" && _log "info" "running from ${daemon_user} user"
	procd_set_param pidfile "/var/run/${NAME}.${server}.pid"
        [ $log -eq 1 ]  && procd_set_param stdout 1
        procd_set_param stderr 1
	procd_close_instance
}


service_triggers() {
	procd_add_reload_trigger "$NAME"
}

start_service() {
	if ! validate_config_section "general" ; then
		_log "err" "Config validate failed."
		return 1
	fi
	has_valid_server $server || return 1
	for srv in $server; do
		start_instance $srv
	done
}
