testbot/scripts: Update the init.d script so it works with the LSB init functions.

Francois Gouget fgouget at codeweavers.com
Thu Oct 4 07:40:35 CDT 2012


This makes it work on Debian.
---
 testbot/scripts/initd |  340 +++++++++++++++++++++++++++++--------------------
 1 file changed, 200 insertions(+), 140 deletions(-)

diff --git a/testbot/scripts/initd b/testbot/scripts/initd
index 041e836..c4caf49 100755
--- a/testbot/scripts/initd
+++ b/testbot/scripts/initd
@@ -1,8 +1,9 @@
 #!/bin/sh
 #
-#     System startup script based on template SUSE script for winetestbot
+#     System startup script based on template SUSE script for WineTestBot
 #     Copyright (C) 1995--2005  Kurt Garloff, SUSE / Novell Inc.
 #     Copyright 2009 Ge van Geldorp.
+#     Copyright 2012 Francois Gouget
 #          
 #     This library is free software; you can redistribute it and/or modify it
 #     under the terms of the GNU Lesser General Public License as published by
@@ -37,152 +38,211 @@
 # Description:       Start winetestbot to start job processing
 ### END INIT INFO
 
+USER="winehq"
+WTB_ROOT="/home/winehq/tools/testbot"
+DAEMON="$WTB_ROOT/bin/Engine.pl"
+PING="$WTB_ROOT/bin/PingEngine.pl"
+PIDFILE="/var/run/winetestbot.pid"
+
 # Check for missing binaries (stale symlinks should not happen)
 # Note: Special treatment of stop for LSB conformance
-WINETESTBOT_BIN=/usr/lib/winetestbot/bin/Engine.pl
-test -x $WINETESTBOT_BIN || { echo "$WINETESTBOT_BIN not installed"; 
+test -x $DAEMON || { echo "$DAEMON not installed";
 	if [ "$1" = "stop" ]; then exit 0;
 	else exit 5; fi; }
 
-# Source LSB init functions
-# providing start_daemon, killproc, pidofproc, 
-# log_success_msg, log_failure_msg and log_warning_msg.
-# This is currently not used by UnitedLinux based distributions and
-# not needed for init scripts for UnitedLinux only. If it is used,
-# the functions from rc.status should not be sourced or used.
-#. /lib/lsb/init-functions
-
-# Shell functions sourced from /etc/rc.status:
-#      rc_check         check and set local and overall rc status
-#      rc_status        check and set local and overall rc status
-#      rc_status -v     be verbose in local rc status and clear it afterwards
-#      rc_status -v -r  ditto and clear both the local and overall rc status
-#      rc_status -s     display "skipped" and exit with status 3
-#      rc_status -u     display "unused" and exit with status 3
-#      rc_failed        set local and overall rc status to failed
-#      rc_failed <num>  set local and overall rc status to <num>
-#      rc_reset         clear both the local and overall rc status
-#      rc_exit          exit appropriate to overall rc status
-#      rc_active        checks whether a service is activated by symlinks
-. /etc/rc.status
-
-# Reset status of this service
-rc_reset
-
-# Return values acc. to LSB for all commands but status:
-# 0	  - success
-# 1       - generic or unspecified error
-# 2       - invalid or excess argument(s)
-# 3       - unimplemented feature (e.g. "reload")
-# 4       - user had insufficient privileges
-# 5       - program is not installed
-# 6       - program is not configured
-# 7       - program is not running
-# 8--199  - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
-# 
-# Note that starting an already running service, stopping
-# or restarting a not-running service as well as the restart
-# with force-reload (in case signaling is not supported) are
-# considered a success.
-
-case "$1" in
+if [ -f /lib/lsb/init-functions ]
+then
+    # Use the LSB compliant functions, on Debian for instance
+    . /lib/lsb/init-functions
+
+    case "$1" in
     start)
-	echo -n "Starting WineTestBot "
-	## Start daemon with startproc(8). If this fails
-	## the return value is set appropriately by startproc.
-	/sbin/startproc -u winetest -g winetest $WINETESTBOT_BIN
-
-	# Remember status and be verbose
-	rc_status -v
-	;;
+        log_daemon_msg "Starting the WineTestBot server" "Engine.pl"
+        # FIXME: We should be using start_daemon but it cannot handle servers
+        # that don't know how to put themselves in the background and that
+        # need a setuid().
+        # start_daemon -p $PIDFILE $DAEMON
+        /sbin/start-stop-daemon --start --quiet --oknodo \
+            --make-pidfile --pidfile $PIDFILE --user $USER \
+            --chuid $USER --background --startas $DAEMON
+	log_end_msg $?
+        ;;
+
     stop)
-	echo -n "Shutting down WineTestBot "
-	## Stop daemon with killproc(8) and if this fails
-	## killproc sets the return value according to LSB.
-
-	/sbin/killproc -TERM $WINETESTBOT_BIN
-
-	# Remember status and be verbose
-	rc_status -v
-	;;
-    try-restart|condrestart)
-	## Do a restart only if the service was active before.
-	## Note: try-restart is now part of LSB (as of 1.9).
-	## RH has a similar command named condrestart.
-	if test "$1" = "condrestart"; then
-		echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
-	fi
-	$0 status
-	if test $? = 0; then
-		$0 restart
-	else
-		rc_reset	# Not running is not a failure.
-	fi
-	# Remember status and be quiet
-	rc_status
-	;;
-    restart)
-	## Stop the service and regardless of whether it was
-	## running or not, start it again.
-	$0 stop
-	$0 start
-
-	# Remember status and be quiet
-	rc_status
-	;;
-    force-reload)
-	## Signal the daemon to reload its config. Most daemons
-	## do this on signal 1 (SIGHUP).
-	## If it does not support it, restart the service if it
-	## is running.
-
-	echo -n "Reload service WineTestBot "
-	## if it supports it:
-	/sbin/killproc -HUP $WINETESTBOT_BIN
-	#touch /var/run/winetestbot.pid
-	rc_status -v
-
-	## Otherwise:
-	#$0 try-restart
-	#rc_status
-	;;
+	log_daemon_msg "Stopping the WineTestBot server" "Engine.pl"
+	killproc -p $PIDFILE $DAEMON
+        RETVAL=$?
+        [ $RETVAL -eq 0 ] && [ -e "$PIDFILE" ] && rm -f $PIDFILE
+        log_end_msg $RETVAL
+        ;;
+
+    restart|force-reload)
+        $0 stop
+        $0 start
+        ;;
+
+    try-restart)
+        ## Do a restart only if the service was active before.
+        if $0 status
+        then
+            $0 restart
+        fi
+        ;;
+
     reload)
-	## Like force-reload, but if daemon does not support
-	## signaling, do nothing (!)
-
-	# If it supports signaling:
-	echo -n "Reload service FOO "
-	/sbin/killproc -HUP $WINETESTBOT_BIN
-	#touch /var/run/winetestbot.pid
-	rc_status -v
-	
-	## Otherwise if it does not support reload:
-	#rc_failed 3
-	#rc_status -v
-	;;
+	log_daemon_msg "Reloading the WineTestBot configuration"
+        killproc -p $PIDFILE $DAEMON -HUP
+	log_end_msg $?
+        ;;
+
+    status)
+        status="0"
+        pidofproc -p $PIDFILE $DAEMON >/dev/null || status="$?"
+        if [ "$status" = 0 ]
+        then
+            if $PING -q
+            then
+                log_success_msg "The WineTestBot server is running"
+                return 0
+            fi
+            log_failure_msg "The WineTestBot server is running but not responding"
+            return 1
+        elif [ "$status" = 4 ]; then
+            log_failure_msg "could not access PID file for the WineTestBot server"
+            return $status
+        else
+            log_failure_msg "The WineTestBot server is not running"
+            return $status
+        fi
+        ;;
+
+    *)
+        echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}"
+        exit 1
+        ;;
+    esac
+
+elif [ -f /etc/rc.status ]
+then
+    # This is typically used for SUSE
+
+    # Shell functions sourced from /etc/rc.status:
+    #      rc_check         check and set local and overall rc status
+    #      rc_status        check and set local and overall rc status
+    #      rc_status -v     be verbose in local rc status and clear it afterwards
+    #      rc_status -v -r  ditto and clear both the local and overall rc status
+    #      rc_status -s     display "skipped" and exit with status 3
+    #      rc_status -u     display "unused" and exit with status 3
+    #      rc_failed        set local and overall rc status to failed
+    #      rc_failed <num>  set local and overall rc status to <num>
+    #      rc_reset         clear both the local and overall rc status
+    #      rc_exit          exit appropriate to overall rc status
+    #      rc_active        checks whether a service is activated by symlinks
+    . /etc/rc.status
+
+    # Reset status of this service
+    rc_reset
+
+    # Return values acc. to LSB for all commands but status:
+    # 0	  - success
+    # 1       - generic or unspecified error
+    # 2       - invalid or excess argument(s)
+    # 3       - unimplemented feature (e.g. "reload")
+    # 4       - user had insufficient privileges
+    # 5       - program is not installed
+    # 6       - program is not configured
+    # 7       - program is not running
+    # 8--199  - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
+    #
+    # Note that starting an already running service, stopping
+    # or restarting a not-running service as well as the restart
+    # with force-reload (in case signaling is not supported) are
+    # considered a success.
+
+    case "$1" in
+        start)
+            echo -n "Starting WineTestBot "
+            ## Start daemon with startproc(8). If this fails
+            ## the return value is set appropriately by startproc.
+            /sbin/startproc -u winetest -g winetest $DAEMON
+
+            # Remember status and be verbose
+            rc_status -v
+            ;;
+        stop)
+            echo -n "Shutting down WineTestBot "
+            ## Stop daemon with killproc(8) and if this fails
+            ## killproc sets the return value according to LSB.
+
+            /sbin/killproc -TERM $DAEMON
+
+            # Remember status and be verbose
+            rc_status -v
+            ;;
+        try-restart|condrestart)
+            ## Do a restart only if the service was active before.
+            ## Note: try-restart is now part of LSB (as of 1.9).
+            ## RH has a similar command named condrestart.
+            if test "$1" = "condrestart"; then
+                    echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
+            fi
+            $0 status
+            if test $? = 0; then
+                $0 restart
+            else
+                rc_reset        # Not running is not a failure.
+            fi
+            # Remember status and be quiet
+            rc_status
+            ;;
+        restart|force-reload)
+            ## Stop the service and regardless of whether it was
+            ## running or not, start it again.
+            $0 stop
+            $0 start
+
+            # Remember status and be quiet
+            rc_status
+            ;;
+        reload)
+            log_daemon_msg "Reloading service WineTestBot"
+            killproc -HUP $DAEMON
+            log_end_msg $?
+
+            ## Otherwise if it does not support reload:
+            #rc_failed 3
+            #rc_status -v
+            ;;
     status)
-	echo -n "Checking for service WineTestBot "
-	## Check status with checkproc(8), if process is running
-	## checkproc will return with exit status 0.
-
-	# Return value is slightly different for the status command:
-	# 0 - service up and running
-	# 1 - service dead, but /var/run/  pid  file exists
-	# 2 - service dead, but /var/lock/ lock file exists
-	# 3 - service not running (unused)
-	# 4 - service status unknown :-(
-	# 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
-	
-	# NOTE: checkproc returns LSB compliant status values.
-	/sbin/checkproc $WINETESTBOT_BIN
-	/usr/lib/winetestbot/bin/PingEngine.pl -q
-	# NOTE: rc_status knows that we called this init script with
-	# "status" option and adapts its messages accordingly.
-	rc_status -v
-	;;
+        status_of_proc $DAEMON
+echo -n "Checking for service WineTestBot "
+        ## Check status with checkproc(8), if process is running
+        ## checkproc will return with exit status 0.
+
+        # Return value is slightly different for the status command:
+        # 0 - service up and running
+        # 1 - service dead, but /var/run/  pid  file exists
+        # 2 - service dead, but /var/lock/ lock file exists
+        # 3 - service not running (unused)
+        # 4 - service status unknown :-(
+        # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
+
+        # NOTE: checkproc returns LSB compliant status values.
+        /sbin/checkproc $DAEMON
+        $PING -q
+        # NOTE: rc_status knows that we called this init script with
+        # "status" option and adapts its messages accordingly.
+        rc_status -v
+        ;;
     *)
-	echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}"
-	exit 1
-	;;
-esac
-rc_exit
+        echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}"
+        exit 1
+        ;;
+    esac
+    rc_exit
+
+
+else
+    echo "WineTestBot does not know how to start on this system"
+    exit 1
+fi
-- 
1.7.10.4



More information about the wine-patches mailing list