Blob Blame History Raw
#! /bin/sh
#
# globus-scheduler-event-generator - Globus Scheduler Event Generator
#
# chkconfig:         - 20 80
# description:       Parse LRM events into a common log format \
#                    for the GRAM job manager to use

### BEGIN INIT INFO
# Provides:          globus-scheduler-event-generator
# Required-Start:    $remote_fs $time
# Required-Stop:     $remote_fs
# Default-Stop:      0 1 2 3 4 5 6
# Short-Description: Globus Scheduler Event Generator
# Description:       The Globus Scheduler Event Generator service 
#                    process state from local resource managers (such as
#                    torque or SGE) into a form that the globus-job-manager
#                    process can easily parse.
#                    It is part of the Globus Toolkit(tm)
### END INIT INFO

# Copyright 1999-2011 University of Chicago
# 
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
# http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

sbindir=/usr/sbin
localstatedir=/var
sysconfdir=/etc
progname=globus-scheduler-event-generator
prog=${sbindir}/${progname}

test -f /etc/sysconfig/${progname} && . /etc/sysconfig/${progname}

test -f ${prog} || exit 0

lockfile=/run/lock/subsys/${progname}

GLOBUS_SEG_LRM_DIR="${GLOBUS_SEG_LRM_DIR:-/etc/globus/scheduler-event-generator}"

full=1
if [ -n "$2" ]; then
    full=0
fi
for lrm in "${GLOBUS_SEG_LRM_DIR}"/*; do
    if [ -n "$2" -a "$(basename "$lrm")" != "$2" ]; then
        continue
    fi
    if [ -f "$lrm" ]; then
        lrms="${lrms:+$lrms }$(basename $lrm)"
    fi
done

GLOBUS_SEG_PIDFMT="${GLOBUS_SEG_PIDFMT:-/run/${progname}-%s.pid}"
GLOBUS_SEG_LOGFMT="${GLOBUS_SEG_LOGFMT:-/var/lib/globus/globus-seg-%s}"

start()
{
    allrc=0
    started=""
    failed=""
    for lrm in $lrms; do
        pidfile="$(printf "$GLOBUS_SEG_PIDFMT" "$lrm")"
        logdir="$(printf "$GLOBUS_SEG_LOGFMT" "$lrm")"

        status $lrm > /dev/null
        rc=$?
        if [ $rc -eq 0 ]; then
            continue
        fi

        if [ ! -d "$logdir" ]; then
            (umask 022; mkdir "$logdir")
        fi
        ${GLOBUS_SEG_NICE_LEVEL:+nice -n "${GLOBUS_SEG_NICE_LEVEL}"} \
            "${prog}" \
            -s "$lrm" \
            -p "$pidfile" \
            -d "$logdir" \
            -b > /dev/null
        rc=$?
        if [ $rc = 0 ]; then
            started="${started:+${started}, }$lrm"
        else
            failed="${failed:+${failed}, }$lrm"
            allrc=$rc
        fi
    done
    if [ "$allrc" -eq 0 -a "$lrms" != "" ]; then
        echo "Started ${progname}${started:+ for ($started)}"
        touch "$lockfile"
    elif [ "$allrc" -eq 0 ]; then
        echo "$progname: no LRMS installed"
    elif [ "$started" = "" ]; then
        echo "Failed to start ${progname} for ($failed)"
    else
        echo "Some problems starting ${progname} for ($failed), but ($started) were ok"
        touch "$lockfile"
    fi
    return $allrc
}

stop()
{
    allrc=0
    stopped=""
    failed=""
    for lrm in $lrms; do
        pidfile="$(printf "$GLOBUS_SEG_PIDFMT" "$lrm")"
        logdir="$(printf "$GLOBUS_SEG_LOGFMT" "$lrm")"

        if [ -f "$pidfile" ]; then
            read pid < "${pidfile}" 2> /dev/null
            if [ "$pid" -gt 0 ] 2>/dev/null; then
                if kill -0 "${pid}" 2> /dev/null; then
                    kill -TERM "${pid}"
                    if sleep 1 && kill -0 "${pid}" 2>/dev/null &&  \
                        sleep 3 && kill -0 "${pid}" 2>/dev/null; then
                        kill -KILL "${pid}"
                    fi

                    if kill -0 "${pid}" 2> /dev/null; then
                        failed="${failed:+$failed, }$lrm"
                        allrc=1
                        continue
                    fi
                fi
            fi
            stopped="${stopped:+${stopped}, }$lrm"
            rm -f "${pidfile}"
        fi
    done
    if [ "$allrc" -eq 0 ]; then
        echo "Stopped ${progname}${stopped:+ for ($stopped)}"
        if [ "$full" -eq 1 ]; then
            rm -f "$lockfile"
        fi
    elif [ "$stopped" = "" ]; then
        echo "Failed to stop ${progname} for $failed"
    else
        echo "Some problems stopping ${progname} for $failed, but $stopped were ok"
    fi
    return $allrc
}

restart()
{
    stop
    start
}

status()
{
    _lrms="$1"
    running=0
    stale=0
    nopidfile=0

    if [ "$_lrms" = "" ]; then
        _lrms="$lrms"
    fi
    for lrm in $_lrms; do
        pidfile="$(printf "$GLOBUS_SEG_PIDFMT" "$lrm")"
        if [ -f "$pidfile" ]; then
            read pid < "$pidfile" 2>/dev/null
            if [ "$pid" -gt 0 ] 2>/dev/null; then
                if ps -p "$pid" > /dev/null; then
                    echo "$progname ($lrm) is running (pid=$pid)"
                    running=1
                else
                    echo "Stale PID file for $progname ($lrm)"
                    stale=1
                fi
            fi
        else
            echo "$progname ($lrm) is not running"
        fi
    done

    if [ "$stale" -ne 0 ]; then
        return 1
    fi
    if [ "$running" -eq 0 -a "$stale" -eq 0 -a "${lrms}" != "" -a -f "${lockfile}" ]; then
        echo "Stale lock file for $progname"
        return 2
    fi

    if [ "$running" -eq 1 ]; then
        return 0
    else
        echo "$progname not running, no LRMs installed"
        return 3
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    reload)
        exit 0
        ;;
    force-reload)
        restart
        ;;
    status)
        status
        ;;
    condrestart|try-restart)
        status || exit 0
        restart
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
        ;;
esac