#!/bin/bash
###############################################################################################################
# Titel: monitor
# Autor: Michael Kaden
# Datum: 14.09.2014
# 
# Funktion:
# Dieses Skript ist ein Teilprogramm von fdtpoc. Es wird mittels Cron-Job regelmäßig wiederholt ausgeführt. 
# Der Cron-Job wird beim Starten des Init-Skripts für "fdtpoc" erstellt und beim Beenden wieder entfernt.
# Es werden Kommandos an die "Alphapoc 1500" gesendet, um die Betriebsbereitschaft abzufragen. 
# Die Antworten werden durch "fdtpoc" in das fdtpoc-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 sds2db-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 POCSAG-Servers und der verbundenen Decoder 
# 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/poc.conf

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 '$'PocTtyToBind_${k}_name)" ]; do
	device="$(eval echo '$'PocTtyToBind_${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
	
	# Inode des Device-Files im MQTT "Control Stack" unter "/fdtpoc/anton/status/inode" auslesen
	#inode=$($timeoutbin 0.5 $mosquitto_sub -N -t "$skriptname/$interface/status/inode")
	#inode=$(cat "$rundir/$interface.inode")
	#$mosquitto_pub -t "$skriptname/$interface/status/inode" -m "$inode"
	
	#if [ ! "$inode" ]; then
		# Inode des Device-Files im MQTT "Control Stack" unter "/fdtpoc/anton/status/inode" speichern
		
		
	#Programm muss neu gestartet werden, wenn ein USB-Converter reconnected wurde
	#if [ "$inode" != "$(stat -L -c %i /dev/$interface)" ];then
		# Inode des Device-Files im MQTT "Control Stack" unter "/fdtpoc/anton/status/inode" speichern
	#	inode=$(stat -L -c %i /dev/$interface)
	#	$mosquitto_pub -t "$skriptname/$interface/status/inode" -m "$inode"
	#	echo $inode > "$rundir/$interface.inode"
	#	log "$myname" "Inode($inode) von \"$interface\" geändert! Neustart von $skriptname erforderlich!"
		#$initscript stop ; sleep 20; $initscript start
		#exit 1
	#else
		# Zeitstempel der letzten Ausgabe des Decoders aus dem MQTT "Control Stack" unter "/fdtpoc/anton/status/last_vital"	auslesen
		#timestamp=$($timeoutbin 0.5 $mosquitto_sub -N -t "$skriptname/$interface/status/last_vital")
		status["ts"]=$(cat "$rundir/$device.last_vital")
		
	# JSON Objekt für Monitor-Meldung erstellen
	log "$myname" "$PocScriptName" "creating monitor JSON object"
	message="{ \"host\": \"$host\", \"pub\": \"smi/trx/poc/monitor\", \"ts\": \"$now\", \"sys\": \"$PocScriptName\", \"type\": \"monitor\", \"dev\": \"$device\", \"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" "$PocScriptName" "  $i: ${json[${i}]}"; done
	
	# publiziere Monitor-Meldung mit MQTT für weitere Verarbeitung
	log "$myname" "$PocScriptName" "publishing monitor JSON object at MQTT topic \"$(eval echo $PocMqttMonitor)\""
	$mosquitto_pub -t "$(eval echo $PocMqttMonitor)" -m "$message"
	
	#write_spooler "AT\r" "$PocScriptName" $device
	#write_spooler "s" "$PocScriptName" $device
	
	#fi
	((k++))
	unset status
	unset json
	
done


