Skip to content

Commit

Permalink
Create a ZED init script
Browse files Browse the repository at this point in the history
  • Loading branch information
FransUrbo committed Feb 6, 2014
1 parent 92b6e88 commit f2d0321
Show file tree
Hide file tree
Showing 3 changed files with 163 additions and 1 deletion.
1 change: 1 addition & 0 deletions etc/init.d/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
zfs
zed
13 changes: 12 additions & 1 deletion etc/init.d/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
initdir = $(DEFAULT_INIT_DIR)
init_SCRIPTS = zfs
zeddir = $(DEFAULT_INIT_DIR)
zed_SCRIPTS = zed

EXTRA_DIST = \
$(top_srcdir)/etc/init.d/zfs.fedora.in \
Expand All @@ -17,5 +19,14 @@ $(init_SCRIPTS):
-e 's,@initdir\@,$(initdir),g' \
'$@.$(DEFAULT_INIT_SCRIPT).in' >'$@'

$(zed_SCRIPTS):
-$(SED) -e 's,@bindir\@,$(bindir),g' \
-e 's,@sbindir\@,$(sbindir),g' \
-e 's,@udevdir\@,$(udevdir),g' \
-e 's,@udevruledir\@,$(udevruledir),g' \
-e 's,@sysconfdir\@,$(sysconfdir),g' \
-e 's,@initdir\@,$(initdir),g' \
'[email protected]' >'$@'

distclean-local::
-$(RM) $(init_SCRIPTS)
-$(RM) $(init_SCRIPTS) $(zed_SCRIPTS)
150 changes: 150 additions & 0 deletions etc/init.d/zed.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
#!/bin/sh

### BEGIN INIT INFO
# Provides: zed zeventd
# Required-Start: zfs
# Required-Stop: zfs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# 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

# Author: Turbo Fredriksson <[email protected]>

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="ZFS Event Daemon"
NAME=zed
DAEMON=@sbindir@/$NAME
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

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

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
# Add code here, if necessary, that waits for the process to be ready
# to handle requests from services started subsequently which depend
# on this one. As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
return 0
}

case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
reload)
log_daemon_msg "Reloading $DESC" "$NAME"
do_reload
log_end_msg $?
;;
restart)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload}" >&2
exit 3
;;
esac

:

2 comments on commit f2d0321

@dun
Copy link

@dun dun commented on f2d0321 Mar 22, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the zed sysvinit scripts need to be done in a distro-specific manner analogous to those for the existing zfs scripts. This is towards the top of my todo list for this coming week.

@FransUrbo
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The current distro-specific scripts will (hopfully!) be replaced with more generic 'works everywhere and anywhere' ones in openzfs#2106.

The more distro specific stuff we have, the more difficult it is to maintain. The current scripts currently differ quite greatly in functionality and options. Besides, it isn't really OUR job do do this. It should really be up to the distributions...

Please sign in to comment.