#!/bin/bash
###############################################################################################################
# Titel: sds2db
# Autor: Michael Kaden
# Datum: 14.09.2014
#
# Funktion:
# Dieses Skript ist ein Teilprogramm von sds2db. 
# Enthlt eine SDS-TL (Type 4) eine Empfangsquittungsanforderung im Message Header, so kann eine 
# "Delivery Report"-SDS an den Absender versandt werden. Empfangene Status-SDS knnen quittiert werden, in dem der empfangene
# Status an den Absender als Status-SDS zurckgesandt wird, wenn die SDS in die DB geschrieben werden konnte.
#
# Zweck:
# Das Script soll als Hintergrundprozess auf einem Statusmonitor-PC laufen, der mittels RS232-Schnittstellen (auch 
# USB/Seriell-Konverter oder Ethernet-Serial-Device-Server) mit einem PEI-Interface eines TETRA Funkgertes verbunden ist. 
# Die in der MySQL-Datenbank gesammelten SDS knnen so in anderen Anwendungen, z.B. Einsatzfhrungssoftware, ausgewertet 
# werden, um z.B. Status-, Positions- oder Text-Informationen zu verarbeiten.
#
# Copyright (C) 2014 Michael Kaden
#
# Dieses Programm ist freie Software. Sie knnen es unter Beachtung der Nutzungsbedingungen benutzen, 
# weitergeben und modifizieren.
# Die Verffentlichung dieses Programms erfolgt in der Hoffnung, dass es Ihnen von Nutzen sein wird, 
# aber OHNE IRGENDEINE GARANTIE, sogar ohne die Garantie der MARKTREIFE oder der VERWENDBARKEIT FR EINEN 
# BESTIMMTEN ZWECK. 
###############################################################################################################

# Config-File einlesen
source /usr/local/sds2db/etc/sds2db.conf
source /usr/local/sds2db/etc/SDSprocess.conf

# Konstanen und Variablen definieren
myname=$(echo $0 | $awkbin -F/ '{ print $NF }')
declare -A SDSArray
SDSArray["sdsStr"]="$1"
SDSArray["device"]="$(echo "${SDSArray["sdsStr"]}" | $awkbin -F, '{ print $1 }' )"
SDSArray["ai_service"]="$(echo "${SDSArray["sdsStr"]}" | $awkbin -F, '{ print $2 }' )"
SDSArray["from"]="$(echo "${SDSArray["sdsStr"]}" | $awkbin -F, '{ print $3 }' )"
SDSArray["from_type"]="$(echo "${SDSArray["sdsStr"]}" | $awkbin -F, '{ print $4 }' )"
SDSArray["to"]="$(echo "${SDSArray["sdsStr"]}" | $awkbin -F, '{ print $5 }' )"
SDSArray["to_type"]="$(echo "${SDSArray["sdsStr"]}" | $awkbin -F, '{ print $6 }' )"
SDSArray["length"]="$(echo "${SDSArray["sdsStr"]}" | $awkbin -F, '{ print $7 }' )"
SDSArray["user_data"]="$(echo "${SDSArray["sdsStr"]}" | $awkbin -F, '{ print $8 }' )"

i=1
while [ -n "$(eval echo '$'SDSfwd_SOURCEport_${i})" ]; do
	if [ "$(eval echo '$'SDSfwd_SOURCEport_${i})" = "${SDSArray["device"]}" ]; then
		if [ -n "$(eval echo '$'SDSfwd_TARGETport_${i})" ]; then SDSArray["SDSfwd_TARGETport"]="$(eval echo '$'SDSfwd_TARGETport_${i})"; fi
		if [ -n "$(eval echo '$'SDSfwd_STATUSdrop_${i})" ]; then SDSArray["SDSfwd_STATUSdrop"]="$(eval echo '$'SDSfwd_STATUSdrop_${i})"; fi
		if [ -n "$(eval echo '$'SDSfwd_TEXT_${i})" ]; then SDSArray["SDSfwd_TEXT"]="$(eval echo '$'SDSfwd_TEXT_${i})"; fi
		if [ -n "$(eval echo '$'SDSfwd_LIP_${i})" ]; then SDSArray["SDSfwd_LIP"]="$(eval echo '$'SDSfwd_LIP_${i})"; fi
		if [ -n "$(eval echo '$'SDSfwd_sysTEXT_${i})" ]; then SDSArray["SDSfwd_sysTEXT"]="$(eval echo '$'SDSfwd_sysTEXT_${i})"; fi
		if [ -n "$(eval echo '$'SDSfwd_sysLIP_${i})" ]; then SDSArray["SDSfwd_sysLIP"]="$(eval echo '$'SDSfwd_sysLIP_${i})"; fi
	fi	
	((i++))
done

#Debug
#log "$myname(${SDSArray["device"]})" "${SDSArray["SDSfwd_TARGETport"]}"
#log "$myname(${SDSArray["device"]})" "${SDSArray["SDSfwd_STATUSdrop"]}"
#log "$myname(${SDSArray["device"]})" "${SDSArray["SDSfwd_TEXT"]}"
#log "$myname(${SDSArray["device"]})" "${SDSArray["SDSfwd_LIP"]}"

# Wenn die SDS eine TL-SDS ist
if [ "${SDSArray["ai_service"]}" = "12" ]; then
	# Assoziatives Array erzeugen um die decodierten PDU-Protocol-Tags zu speichern
	declare -A PDUelements
	# Zeilenweise den Output des PHP-dekodier-Skripts einlesen, der das Array der PDU-Protocol-Tags fllt
	while read line; do
		if [ -n "$(echo "$line" | tr -d '\r\n')" ]; then
			# fr alle nicht leeren Zeilen die Array-Elemente befllen
			eval $line
		fi
	done <<< "$("$phpbin" "/usr/local/sds2db/bin/SDSdecode.php" ${SDSArray["user_data"]})"
	log "$myname(${SDSArray["device"]})" "SDS Protocol \"${PDUelements["ProtoIdent_name"]}\""
	# Wenn die SDS vom Typ "Text Messaging" ist und Text enthlt
	if ([ "${PDUelements["ProtoIdent_value"]}" = "130" ] && [ -n "${PDUelements["Text"]}" ]); then
		log "$myname(${SDSArray["device"]})" "SDS Text \"${PDUelements["Text"]}\""
		# Prfen ob der Text ein Positions-Telegramm enthlt (TVPN........E........)
		position=$(echo "${PDUelements["Text"]}" |egrep -o "TVPN........E........")
		if [ -n "$position" ]; then
			log "$myname(${SDSArray["device"]})" "Positionstelegramm gefunden \"$position\""
			position_N_hex="$(echo $position | $awkbin '{ print substr($1 ,5,8) }')"
			position_E_hex="$(echo $position | $awkbin '{ print substr($1 ,14,8) }')"
			lat="$(echo "scale=6; $(echo "ibase=16; $position_N_hex" | bc)/1000000" | bc)"
			lon="$(echo "scale=6; $(echo "ibase=16; $position_E_hex" | bc)/1000000" | bc)"
			log "$myname(${SDSArray["device"]})" "lat \"$lat N\""
			log "$myname(${SDSArray["device"]})" "lon \"$lon E\""			
			# wenn ein Ziel-Port konfiguriert wurde und durch SDSprocess generierte LIP-SDS dort ausgegeben werden sollen:
			if [ -c "/dev/${SDSArray["SDSfwd_TARGETport"]}" ] && [ "${SDSArray["SDSfwd_sysLIP"]}" = "yes" ]; then
				# Erzeuge aus den Positionsdaten eine LIP-SDS
				LIP_PDU=$("$phpbin" "/usr/local/sds2db/bin/SDSencode.php" --ProtoIdent 10 --PduType 0 --TimeElapsed 0 --PosErr 7 --HorVeloc 127 --DirOfTravel 15 --TypeOfAddData 0 --ReasonForSending 20 --Longitude $lon --Latitude $lat)
				LIP_PDU=$(echo $LIP_PDU | tr -d '\r\n" "')
				log "$myname(${SDSArray["device"]})" "erstelle LIP-SDS \"$LIP_PDU\""
				log "$myname(${SDSArray["device"]})" "schreibe SDS an \"${SDSArray["SDSfwd_TARGETport"]}\""
				# bergebe die SDS an den Ziel-Port
				printf "\r\n+CTSDSR: ${SDSArray["ai_service"]},${SDSArray["from"]},${SDSArray["from_type"]},${SDSArray["to"]},${SDSArray["to_type"]},$(echo "${#LIP_PDU}*4" | bc)\r\n$LIP_PDU\r\n" > /dev/${SDSArray["SDSfwd_TARGETport"]}
			fi
		else
			# wenn der Text kein Positions-Telegramm enthlt
			# wenn ein Ziel-Port konfiguriert wurde und am Quell-Port empfangene Text-SDS dort ausgegeben werden sollen
			if [ -c "/dev/${SDSArray["SDSfwd_TARGETport"]}" ] && [ "${SDSArray["SDSfwd_TEXT"]}" = "yes" ]; then
				log "$myname(${SDSArray["device"]})" "schreibe SDS an \"${SDSArray["SDSfwd_TARGETport"]}\""
				# bergebe die SDS an den Ziel-Port
				printf "\r\n+CTSDSR: ${SDSArray["ai_service"]},${SDSArray["from"]},${SDSArray["from_type"]},${SDSArray["to"]},${SDSArray["to_type"]},${SDSArray["length"]}\r\n${SDSArray["user_data"]}\r\n" > /dev/${SDSArray["SDSfwd_TARGETport"]}
			fi
		fi
		# Delivery report request senden, wenn der Protocol Tag einen entsprechenden Wert enthlt und fr dieses Device das Senden eines Reports 
		# konfiguriert wurde und der Empfnger des Reports in der Whitelist steht oder fr dieses Device keine Whitelist konfiguriert ist.
		if ([ ${PDUelements["DelivRepReq_value"]} -gt '0' ] && [ `echo "$SDSdeliveryReport" |grep -c "${SDSArray["device"]}"` -eq '1' ] && 
		   ([ -e "$send_whitelist_rundir/${SDSArray["from"]}" ] || [ ! `echo "$use_send_issi_whitelist" |grep -c "${SDSArray["device"]}"` -eq '1' ]))
	  	then
			log "$myname(${SDSArray["device"]})" "${PDUelements["DelivRepReq_name"]} (${PDUelements["ShrtFmRep_name"]})"
			case ${PDUelements["DelivRepReq_value"]} in
				1)	# received report requested
					write_spooler "AT+CTSDS=12,0,0,0,1\r" "${SDSArray["device"]}"
					write_spooler "AT+CMGS=${SDSArray["from"]},32\r\n" "${SDSArray["device"]}"	
					write_spooler "821000$(printf "%02X" ${PDUelements["MsgRef"]})\x1a" "${SDSArray["device"]}"
					log "$myname(${SDSArray["device"]})" "received report an \"${SDSArray["from"]}\" gesendet"
					;;
				2)	# consumed report requested
					write_spooler "AT+CTSDS=12,0,0,0,1\r" "${SDSArray["device"]}"
					write_spooler "AT+CMGS=${SDSArray["from"]},32\r\n" "${SDSArray["device"]}"	
					write_spooler "821002$(printf "%02X" ${PDUelements["MsgRef"]})\x1a" "${SDSArray["device"]}"
					log "$myname(${SDSArray["device"]})" "consumed report an \"${SDSArray["from"]}\" gesendet"
					;;
				3)	# received and consumed report requested
					write_spooler "AT+CTSDS=12,0,0,0,1\r" "${SDSArray["device"]}"
					write_spooler "AT+CMGS=${SDSArray["from"]},32\r\n" "${SDSArray["device"]}"	
					write_spooler "821000$(printf "%02X" ${PDUelements["MsgRef"]})\x1a" "${SDSArray["device"]}"
					log "$myname(${SDSArray["device"]})" "received report an \"${SDSArray["from"]}\" gesendet"
					write_spooler "AT+CTSDS=12,0,0,0,1\r" "${SDSArray["device"]}"
					write_spooler "AT+CMGS=${SDSArray["from"]},32\r\n" "${SDSArray["device"]}"	
					write_spooler "821002$(printf "%02X" ${PDUelements["MsgRef"]})\x1a" "${SDSArray["device"]}"
					log "$myname(${SDSArray["device"]})" "consumed report an \"${SDSArray["from"]}\" gesendet"
					;;
			esac			
		fi
	# Wenn die SDS vom Typ "Location information protocol" ist und eine Position enthlt
	elif ([ "${PDUelements["ProtoIdent_value"]}" = "10" ] && [ -n "${PDUelements["Latitude"]}" ]); then
		log "$myname(${SDSArray["device"]})" "lat \"${PDUelements["Latitude"]} N\""
		log "$myname(${SDSArray["device"]})" "lon \"${PDUelements["Longitude"]} E\""
		# bergebe die SDS an den seriellen Port , der als gefilteter EDP4-Port fr 
		# die PEI-Schnittstelle konfiguriert wurde, von der die SDS empfangen wurde.
		if [ -c "/dev/${SDSArray["SDSfwd_TARGETport"]}" ] && [ "${SDSArray["SDSfwd_LIP"]}" = "yes" ]; then
			log "$myname(${SDSArray["device"]})" "schreibe SDS an \"${SDSArray["SDSfwd_TARGETport"]}\""
			printf "\r\n+CTSDSR: ${SDSArray["ai_service"]},${SDSArray["from"]},${SDSArray["from_type"]},${SDSArray["to"]},${SDSArray["to_type"]},${SDSArray["length"]}\r\n${SDSArray["user_data"]}\r\n" > /dev/${SDSArray["SDSfwd_TARGETport"]}
		fi
	fi
# Wenn die SDS eine Status-SDS ist
elif [ "${SDSArray["ai_service"]}" = "13" ]; then
	log "$myname(${SDSArray["device"]})" "SDS Protocol \"Status\""
	STATUS=$("$phpbin" "/usr/local/sds2db/bin/STATUSdecode.php" ${SDSArray["user_data"]})
	log "$myname(${SDSArray["device"]})" "SDS Status \"$STATUS\""
	# Wenn der Status mehr als 4 Zeichen enthlt, wurde er mit der Status-Mapping-Tabelle ersetzt. 
	# Die Status-Entsprechung wird als Text-SDS an EDP4 gesendet, 
	# wenn durch SDSprocess generierte Text-SDS an den Ziel-Port gesendet werden sollen
	if [ ${#STATUS} -gt 4 ] && [ -c "/dev/${SDSArray["SDSfwd_TARGETport"]}" ] && [ "${SDSArray["SDSfwd_sysTEXT"]}" = "yes" ]; then
		TXT_PDU=$("$phpbin" "/usr/local/sds2db/bin/SDSencode.php" --ProtoIdent 130 --MsgType 0 --DelivRepReq 0 --ShrtFmRep 0 --StorFwd 0 --MsgRef 255 --TimStmpUsd 0 --TxtCodSch 1 --Text "SYSMSG: $STATUS")
		TXT_PDU=$(echo $TXT_PDU | tr -d '\r\n" "')
		log "$myname(${SDSArray["device"]})" "erstelle TXT-SDS \"$TXT_PDU\""
		log "$myname(${SDSArray["device"]})" "schreibe SDS an \"${SDSArray["SDSfwd_TARGETport"]}\""
		# bergebe die SDS an den Ziel-Port
		printf "\r\n+CTSDSR: 12,${SDSArray["from"]},${SDSArray["from_type"]},${SDSArray["to"]},${SDSArray["to_type"]},$(echo "${#TXT_PDU}*4" | bc)\r\n$TXT_PDU\r\n" > /dev/${SDSArray["SDSfwd_TARGETport"]}
	# Andernfalls wird der "native" Tetra-Status-Code an den seriellen Port gesendet, der als gefilteter EDP4-Port fr 
	# die PEI-Schnittstelle konfiguriert wurde, von der die SDS empfangen wurde.
	else
		# Prfe ob das Device existiert und der Statuswert nicht unterdrckt werden soll 
		if ([ -c "/dev/${SDSArray["SDSfwd_TARGETport"]}" ] && 
		    [ "${SDSArray["SDSfwd_STATUSdrop"]}" != "all" ] && 
		    [ "$(echo "${SDSArray["SDSfwd_STATUSdrop"]}" |grep -c "${SDSArray["user_data"]}")" = "0" ]); then
			log "$myname(${SDSArray["device"]})" "schreibe SDS an \"${SDSArray["SDSfwd_TARGETport"]}\""
			printf "\r\n+CTSDSR: ${SDSArray["ai_service"]},${SDSArray["from"]},${SDSArray["from_type"]},${SDSArray["to"]},${SDSArray["to_type"]},${SDSArray["length"]}\r\n${SDSArray["user_data"]}\r\n" > /dev/${SDSArray["SDSfwd_TARGETport"]}
		fi

	fi
	# wenn konfiguriert, empfangenen Status als Quittung zurck senden
	if ([ `echo "$confirmStatusSDS" |grep -c "${SDSArray["device"]}"` -eq '1' ] && ([ -e "$send_whitelistdir/${SDSArray["from"]}" ] || [ ! `echo "$use_send_issi_whitelist" |grep -c "${SDSArray["device"]}"` -eq '1' ])); then
		write_spooler "AT+CTSDS=13,0\r" "${SDSArray["device"]}"
		write_spooler "AT+CMGS=${SDSArray["from"]},16\r\n" "${SDSArray["device"]}"
		write_spooler "${SDSArray["user_data"]}\x1a" "${SDSArray["device"]}"
		log "$myname(${SDSArray["device"]})" "SDS Statusquittung \"${SDSArray["user_data"]}\" an \"${SDSArray["from"]}\" gesendet"
	fi
fi

unset SDSarray
unset PDUelements

exit 0

