#!/bin/bash
#
# Guralp Configuration System
#   Copyright (c) 2008-2012 Guralp Systems Ltd. All rights reserved.
#
#   Scream server config

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

# Load support functions
script_dir=$(dirname $0)
. $script_dir/functions.sh
. $script_dir/svc_funcs.sh
. $script_dir/gdi2gcf_link.sh


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

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


do_read() {
    local i entry line reject

    # Standard control info
    gcs_svc_read || return 1

    # Now the service type dependant variables

    gcs_var "d_enable_broadcast"	"False"
    gcs_var "d_v40_com_names"		"False"
    gcs_var "d_acquisition_host"	""
    gcs_var "d_bind_host"		""
    gcs_var "d_bind_service"		"scream"
    gcs_var "d_disable_terminal"	"False"
    gcs_var "d_filter_type"		"none"
    gcs_var "d_filter_sample_rate"	""
    gcs_var "d_state_directory"	"/var/lib/${name}.${sel}"

    if [ -r "$CFGFILE" ]
    then
	gcs_var_o "enable_broadcast"
	gcs_var_o "v40_com_names"
	gcs_var_o "acquisition_host"
	gcs_var_o "bind_host"
	gcs_var_o "bind_service"
	gcs_var_o "disable_terminal"
	gcs_var_o "filter_type"
	gcs_var_o "filter_sample_rate"

	gcs_gdi2gcf_iselect "$(gcs_get_varcf "gcfout_dbdir" "${CFGFILE}")"

	line="$(gcs_get_varcf "push" "${CFGFILE}")"
	i=0
	for entry in ${line}
	do
	    gcs_var "o_push_host${i}" "${entry/,*}"
	    gcs_var "o_push_service${i}" "${entry/*,}"
	    ((i++))
	done

	line="$(gcs_get_varcf "terminal_ip_filter" "${CFGFILE}")"
	i=0
	for entry in ${line//,/ }
	do
	    case "${entry}" in
	    accept*)
		reject="False"
		;;
	    reject*)
		reject="True"
		;;
	    *)
		continue
		;;
	    esac

	    gcs_var "o_terminal_ip_filter_reject${i}" "${reject}"
	    entry="${entry/*\(}"
	    entry="${entry/\)*}"
	    gcs_var "o_terminal_ip_filter_address${i}" "${entry}"
	    ((++i))
	done

	line="$(gcs_get_varcf "filter_channels" "${CFGFILE}")"
	i=0
	for entry in ${line//,/ }
	do
	    gcs_var "o_filter_channel_name${i}" "${entry}"
	    ((++i))
	done
    else
	gcs_gdi2gcf_iselect ""
    fi
}


do_check() {

    gcs_read_vars

    # Standard service control/info vars
    gcs_svc_check

    # Service dependant variables
    case "${new_filter_type}" in
    sample_rate)
        if [ -z "${new_filter_sample_rate}" ]
        then
            gcs_err "filter_sample_rate" "Max sample rate not set."
        fi
        ;;
    channel_name)
	check_table_not_empty "filter_channels" "filter_channel_name" \
			"No channel names set."
        ;;
    esac

    gcs_gdi2gcf_dereference
}


do_write() {
    local -i i
    local line entry reject

    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"

    # Do the simple keywords in place
    gcs_set_varcf "application_description" "${CFGFILE}"    "${new_desc}"
    gcs_set_varcf "enable_broadcast"        "${CFGFILE}"    "${new_enable_broadcast}"
    gcs_set_varcf "v40_com_names"           "${CFGFILE}"    "${new_v40_com_names}"
    gcs_set_varcf "acquisition_host"        "${CFGFILE}"    "${new_acquisition_host}"
    gcs_set_varcf "bind_host"               "${CFGFILE}"    "${new_bind_host}"
    gcs_set_varcf "bind_service"            "${CFGFILE}"    "${new_bind_service}"
    gcs_set_varcf "disable_terminal"        "${CFGFILE}"    "${new_disable_terminal}"
    gcs_set_varcf "filter_type"             "${CFGFILE}"    "${new_filter_type}"
    gcs_set_varcf "filter_sample_rate"      "${CFGFILE}"    "${new_filter_sample_rate}"
    gcs_set_varcf "gcfout_dbdir"            "${CFGFILE}"    "${new_gcfout_dbdir}"
    gcs_set_varcf "state_directory"         "${CFGFILE}"    "${new_state_directory}"

    # build push line
    line=""
    for (( i = 0 ; i < $new_push_rows ; i++ ))
    do
        eval entry="\${new_push_host${i}},\${new_push_service${i}}"
        [ "${entry}" == "," ] && continue
        line="${line} ${entry}"
    done
    gcs_set_varcf "push"                    "${CFGFILE}"    "${line}"

    # build channel output filter line
    line=""
    for (( i = 0 ; i < $new_filter_channels_rows ; i++ ))
    do
        entry="new_filter_channel_name${i}"
        [ -z "${!entry}" ] && continue
        line="${line} ${!entry},"
    done        
    gcs_set_varcf "filter_channels"         "${CFGFILE}"    "${line}"

    # build terminal IP filter line
    line=""
    for (( i = 0 ; i < $new_terminal_ip_filter_rows ; i++ ))
    do
        eval entry="\${new_terminal_ip_filter_address${i}}"
        [ -z "${entry}" ] && continue
        eval reject="\${new_terminal_ip_filter_reject${i}}"
        if gcs_truefalse "${reject:-false}"
        then
            entry="reject(${entry})"
        else
            entry="accept(${entry})"
        fi
        [ -n "${line}" ] && entry=",${entry}"
        line="${line}${entry}"
    done
    gcs_set_varcf "terminal_ip_filter"      "${CFGFILE}"    "${line}"

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



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

gcs_cleanup
exit 0

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