#!/bin/bash
###############################################################################################################
# Titel: regular.run
# Autor: Michael Kaden
# Datum: 14.09.2014
# 
# Funktion:
# Dieses Skript ist ein Teilprogramm von fdtsds. Es wird mittels Cron-Job regelmäßig wiederholt ausgeführt. 
# Der Cron-Job wird beim Starten des Init-Skripts für "fdtsds" erstellt und beim Beenden wieder entfernt.
# Es werden AT Kommandos an die PEI-Schnittstelle eines verbundenen TETRA FuGs gesendet, um die Betriebs-
# bereitschaft abzufragen. Die Antworten werden durch "fdtsds" in das fdtsds-Logfile geschrieben und hier zyklisch
# ausgewertet, um einen "Alive"-Eintrag in einer Datenbanktabelle aufzufrischen. Zusätzlich wird ein "Alive"-Eintrag
# dieses Hosts in einer Datenbanktabelle aufgefrischt, um die Betriebsbereitschaft des fdtsds-Statusservers an-
# zuzeigen.
#
# Zweck:
# Diese Informationen können so in anderen Anwendungen, z.B. Einsatzführungssoftware oder Status-Frontend, 
# ausgewertet werden, um z.B. die Funktionsbereitschaft des Statusservers und der verbundenen FuGs zu monitoren.
#
# Copyright (C) 2014 Michael Kaden
#
# Dieses Programm ist freie Software. Sie können es unter Beachtung der Nutzungsbedingungen benutzen, 
# weitergeben und modifizieren.
# Die Veröffentlichung 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 FÜR EINEN 
# BESTIMMTEN ZWECK. 
###############################################################################################################

# Config-File einlesen
source /usr/local/smi/trx/etc/sds.conf

# eigenen Dateinamen bestimmen
myname=$(echo $0 | $awk -F/ '{ print $NF }')

# hole aktuellen Timestamp
now=$(date +%s)

# für alle konfigurierten Interfaces im Config-File 
k=1
while [ -n "$(eval echo '$'SdsTtyToBind_${k}_name)" ]; do
	device="$(eval echo '$'SdsTtyToBind_${k}_name)"

	# erzeuge ein assoziatives Array um die Statuswerte zu speichern
	declare -A status
	
	# erzeuge ein assoziatives Array um die JSON message zu speichern
	declare -A json

	# ISSI des an diesem Port angeschlossenen FuGs auslesen
	status["issi"]=$(cat "$rundir/$device.issi")
	
	# GSSI des an diesem Port angeschlossenen FuGs auslesen
	status["gssi"]=$(cat "$rundir/$device.gssi")
	
	# Start-GSSI des an diesem Port angeschlossenen FuGs auslesen
	status["start_gssi"]=$(cat "$rundir/$device.start_gssi")
	
	# OPTA des an diesem Port angeschlossenen FuGs auslesen
	status["opta"]=$(cat "$rundir/$device.opta")
	
	# signal strength (dBm) des an diesem Port angeschlossenen FuGs auslesen
	status["dBm"]=$(cat "$rundir/$device.signal_strength_dBm")
	
	# registration status des an diesem Port angeschlossenen FuGs auslesen
	status["reg"]=$(cat "$rundir/$device.registration_status")
	
	# location area des an diesem Port angeschlossenen FuGs auslesen
	status["LA"]=$(cat "$rundir/$device.location_area")
	
	# network identifier des an diesem Port angeschlossenen FuGs auslesen
	status["MNI"]=$(cat "$rundir/$device.network_identifier")
	
	# Zeitstempel der letzten Ausgabe des an diesem Port angeschlossenen FuGs auslesen
	status["ts"]=$(cat "$rundir/$device.last_vital")
	
	# Anzahl aller (Sub-)Prozesse bestimmen
	# pstree -u -p $(cat /usr/local/smi/trx/var/run/sds.motorola.tx.sds0.pid) | sed 's/)/)\n/g' | sed 's/^---//g'
	# find /usr/local/smi/trx/var/run/ -iname *.sds0.pid -exec bash -c 'pstree -A -u -p $(cat $0) | sed "s/)/)\n/g" | sed "s/^---//g"' {} \;
	
	# JSON Objekt für Monitor-Meldung erstellen
	log "$myname" "creating new monitor JSON object"
	message="{ \"host\": \"$host\", \"pub\": \"smi/trx/sds/monitor\", \"ts\": \"$now\", \"sys\": \"$SdsScriptName\", \"type\": \"monitor\", \"dev\": \"$device\", \"issi\": \"${status[issi]}\", \"gssi\": \"${status[gssi]}\", \"opta\": \"${status[opta]}\", \"rss\": \"${status[dBm]}\", \"reg\": \"${status[reg]}\", \"la\": \"${status[LA]]}\", \"mni\": \"${status[MNI]}\", \"lv\": \"${status[ts]}\" }"
	
	# erstelle Liste der Keys im JSON-Objekt
	keys=$(echo "$message" | $jq -r 'keys[]')
	
	# übernehme JSON-Objekt in Array
	for i in $keys; do json[${i}]=$(echo "$message" | $jq -r .${i}); done
	
	for i in $keys; do log "$myname" "  $i: ${json[${i}]}"; done
	
	# publiziere Monitor-Meldung mit MQTT für weitere Verarbeitung
	log "$myname" "publishing monitor JSON object on MQTT topic \"$(eval echo $SdsMqttMonitor)\""
	$mosquitto_pub -t "$(eval echo $SdsMqttMonitor)" -m "$message"
	
    if [ -n "${status["issi"]}" ]; then

		if [ -z "${status["gssi"]}" ]; then
			log "$myname" "lese gewählte Gruppe von Interface \"$device\""
			write_spooler "AT+CTGS?\r" "$SdsScriptName" $device
		fi
		
		if [ -z "${status["opta"]}" ]; then
			log "$myname" "lese OPTA von Interface \"$device\""
			write_spooler "AT+SIM=3\r" "$SdsScriptName" $device
		fi
		
		if ([ -n "${status["start_gssi"]}" ] && [ -n "${status["gssi"]}" ] && [ "${status["gssi"]}" != "${status["start_gssi"]}" ]); then
			log "$myname" "wechsle Gruppe zu GSSI ${status["start_gssi"]} auf \"$device\""
			write_spooler "AT+CTGS=1,${status["start_gssi"]}\r" "$SdsScriptName" $device
		fi
		
		log "$myname" "lese Signalqualität von Interface \"$device\""
		write_spooler "AT+CSQ?\r" "$SdsScriptName" $device
		
	else
	
		log "$myname" "lese MS Identität von Interface \"$device\""
		write_spooler "AT+CNUMF?\r" "$SdsScriptName" $device
		
	fi
	
	((k++))
	unset status
	unset json
	
done
