#!/bin/sh /etc/rc.common
# Copyright (C) 2023 Tianling Shen <cnsztl@immortalwrt.org>

USE_PROCD=1
START=99

extra_command "hot_reload" "Hot-reload service"

CONF="dae"
PROG="/usr/bin/dae"
LOG_DIR="/var/log/dae"

start_service() {
	config_load "$CONF"

	local enabled
	config_get_bool enabled "config" "enabled" "0"
	[ "$enabled" -eq "1" ] || return 1

	local config_file
	config_get config_file "config" "config_file" "/etc/dae/config.dae"

	"$PROG" validate -c "$config_file" || return 1

	local log_maxbackups log_maxsize
	config_get log_maxbackups "config" "log_maxbackups" "1"
	config_get log_maxsize "config" "log_maxsize" "1"

	procd_open_instance "$CONF"
	procd_set_param env DAE_LOCATION_ASSET="/usr/share/v2ray"
	procd_set_param command "$PROG" run
	procd_append_param command --config "$config_file"
	procd_append_param command --disable-timestamp
	procd_append_param command --logfile "$LOG_DIR/dae.log"
	procd_append_param command --logfile-maxbackups "$log_maxbackups"
	procd_append_param command --logfile-maxsize "$log_maxsize"

	procd_set_param limits core="unlimited"
	procd_set_param limits nofile="1000000 1000000"
	procd_set_param respawn
	# procd_set_param stdout 1
	procd_set_param stderr 1

	procd_close_instance
}

stop_service() {
	rm -rf "$LOG_DIR"
	# kill lingering procs in daens: TERM first, then KILL for stubborn ones
	for pid in $(ip netns pids daens 2>/dev/null); do kill "$pid" 2>/dev/null; done
	if [ -n "$(ip netns pids daens 2>/dev/null)" ]; then
		sleep 1
		for pid in $(ip netns pids daens 2>/dev/null); do kill -9 "$pid" 2>/dev/null; done
	fi
	# cleanup daens netns; ip-full needed for netns, busybox fallback via umount
	if ! ip netns del daens 2>/dev/null; then
		umount /run/netns/daens 2>/dev/null
		rm -f /run/netns/daens
	fi
	# clean orphaned dae0
	ip link del dae0 2>/dev/null || true
}

service_triggers() {
	procd_add_reload_trigger "$CONF"
}

hot_reload() {
	/etc/init.d/dae running && "$PROG" reload "$(cat /var/run/dae.pid)"
}

reload_service() {
	restart
}
