#!/bin/bash

# Generated at Wed Nov  7 21:29:43 CET 2012 - Do not edit!
# template: /DB/HOME/nerces/SISMO/SEISCOMP/seiscomp-2.6/templates/seiscomp.tpl

export SEISCOMP_ROOT="/DB/HOME/nerces/SISMO/SEISCOMP/seiscomp-2.6"

if [ "$SEISCOMP_LOCK" != true ]; then
    mkdir -p "$SEISCOMP_ROOT/status"
    while :; do
        SEISCOMP_LOCK=true $SEISCOMP_ROOT/bin/run_with_lock \
            $SEISCOMP_ROOT/status/seiscomp.pid bash -c "$0 $*"
        if [ $? -ne 255 ]; then exit $?; fi
        echo "...locked...trying again..."
        sleep 1
    done
fi

export PATH="$SEISCOMP_ROOT/bin:$PATH"

if ! cd "$SEISCOMP_ROOT"; then
    echo "Cannot change directory to $SEISCOMP_ROOT"
    exit 1
fi

if [ ! -r "lib/env.sh" ]; then
    echo "Cannot read $SEISCOMP_ROOT/lib/env.sh"
    exit 1
fi

source "lib/env.sh"

if [ ! -r "lib/keyutils.sh" ]; then
    echo "Cannot read $SEISCOMP_ROOT/lib/keyutils.sh"
    exit 1
fi

source "lib/keyutils.sh"

global_cfg="templates/global.cfg"
if [ ! -r "$global_cfg" ]; then
    echo "Cannot read $SEISCOMP_ROOT/$global_cfg!"
    exit 1
fi

network_cfg="templates/network.cfg"
if [ ! -r "$network_cfg" ]; then
    echo "Cannot read $SEISCOMP_ROOT/$network_cfg!"
    exit 1
fi

station_cfg="templates/station.cfg"
if [ ! -r "$station_cfg" ]; then
    echo "Cannot read $SEISCOMP_ROOT/$station_cfg!"
    exit 1
fi

VERSION="2.6 (2009.075)"
KEY_VERSION="2.5"

_get_pkgmods() {
    pkgmods="$(for p in pkg/[0-9]*; do
        attr=$($p get_attributes)
        if ([ -z "$1" ] || echo $attr | grep -q "\<$1\>") &&
            ([ "$ADVANCED" = yes ] || echo $attr | grep -vq "\<advanced\>"); then
            echo "${p##*/}"
        fi
    done)"
}

_init_globals() {
    ORGANIZATION=""
    ADVANCED="yes"
    SYSLOG="no"

    if [ -f "key/global" ]; then
        source key/global
    fi
    
    Ask ORGANIZATION "Name of Data Center" "$ORGANIZATION"
    AskYN ADVANCED "Advanced configuration" "$ADVANCED"

    if [ "$ADVANCED" = yes ]; then
        AskYN SYSLOG "Use syslog when supported" "$SYSLOG"
    fi

    OutputKeys $global_cfg >key/global
}

_edit_globals() {
    _init_globals
    _get_pkgmods globals
    
    pkglist="$(for p in $pkgmods; do echo -n "${p#*_} "; done)"
    echo
    echo "Following packages are selectable: $pkglist"

    while :; do
        Ask pkg "Select package"
        if [ -z "$pkg" ]; then
            return
        elif echo "$pkglist" | grep -q "\<$pkg\>"; then
            break
        fi

        echo "Package $pkg not installed"
    done

    for p in $pkgmods; do
        if [ "$pkg" = "${p#*_}" ]; then
            pkg/$p edit_globals $profile
            return
        fi
    done

    echo "Cannot find $pkg config hook"
}

_edit_station() {
    _get_pkgmods station

    if [ "$(echo key/station_${NET}_*)" != "key/station_${NET}_*" ]; then
        echo -n "Following stations are defined in network ${NET}: "
        for k in key/station_${NET}_*; do
            echo -n "${k##*_} "
        done
        echo
    else
        echo "No stations defined in network ${NET}"
    fi

    Ask STATION "Station code"
    STATION="$(echo ${STATION} | tr '[:lower:]' '[:upper:]' | 
        sed -e 's/^[^A-Z0-9]*\([A-Z0-9]\{1,5\}\).*/\1/g')"

    STAT_DESC="$NET station"
    LATITUDE=""
    LONGITUDE=""
    ELEVATION=""
    DATALOGGER="Q330"
    DATALOGGER_SN="xxxx"
    SEISMOMETER1="STS-2N"
    SEISMOMETER_SN1="yyyy"
    GAIN_MULT1="1.0"
    SAMPLING1="100/20/1/0.1"
    ORIENTATION1='Z 0 -90; N 0 0; E 90 0'
    DEPTH1=""
    SEISMOMETER2=""
    SEISMOMETER_SN2=""
    GAIN_MULT2=""
    SAMPLING2=""
    ORIENTATION2='Z 0 -90; N 0 0; E 90 0'
    DEPTH2=""
    START_DATE="2006/001"
    PACKAGES="$(for p in $pkgmods; do echo -n "${p#*_} "; done)"
    CONFIGURED="no"

    if [ -z "$STATION" ]; then
        return
    elif [ -f "key/station_${NET}_${STATION}" ]; then
        echo
        echo "Editing existing station ${STATION}"
        source "key/station_${NET}_${STATION}"
    else
        echo
        echo "Adding new station ${STATION}"
    fi
 
    Ask STAT_DESC "Station description" "$STAT_DESC"

    if [ "$ADVANCED" = yes ]; then
        Ask LATITUDE "Latitude" "$LATITUDE"
        Ask LONGITUDE "Longitude" "$LONGITUDE"
        Ask ELEVATION "Elevation" "$ELEVATION"
        Ask DATALOGGER "Datalogger" "$DATALOGGER"
        Ask SEISMOMETER1 "Primary seismometer" "$SEISMOMETER1"
        Ask GAIN_MULT1 "Gain multiplier of $SEISMOMETER1" "$GAIN_MULT1"
        Ask SAMPLING1 "Sample rates of $SEISMOMETER1" "$SAMPLING1"
        Ask DEPTH1 "Depth of $SEISMOMETER1" "$DEPTH1"
        
        Ask SEISMOMETER2 "Secondary seismometer (eg., strong-motion)" "$SEISMOMTER2"
        if [ -n "$SEISMOMETER2" ]; then
            Ask GAIN_MULT2 "Gain multiplier of $SEISMOMETER2" "$GAIN_MULT"
            Ask SAMPLING2 "Sample rates of $SEISMOMETER2" "$SAMPLING"
            Ask DEPTH2 "Depth of $SEISMOMETER2" "$DEPTH2"
        fi
        
        Ask START_DATE "Start date" "$START_DATE"
        CONFIGURED="yes"
    fi

    pkgs="$PACKAGES"
    PACKAGES=""
    for p in $pkgmods; do
        pkg="${p#*_}"
        if echo "$pkgs" | grep -q "\<$pkg\>"; then
            enabled="yes"
            profile="$(echo -n "$pkgs" | sed -e "s/.*\<$pkg\>\(:\([^ ]*\)\)\?.*/\2/")"
        else
            enabled="no"
            profile=""
        fi

        AskYN enabled "Enable $pkg for ${NET}_${STATION}" "$enabled"
        if [ "$enabled" = yes ]; then
            if [ -z "$profile" ]; then
                useprof="no"
            else
                useprof="yes"
            fi
            
            if [ "$(echo $pkg/key/profile_*)" != "$pkg/key/profile_*" ]; then
                AskYN useprof "Use predefined profile" "$useprof"
                if [ "$useprof" = yes ]; then
                    echo -n "Following profiles are defined for package $pkg: "
                    for pf in $pkg/key/profile_*; do
                        echo -n "${pf##*/profile_} "
                    done
                    echo

                    while :; do
                        Ask profile "Select profile" "$profile"
                        if [ -f "$pkg/key/profile_${profile}" ]; then
                            break
                        fi

                        echo "Profile $profile not found"
                    done
                fi
            fi

            if [ "$useprof" = no ]; then
                pkg/$p edit_station $NET $STATION
            fi
        fi

        if [ "$enabled" = yes ]; then
            if [ -n "$PACKAGES" ]; then
                PACKAGES="$PACKAGES "
            fi
            if [ "$useprof" = yes ]; then
                PACKAGES="${PACKAGES}$pkg:$profile"
            else
                PACKAGES="${PACKAGES}$pkg"
            fi
        fi
    done
    
    OutputKeys "$station_cfg" >key/station_${NET}_${STATION}
}                

_remove_station() {
    if [ "$(echo key/station_${NET}_*)" != "key/station_${NET}_*" ]; then
        echo -n "Following stations are defined in network ${NET}: "
        for k in key/station_${NET}_*; do
            echo -n "${k##*_} "
        done
        echo
        Ask STATION "Station to remove"
        STATION="$(echo ${STATION} | tr '[:lower:]' '[:upper:]' | 
            sed -e 's/^[^A-Z0-9]*\([A-Z0-9]\{1,5\}\).*/\1/g')"

        if [ -f "key/station_${NET}_${STATION}" ]; then
            echo "Removing ${NET}_${STATION}"
            rm -f key/station_${NET}_${STATION}
        else
            echo "Station ${NET}_${STATION} not found"
        fi
    else
        echo "No stations defined in network ${NET}"
    fi
}

_edit_network() {
    if [ "$(echo key/network_*)" != "key/network_*" ]; then
        echo -n "Following networks are defined: "
        for k in key/network_*; do
            echo -n "${k##*_} "
        done
        echo
    else
        echo "No networks defined"
    fi
 
    Ask NET "Network code"
    NET="$(echo ${NET} | tr '[:lower:]' '[:upper:]' | 
        sed -e 's/^[^A-Z0-9]*\([A-Z0-9]\{1,2\}\).*/\1/g')"

    NET_DESC="$NET network"
    NET_NAME="${NET}-Net"

    if [ -z "$NET" ]; then
        return
    elif [ -f "key/network_${NET}" ]; then
        echo
        echo "Editing existing network ${NET}"
        source "key/network_${NET}"
    else
        echo
        echo "Adding new network ${NET}"
    fi
    
    Ask NET_DESC "Network description" "$NET_DESC"
    Ask NET_NAME "Network name" "$NET_NAME"
    OutputKeys "$network_cfg" >key/network_$NET

    while :; do
        echo
        echo "A) Add/Edit station"
        echo "R) Remove station"
        echo "Q) Back to main menu"
        Ask reply "Command?" "A"
        echo

        case "$reply" in
            A|a) _edit_station ;;
            R|r) _remove_station ;;
            Q|q) return ;;
            *)   echo "Invalid command" ;;
        esac
    done
}

_remove_network() {
    if [ "$(echo key/network_*)" != "key/network_*" ]; then
        echo -n "Following networks are defined: "
        for k in key/network_*; do
            echo -n "${k##*_} "
        done
        echo
        Ask NET "Network to remove"
        NET="$(echo $NET | tr '[:lower:]' '[:upper:]' | 
            sed -e 's/^[^A-Z0-9]*\([A-Z0-9]\{1,2\}\).*/\1/g')"

        if [ -f "key/network_$NET" ]; then
            echo "Removing ${NET}"
            rm -f key/network_${NET}
            rm -f key/station_${NET}_*
        else
            echo "Network ${NET} not found"
        fi
    else
        echo "No networks defined"
    fi
} 

_edit_profile() {
    _get_pkgmods profile

    pkglist="$(for p in $pkgmods; do echo -n "${p#*_} "; done)"
    echo "Following packages are selectable: $pkglist"

    while :; do
        Ask pkg "Select package"
        if [ -z "$pkg" ]; then
            return
        elif echo "$pkglist" | grep -q "\<$pkg\>"; then
            break
        fi

        echo "Package $pkg not installed"
    done

    if [ "$(echo $pkg/key/profile_*)" != "$pkg/key/profile_*" ]; then
        echo -n "Following profiles are defined for package $pkg: "
        for pf in $pkg/key/profile_*; do
            echo -n "${pf##*/profile_} "
        done
        echo
    else
        echo "No profiles defined for package $pkg"
    fi

    Ask profile "Select existing or new profile"
    profile="$(echo $profile | sed -e 's/[[:space:]]/_/g')"
    if [ -z "$profile" ]; then
        return
    elif [ -f "$pkg/key/profile_$profile" ]; then
        echo
        echo "Editing existing profile $profile"
    else
        echo
        echo "Creating new profile $profile"
    fi

    for p in $pkgmods; do
        if [ "$pkg" = "${p#*_}" ]; then
            pkg/$p edit_profile $profile
            return
        fi
    done

    echo "Cannot find $pkg config hook"
}

_write_conf() {
    LoadConfig "$global_cfg" "$network_cfg" "$station_cfg"

    echo "Writing global configuration"
    
    if [ ! -f "key/global" ]; then
        echo "Cannot find $SEISCOMP_ROOT/key/global"
        return
    fi

    source key/global
    
    ORGANIZATION="$(echo $ORGANIZATION | sed -e 's/[[:space:]]/_/g')"
    OutputFile templates/nettab_head.tpl >config/net.tab

    for n in key/network_*; do
        if [ "$n" = "key/network_*" ]; then
            echo "No networks defined"
            break
        fi
        
        NET="${n##*_}"
        source $n
        NET_DESC="$(echo $NET_DESC | sed -e 's/[[:space:]]/_/g')"
        NET_NAME="$(echo $NET_NAME | sed -e 's/[[:space:]]/_/g')"
        OutputFile templates/nettab_network.tpl >>config/net.tab
        for s in key/station_${NET}_*; do
            if [ "$s" = "key/station_${NET}_*" ]; then
                echo "No stations defined for network $NET"
                break
            fi

            STATION="${s##*_}"
            source $s
            if [ "$CONFIGURED" = yes ]; then
                STAT_DESC="$(echo $STAT_DESC | sed -e 's/[[:space:]]/_/g')"
                SEISMOMETER="$SEISMOMETER1"
                SEISMOMETER_SN="$SEISMOMETER_SN1"
                GAIN_MULT="$GAIN_MULT1"
                SAMPLING="$SAMPLING1"
                DEPTH="$DEPTH1"
                OutputFile templates/nettab_station.tpl >>config/net.tab
                if [ -n "$SEISMOMETER2" ]; then
                    test -n "$DATALOGGER2" && DATALOGGER="$DATALOGGER2"
                    test -n "$DATALOGGER_SN2" && DATALOGGER="$DATALOGGER_SN2"
                    SEISMOMETER="$SEISMOMETER2"
                    SEISMOMETER_SN="$SEISMOMETER_SN2"
                    GAIN_MULT="$GAIN_MULT2"
                    SAMPLING="$SAMPLING2"
                    DEPTH="$DEPTH2"
                    OutputFile templates/nettab_station.tpl >>config/net.tab
                fi
            fi
        done
    done

    _get_pkgmods
    
    for p in $pkgmods; do
        pkg="${p#*_}"
        echo
        echo "Writing configuration for $pkg"
        pkg/$p write_conf
    done
}

_configure() {
    mkdir -p key

    if [ ! -f "key/global" -o "$ADVANCED" = no ]; then
        echo "Initializing global parameters"
        _init_globals
    fi
    
    _get_pkgmods globals

    for p in $pkgmods; do
        pkg="${p#*_}"
        if [ ! -f "$pkg/key/global" -o "$ADVANCED" = no ]; then
            echo "Initializing $pkg"
            pkg/$p edit_globals
        fi
    done

    if [ "$ADVANCED" = yes ]; then
        while :; do
            echo
            echo "G) Edit global parameters"
            echo "A) Add/Edit network"
            echo "R) Remove network"
            echo "P) Add/Edit configuration profile"
            echo "W) Write configuration and quit"
            echo "Q) Quit without writing configuration"
            Ask reply "Command?" "A"
            echo

            case "$reply" in
                G|g) _edit_globals ;;
                A|a) _edit_network ;;
                R|r) _remove_network ;;
                P|p) _edit_profile ;;
                W|w) _write_conf
                     exit 0 ;;
                Q|q) exit 0 ;;
                *)   echo "Invalid command" ;;
            esac
        done
    else
        while :; do
            echo
            echo "A) Add/Edit network"
            echo "R) Remove network"
            echo "W) Write configuration and quit"
            echo "Q) Quit without writing configuration"
            Ask reply "Command?" "A"
            echo

            case "$reply" in
                A|a) _edit_network ;;
                R|r) _remove_network ;;
                W|w) _write_conf
                     exit 0 ;;
                Q|q) exit 0 ;;
                *)   echo "Invalid command" ;;
            esac
        done
    fi
}

echo "SeisComP version $VERSION" 1>&2

if [ "$#" -eq 0 ]; then
    echo "Usage: seiscomp {{start|stop|check|print_crontab} [pkg]}|config" 1>&2
    exit 0
fi

action="$1"
shift

ORGANIZATION=""
ADVANCED="yes"
SYSLOG="no"

if [ -f "key/global" ]; then
    source key/global
fi
    
_get_pkgmods

case "$action" in
    start)
        for p in $pkgmods; do
            pkg="${p#*_}"
            if [ -z "$*" ] || echo "$*" | grep -q "\<$pkg\>"; then
                touch "status/$pkg.run"
                pkg/$p start </dev/null
            fi
        done
        exit 0
        ;;
    stop)
        for p in $(echo "$pkgmods" | sort -r); do
            pkg="${p#*_}"
            if [ -z "$*" ] || echo "$*" | grep -q "\<$pkg\>"; then
                pkg/$p stop </dev/null
                rm -f "status/$pkg.run"
            fi
        done
        exit 0
        ;;
    check)
        for p in $pkgmods; do
            pkg="${p#*_}"
            if [ -f "status/$pkg.run" ]; then
                if [ -z "$*" ] || echo "$*" | grep -q "\<$pkg\>"; then
                    touch "status/$pkg.run"
                    pkg/$p check </dev/null
                fi
            fi
        done
        exit 0
        ;;
    print_crontab)
        if [ $# -eq 0 ]; then
            echo "*/3 * * * * $SEISCOMP_ROOT/bin/seiscomp check >/dev/null 2>&1"
            for p in $pkgmods; do
                pkg/$p print_crontab
            done
            exit 0
        fi
        ;;
    config)
        if [ $# -eq 0 ]; then
            _configure
            exit 0
        fi
        ;;
esac

echo "Invalid parameters" 1>&2
exit 1

