#!/bin/bash

### BEGIN INIT INFO
# Provides:          sds2db
# Required-Start:    autossh
# Required-Stop:     autossh
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: writes TETRA SDS into database
# Description:       writes TETRA SDS into database
### END INIT INFO

# Return values acc. to LSB for all commands but status:
# 0 - success
# 1 - misc error
# 2 - invalid or excess args
# 3 - unimplemented feature (e.g. reload)
# 4 - insufficient privilege
# 5 - program not installed
# 6 - program not configured
# 7 - program is not running
#
# Note that starting an already running service, stopping
# or restarting a not-running service as well as the restart
# with force-reload (in case signalling is not supported) are
# considered a success.

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

start_daemon()
{
    if !([ -e $pidfiledir/$skriptname.pid ]); then
	echo -n "Starting $skriptname... "
	# Start des Skripts im Logfile vermerken
	echo "$(date +"%b %d %H:%M:%S") $host $skriptname: --------------------------" >> $logfile
	echo "$(date +"%b %d %H:%M:%S") $host $skriptname: Start $skriptname begonnen" >> $logfile
	# Moxa serial device server starten
	#modprobe npreal2 ttymajor=33 calloutmajor=38 verbose=0  > /dev/null 2>&1
	#/usr/lib/npreal2/driver/mxloadsvr > /dev/null 2>&1

     # Prfen ob bentigte Binaries vorhanden sind
     test_if_exist=()
     test_if_exist+=($sttybin)
     test_if_exist+=($mysqlbin)
     test_if_exist+=($awkbin)
     test_if_exist+=($program)
     test_if_exist+=($inotifybin)
     test_if_exist+=($programdir/$readspooler)
     test_if_exist+=($programdir/$writespooler)
     test_if_exist+=($programdir/$inithelper)
     test_if_exist+=($programdir/$regular_run) 
     for i in "${!test_if_exist[@]}"; do
       if !([ -e "${test_if_exist[$i]}" ]); then
         echo "$(date +"%b %d %H:%M:%S") $host $skriptname: Stop! \"${test_if_exist[$i]}\" existiert nicht" >> $logfile
         echo "failed!"
         exit 1
       fi
     done
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: lsche Alive-Eintrge der FuGs aus DB" >> $logfile
     exec_mysql "DELETE FROM $db_radios_table where radio_hostname='$host'" > /dev/null 2>&1
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: lsche Alive-Eintrge des Servers aus DB" >> $logfile
     exec_mysql "DELETE FROM $db_servers_table where server_hostname='$host'" > /dev/null 2>&1
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: starte $skriptname" >> $logfile
     start-stop-daemon --start --quiet --pidfile $pidfiledir/$skriptname.pid --make-pidfile --background --exec  $program
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: starte write spooler" >> $logfile
     start-stop-daemon --start --quiet --pidfile $pidfiledir/$writespooler.pid --make-pidfile --background --exec  $programdir/$writespooler
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: erstelle Cronjob fr regular run skript" >> $logfile
     echo "*/1 *    * * *   root	$programdir/$regular_run >/dev/null 2>&1" > /etc/cron.d/$skriptname

     # fr alle seriellen Interfaces im configfile (serialdev_X)
     ret=0
     i=1
     while [ -n "$(eval echo '$'serialdev_$i)" ]; do
       # Initialisierungskommandos ausfhren
       echo "$(date +"%b %d %H:%M:%S") $host $skriptname: initialisiere serielle Schnittstelle \"$(eval echo '$'serialdev_$i)\"" >> $logfile
       j=1
       while [ -n "$(eval echo '$'serialdev_${i}_init_${j})" ]; do
	       $(eval echo '$'serialdev_${i}_init_${j}) > /dev/null 2>&1
	       ret=$?
	       # ein fehlgeschlagenes Initialisierungskommando wird einmal wiederholt (weil stty nach einem Rechner-Neustart beim 1. Aufruf fehlschlgt)
	       if [ "$ret" -ne 0 ];then
		       $(eval echo '$'serialdev_${i}_init_${j}) > /dev/null 2>&1
		       ret=$?
	       fi
	       ret_serialinit=$(($ret_serialinit+$ret))
	       ((j++))
       done
                 
       # Wenn Initialisierung nicht erfolgreich war
       if (( "$ret_serialinit" != 0 )); then
       # Fehlermeldung ins Logfile schreiben und Skript beenden
         echo "$(date +"%b %d %H:%M:%S") $host $skriptname: Stop! \"$(eval echo '$'serialdev_$i)\" kann nicht initialisiert werden" >> $logfile
         echo "failed!"
	 stop_deamon
         exit 1
       fi
       ((i++))
     done
     # userdefinierbare Initialisierungskommandos ausfhren
     ret=0
     l=1
     while [ -n "$(eval echo '$'userinit_${l})" ]; do
	       cmd_userinit=$(eval echo '$'userinit_${l} | $awkbin -F[ '{ print $1 }')
	       log_userinit=$(eval echo '$'userinit_${l} | sed -n -e 's/.*\[\(.*\)]/\1/p')
	       echo "$(date +"%b %d %H:%M:%S") $host $skriptname: $log_userinit" >> $logfile
       	       # debug
	       #echo "\$userinit_${l}: $cmd_userinit" >> $logfile
	       $cmd_userinit > /dev/null 2>&1
	       ret=$? 
	       ret_userinit=$(($ret_userinit+$ret))
	       ((l++))
     done
     # Wenn Initialisierung nicht erfolgreich war
     if (( "$ret_userinit" != 0 )); then
       # Fehlermeldung ins Logfile schreiben und Skript beenden
       echo "$(date +"%b %d %H:%M:%S") $host $skriptname: Stop! Userdefinierbares Init-Kommando fehlgeschlagen" >> $logfile
       echo "failed!"
       stop_deamon
       exit 1
     fi
     # Readspooler auf jedem konfigurierten Interface starten
     for runVAR in $ttyToListenTo; do
       echo "$(date +"%b %d %H:%M:%S") $host $skriptname: starte read spooler auf \"$runVAR\"" >> $logfile
       cp $programdir/$readspooler $runfiledir/$readspooler.$runVAR
       start-stop-daemon --start --quiet --pidfile $pidfiledir/$readspooler.pid.$runVAR --make-pidfile --background --exec  $runfiledir/$readspooler.$runVAR 
       $($programdir/$inithelper $runVAR)
       echo "$(date +"%b %d %H:%M:%S") $host $skriptname: konfiguriere Logfile-Rotation fr \"$logfile.$runVAR\"" >> $logfile
       cat > /etc/logrotate.d/$runVAR << EOF
$logfile.$runVAR {
	daily
	rotate 7
	copytruncate
	delaycompress
	compress
	notifempty
	missingok
}
EOF
       
     done
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: Start $skriptname abgeschlossen" >> $logfile
     echo "done!"
   else
     echo "A copy of the daemon is still running.  If you just stopped it,"
     echo "please wait for it to shut down."
     exit 1
   fi
}

stop_deamon()
{
     echo -n "Stopping $skriptname... "
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: --------------------------" >> $logfile
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: Stop $skriptname begonnen" >> $logfile
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: beende write spooler" >> $logfile
     if [ -e $pidfiledir/$writespooler.pid ]; then
       for k in $(pstree -p $(cat $pidfiledir/$writespooler.pid) | sed 's/(/\n(/g' | grep '(' | sed 's/(\(.*\)).*/\1/' | tr "\n" " "); do
         kill $k > /dev/null 2>&1
       done
       echo "$(date +"%b %d %H:%M:%S") $host $skriptname: lsche PID-File $pidfiledir/$writespooler.pid" >> $logfile
       rm -f $pidfiledir/$writespooler.pid
     fi
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: lsche write spooler Dateien" >> $logfile
     rm -f $writespooldir/*
     
     for i in $(ls $pidfiledir/$readspooler.pid* 2> /dev/null); do
       echo "$(date +"%b %d %H:%M:%S") $host $skriptname: beende read spooler auf \"$(echo $i |$awkbin -F. '{ print $NF }')\"" >> $logfile
       start-stop-daemon --stop --quiet --pidfile $i > /dev/null 2>&1
       rm -f $runfiledir/$readspooler.$(echo $i |$awkbin -F. '{ print $NF }')
       echo "$(date +"%b %d %H:%M:%S") $host $skriptname: lsche PID-File $i" >> $logfile
       rm -f $i
       echo "$(date +"%b %d %H:%M:%S") $host $skriptname: lsche FuG-Identity-File $runfiledir/$(echo $i |$awkbin -F. '{ print $NF }')" >> $logfile
       rm -f $runfiledir/$(echo $i |$awkbin -F. '{ print $NF }')
     done
         
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: beende $skriptname" >> $logfile
     if [ -e $pidfiledir/$skriptname.pid ]; then
       for k in $(pstree -p $(cat $pidfiledir/$skriptname.pid) | sed 's/(/\n(/g' | grep '(' | sed 's/(\(.*\)).*/\1/' | tr "\n" " "); do
         kill $k > /dev/null 2>&1
       done
       echo "$(date +"%b %d %H:%M:%S") $host $skriptname: lsche PID-File $pidfiledir/$skriptname.pid" >> $logfile
       rm -f $pidfiledir/$skriptname.pid
     fi
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: lsche read spooler Dateien" >> $logfile
     rm -f $readspooldir/*
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: lsche Cronjob fr regular run skript" >> $logfile
     if [ -e /etc/cron.d/$skriptname ]; then
       rm -f /etc/cron.d/$skriptname
     fi
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: lsche Alive-Eintrge der FuGs aus DB" >> $logfile
     exec_mysql "DELETE FROM $db_radios_table where radio_hostname='$host'" > /dev/null 2>&1
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: lsche Alive-Eintrge des Servers aus DB" >> $logfile
     exec_mysql "DELETE FROM $db_servers_table where server_hostname='$host'" > /dev/null 2>&1
     echo "$(date +"%b %d %H:%M:%S") $host $skriptname: Stop $skriptname abgeschlossen" >> $logfile
     echo "done!"
 }

case "$1" in
  start)
    start_daemon
  ;;
  stop)
    stop_deamon
  ;;
  restart)
     stop_deamon
     start_daemon
  ;;
  *)
     echo "Usage: $0 {start|stop|restart}" >&2
     exit 1
esac
exit 0
