#! /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:-@prefix@}"
exec_prefix="@exec_prefix@";
sbindir="@sbindir@";
bindir="@bindir@";
datarootdir="@datarootdir@";
datadir="@datadir@";
libexecdir="@libexecdir@";
sysconfdir="@sysconfdir@";
sharedstatedir="@sharedstatedir@";
localstatedir="@localstatedir@";

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

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

while getopts "e:d:En: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 "$sysconfdir/grid-services/available/$OPTARG" ]; then
                echo "Service \"$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"
            ;;
        E)
            enable=""
            if [ -f "${sysconfdir}/grid-services/available/jobmanager" ]; then
                enable=jobmanager
            else
                for f in "${sysconfdir}/grid-services/available/jobmanager"*; do
                    if [ -f "$f" ]; then
                        enable="$(basename "$f")"
                        break
                    fi
                done
            fi
            if [ "$enable" = "" ]; then
                echo "No available jobmanager services to enable" 1>&2
                exit 1
            fi
            if [ "$enable" != "jobmanager" ];then
                name=jobmanager
            fi

            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 "$sysconfdir/grid-services/$OPTARG" ]; then
                echo "Service \"$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 "  -E                          Enable default jobmanager service"
            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" "$sysconfdir/grid-services/${enable}"
        if [ -n "${name}" ]; then
            ln -sf "$enable" "$sysconfdir/grid-services/${name}"
        fi
        rc=$?
        ;;
    -d)
        for service in "$sysconfdir"/grid-services/*; do
            if [ -f "$service" -o -L "$service" ]; then
                linkname="$(dealias "$service")"
                if [ "$linkname" = "$(basename "${disable}")" ]; then
                    rm "$service"
                fi
            fi
        done
        rm "$sysconfdir/grid-services/${disable}"
        rc=$?
        ;;
    -l)
        if [ -z "$name" ]; then
            enabled=""
            for service in "${sysconfdir}"/grid-services/available/*; do
                if [ -f "$service" ]; then
                    service_name="$(basename "$service")"
                    enabled="${enabled:+"$enabled "}$service_name"
                    if [ -h "$sysconfdir/grid-services/$service_name" ]; then
                        echo "$service_name [ENABLED]"
                    else
                        echo "$service_name [DISABLED]"
                    fi
                fi
            done
            for service in "${sysconfdir}"/grid-services/*; 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 "${sysconfdir}/grid-services/$name" ]; then
                linkname="$(dealias "/etc/grid-services/$name")"

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