summaryrefslogtreecommitdiffstats
path: root/wrappers
diff options
context:
space:
mode:
authorRich Megginson <rmeggins@redhat.com>2007-02-09 22:33:59 +0000
committerRich Megginson <rmeggins@redhat.com>2007-02-09 22:33:59 +0000
commit941a7e89074e2ed0e0401aa778ccf412dce14fc8 (patch)
treec32facb9e9817cbffba8db9b6eda22b9db95b8e4 /wrappers
parent04e615e5a4d68e3c5165eeb4f9c0bfae25547925 (diff)
downloadds-941a7e89074e2ed0e0401aa778ccf412dce14fc8.tar.gz
ds-941a7e89074e2ed0e0401aa778ccf412dce14fc8.tar.xz
ds-941a7e89074e2ed0e0401aa778ccf412dce14fc8.zip
Resolves: bug 160235
Bug Description: Add support for /etc/init scripts Reviewed by: nkinder (Thanks!) Fix Description: Add the new initscript. The initscript is called $PACKAGE_NAME which by default is fedora-ds. This script is created from wrappers/initscript.in, sed'd by the fixupcmd in Makefile.am during make install. The way it works is this: service fedora-ds cmd will execute the cmd on all instances (found in /etc/fedora-ds by default). service fedora-ds cmd instance will execute cmd on only that instance. So if you have /etc/fedora-ds/slapd-foo /etc/fedora-ds/slapd-bar and you do service start fedora-ds it will start up both slapd-foo and slapd-bar. If you do service start fedora-ds bar it will start up only slapd-bar. If you do service start fedora-ds biff you will get an error message. The initdir is platform specific (e.g. /etc/rc.d/init.d on linux, /etc/init.d on Solaris) so the definition was added to the platform dependent section of configure.ac. The init script is explicitly branded, including the filename. I needed to add support to the autotool files so that we could change the name of the file. Since package_name is defined when you use the AC_INIT macro in configure.ac, we don't need to define it elsewhere (e.g. #define BRAND_DS). So I added the branding and other information to the autotool files, and changed create_instance to use package_name instead of brand_ds to be consistent. Having the package_name defined in much fewer places should make it much easier to change in the future if necessary. I also fixed a compiler warning in ldaprot.h. Platforms tested: RHEL4, FC6 Flag Day: no Doc impact: Yes. We need to document how to use the initscript, and how to enable startup on boot - chkconfig fedora-ds on
Diffstat (limited to 'wrappers')
-rw-r--r--wrappers/initscript.in247
1 files changed, 247 insertions, 0 deletions
diff --git a/wrappers/initscript.in b/wrappers/initscript.in
new file mode 100644
index 00000000..6c69e309
--- /dev/null
+++ b/wrappers/initscript.in
@@ -0,0 +1,247 @@
+#!/bin/bash
+#
+# @package_name@ This starts and stops @package_name@
+#
+# chkconfig: - 21 79
+# description: @package_name@ Directory Server
+# processname: @sbindir@/ns-slapd
+# configdir: @sysconfdir@/@package_name@/
+# piddir: @localstatedir@/run/@package_name@
+# datadir: @localstatedir@/lib/@package_name@/slapd-<instance name>
+#
+
+# Source function library.
+. /etc/rc.d/init.d/functions
+# Source networking configuration.
+. /etc/sysconfig/network
+
+# Check that networking is up.
+if [ ${NETWORKING} = "no" ]
+then
+ echo "Networking is down"
+ exit 0
+fi
+
+
+exec="@sbindir@/ns-slapd"
+prog="@package_name@"
+# Lockfile
+lockfile="@localstatedir@/lock/subsys/@package_name@"
+# PID directory
+piddir="@localstatedir@/run/@package_name@"
+# Instance basedir
+instbase="@sysconfdir@/@package_name@"
+
+
+[ -f $exec ] || exit 0
+
+
+umask 077
+
+pids=$(pidof $exec)
+
+INSTANCES=""
+
+for FILE in `/bin/ls -d $instbase/slapd-* 2>/dev/null`; do
+ INSTANCES+=$(echo "$FILE" | sed -e "s|$instbase/slapd-||")
+ INSTANCES+=" "
+done
+
+if [ -n "$2" ]; then
+ for I in $INSTANCES; do
+ if [ "$2" == "$I" ]; then
+ INSTANCES="$2"
+ fi
+ done
+ if [ "$2" != "$INSTANCES" ]; then
+ echo -n "$2 is an invalid @package_name@ instance"
+ failure; echo
+ exit 1
+ fi
+fi
+
+start() {
+ if [ -n "$INSTANCES" ]; then
+ export LD_LIBRARY_PATH=@libdir@/@package_name@:@nss_libdir@
+ echo "Starting $prog: "
+ # Start every slapd instance that isn't already running
+ errors=0
+ successes=0
+ for instance in $INSTANCES; do
+ echo -n " $instance..."
+ # the server creates pidfile and writes the pid to it when it is fully
+ # started and available to serve clients
+ pidfile=$piddir/slapd-$instance.pid
+ # the server creates startpidfile and writes the pid to just after
+ # the process begins i.e. it received the startup request and didn't
+ # die a horrible death (e.g. shared lib problem, oom, etc.)
+ startpidfile=$piddir/slapd-$instance.startpid
+ server_running=0
+ if [ -e $pidfile ]; then
+ pid=$(cat $pidfile)
+ if [ $(echo "$pids" | grep -c $pid) -ge 1 ]; then
+ echo -n " already running"
+ success; echo
+ let successes=successes+1
+ server_running=1
+ else
+ echo -n " not running, but pid file exists - attempt to start anyway..."
+ rm -f $pidfile
+ fi
+ fi
+ server_started=0
+ if [ $server_running -eq 0 ] ; then
+ rm -f $pidfile
+ rm -f $startpidfile
+ $exec -D $instbase/slapd-$instance -i $pidfile -w $startpidfile
+ if [ $? -eq 0 ]; then
+ server_started=1 # well, perhaps not running, but started ok
+ else
+ failure; echo
+ let errors=errors+1
+ fi
+ fi
+ # ok, if we started the server successfully, let's see if it is really
+ # running and ready to serve requests
+ if [ $server_started -eq 1 ] ; then
+ loop_counter=1
+ # wait for 10 seconds for the start pid file to appear
+ max_count=10
+ while test $loop_counter -le $max_count; do
+ loop_counter=`expr $loop_counter + 1`
+ if test ! -f $startpidfile ; then
+ sleep 1
+ else
+ pid=`cat $startpidfile`
+ fi
+ done
+ if test ! -f $startpidfile ; then
+ failure; echo
+ let errors=errors+1
+ server_started=0
+ fi
+ fi
+ # ok, server wrote the startpid file - let's see if it comes up
+ # ready to service requests
+ if [ $server_started -eq 1 ] ; then
+ loop_counter=1
+ # wait for 10 minutes (600 times 1 seconds)
+ max_count=600
+ while test $loop_counter -le $max_count ; do
+ loop_counter=`expr $loop_counter + 1`
+ if test ! -f $pidfile ; then
+ if kill -0 $pid > /dev/null 2>&1 ; then
+ sleep 1
+ else
+ break
+ fi
+ else
+ pid=`cat $pidfile`
+ break
+ fi
+ done
+ if kill -0 $pid > /dev/null 2>&1 && test -f $pidfile ; then
+ success; echo
+ let successes=successes+1
+ else
+ failure; echo
+ let errors=errors+1
+ fi
+ fi
+ rm -f $startpidfile
+ done
+ if [ $successes -ge 1 ]; then
+ touch $lockfile
+ fi
+ if [ $errors -ge 1 ]; then
+ echo "*** Warning: $errors instance(s) failed to start"
+ fi
+ else
+ echo "*** Error: no $prog instances configured"
+ fi
+}
+
+stop() {
+ echo "Shutting down $prog: "
+ errors=0
+ for instance in $INSTANCES; do
+ pidfile=$piddir/slapd-$instance.pid
+ if [ -e $pidfile ]; then
+ pid=$(cat $pidfile)
+ echo -n " $instance..."
+ server_stopped=0
+ if [ $(echo "$pids" | grep -c $pid) -ge 1 ]; then
+ kill $pid
+ if [ $? -eq 0 ]; then
+ server_stopped=1
+ else
+ failure; echo
+ let errors=errors+1
+ fi
+ fi
+ if [ $server_stopped -eq 1 ] ; then
+ loop_counter=1
+ # wait for 10 minutes (600 times 1 second)
+ max_count=600
+ while test $loop_counter -le $max_count; do
+ loop_counter=`expr $loop_counter + 1`
+ if kill -0 $pid > /dev/null 2>&1 ; then
+ sleep 1
+ else
+ if test -f $pidfile ; then
+ rm -f $pidfile
+ fi
+ break
+ fi
+ done
+ if test -f $pidfile ; then
+ failure; echo
+ let errors=errors+1
+ else
+ success; echo
+ rm -f $pidfile
+ fi
+ fi
+ fi
+ done
+ if [ $errors -ge 1 ]; then
+ echo -n "*** Error: $errors instance(s) unsuccessfully stopped"
+ failure; echo
+ else
+ rm -f $lockfile
+ fi
+}
+
+restart() {
+ stop
+ start
+}
+
+
+status() {
+ for instance in $INSTANCES; do
+ if [ -e $piddir/slapd-$instance.pid ]; then
+ pid=$(cat $piddir/slapd-$instance.pid)
+ if [ $(echo "$pids" | grep -c $pid) -ge 1 ]; then
+ echo "$prog $instance (pid $pid) is running..."
+ else
+ echo "$prog $instance dead but pid file exists"
+ fi
+ else
+ echo "$prog $instance is stopped"
+ fi
+ done
+}
+
+
+case "$1" in
+ start|stop|restart|reload|status)
+ $1
+ ;;
+ condrestart)
+ [ ! -f $lockfile ] || restart
+ ;;
+ *)
+ echo $"Usage: $0 {start|stop|status|restart|condrestart} [instance-name]"
+ exit 2
+esac