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

USE_PROCD=1
START=90
STOP=10

NAME="vlmcsd"
CONF="$NAME"
PROG="/usr/bin/vlmcsd"
INI_FILE="/etc/vlmcsd.ini"
KMS_PORT="1688"
DHCP_SECTION="$NAME"

normalize_bool() {
	case "$1" in
		1|on|true|yes|enabled)
			return 0
		;;
		*)
			return 1
		;;
	esac
}

config_get_bool_compat() {
	local __var="$1"
	local section="$2"
	local option="$3"
	local default="${4:-0}"
	local legacy_option="$5"
	local value

	config_get value "$section" "$option"
	if [ -z "$value" ] && [ -n "$legacy_option" ]; then
		config_get value "$section" "$legacy_option"
	fi

	if normalize_bool "${value:-$default}"; then
		eval "$__var=1"
	else
		eval "$__var=0"
	fi
}

reload_dnsmasq() {
	[ -x /etc/init.d/dnsmasq ] || return 0

	/etc/init.d/dnsmasq reload >/dev/null 2>&1 || \
		/etc/init.d/dnsmasq restart >/dev/null 2>&1 || true
}

sync_dns_srv() {
	local enabled="$1"
	local before after hostname domain srv target

	before="$(uci -q show "dhcp.${DHCP_SECTION}" 2>/dev/null)"
	uci -q delete "dhcp.${DHCP_SECTION}"

	if [ "$enabled" = "1" ]; then
		hostname="$(uci -q get system.@system[0].hostname)"
		domain="$(uci -q get dhcp.@dnsmasq[0].domain)"

		[ -n "$hostname" ] || hostname="OpenWrt"

		srv="_vlmcs._tcp"
		target="$hostname"
		if [ -n "$domain" ]; then
			srv="${srv}.${domain}"
			target="${target}.${domain}"
		fi

		uci -q set "dhcp.${DHCP_SECTION}=srvhost"
		uci -q set "dhcp.${DHCP_SECTION}.srv=${srv}"
		uci -q set "dhcp.${DHCP_SECTION}.target=${target}"
		uci -q set "dhcp.${DHCP_SECTION}.port=${KMS_PORT}"
	fi

	after="$(uci -q show "dhcp.${DHCP_SECTION}" 2>/dev/null)"
	[ "$before" = "$after" ] && return 0

	uci -q commit dhcp
	reload_dnsmasq
}

start_service() {
	local enabled auto_activate internet_access

	config_load "$CONF"
	config_get_bool_compat enabled config enabled 0
	config_get_bool_compat auto_activate config auto_activate 1 autoactivate
	config_get_bool_compat internet_access config internet_access 0

	if [ "$enabled" -ne 1 ]; then
		sync_dns_srv 0
		return 1
	fi

	[ -x "$PROG" ] || return 1

	sync_dns_srv "$auto_activate"

	procd_open_instance "$NAME"
	procd_set_param command "$PROG" -D -i "$INI_FILE" -L "0.0.0.0:${KMS_PORT}"
	procd_set_param file "$INI_FILE"
	procd_set_param respawn
	procd_set_param stdout 1
	procd_set_param stderr 1

	if [ "$internet_access" -eq 1 ]; then
		procd_open_data
		json_add_array firewall
			json_add_object ""
				json_add_string type rule
				json_add_string name "Allow-vlmcsd"
				json_add_string proto "tcp"
				json_add_string src "*"
				json_add_string dest_port "$KMS_PORT"
				json_add_string target "ACCEPT"
			json_close_object
		json_close_array
		procd_close_data
	fi

	procd_close_instance
}

stop_service() {
	sync_dns_srv 0
}

service_triggers() {
	procd_add_reload_trigger "$CONF" dhcp system
}

reload_service() {
	restart
}
