#!/bin/bash
# puppet        Init script for running the puppet client daemon
#
# Author:       Duane Griffin <d.griffin@psenterprise.com>
#               David Lutterkort <dlutter@redhat.com>
#
# chkconfig: - 98 02
#
# description: Enables periodic system configuration checks through puppet.
# processname: puppet
# config: /etc/sysconfig/puppet

# Source function library.
. /etc/rc.d/init.d/functions

[ -f /etc/sysconfig/puppet ] && . /etc/sysconfig/puppet
lockfile=/var/lock/subsys/puppet
piddir=/var/run/puppetlabs
pidfile="${piddir}/agent.pid"
puppetd=/opt/puppetlabs/puppet/bin/puppet
pid=$(cat "$pidfile" 2> /dev/null)
RETVAL=0

PUPPET_OPTS="agent "

# Determine if we can use the -p option to daemon, killproc, and status.
# RHEL < 5 can't.
if status | grep -q -- '-p' 2>/dev/null; then
    daemonopts="--pidfile $pidfile"
    pidopts="-p $pidfile"
    USEINITFUNCTIONS=true
fi

# Figure out if the system just booted. Let's assume
# boot doesn't take longer than 5 minutes
## Not used for now
##[ -n "$INIT_VERSION" ] && PUPPET_OPTS="${PUPPET_OPTS} --fullrun"

start() {
    echo -n $"Starting puppet agent: "
    mkdir -p $piddir
    daemon $daemonopts $puppetd ${PUPPET_OPTS} ${PUPPET_EXTRA_OPTS}
    RETVAL=$?
    echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}

stop() {
    echo -n $"Stopping puppet agent: "
    if [ "$USEINITFUNCTIONS" = "true" ]; then
      killproc $pidopts $puppetd
      RETVAL=$?
    else
      if [ -n "${pid}" ]; then
        kill -TERM $pid >/dev/null 2>&1
        RETVAL=$?
      fi
    fi
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
    return $RETVAL
}

reload() {
    echo -n $"Reloading puppet agent: "
    if [ "$USEINITFUNCTIONS" = "true" ]; then
      killproc $pidopts $puppetd -HUP
      RETVAL=$?
    else
      if [ -n "${pid}" ]; then
        kill -HUP $pid >/dev/null 2>&1
        RETVAL=$?
      else
        RETVAL=0
      fi
    fi
    echo
    return $RETVAL
}

rotate() {
    echo -n $"Reopening log files for puppet agent: "
    killproc $pidopts $puppetd -USR2
    RETVAL=$?
    echo
    return $RETVAL
}

restart() {
    stop
    start
}

rh_status() {
    base=puppet
    if [ "$USEINITFUNCTIONS" = "true" ]; then
      status $pidopts $puppetd
      RETVAL=$?
      return $RETVAL
    else
      if [ -n "${pid}" ]; then
        if `ps -p $pid | grep $pid > /dev/null 2>&1`; then
          echo "${base} (pid ${pid}) is running..."
          RETVAL=0
          return $RETVAL
        fi
      fi
      if [ -f "${pidfile}" ] ; then
        echo "${base} dead but pid file exists"
        RETVAL=1
        return $RETVAL
      fi
      if [ -f "${lockfile}" ]; then
        echo "${base} dead but subsys locked"
        RETVAL=2
        return $RETVAL
      fi
      echo "${base} is stopped"
      RETVAL=3
      return $RETVAL
    fi
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

genconfig() {
    echo -n $"Generate puppet agent configuration: "
    $puppetd ${PUPPET_OPTS} ${PUPPET_EXTRA_OPTS} --genconfig
}

case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        restart
    ;;
    rotate)
        rotate
    ;;
    reload|force-reload)
        reload
    ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        restart
    ;;
    status)
        rh_status
    ;;
    once)
        shift
        $puppetd ${PUPPET_OPTS} --onetime ${PUPPET_EXTRA_OPTS} $@
        ;;
    genconfig)
        genconfig
    ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|rotate|once|genconfig}"
        exit 1
esac

exit $RETVAL
