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

START=88
USE_PROCD=1

interface_multipath_settings() {
	local mode port
	local config="$1"
	id=$(($id+1))
	config_get mode "$config" multipath ""
	[ "$mode" = "" ] && {
		mode="$(uci -q get openmptcprouter.$config.multipath)"
	}
	[ "$mode" = "off" ] || [ "$mode" = "" ] && return 1
	config_get ifname "$config" device
	[ -z "$ifname" ] && config_get ifname "$config" ifname
	[ -z "$ifname" ] && ifname=$(ifstatus "$config" | jsonfilter -q -e '@["l3_device"]')
	[ -n "$(echo $ifname | grep '@')" ] && ifname=$(ifstatus "$1" | jsonfilter -q -e '@["device"]')
	[ -z "$ifname" ] && return 1
	addr=$(ifstatus ${config} | jsonfilter -q -e '@["ipv4-address"][0].address')
	[ -z "$addr" ] && return 1
	count=$(($count+1))
	port=$((firstport+count))
	cat >> /tmp/etc/${interface_name}.conf <<-EOF

	[${config}]
	bindhost = "${addr}"
	bindport = "${port}"
	remotehost = "${host}"
	remoteport = "${port}"
	EOF
}

start_service() {
	local enable timeout mode password reorder_buffer_size interface_name host firstport loss_tolerance latency_tolerance
	[ "$(uci -q get mlvpn.general.enable)" = "1" ] || return 1
	interface_name="$(uci -q get mlvpn.general.interface_name)"
	timeout="$(uci -q get mlvpn.general.timeout)"
	mode="$(uci -q get mlvpn.general.mode)"
	password="$(uci -q get mlvpn.general.password)"
	reorder_buffer_size="$(uci -q get mlvpn.general.reorder_buffer_size)"
	loss_tolerance="$(uci -q get mlvpn.general.loss_tolerance)"
	latency_tolerance="$(uci -q get mlvpn.general.latency_tolerance)"
	cleartext_data="$(uci -q get mlvpn.general.cleartext_data)"
	[ -z "$cleartext_data" ] && cleartext_data="0"
	host="$(uci -q get mlvpn.general.host)"
	firstport="$(uci -q get mlvpn.general.firstport)"
	
	# "uci get network.omrvpn" is the section type, never the device: this
	# ran on every start, and a bare "uci commit" flushed every package's
	# pending changes, not only this one
	if [ -n "$(uci -q get network.omrvpn)" ] && [ "$(uci -q get network.omrvpn.device)" != "${interface_name}" ]; then
		uci -q set network.omrvpn.device=${interface_name}
		uci -q commit network
	fi
	
	cat > /tmp/etc/${interface_name}.conf <<-EOF
	[general]
	tuntap = "tun"
	mode = "${mode}"
	interface_name = "${interface_name}"
	timeout = ${timeout}
	reorder_buffer = yes
	reorder_buffer_size = ${reorder_buffer_size}
	loss_tolerence = ${loss_tolerance}
	latency_tolerence = ${latency_tolerance}
	cleartext_data = ${cleartext_data}
	password = "${password}"
	mtu = 1452
	EOF
	
	local count=0 id=0
	config_load network
	config_foreach interface_multipath_settings interface

	chmod 0600 "/tmp/etc/${interface_name}.conf"
	procd_open_instance
	procd_set_param command /usr/sbin/mlvpn -c /tmp/etc/${interface_name}.conf --user nobody
	procd_set_param file "/tmp/etc/${interface_name}.conf"
	procd_set_param respawn
	procd_set_param stdout 1
	procd_set_param stderr 1
	procd_close_instance
}

service_triggers() {
	procd_add_reload_trigger mlvpn
}