diff options
author | Rich Megginson <rmeggins@redhat.com> | 2007-02-09 22:33:59 +0000 |
---|---|---|
committer | Rich Megginson <rmeggins@redhat.com> | 2007-02-09 22:33:59 +0000 |
commit | 941a7e89074e2ed0e0401aa778ccf412dce14fc8 (patch) | |
tree | c32facb9e9817cbffba8db9b6eda22b9db95b8e4 /wrappers | |
parent | 04e615e5a4d68e3c5165eeb4f9c0bfae25547925 (diff) | |
download | ds-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.in | 247 |
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 |