diff --git a/salt-minion b/salt-minion index 06d5f0b..b0898a4 100644 --- a/salt-minion +++ b/salt-minion @@ -24,301 +24,133 @@ # # processname: /usr/bin/salt-minion -# Allow these to be overridden for tests -: "${SALTMINION_BINDIR:=/usr/bin}" -: "${SALTMINION_SYSCONFDIR:=/etc}" -# Default values (can be overridden in settings file) -: "${USER:=$(id -nu)}" -SALTMINION="${SALTMINION_BINDIR}/salt-minion" -SALTCALL="${SALTMINION_BINDIR}/salt-call" -# SALTMINION_CONFIGS are newline-separated entries of: MINION_USER CONFIG_DIR -: "${SALTMINION_CONFIGS:=" -$USER ${SALTMINION_SYSCONFDIR}/salt -"}" -SALTMINION_ARGS="" -SALTMINION_TIMEOUT=30 -SALTMINION_TICK=1 - -SERVICE="salt-minion" - -# Read in settings file -if [ -f "${SALTMINION_SYSCONFDIR}/default/salt" ]; then - . "${SALTMINION_SYSCONFDIR}/default/salt" -elif [ -f "${SALTMINION_SYSCONFDIR}/sysconfig/salt" ]; then - . "${SALTMINION_SYSCONFDIR}/sysconfig/salt" +DEBIAN_VERSION=/etc/debian_version +SUSE_RELEASE=/etc/SuSE-release +# Source function library. +if [ -f $DEBIAN_VERSION ]; then + break +elif [ -f $SUSE_RELEASE -a -r /etc/rc.status ]; then + . /etc/rc.status +else + . /etc/rc.d/init.d/functions fi -RETVAL=0 -NS_NOTRIM="--notrim" -ERROR_TO_DEVNULL="/dev/null" - - -_su_cmd() { - local user="$1" - shift - - if [ "X$USER" = "X$user" ]; then - eval $1 - else - su -l -c "$1" "$user" - fi -} - - -_get_pid() { - netstat $NS_NOTRIM -ap --protocol=unix 2>$ERROR_TO_DEVNULL \ - | sed -r -e "\|\s${SOCK_DIR}/minion_event_${MINION_ID_HASH}_pub\.ipc$|"'!d; s|/.*||; s/.*\s//;' \ - | uniq -} - - -_is_running() { - [ -n "$(_get_pid)" ] -} - - -_get_salt_config_value() { - _su_cmd \ - "$MINION_USER" \ - "\ - \"$SALTCALL\" \ - -c \"$CONFIG_DIR\" \ - --no-color \ - --local config.get \ - \"$1\" \ - " \ - 2>$ERROR_TO_DEVNULL \ - | sed -r -e '2!d; s/^\s*//;' -} - +# Default values (can be overridden below) +SALTMINION=/usr/bin/salt-minion +PYTHON=/usr/bin/python +MINION_ARGS="" -_make_id_hash() { - # $1 - minion_id - local hasher='' +if [ -f /etc/default/salt ]; then + . /etc/default/salt +fi - case "$(_get_salt_config_value hash_type)" in - (md5) hasher="md5sum";; - (sha1) hasher="sha1sum";; - (sha224) hasher="sha224sum";; - (sha256) hasher="sha256sum";; - (sha384) hasher="sha384sum";; - (sha512) hasher="sha512sum";; - (*) echo "ERROR: No salt hash_type specified";; - esac - - if [ -n "$hasher" ]; then - printf "$1" | "$hasher" | cut -c 1-10 - fi -} +SERVICE=salt-minion +PROCESS=salt-minion +RETVAL=0 start() { - # $1 - config dir - local retval=0 - - if _is_running; then - echo "Service $SERVICE:$MINION_USER:$MINION_ID already running" - return 0 - fi - - echo -n "Starting $SERVICE:$MINION_USER:$MINION_ID daemon: " - - _su_cmd \ - "$MINION_USER" \ - "\ - \"$SALTMINION\" \ - -c \"$CONFIG_DIR\" \ - -d $SALTMINION_ARGS \ - ${SALTMINION_DEBUG:+-l debug} \ - " \ - 2>$ERROR_TO_DEVNULL \ - || retval=$? - - if [ 0 -eq "$retval" ]; then - local endtime=$(($(date '+%s')+$SALTMINION_TIMEOUT)) - while ! _is_running; do - if [ "$endtime" -lt "$(date '+%s')" ]; then - echo -n "TIMEOUT " - retval=1 - break - fi - sleep $SALTMINION_TICK - done - fi - - if [ 0 -eq "$retval" ]; then - echo -n "OK" + echo -n $"Starting salt-minion daemon: " + if [ -f $SUSE_RELEASE ]; then + startproc -f -p /var/run/$SERVICE.pid $SALTMINION -d $MINION_ARGS + rc_status -v + elif [ -e $DEBIAN_VERSION ]; then + if [ -f $LOCKFILE ]; then + echo -n "already started, lock file found" + RETVAL=1 + elif $PYTHON $SALTMINION -d $MINION_ARGS >& /dev/null; then + echo -n "OK" + RETVAL=0 + fi else - echo -n "FAIL" - if [ -n "$SALTMINION_DEBUG" ]; then - printf "\nPROCESSES:\n" >&2 - ps wwwaxu | grep '[s]alt-minion' >&2 - printf "\nSOCKETS:\n" >&2 - netstat $NS_NOTRIM -ap --protocol=unix | grep 'salt.*minion' >&2 - printf "\nLOG_FILE:\n" >&2 - tail -n 20 "$LOG_FILE" >&2 - printf "\nENVIRONMENT:\n" >&2 - env >&2 + if [[ ! -z "$(pidofproc -p /var/run/$SERVICE.pid $PROCESS)" ]]; then + RETVAL=$? + echo -n "already running" + else + daemon --check $SERVICE $SALTMINION -d $MINION_ARGS + RETVAL=$? + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SERVICE + echo + return $RETVAL fi fi + RETVAL=$? echo - - return $retval + return $RETVAL } - stop() { - # $1 - config dir - local retval=0 - - if ! _is_running; then - echo "Service $SERVICE:$MINION_USER:$MINION_ID is not running" - return 0 - fi - - echo -n "Stopping $SERVICE:$MINION_USER:$MINION_ID daemon: " - local pid="$(_get_pid)" - - # pid below is intentionally not quoted in case there are *multiple* - # minions running with the same configuration. - _su_cmd "$MINION_USER" "kill -TERM $pid 2>/dev/null" || retval=$? - if [ 0 -eq "$retval" ]; then - local endtime=$(($(date '+%s')+$SALTMINION_TIMEOUT)) - while _is_running; do - if [ "$endtime" -lt "$(date '+%s')" ]; then - # Try one more time with a big hammer - _su_cmd "$MINION_USER" "kill -KILL $pid 2>/dev/null" || : - sleep $SALTMINION_TICK - if _is_running; then - echo -n "TIMEOUT " - retval=1 - fi - break - fi - sleep 1 - done - - fi - - if [ 0 -eq "$retval" ]; then - rm -f "$PID_FILE" - echo -n "OK" - else - echo -n "FAIL" - fi - - echo - - return $retval -} - - -status() { - local retval=0 - local pid="$(_get_pid)" - - if [ -n "$pid" ]; then - # Unquote $pid here to display multiple PIDs in one line - echo "$SERVICE:$MINION_USER:$MINION_ID is running:" $pid + echo -n $"Stopping salt-minion daemon: " + if [ -f $SUSE_RELEASE ]; then + killproc -TERM $SALTMINION + rc_status -v + RETVAL=$? + elif [ -f $DEBIAN_VERSION ]; then + # Added this since Debian's start-stop-daemon doesn't support spawned processes + if ps -ef | grep "$PYTHON $SALTMINION" | grep -v grep | awk '{print $2}' | xargs kill &> /dev/null; then + echo -n "OK" + RETVAL=0 + else + echo -n "Daemon is not started" + RETVAL=1 + fi else - retval=3 - echo "$SERVICE:$MINION_USER:$MINION_ID is stopped." - if [ -e "$PID_FILE" ]; then - echo "$SERVICE:$MINION_USER:$MINION_ID has orphaned pid file: $PID_FILE." - retval=1 + killproc $PROCESS + RETVAL=$? + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$SERVICE + # tidy up any rogue processes: + PROCS=`ps -ef | grep "$SALTMINION" | grep -v grep | awk '{print $2}'` + if [ -n "$PROCS" ]; then + kill $PROCS &> /dev/null + sleep 1 + PROCS=`ps -ef | grep "$SALTMINION" | grep -v grep | awk '{print $2}'` + if [ -n "$PROCS" ]; then + kill -9 $PROCS &> /dev/null + fi fi fi - return $retval + echo } restart() { - # $1 - config dir - stop "$1" - start "$1" + stop + start } - -main() { - if [ -n "$SALTMINION_DEBUG" ]; then - set -x - ERROR_TO_DEVNULL="&2" - fi - - # Check to see if --notrim is a valid netstat option - if netstat --notrim 2>&1 >/dev/null | grep -q 'unrecognized'; then - NS_NOTRIM='' - fi - - # Pre-filter for unhandled commands - case "$1" in - (start|stop|status|restart|condrestart|try-restart) ;; - (reload) - echo "Can't reload $SERVICE - you must restart it" - exit 3 - ;; - (*) - echo "Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload}" - exit 2 - ;; - esac - - while read MINION_USER CONFIG_DIR; do - if [ -z "$CONFIG_DIR" ]; then - continue - fi - - if ! [ -d "$CONFIG_DIR" ]; then - echo "ERROR: non-existent $SERVICE config directory: $CONFIG_DIR" - RETVAL=1 - continue - fi - - SOCK_DIR="$(_get_salt_config_value sock_dir)" - PID_FILE="$(_get_salt_config_value pidfile)" - LOG_FILE="$(_get_salt_config_value log_file)" - MINION_ID="$(_get_salt_config_value id)" - MINION_ID_HASH="$(_make_id_hash "$MINION_ID")" - if [ \ - -z "$SOCK_DIR" \ - -o -z "$PID_FILE" \ - -o -z "$LOG_FILE" \ - -o -z "$MINION_ID" \ - -o -z "$MINION_ID_HASH" \ - ]; then - echo "ERROR: Unable to look-up config values for $CONFIG_DIR" - RETVAL=1 - continue +# See how we were called. +case "$1" in + start|stop|restart) + $1 + ;; + status) + if [ -f $SUSE_RELEASE ]; then + echo -n "Checking for service salt-minion " + checkproc $SALTMINION + rc_status -v + elif [ -f $DEBIAN_VERSION ]; then + if [ -f $LOCKFILE ]; then + RETVAL=0 + echo "salt-minion is running." + else + RETVAL=1 + echo "salt-minion is stopped." + fi + else + status $PROCESS + RETVAL=$? fi - - # See how we were called. - case "$1" in - (start|stop|restart|status) - "$1" || RETVAL=$? - ;; - (condrestart|try-restart) - if ! _is_running; then - RETVAL=7 - else - stop - start || RETVAL=$? - fi - ;; - (*) - echo "Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload}" - RETVAL=2 - ;; - esac - done <