#!/bin/bash
#
# Guralp Configuration System
#   Copyright (c) 2008-2010 Guralp Systems Ltd. All rights reserved.
#
#   CD1.1 sender config

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

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


do_read() {
	local -i i

	# Standard control info
	gcs_svc_read || return 1

	# Now the service type dependant variables

	# Fold hostname to uppercase and restrict to 8 characters
	gcs_var "d_station_name"			\
		"$(hostname | tr a-z A-Z | sed -e 's/^\(........\).*/\1/')"

	gcs_var "d_station_type"		"IMS"
	gcs_var "d_data_consumer_host"		""
	gcs_var "d_data_consumer_service"	"8000"
	gcs_var "d_spyrus_slot"			"0"
	gcs_var "d_auth_key_id"			"0"
	gcs_var "d_backfill_policy"		"LIFO"
	gcs_var "d_transmission_log"		"False"
	gcs_var "d_dbdir"			"/var/lib/${name}.${sel}"
	gcs_var "d_relax_connection_checks"	"False"
	gcs_var "d_reconnect_timeout"		""
	gcs_var "d_allow_zeroized_acknack"	"False"

	if [ -r "$CFGFILE" ]
	then
	    gcs_var_o "station_name"
	    gcs_var_o "station_type"
	    gcs_var_o "data_consumer_host"
	    gcs_var_o "data_consumer_service"
	    gcs_var_o "spyrus_slot"
	    gcs_var_o "auth_key_id"
	    gcs_var_o "backfill_policy"
	    gcs_var_o "transmission_log"
	    gcs_var_o "dbdir"
	    gcs_var_o "relax_connection_checks"
	    gcs_var_o "reconnect_timeout"
	    gcs_var_o "allow_zeroized_acknack"

	    gcs_cd11mux_iselect "$(gcs_get_varcf "mux_path" "${CFGFILE}")" "sink"

	    filter_line="$(gcs_get_varcf "channel_filter" "${CFGFILE}")" 
	    i=0
	    for entry in ${filter_line}
	    do
		case "${entry}" in
		accept,*)
			gcs_var "o_channel_filter_accept${i}" "True"
			;;
		reject,*)
			gcs_var "o_channel_filter_reject${i}" "False"
			;;
		*)
			continue
			;;
		esac

		gcs_var "o_channel_filter_name${i}" "${entry/*,}"

		((i++))
	    done
	else
	    gcs_cd11mux_iselect "" "sink"
	fi
}


do_check() {

	gcs_read_vars

	# Standard service control/info vars
	gcs_svc_check

	# Service dependant variables
	# Checks are done by the main engine so nothing to do here

	gcs_cd11mux_dereference "sink"
}


do_write() {
	local -i i
	local val

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

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

	gcs_ensure_cfgfile_exists $CFGFILE

	# Standard path controls
	gcs_set_varf DESC	$CTLFILE "$desc"

	# Do the simple keywords in place
	gcs_set_varcf	"application_description" "${CFGFILE}"	"${new_desc}"
	gcs_set_varcf	"station_name"		"${CFGFILE}"	"${new_station_name}"
	gcs_set_varcf	"station_type"		"${CFGFILE}"	"${new_station_type}"
	gcs_set_varcf	"data_consumer_host"	"${CFGFILE}"	"${new_data_consumer_host}"
	gcs_set_varcf	"data_consumer_service"	"${CFGFILE}"	"${new_data_consumer_service}"
	gcs_set_varcf	"spyrus_slot"		"${CFGFILE}"	"${new_spyrus_slot}"
	gcs_set_varcf	"auth_key_id"		"${CFGFILE}"	"${new_auth_key_id}"
	gcs_set_varcf	"backfill_policy"	"${CFGFILE}"	"${new_backfill_policy}"
	gcs_set_varcf	"mux_path"		"${CFGFILE}"	"${new_mux_path}"
	gcs_set_varcf	"dbdir"			"${CFGFILE}"	"${new_dbdir}"
	gcs_set_varcf	"dbdir_group"		"${CFGFILE}"	"data"
	gcs_set_varcf	"dbdir_mode"		"${CFGFILE}"	"02775"
	gcs_set_varcf	"management_socket"	"${CFGFILE}"	"/var/run/${name}.${sel}.management"
	gcs_set_varcf	"management_socket_group" "${CFGFILE}"	"data"
	gcs_set_varcf	"management_socket_mode" "${CFGFILE}"	"0660"
	gcs_set_varcf	"transmission_log"	"${CFGFILE}"	"${new_transmission_log}"
	gcs_set_varcf	"relax_connection_checks" "${CFGFILE}"  "${new_relax_connection_checks}"
	gcs_set_varcf	"reconnect_timeout"	"${CFGFILE}"	"${new_reconnect_timeout}"
	gcs_set_varcf	"allow_zeroized_acknack" "${CFGFILE}"  "${new_allow_zeroized_acknack}"

	# build channel filter line
	val=""
	for (( i = 0 ; i < $new_channel_filter_rows ; i++ ))
	do
		eval entry_name="\${new_channel_filter_name${i}}"
		[ -z "${entry_name}" ] && continue
		eval entry_accept="\${new_channel_filter_accept${i}}"
                if gcs_truefalse "${entry_accept:-false}"
		then
		    entry_accept="accept"
		else
		    entry_accept="reject"
		fi
		val="${val} ${entry_accept},${entry_name}"
	done
	gcs_set_varcf	"channel_filter"	"${CFGFILE}"	"${val}"

	# 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 "X$1" in
X--check)	do_check	;;
X--write)	do_write	;;
X--read)	do_read		;;
*)		exit 1		;;
esac

gcs_cleanup
exit 0
