# Tiny Cloud - init system service management
# vim:set filetype=sh:
# shellcheck shell=sh

init_system() {
	case "${TINY_CLOUD_INIT_SYSTEM:-auto}" in
		openrc|systemd)
			echo "$TINY_CLOUD_INIT_SYSTEM"
			;;
		auto)
			if [ -d "$ROOT/run/systemd/system" ]; then
				echo systemd
			elif command -v rc-update >/dev/null 2>&1; then
				echo openrc
			elif command -v systemctl >/dev/null 2>&1; then
				echo systemd
			else
				# Tiny Cloud historically supported OpenRC only.
				echo openrc
			fi
			;;
		*)
			log err "unsupported init system: $TINY_CLOUD_INIT_SYSTEM"
			return 1
			;;
	esac
}

systemctl_root() {
	if [ -n "$ROOT" ]; then
		$MOCK systemctl "--root=$ROOT" "$@"
	else
		$MOCK systemctl "$@"
	fi
}

service_enable() {
	local service="$1" runlevel="${2:-default}"
	case "$(init_system)" in
		openrc) $MOCK rc-update add "$service" "$runlevel" ;;
		systemd) systemctl_root enable "$service.service" ;;
	esac
}

service_disable() {
	local service="$1" runlevel="${2:-default}"
	case "$(init_system)" in
		openrc) $MOCK rc-update del "$service" "$runlevel" ;;
		systemd) systemctl_root disable "$service.service" ;;
	esac
}

service_start() {
	local service="$1"
	case "$(init_system)" in
		openrc) $MOCK rc-service "$service" start ;;
		systemd) $MOCK systemctl start "$service.service" ;;
	esac
}

tiny_cloud_services_disable() {
	local phase
	case "$(init_system)" in
		openrc)
			rm -f "$ETC"/runlevels/*/tiny-cloud*
			;;
		systemd)
			systemctl_root disable \
				tiny-cloud-boot.service \
				tiny-cloud-early.service \
				tiny-cloud-main.service \
				tiny-cloud-final.service
			;;
	esac
}

tiny_cloud_services_enable() {
	local phase
	case "$(init_system)" in
		openrc)
			ln -s /etc/init.d/tiny-cloud-boot "$ETC"/runlevels/boot
			for phase in early main final; do
				ln -s "/etc/init.d/tiny-cloud-$phase" "$ETC"/runlevels/default
			done
			;;
		systemd)
			systemctl_root enable \
				tiny-cloud-boot.service \
				tiny-cloud-early.service \
				tiny-cloud-main.service \
				tiny-cloud-final.service
			;;
	esac
}
