#!/bin/sh /etc/rc.common
# Quicksilver - mihomo 服务管理（TUN 透明代理 + dnsmasq DNS 接管）

START=99
STOP=15
USE_PROCD=1

EZ_DIR="/etc/quicksilver"
RUN_DIR="$EZ_DIR/run"
CORE="$EZ_DIR/core/mihomo"
DNS_BACKUP="$EZ_DIR/dnsmasq.backup"

ez_log() { logger -t quicksilver -p daemon.info "$*"; }
ez_err() { logger -t quicksilver -p daemon.err "$*"; }

cfg() {
	local v
	v=$(uci -q get "quicksilver.config.$1")
	[ -n "$v" ] && echo "$v" || echo "$2"
}

# ---- dnsmasq 接管：上游指向 mihomo DNS，停止时还原 ----

dns_takeover() {
	local port
	port=$(cfg dns_port 7874)

	# 已接管过则只需确保端口正确
	if [ -f "$DNS_BACKUP" ]; then
		uci -q delete dhcp.@dnsmasq[0].server
		uci -q add_list dhcp.@dnsmasq[0].server="127.0.0.1#$port"
		uci -q commit dhcp
		/etc/init.d/dnsmasq restart >/dev/null 2>&1
		return 0
	fi

	{
		echo "noresolv=$(uci -q get dhcp.@dnsmasq[0].noresolv)"
		echo "server=$(uci -q get dhcp.@dnsmasq[0].server)"
	} > "$DNS_BACKUP"

	uci -q set dhcp.@dnsmasq[0].noresolv='1'
	uci -q delete dhcp.@dnsmasq[0].server
	uci -q add_list dhcp.@dnsmasq[0].server="127.0.0.1#$port"
	uci -q commit dhcp
	/etc/init.d/dnsmasq restart >/dev/null 2>&1
	ez_log "dnsmasq 上游已指向 mihomo DNS (127.0.0.1#$port)"
}

dns_restore() {
	local noresolv servers s

	[ -f "$DNS_BACKUP" ] || return 0

	noresolv=$(sed -n 's/^noresolv=//p' "$DNS_BACKUP")
	servers=$(sed -n 's/^server=//p' "$DNS_BACKUP")

	if [ -n "$noresolv" ]; then
		uci -q set dhcp.@dnsmasq[0].noresolv="$noresolv"
	else
		uci -q delete dhcp.@dnsmasq[0].noresolv
	fi

	uci -q delete dhcp.@dnsmasq[0].server
	for s in $servers; do
		uci -q add_list dhcp.@dnsmasq[0].server="$s"
	done

	uci -q commit dhcp
	rm -f "$DNS_BACKUP"
	/etc/init.d/dnsmasq restart >/dev/null 2>&1
	ez_log "dnsmasq 配置已还原"
}

# ---- 服务 ----

start_service() {
	if [ "$(cfg enabled 0)" != "1" ]; then
		dns_restore
		return 0
	fi

	if [ ! -x "$CORE" ]; then
		ez_err "启动失败：mihomo 内核未安装"
		return 1
	fi

	# 每次启动重新生成配置（应用最新的 uci 设置）；
	# 生成失败但存在上次的可用配置时降级使用旧配置
	if ! /usr/share/quicksilver/quicksilver.sh gen_config; then
		if [ -s "$RUN_DIR/config.yaml" ]; then
			ez_err "配置生成失败，使用上一次的配置启动"
		else
			ez_err "启动失败：无可用配置（请先登录获取订阅）"
			return 1
		fi
	fi

	dns_takeover

	procd_open_instance core
	procd_set_param command "$CORE" -d "$RUN_DIR" -f "$RUN_DIR/config.yaml"
	procd_set_param respawn 3600 5 5
	procd_set_param limits nofile="1000000 1000000"
	procd_set_param stdout 1
	procd_set_param stderr 1
	procd_close_instance

	/usr/share/quicksilver/quicksilver.sh apply_cron >/dev/null 2>&1
	ez_log "mihomo 已启动 (TUN 模式)"
}

stop_service() {
	dns_restore
	ez_log "mihomo 已停止"
}

reload_service() {
	restart
}

service_triggers() {
	procd_add_reload_trigger "quicksilver"
}
