#!/bin/bash
###############################################################################################################
# Titel: regular.run
# Autor: Michael Kaden
# Datum: 14.09.2014
# 
# Funktion:
# Dieses Skript ist ein Teilprogramm von fdtsms. Es wird mittels Cron-Job regelmäßig wiederholt ausgeführt. 
# Der Cron-Job wird beim Starten des Init-Skripts für "fdtsms" erstellt und beim Beenden wieder entfernt.
# Es dient dazu, die Betriebsbereitschaft des Servers und des Programms anzuzeigen. Dafür wird ein
# "Alive"-Eintrag des Modems und dieses Programms in einer Datenbanktabelle aufgefrischt.
#
# Zweck:
# Diese Informationen können so in anderen Anwendungen, z.B. Einsatzführungssoftware oder Status-Frontend, 
# ausgewertet werden, um z.B. die Funktionsbereitschaft des Servers und des verbundenen GSM-Modems zu monitoren.
#
# Copyright (C) 2016 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/sms.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 '$'SmsTtyToBind_${k}_name)" ]; do
	device="$(eval echo '$'SmsTtyToBind_${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

	# Nummer des an diesem Port angeschlossenen GSM-Modems auslesen
	status["num"]=$(cat "$rundir/$device.own_number")
	#status["toa"]=$(cat "$rundir/$device.toa")
	
	# Signalqualtität des an diesem Port angeschlossenen GSM-Modems auslesen
	status["dbm"]=$(cat "$rundir/$device.signal_strength_dBm")
	
	# registration_status des an diesem Port angeschlossenen GSM-Modems auslesen
	status["reg"]=$(cat "$rundir/$device.registration_status")
	
	# network_operator des an diesem Port angeschlossenen GSM-Modems auslesen
	status["op"]=$(cat "$rundir/$device.network_operator")
		
	# Zeitstempel der letzten Ausgabe des an diesem Port angeschlossenen GSM-Modems auslesen
	status["ts"]=$(cat "$rundir/$device.last_vital")
	
	# JSON Objekt für Monitor-Meldung erstellen	
	log "$myname" "creating monitor JSON object"
	message="{ \"host\": \"$host\", \"pub\": \"smi/trx/sms/monitor\", \"ts\": \"$now\", \"sys\": \"$SmsScriptName\", \"type\": \"monitor\", \"dev\": \"$device\", \"on\": \"${status[num]}\", \"rss\": \"${status[dbm]}\", \"reg\": \"${status[reg]}\", \"op\": \"${status[op]}\", \"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
	
	# write the array content into the logfile
	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 at MQTT topic \"$(eval echo $SmsMqttMonitor)\""
	$mosquitto_pub -t "$(eval echo $SmsMqttMonitor)" -m "$message"
	
	if [ -z "${status["num"]}" ]; then
		log "$myname" "request subscriber number from interface \"$device\""
		write_spooler "AT+CNUM\r" $device
		waitForOk "AT+CNUM"
	fi
	
	log "$myname" "request signal quality and registration status from interface \"$device\""
	write_spooler "AT+CREG?\r" $device
	waitForOk "AT+CREG?"
	write_spooler "AT+CSQ\r" $device
	waitForOk "AT+CSQ"
	
	((k++))
	unset status
	
done
