#!/usr/bin/sh
# 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.

prefix="${GLOBUS_LOCATION-/usr}"
exec_prefix="/usr"
sbindir="/usr/sbin"
datarootdir="${prefix}/share"
datadir="/usr/share"
libexecdir="/usr/share/globus"
sysconfdir="/etc"
sharedstatedir="/var/lib"
localstatedir="/var"

PATH=${sbindir}:${PATH}
GLOBUS_SEG_CONFIG=${GLOBUS_SEG_CONFIG:-/etc/sysconfig/globus-scheduler-event-generator}
test -f "${GLOBUS_SEG_CONFIG}" && . "${GLOBUS_SEG_CONFIG}"

# Keep in sync with init script
GLOBUS_SEG_PIDFMT="${GLOBUS_SEG_PIDFMT:-${localstatedir}/run/globus-scheduler-event-generator-%s.pid}"
GLOBUS_SEG_LRM_DIR="${GLOBUS_SEG_LRM_DIR:-${sysconfdir}/globus/scheduler-event-generator}"

enable=""
disable=""
name=""

dealias()
{
    expr "$(ls -l "$1")" : ".* -> \(.*\)"
}

while getopts "e:d:n:lh" arg; do
    case $arg in
        e)
            if expr "$OPTARG" : "[^/]*/.*" > /dev/null 2>&1; then
                echo "Illegal service name \"$OPTARG\"" 1>&2
                exit 1
            fi
            if [ ! -f "$GLOBUS_SEG_LRM_DIR/available/$OPTARG" ]; then
                echo "SEG module \"$OPTARG\" does not exist" 1>&2
                exit 1
            fi
            enable="$OPTARG"
            if [ -n "$mode" ]; then
                echo "Duplicate or incompatible options: $mode and -e" 1>&2
                exit 1
            fi
            mode="-e"
            ;;
        d)
            if expr "$OPTARG" : "[^/]*/.*" > /dev/null 2>&1; then
                echo "Illegal service name \"$OPTARG\"" 1>&2
                exit 1
            fi
            if [ ! -L "$GLOBUS_SEG_LRM_DIR/$OPTARG" ]; then
                echo "SEG module \"$OPTARG\" is not enabled" 1>&2
                exit 1
            fi
            disable="$OPTARG"
            if [ -n "$mode" ]; then
                echo "Duplicate or incompatible options: $mode and -d" 1>&2
                exit 1
            fi
            mode="-d"
            ;;
        n)
            if expr "$OPTARG" : "[^/]*/.*" > /dev/null 2>&1; then
                echo "Illegal service name \"$OPTARG\"" 1>&2
                exit 1
            fi
            name="$OPTARG"
            ;;
        l)
            if [ -n "$mode" ]; then
                echo "Duplicate or incompatible options: $mode and -l" 1>&2
                exit 1
            fi
            mode="-l"
            ;;
        h)
            echo "Usage: $(basename $0) OPTIONS"
            echo "  -e SERVICE                  Enable SERVICE"
            echo "  -d SERVICE                  Disable SERVICE"
            echo "  -n NAME                     Service name"
            echo "  -l                          List services"
            echo "  -h                          Print this help and exit"
            exit 0
            ;;
        *)
            echo "$(basename $0): illegal option: $arg"
            echo "Usage: $(basename $0): [-e SERVICE] [-d SERVICE] [-l] [-h]"
            exit 1
            ;;
    esac
done

if [ -z "$mode" ]; then
    echo "Usage: $(basename $0): [-e SERVICE] [-d SERVICE] [-l] [-h]"
    exit 1
fi

rc=0
case $mode in
    -e)
        ln -sf "available/$enable" "$GLOBUS_SEG_LRM_DIR/${enable}"
        if [ -n "${name}" ]; then
            ln -sf "$enable" "$GLOBUS_SEG_LRM_DIR/${name}"
        fi
        rc=$?
        ;;
    -d)
        for service in "$GLOBUS_SEG_LRM_DIR"/*; do
            if [ -f "$service" -o -L "$service" ]; then
                linkname="$(dealias "$service")"
                pidfile="$(printf "$GLOBUS_SEG_PIDFMT" "$(basename "$service")")"
                kill $(cat $pidfile)
                if [ "$linkname" = "$(basename "${disable}")" ]; then
                    rm "$service"
                fi
            fi
        done
        rm "$GLOBUS_SEG_LRM_DIR/${disable}"
        rc=$?
        ;;
    -l)
        if [ -z "$name" ]; then
            enabled=""
            for service in "${GLOBUS_SEG_LRM_DIR}/available/"*; do
                if [ -f "$service" ]; then
                    service_name="$(basename "$service")"
                    enabled="${enabled:+"$enabled "}$service_name"
                    if [ -h "${GLOBUS_SEG_LRM_DIR}/$service_name" ]; then
                        echo "$service_name [ENABLED]"
                    else
                        echo "$service_name [DISABLED]"
                    fi
                fi
            done
            for service in "${GLOBUS_SEG_LRM_DIR}/"*; do
                if [ -f "$service" ]; then
                    service_name="$(basename "$service")"
                    found=0
                    for i in $enabled; do
                        if [ "$i" = "$service_name" ]; then
                            found=1
                        fi
                    done
                    if [ "$found" -eq 0 ]; then
                        linkname="$(dealias "$service")"

                        echo "$service_name [ALIAS to $(basename "$linkname")]"
                    fi
                fi
            done
        else
            if [ -f "${GLOBUS_SEG_LRM_DIR}/$name" ]; then
                linkname="$(dealias "/etc/globus/seg/$name")"

                if [ "$(basename "$linkname")" != "$name" ]; then
                    echo "$name [ALIAS to $(basename "$linkname")]"
                else
                    echo "$name [ENABLED]"
                fi
            elif [ -f "${GLOBUS_SEG_LRM_DIR}/available/$name" ]; then
                echo "$name [DISABLED]"
            else
                echo "$name does not exist" 1>&2
                rc=1
            fi
        fi
        ;;
esac
exit $rc
