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

# mergerfs -f -o category.create=epmfs,minfreespace=100M,fsname=mergerfs:/mnt/merged /mnt/n2:/mnt/n3:/mnt/n4 /mnt/merged

START=98

USE_PROCD=1

start_service() {
	config_load mergerfs
	config_foreach start_pool pool
}

start_pool() {
	local section="$1"
	local enabled mountpoint paths createpolicy minfreespace options

	config_get_bool enabled "$section" enabled 0
	[ "$enabled" -eq 1 ] || return 0
	config_get mountpoint "$section" mountpoint
	config_get paths "$section" paths
	config_get createpolicy "$section" createpolicy "epmfs"
	config_get minfreespace "$section" minfreespace "4G"
	config_get options "$section" options

	# 检查 mountpoint 是否已设置
	[ -z "$mountpoint" ] && {
		logger -t "mergerfs" "mountpoint not set for $section"
		return 1
	}

	# (
	printf "%s\n" "$paths" | while IFS= read -r p; do
		case "$p" in
			/*)
			if [ ! -d "$p" ]; then
				logger -t "mergerfs" "source path $p does not exist for $mountpoint"
				return 1
			fi
			;;
		esac
	done || return 1

	# 只保留以 / 开头的路径，拼接为冒号分隔的字符串
	srcs=$(
		# (
		printf "%s\n" "$paths" | while IFS= read -r p; do
			case "$p" in
				/*) printf ':%s' "$p" ;;
			esac
		done
	)
	srcs="${srcs#:}"

	[ -z "$srcs" ] && {
		logger -t "mergerfs" "no valid source paths for $mountpoint"
		return 1
	}

	local opts
	opts="category.create=${createpolicy},minfreespace=${minfreespace},fsname=mergerfs:${mountpoint}"
	[ -n "$options" ] && opts="${opts},${options}"

	mkdir -p "$mountpoint"
	# mountpoint -q "$mountpoint" && umount "$mountpoint"

	logger -t "mergerfs" "mergerfs -o $opts \"$srcs\" \"$mountpoint\""

	procd_open_instance "$section"
	procd_set_param command /usr/bin/mergerfs -f -o "$opts" "$srcs" "$mountpoint"
	procd_close_instance
	# close flock fd, or the script will hangs next time it runs
	# ( exec 1000>&- ; mergerfs -o "$opts" "$srcs" "$mountpoint" )
}

stop_service() {
	config_load mergerfs
	config_foreach stop_pool pool
}

stop_pool() {
	local section="$1"
	local mountpoint
	config_get mountpoint "$section" mountpoint
	[ -n "$mountpoint" ] && umount "$mountpoint"
}

service_triggers() {
	procd_add_reload_trigger "mergerfs"
}
