[Calypso] [PATCH] Correct and clean up init.d script

Petter Reinholdtsen pere at hungry.com
Mon Jan 25 12:04:17 PST 2016


Based on the changes from chrysn at fsfe.org, I had a closer look at the
init.d script and propose to change it like this:

 - Use correct path to program (/usr/bin, not /usr/sbin).
 - Stop running as root, run as user calypso, and move pidfile to a
   place writable by this user.
 - By default, only listen on 127.0.0.1.
 - Remove unused / disabled code.
 - Change indentation from spaces and tabs to 4 spaces.

diff --git a/calypso-init b/calypso-init
index 5a1728a..2716546 100755
--- a/calypso-init
+++ b/calypso-init
@@ -12,14 +12,18 @@
 
 # Author: Keith Packard <keithp at keithp.com>
 # Author: Joe Nahmias <jello at debian.org>
+# Author: Petter Reinholdtsen <pere at debian.org>
 
 # PATH should only include /usr/* if it runs after the mountnfs.sh script
 PATH=/sbin:/usr/sbin:/bin:/usr/bin
 DESC="Calypso CalDAV Server"
 NAME=calypso
-DAEMON=/usr/sbin/$NAME
-PIDFILE=/var/run/$NAME.pid
-SCRIPTNAME=/etc/init.d/$NAME
+USER=calypso
+GROUP=calypso
+BINDIP=127.0.0.1
+DAEMON=/usr/bin/$NAME
+PIDFILE=/var/run/calypso/$NAME.pid
+CALYPSO_OPTS="--daemon"
 
 # Exit if the package is not installed
 [ -x "$DAEMON" ] || exit 0
@@ -27,6 +31,14 @@ SCRIPTNAME=/etc/init.d/$NAME
 # Read configuration variable file if it is present
 [ -r /etc/default/$NAME ] && . /etc/default/$NAME
 
+if [ "$BINDIP" ] ; then
+    CALYPSO_OPTS="${CALYPSO_OPTS:+$CALYPSO_OPTS }--host=$BINDIP"
+fi
+
+if [ "$PIDFILE" ] ; then
+    CALYPSO_OPTS="${CALYPSO_OPTS:+$CALYPSO_OPTS }--pid-file=$PIDFILE"
+fi
+
 # Load the VERBOSE setting and other rcS variables
 . /lib/init/vars.sh
 
@@ -38,14 +50,15 @@ SCRIPTNAME=/etc/init.d/$NAME
 #
 # Check whether daemon starting is enabled
 #
-check_start_daemon() {
-        if [ "$DISABLE_CALPYSO" = "yes" ]; then
-                [ "$VERBOSE" != no ] && \
-                        log_warning_msg "Not starting calypso, disabled via /etc/default/calypso"
-                return 1
-        else
-                return 0
-        fi
+check_start_daemon()
+{
+    if [ "$DISABLE_CALPYSO" = "yes" ]; then
+        [ "$VERBOSE" != no ] && \
+            log_warning_msg "Not starting $NAME, disabled via /etc/default/$NAME"
+        return 1
+    else
+        return 0
+    fi
 }
 
 #
@@ -53,18 +66,23 @@ check_start_daemon() {
 #
 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 -- \
-		$CALYPSO_OPTS \
-		|| 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.
+    # Return
+    #   0 if daemon has been started
+    #   1 if daemon was already running
+    #   2 if daemon could not be started
+    mkdir -p $(dirname $PIDFILE)
+    chown $USER:$GROUP $(dirname $PIDFILE)
+    start-stop-daemon \
+        --quiet \
+        --start \
+        --chuid $USER \
+        --pidfile $PIDFILE \
+        --exec $DAEMON \
+        -- $CALYPSO_OPTS \
+        || 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.
 }
 
 #
@@ -72,97 +90,84 @@ do_start()
 #
 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
+    # 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"
 }
 
 case "$1" in
-  start)
-	check_start_daemon || exit 0
-	[ "$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|force-reload)
-	#
-	# If do_reload() is not implemented then leave this commented out
-	# and leave 'force-reload' as an alias for 'restart'.
-	#
-	#log_daemon_msg "Reloading $DESC" "$NAME"
-	#do_reload
-	#log_end_msg $?
-	#;;
-  restart|force-reload)
-	#
-	# 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|restart|reload|force-reload}" >&2
-	echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
-	exit 3
-	;;
+    start)
+        check_start_daemon || exit 0
+        [ "$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 $?
+        ;;
+    restart|force-reload)
+        #
+        # 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: $0 {start|stop|status|restart|force-reload}" >&2
+        exit 3
+        ;;
 esac
 
 :

--
Happy hacking
Petter Reinholdtsen


More information about the Calypso mailing list