X-Git-Url: http://ftp.carnet.hr/carnet-debian/scm?a=blobdiff_plain;f=files%2Fetc%2Finit.d%2Fslapd;fp=files%2Fetc%2Finit.d%2Fslapd;h=53b18fc6db6ee192dcea31adf105b58409d79a6b;hb=d76524eb23710a7326e9633ab4df800d65449c5d;hp=0000000000000000000000000000000000000000;hpb=a26fded43562e80021ad20d6066a6667fa78e0e8;p=carnet-upgrade.git diff --git a/files/etc/init.d/slapd b/files/etc/init.d/slapd new file mode 100755 index 0000000..53b18fc --- /dev/null +++ b/files/etc/init.d/slapd @@ -0,0 +1,256 @@ +#! /bin/sh + +# Kill me on all errors +set -e + +# Stop processing if slapd is not there +[ -x /usr/sbin/slapd ] || exit 0 + +# Set default values +DB_RECOVER_CMD=db4.2_recover + +# Source the init script configuration +if [ -f "/etc/default/slapd" ]; then + . /etc/default/slapd +fi + +# Load the default location of the slapd config file +if [ -z "$SLAPD_CONF" ]; then + SLAPD_CONF="/etc/ldap/slapd.conf" +else + SLAPD_OPTIONS="-f $SLAPD_CONF $SLAPD_OPTIONS" + SLURPD_OPTIONS="-f $SLAPD_CONF $SLURPD_OPTIONS" +fi + +# Stop processing if the config file is not there +if [ ! -r "$SLAPD_CONF" ]; then + cat <&2 +No configuration file was found for slapd at $SLAPD_CONF. +If you have moved the slapd configuration file please modify +/etc/default/slapd to reflect this. If you chose to not +configure slapd during installation then you need to do so +prior to attempting to start slapd. +An example slapd.conf is in /usr/share/slapd +EOF + exit 0 # Should this be 1? +fi + +# Figure out some default settings +# Check wether slurpd should get started +if [ "$SLURPD_START" != "yes" ] && [ "$SLURPD_START" != "no" ]; then + if grep -q '^replica' "$SLAPD_CONF" > /dev/null 2>&1 ; then + SLURPD_START=yes + else + SLURPD_START=no + fi +fi + +# Find out the name of slapd's pid file +if [ -z "$SLAPD_PIDFILE" ]; then + SLAPD_PIDFILE=`sed -ne 's/^pidfile[[:space:]]\+\(.\+\)/\1/p' \ + "$SLAPD_CONF"` +fi + +# XXX: Breaks upgrading if there is no pidfile (invoke-rc.d stop will fail) +# -- Torsten +if [ -z "$SLAPD_PIDFILE" ]; then + cat <&2 +The pidfile for slapd is neither specified in "$SLAPD_CONF" nor +in /etc/default/slapd. Consequently, slapd will not be started. +EOF + exit 1 +fi + +# Pass the user and group to run under to slapd +if [ "$SLAPD_USER" ]; then + SLAPD_OPTIONS="-u $SLAPD_USER $SLAPD_OPTIONS" +fi + +if [ "$SLAPD_GROUP" ]; then + SLAPD_OPTIONS="-g $SLAPD_GROUP $SLAPD_OPTIONS" +fi + +# Tell the user that something went wrong and give some hints for +# resolving the problem. +report_failure() { + if [ -n "$reason" ]; then + echo " - failed: " + echo "$reason" + else + echo " - failed." + cat </dev/null 2>&1; then + echo -n " ($DB_RECOVER_CMD not found), " + return 0 + fi + + bdb_envs=`find_bdb_envs` + + # We care only about BDB environments + if [ -z "$bdb_envs" ]; then + return 0 + fi + + # Make sure there is no slapcat and no slapd running as we might + # break the DB in that case + if pidof /usr/lib/slapd >/dev/null; then + echo -n " (slapd running, no recovery), " + return 0 + fi + + echo -n " running BDB recovery" + for dbdir in $bdb_envs; do + reason="`$DB_RECOVER_CMD -eh $dbdir 2>&1`" || \ + db_recover_failed $dbdir + done + echo -n "," +} + +# Find bdb environment dirs +find_bdb_envs() { + local d + for d in `sed -ne 's/^directory[[:space:]]\+"*\([^"]\+\).*/\1/p' \ + < "$SLAPD_CONF"`; do + if [ -d "$d" -a -f "$d/objectClass.bdb" ]; then + echo $d + fi + done +} + +# Inform the user that BDB recovery failed +db_recover_failed() { + local dbdir + dbdir="$1" + + reason="`cat <&1`" + else + reason="`start-stop-daemon --start --quiet --oknodo \ + --pidfile "$SLAPD_PIDFILE" \ + --exec /usr/sbin/slapd -- -h "$SLAPD_SERVICES" $SLAPD_OPTIONS 2>&1`" + fi +} + +# Start the slurpd daemon and capture the error message if any to +# $reason. +start_slurpd() { + if [ "$SLURPD_START" != yes ]; then + return 0 + fi + echo -n " slurpd" + reason="`start-stop-daemon --start --quiet --oknodo \ + --exec /usr/sbin/slurpd -- $SLURPD_OPTIONS 2>&1`" +} + +# Stop the slapd daemon and capture the error message (if any) to +# $reason. +stop_slapd() { + echo -n " slapd" + reason="`start-stop-daemon --stop --quiet --oknodo --retry 10 \ + --pidfile "$SLAPD_PIDFILE" \ + --exec /usr/sbin/slapd 2>&1`" +} + +# Stop the slurpd daemon and capture the error message (if any) to +# $reason. +stop_slurpd() { + if [ "$SLURPD_START" != yes ]; then + return 0 + fi + echo -n " slurpd" + reason="`start-stop-daemon --stop --quiet --oknodo --retry 10 \ + --exec /usr/sbin/slurpd 2>&1`" +} + +# Start the OpenLDAP daemons +start() { + echo -n "Starting OpenLDAP:" + trap 'report_failure' 0 + if [ "$TRY_BDB_RECOVERY" = "yes" ]; then + try_fix_db + fi + start_slapd + start_slurpd + trap "-" 0 + echo . +} + +# Stop the OpenLDAP daemons +stop() { + echo -n "Stopping OpenLDAP:" + trap 'report_failure' 0 + stop_slurpd + stop_slapd + trap "-" 0 + echo . +} + +case "$1" in + start) + start ;; + stop) + stop ;; + restart|force-reload) + stop + start + ;; + *) + echo "Usage: $0 {start|stop|restart|force-reload}" + exit 1 + ;; +esac