#!/bin/bash
# config-scripts/src/share/svc--gcf-in-scream/gcf-in-scream.sh
# 
#  Copyright: ©2009–2015, Güralp Systems Ltd.
#  Author: Laurence Withers <lwithers@guralp.com>
#  License: GPLv3
#

# Handle the navbar query without loading anything
if [ "$1" == "--navbar" ]
then
    echo "servicestop Services"
    echo "servicessub/gcf-in-scream gcf-in-scream"
    echo "gcf-in-scream/$3 $3"
    exit 0
fi

# Load support functions
script_dir="`dirname $0`"
. "${script_dir}/functions.sh"
. "${script_dir}/svc_funcs.sh"
. "${script_dir}/gdi-base_link.sh"


do_read() {
    local server i input_name output_name

    # Standard control info
    gcs_svc_read || return 1

    # Now the service type dependant variables

    ## Global defaults
    gcs_var "d_backfill_directory" "/var/lib/${name}.${sel}"
    gcs_var "d_local_host"         ""
    gcs_var "d_local_service"      "scream1"
    gcs_var "d_text_to_syslog"     "true"

    if [ -r "${CFGFILE}" ]
    then
        ## Global
        gcs_var_o2 "backfill_directory" ""
        gcs_var_o2 "local_host" ""
        gcs_var_o2 "local_service" ""
        gcs_var_o2 "text_to_syslog" ""

        ## Servers
        i=0
        for server in `gcs_list_varcf2_sections "${CFGFILE}"`
        do
            [ "${server}" = "source_map" ] && continue
            gcs_var "o_server_name${i}"        "${server}"
            gcs_var "o_server_host${i}"        "$(gcs_get_varcf2 "host" "${CFGFILE}" "${server}")"
            gcs_var "o_server_service${i}"     "$(gcs_get_varcf2 "service" "${CFGFILE}" "${server}")"
            gcs_var "o_server_type${i}"        "$(gcs_get_varcf2 "type" "${CFGFILE}" "${server}")"
            gcs_var "o_server_backfill${i}"    "$(gcs_get_varcf2 "backfill_max_requests" "${CFGFILE}" "${server}")"
            gcs_var "o_server_tcp_timeout${i}" "$(gcs_get_varcf2 "timeout_period" "${CFGFILE}" "${server}")"
            ((++i))
        done

        # channel map
        i=0
        while read -r input_name output_name
        do
            gcs_var "o_source_map_input${i}"    "${input_name}"
            gcs_var "o_source_map_output${i}"   "${output_name}"
            ((++i))
        done < <(cf2list "${CFGFILE}" '[source_map]')

        gcs_gdi_base_iselect "`gcs_get_varcf2 "gdi_socket" "${CFGFILE}" ""`" "source"
    else
        gcs_gdi_base_iselect "" "source"
    fi
}



do_check() {
    gcs_read_vars

    # Standard service control/info vars
    gcs_svc_check

    # Service dependant variables
    # Most of the checks are done by the main engine

    gcs_gdi_base_dereference "source"
}



do_write_server() {
    local i server var
    i="$1"
    server="$2"

    var="new_server_type${i}"
    gcs_set_varcf2 "type"                       "${CFGFILE}" "${!var}" "${server}"
    var="new_server_host${i}"
    gcs_set_varcf2 "host"                       "${CFGFILE}" "${!var}" "${server}"
    var="new_server_service${i}"
    gcs_set_varcf2 "service"                    "${CFGFILE}" "${!var}" "${server}"
    var="new_server_backfill${i}"
    gcs_set_varcf2 "backfill_max_requests"      "${CFGFILE}" "${!var}" "${server}"
    var="new_server_tcp_timeout${i}"
    gcs_set_varcf2 "timeout_period"             "${CFGFILE}" "${!var}" "${server}"
}

do_write() {
    local i server var input_name output_name

    do_check
    if (( gcs_errors > 0 ))
    then
        return
    fi

    if gcs_truefalse "${new_delete:-false}"
    then
        gcs_svc_delete "${name}" "${sel}"
    fi

    # Standard service controls
    gcs_ensure_cfgfile_exists "${CTLFILE}"
    gcs_set_varf "DESC" "${CTLFILE}" "${desc}"

    # Now the service type dependant variables
    gcs_ensure_cfgfile_exists "${CFGFILE}"

    ## Global
    gcs_set_varcf2 "application_description"    "${CFGFILE}" "${new_desc}"               ""
    gcs_set_varcf2 "backfill_directory"         "${CFGFILE}" "${new_backfill_directory}" ""
    gcs_set_varcf2 "backfill_directory_group"   "${CFGFILE}" "data"                      ""
    gcs_set_varcf2 "backfill_directory_mode"    "${CFGFILE}" "02775"                     ""
    gcs_set_varcf2 "local_host"                 "${CFGFILE}" "${new_local_host}"         ""
    gcs_set_varcf2 "local_service"              "${CFGFILE}" "${new_local_service}"      ""
    gcs_set_varcf2 "text_to_syslog"             "${CFGFILE}" "${new_text_to_syslog}"     ""
    gcs_set_varcf2 "gdi_socket"                 "${CFGFILE}" "${new_gdi_socket}"         ""

    # process each existing section in the config file
    # record which sections have been saved
    for server in `gcs_list_varcf2_sections "${CFGFILE}"`
    do
        [ "${server}" = "source_map" ] && continue

        for (( i = 0 ; i < ${new_servers_rows} ; i++ ))
        do
            var="new_server_name${i}"
            [ "${!var}" == "${server}" ] && break
        done

        [ "${i}" -ge ${new_servers_rows} ] && gcs_clear_varcf2_section "${CFGFILE}" "${server}"
    done

    for (( i = 0 ; i < ${new_servers_rows} ; i++ ))
    do
        var="new_server_name${i}"
        server="${!var}"
        [ -z "${server}" ] && continue

        do_write_server "${i}" "${server}"
    done

    # update the channel map
    cf2clear "${CFGFILE}" '[source_map]'
    for (( i = 0; i < ${new_source_map_rows} ; i++ ))
    do
        var="new_source_map_input${i}"
        input_name="${!var}"
        [ -z "${input_name}" ] && continue
        var="new_source_map_output${i}"
        output_name="${!var}"
        [ -z "${output_name}" ] && continue

        cf2set "${CFGFILE}" '[source_map]' "${input_name}=${output_name}"
    done

    # Update the service script
    gcs_update_svc "${name}" "${sel}" "${enable}" "${desc}" "${CFGFILE}" \
            "${CTLFILE}" "${SRVBASE}"
    
    gcs_svc_reload "${name}" "${sel}"
}


name="$2"
sel="$3"

CFGFILE="${CONFIGDIR}/${name}/${sel}.local"
CTLFILE="${CONFIGDIR}/${name}/${sel}.ctl.local"
SRVBASE="${SERVDIR}/${name}"


case "$1" in
--check)
    do_check
    ;;
--write)
    do_write
    ;;
--read)
    do_read
    ;;
*)
    exit 1
    ;;
esac

gcs_cleanup
exit 0

# vim: ts=4:sw=4:expandtab
