#!/bin/sh /etc/rc.common
# Copyright (C) 2018 Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
# shellcheck disable=SC2039
# vim: set noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 :

# shellcheck disable=SC2034
{
	START=99
	STOP=10
	USE_PROCD=1
}

set_shadowsocks_address() {
	uci -q set shadowsocks-libev.$1.local_address="$2"
}

set_ipv6_state() {
	local disable_ipv6="$(uci -q get openmptcprouter.settings.disable_ipv6)"
	[ -z "$disable_ipv6" ] && disable_ipv6="1"
	sysctl -qw net.ipv6.conf.all.disable_ipv6=$disable_ipv6
	sed -i "s:^net.ipv6.conf.all.disable_ipv6=[0-9]*:net.ipv6.conf.all.disable_ipv6=$disable_ipv6:" /etc/sysctl.d/zzz_openmptcprouter.conf

	uci -q batch <<-EOF >/dev/null
		set firewall.@defaults[0].disable_ipv6=$disable_ipv6
		commit firewall
	EOF

	if [ "$disable_ipv6" == "1" ]; then
		logger -t "omr-6in4" "Disable IPv6"
		uci -q batch <<-EOF >/dev/null
			set dhcp.lan.ra_default="0"
			set network.lan.ipv6="0"
			delete network.lan.ipv6
			delete dhcp.lan.dhcpv6
			delete dhcp.lan.ra
			delete dhcp.lan.ra_default
			delete dhcp.lan.ra_management
			delete dhcp.lan.ra_preference
		EOF
		config_load shadowsocks-libev
		config_foreach set_shadowsocks_address ss_redir "0.0.0.0"
	else
		logger -t "omr-6in4" "Enable IPv6"
		uci -q batch <<-EOF >/dev/null
			set dhcp.lan.dhcpv6="server"
			set dhcp.lan.ra="server"
			set dhcp.lan.ra_default="1"
			set dhcp.lan.ra_preference="high"
			set dhcp.lan.ra_management="1"
			set network.lan.ipv6="1"
			set network.lan.delegate="0"
		EOF
		config_load shadowsocks-libev
		config_foreach set_shadowsocks_address ss_redir "::"
	fi
	uci -q batch <<-EOF >/dev/null
		commit network
		commit dhcp
		commit shadowsocks-libev
	EOF
	/etc/init.d/odhcpd restart
}


start_service() {
	[ "$(uci -q get openmptcprouter.settings.disable_ipv6)" != "$(sysctl -n net.ipv6.conf.all.disable_ipv6)" ] && set_ipv6_state
	[ "$(uci -q get openmptcprouter.settings.disable_ipv6)" = "1" ] && {
		ifdown omr6in4
		return
	}
	ifup omr6in4
	procd_open_instance
	# shellcheck disable=SC2086
	procd_set_param command /bin/omr-6in4
	procd_set_param limits nofile="51200 51200"
	procd_set_param respawn 0 10 0
	procd_set_param stderr 1
	procd_close_instance
}

service_triggers() {
	procd_add_interface_trigger "omrvpn"
}

reload_service() {
	stop
	start
}
