#! /bin/bash # # BDII system startup script # $Id: bdii,v 1.9 2009/06/18 14:26:52 lfield Exp $ # chkconfig: - 95 5 # description: BDII Service # config: /etc/bdii/bdii.conf ### BEGIN INIT INFO # Provides: bdii # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Stop: 0 1 2 3 4 5 6 # Short-Description: BDII # Description: Berkeley Database Information Index ### END INIT INFO shopt -s expand_aliases if [ -f /etc/init.d/functions ]; then . /etc/init.d/functions else echo "Error: Cannot source /etc/init.d/functions" fi log_success_msg () { success echo } log_failure_msg() { failure echo } prog=bdii # Debian does not have /var/lock/subsys if [ -d /var/lock/subsys ] ; then LOCK_DIR=/var/lock/subsys else LOCK_DIR=/var/lock fi lockfile=${LOCK_DIR}/$prog RUN=yes if [ -r /etc/default/bdii ] ; then . /etc/default/bdii fi if [ -r /etc/sysconfig/bdii ] ; then . /etc/sysconfig/bdii fi if [ "x$RUN" != "xyes" ] ; then echo "bdii disabled, please adjust the configuration to your needs " echo "and then set RUN to 'yes' in /etc/default/bdii to enable it." exit 0 fi BDII_CONF=${BDII_CONF:-/etc/bdii/bdii.conf} if [ -f "${BDII_CONF}" ]; then . "${BDII_CONF}" fi UPDATE_LOCK_FILE=${UPDATE_LOCK_FILE:-${LOCK_DIR}/bdii-update} SLAPD_LOCK_FILE=${SLAPD_LOCK_FILE:-${LOCK_DIR}/bdii-slapd} UPDATE_PID_FILE=${BDII_PID_FILE:-/var/run/bdii/bdii-update.pid} BDII_USER=${BDII_USER:-ldap} BDII_VAR_DIR=${BDII_VAR_DIR:-/var/lib/bdii} BDII_UPDATE=${BDII_UPDATE:-/usr/sbin/bdii-update} SLAPD=${SLAPD:-/usr/sbin/slapd} SLAPD_CONF=${SLAPD_CONF:-/etc/bdii/bdii-slapd.conf} SLAPD_HOST=${SLAPD_HOST:-0.0.0.0} SLAPD_PORT=${SLAPD_PORT:-2170} SLAPD_DB_DIR=${SLAPD_DB_DIR:-$BDII_VAR_DIR/db} SLAPD_PID_FILE=${SLAPD_PID_FILE:-/var/run/bdii/db/slapd.pid} DB_CONFIG=${DB_CONFIG:-/etc/bdii/DB_CONFIG} if [ -x /sbin/runuser ] ; then RUNUSER=runuser else RUNUSER=su fi function start(){ # Check status if [ -f "${SLAPD_LOCK_FILE}" ] || [ -f "${UPDATE_LOCK_FILE}" ] ; then echo -n "Starting BDII: " result=$($0 status) if [ $? -gt 0 ]; then echo ${result} 1>&2 exit 1 else echo "BDII already started" exit 0 fi fi # Create RAM Disk if [ "${BDII_RAM_DISK}" = "yes" ]; then mount -t tmpfs -o size=1500M,mode=0744 tmpfs ${SLAPD_DB_DIR} fi #Initialize the database directory. mkdir -p ${SLAPD_DB_DIR}/stats mkdir -p ${SLAPD_DB_DIR}/glue2 chown -R ${BDII_USER}:${BDII_USER} ${SLAPD_DB_DIR} [ -x /sbin/restorecon ] && /sbin/restorecon -R ${SLAPD_DB_DIR} mkdir -p ${BDII_VAR_DIR}/archive chown -R ${BDII_USER}:${BDII_USER} ${BDII_VAR_DIR} mkdir -p /var/run/bdii/db chown -R ${BDII_USER}:${BDII_USER} /var/run/bdii [ -x /sbin/restorecon ] && /sbin/restorecon -R /var/run/bdii/db $RUNUSER -s /bin/sh ${BDII_USER} -c "rm -f ${SLAPD_DB_DIR}/stats/* 2>/dev/null" $RUNUSER -s /bin/sh ${BDII_USER} -c "rm -f ${SLAPD_DB_DIR}/glue2/* 2>/dev/null" $RUNUSER -s /bin/sh ${BDII_USER} -c "rm -f ${SLAPD_DB_DIR}/* 2>/dev/null" $RUNUSER -s /bin/sh ${BDII_USER} -c "rm -f ${BDII_VAR_DIR}/old.ldif 2>/dev/null" $RUNUSER -s /bin/sh ${BDII_USER} -c "cp ${DB_CONFIG} ${SLAPD_DB_DIR}" $RUNUSER -s /bin/sh ${BDII_USER} -c "cp ${DB_CONFIG} ${SLAPD_DB_DIR}/stats" $RUNUSER -s /bin/sh ${BDII_USER} -c "cp ${DB_CONFIG} ${SLAPD_DB_DIR}/glue2" echo -n "Starting BDII slapd: " COMMAND="${SLAPD} -f ${SLAPD_CONF} -h ldap://${SLAPD_HOST}:${SLAPD_PORT} -u ${BDII_USER}" ${COMMAND} touch ${SLAPD_LOCK_FILE} if [ ! -f "${SLAPD_PID_FILE}" ]; then sleep 2 fi if [ -f "${SLAPD_PID_FILE}" ]; then ps $(cat ${SLAPD_PID_FILE}) >/dev/null 2>&1 RETVAL=$? else RETVAL=1 fi if [ ${RETVAL} -gt 0 ]; then echo -n "BDII slapd failed to start" 1>&2 rm -f ${SLAPD_LOCK_FILE} eval log_failure_msg echo "${COMMAND} -d 256" ${COMMAND} -d 256 return 1 else eval log_success_msg fi export SLAPD_CONF=${SLAPD_CONF} $RUNUSER -s /bin/sh ${BDII_USER} -c "${BDII_UPDATE} -c ${BDII_CONF} -d" touch ${UPDATE_LOCK_FILE} if [ ! -f ${UPDATE_PID_FILE} ]; then sleep 2 fi if [ -f ${UPDATE_PID_FILE} ]; then ps $(cat ${UPDATE_PID_FILE}) >/dev/null 2>&1 RETVAL=$? else RETVAL=1 fi echo -n "Starting BDII update process: " if [ ${RETVAL} -gt 0 ]; then echo -n "BDII update process failed to start" 1>&2 rm -f ${UPDATE_LOCK_FILE} eval log_failure_msg return 1 else eval log_success_msg touch $lockfile return 0 fi } function stop(){ # Check the existance of the lock file if [ ! -f "${SLAPD_LOCK_FILE}" ] && [ ! -f "${UPDATE_LOCK_FILE}" ]; then echo -n "Stopping BDII: " result=$($0 status) if [ $? -gt 0 -a $? -ne 3 ]; then echo ${result} 1>&2 return 1 else echo "BDII already stopped" return 0 fi fi RETVAL=0 echo -n "Stopping BDII update process: " if [ -f "${UPDATE_PID_FILE}" ]; then UPDATE_PID=$(cat ${UPDATE_PID_FILE}) fi $RUNUSER -s /bin/sh ${BDII_USER} -c "kill -15 ${UPDATE_PID} 2>/dev/null" if [ -n "${UPDATE_PID}" ]; then ps ${UPDATE_PID} >/dev/null 2>&1 if [ $? = 0 ]; then sleep 2 ps ${UPDATE_PID} >/dev/null 2>&1 if [ $? = 0 ]; then $RUNUSER -s /bin/sh ${BDII_USER} -c "kill -9 ${UPDATE_PID} 2>/dev/null" sleep 2 ps ${UPDATE_PID} >/dev/null 2>&1 if [ $? = 0 ]; then echo -n "Could not kill BDII update process ${UPDATE_PID}" 1>&2 RETVAL=1 fi fi fi fi if [ ${RETVAL} = 0 ]; then rm -f ${UPDATE_PID_FILE} rm -f ${UPDATE_LOCK_FILE} eval log_success_msg else eval log_failure_msg fi echo -n "Stopping BDII slapd: " if [ -f "${SLAPD_PID_FILE}" ]; then SLAPD_PID=$(cat ${SLAPD_PID_FILE}) fi $RUNUSER -s /bin/sh ${BDII_USER} -c "kill -15 ${SLAPD_PID} 2>/dev/null" if [ -n "${SLAPD_PID}" ]; then ps ${SLAPD_PID} >/dev/null 2>&1 if [ $? = 0 ]; then sleep 2 ps ${SLAPD_PID} >/dev/null 2>&1 if [ $? = 0 ]; then $RUNUSER -s /bin/sh ${BDII_USER} -c "kill -9 ${SLAPD_PID} 2>/dev/null" sleep 2 ps ${SLAPD_PID} >/dev/null 2>&1 if [ $? = 0 ]; then echo -n "Could not kill BDII slapd process ${SLAPD_PID}" 1>&2 RETVAL=2 else rm -f {SLAPD_PID_FILE} fi fi fi fi if [ ${RETVAL} = 2 ]; then eval log_failure_msg else rm -f ${SLAPD_LOCK_FILE} eval log_success_msg fi if [ ! ${RETVAL} = 0 ]; then return 1 else mountpoint -q ${SLAPD_DB_DIR} && umount ${SLAPD_DB_DIR} rm -f $lockfile return 0 fi } function status(){ if [ ! -f "${SLAPD_LOCK_FILE}" ] && [ ! -f "${UPDATE_LOCK_FILE}" ]; then echo -n "BDII Stopped" eval log_success_msg return 3 fi if [ -f ${SLAPD_PID_FILE} ]; then ps $(cat ${SLAPD_PID_FILE}) >/dev/null 2>&1 if [ ! $? = 0 ]; then echo -n "BDII slapd PID file exists but the process died" 1>&2 eval log_failure_msg return 1 fi else echo -n "BDII slapd PID file ${SLAPD_PID_FILE} does not exist" 1>&2 eval log_failure_msg return 1 fi if [ -f ${UPDATE_PID_FILE} ]; then ps $(cat ${UPDATE_PID_FILE}) >/dev/null 2>&1 if [ ! $? = 0 ]; then echo -n "BDII update process died" 1>&2 eval log_failure_msg return 1 fi else echo -n "BDII update process failed to start" 1>&2 eval log_failure_msg return 1 fi # Check for hanging process response=$(ldapsearch -LLL -x -h ${SLAPD_HOST} -p ${SLAPD_PORT} -b o=infosys objectClass=UpdateStats modifyTimestamp 2>/dev/null | grep modifyTimestamp ) if [ $? -eq 0 ]; then time_stamp=$(echo ${response} | cut -d" " -f2) time_string=$(echo ${time_stamp} | sed 's/^\([0-9][0-9][0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\).*/\1-\2-\3 \4:\5/') time_int=$(date --utc --date "${time_string}" +%s) let time_threshold=${time_int}+1200 time_now=$(date --utc +%s) if [ ${time_now} -gt ${time_threshold} ]; then echo -n "BDII update process hanging" 1>&2 eval log_failure_msg return 1 fi fi echo -n "BDII Runnning " eval log_success_msg return 0 } case "$1" in start) start RETVAL=$? ;; stop) stop RETVAL=$? ;; status) status RETVAL=$? ;; reload) ;; restart | force-reload) stop start RETVAL=$? ;; condrestart | try-restart) if [ -f ${SLAPD_LOCK_FILE} ] || [ -f ${UPDATE_LOCK_FILE} ]; then stop start RETVAL=$? fi ;; *) echo $"Usage: $0 {start|stop|restart|status|condrestart}" RETVAL=1 esac exit ${RETVAL}