#!/bin/sh /etc/rc.common
# Copyright (C) 2018-2026 Ycarus (Yannick Chabanois) <ycarus@zugaina.org> for OpenMPTCProuter
# SPDX-License-Identifier: GPL-3.0

# shellcheck disable=SC2034
START=91
USE_PROCD=1

# The model's weights are only kept up to date, or dropped, by
# omr-weight-sync: without it they stayed in the router's and the VPS's
# weight maps (040-multipath-weight, 006-mqvpn-weight, VPS pins)
clear_decision_weights() {
	. /usr/share/omr/lib/omr-state.sh
	uci -q -P /var/state show openmptcprouter 2>/dev/null | \
		sed -n 's/^openmptcprouter\.\([^.=][^.=]*\)\.decision_weight=.*/\1/p' | \
		while read -r iface; do
			omr_state_del openmptcprouter "$iface" decision_weight
		done
}

start_service() {
	local enabled interval

	# The custom server's Bearer token is kept in /var/state now: drop the
	# copy older versions left in the config, which would stand in for it
	. /usr/share/omr/lib/omr-state.sh
	omr_state_migrate omr-metrics settings token

	local weight_sync_enabled
	weight_sync_enabled=$(uci -q get omr-metrics.settings.enable_weight_sync)
	enabled=$(uci -q get omr-metrics.settings.send_to_vps)
	if [ "$enabled" = "0" ] || [ "$weight_sync_enabled" = "0" ]; then
		clear_decision_weights
	fi
	[ "$enabled" = "0" ] && return

	interval=$(uci -q get omr-metrics.settings.interval)

	procd_open_instance
	procd_set_param command /usr/bin/omr-metrics-send
	[ -n "$interval" ] && procd_append_param env "OMR_METRICS_INTERVAL=$interval"
	procd_set_param respawn 0 10 0
	procd_set_param stderr 1
	procd_close_instance

	[ "${weight_sync_enabled:-1}" != "0" ] && {
		procd_open_instance weight_sync
		procd_set_param command /usr/bin/omr-weight-sync
		procd_set_param respawn 0 10 0
		procd_set_param stderr 1
		procd_close_instance
	}
}

# After procd_kill: omr-weight-sync drops them on TERM too, but a fetch still
# running when procd gives up and kills it could leave one behind
service_stopped() {
	clear_decision_weights
}

service_triggers() {
	procd_add_reload_trigger omr-metrics
}

reload_service() {
	stop
	start
}
