#!@DEFAULT_INIT_SHELL@
#
# zfs-zed
#
# chkconfig:    2345 29 99
# description:  This script will start and stop the ZFS Event Daemon.
# probe: true
#
### BEGIN INIT INFO
# Provides:          zfs-zed
# Required-Start:    zfs-mount
# Required-Stop:     zfs-mount
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# X-Stop-After:      zfs-share
# Short-Description: ZFS Event Daemon
# Description:       zed monitors ZFS events. When a zevent is posted, zed
#                    will run any scripts that have been enabled for the
#                    corresponding zevent class.
### END INIT INFO
#
# Released under the 2-clause BSD license.
#
# This script is based on debian/zfsutils.zfs.init from the
# Debian GNU/kFreeBSD zfsutils 8.1-3 package, written by Aurelien Jarno.

# Source the common init script
. @sysconfdir@/zfs/zfs-functions

ZED_NAME="zed"
ZED_PIDFILE="@runstatedir@/$ZED_NAME.pid"

# shellcheck disable=SC2034
extra_started_commands="reload"

# Exit if the package is not installed
[ -x "$ZED" ] || exit 0

# ----------------------------------------------------

do_depend()
{
	after zfs-mount localmount
}

do_start()
{
	check_module_loaded "zfs" || exit 0

	ZED_ARGS="$ZED_ARGS -p $ZED_PIDFILE"

	zfs_action "Starting ZFS Event Daemon" zfs_daemon_start \
	    "$ZED_PIDFILE" "$ZED" "$ZED_ARGS"
	return "$?"
}

do_stop()
{
	local pools
	check_module_loaded "zfs" || exit 0

	zfs_action "Stopping ZFS Event Daemon" zfs_daemon_stop \
	   "$ZED_PIDFILE" "$ZED" "$ZED_NAME" || return "$?"

	# Let's see if we have any pools imported
	pools=$("$ZPOOL" list -H -oname)
	if [ -z "$pools" ]
	then
		# No pools imported, it is/should be safe/possible to
		# unload modules.
		zfs_action "Unloading modules" rmmod zfs zunicode \
		    zavl zcommon znvpair zlua spl
		return "$?"
	fi
}

do_status()
{
	check_module_loaded "zfs" || exit 0

	zfs_daemon_status "$ZED_PIDFILE" "$ZED" "$ZED_NAME"
	return "$?"
}

do_reload()
{
	check_module_loaded "zfs" || exit 0

	zfs_action "Reloading ZFS Event Daemon" zfs_daemon_reload \
	    "$ZED_PIDFILE" "$ZED_NAME"
	return "$?"
}

# ----------------------------------------------------

if [ ! -e /sbin/openrc-run ]; then
	case "$1" in
		start)
			do_start
			;;
		stop)
			do_stop
			;;
		status)
			do_status
			;;
		reload|force-reload)
			do_reload
			;;
		restart)
			do_stop
			do_start
			;;
		*)
			[ -n "$1" ] && echo "Error: Unknown command $1."
			echo "Usage: $0 {start|stop|status|reload|restart}"
			exit 1
			;;
	esac

	exit $?
else
	# Create wrapper functions since Gentoo don't use the case part.
	depend() { do_depend; }
	start() { do_start; }
	stop() { do_stop; }
	status() { do_status; }
	reload() { do_reload; }
fi
