#!/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

myname=$(echo $0 | $awkbin -F/ '{ print $NF }')

start_daemon()
{
    if [ ! -e $runfiledir/$skriptname.pid ]; then
	echo -n "Starting $skriptname... "
	# Start des Skripts im Logfile vermerken
	log "$myname" "---------------------"
	log "$myname" "Start $skriptname begonnen"

     # 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
         log "$myname" "Stop! \"${test_if_exist[$i]}\" existiert nicht"
         echo "failed!"
         exit 5
       fi
     done
     log "$myname" "lsche Alive-Eintrge der FuGs aus DB"
     exec_mysql "DELETE FROM $db_radios_table where radio_hostname='$host'" > /dev/null 2>&1
     log "$myname" "lsche Alive-Eintrge des Servers aus DB"
     exec_mysql "DELETE FROM $db_servers_table where server_hostname='$host'" > /dev/null 2>&1
     log "$myname" "starte $skriptname"
     start-stop-daemon --start --quiet --pidfile $runfiledir/$skriptname.pid --make-pidfile --background --exec  $program
     if [ ! -e $logrotatedir/$skriptname ]; then
       log "$myname" "konfiguriere Logfile-Rotation fr \"$logdir\""
       cat > "$logrotatedir/$skriptname" << EOF
$logdir/*.log {
	daily
	rotate 7
	copytruncate
	delaycompress
	compress
	notifempty
	missingok
}
EOF
     fi
     log "$myname" "starte Write-Spooler"
     start-stop-daemon --start --quiet --pidfile "$runfiledir/$writespooler.pid" --make-pidfile --background --exec  "$programdir/$writespooler"
     log "$myname" "erstelle Cronjob fr regular run skript"
     echo "*/1 *    * * *   root	$programdir/$regular_run >/dev/null 2>&1" > "$crondir/$skriptname"

     # fr alle seriellen Interfaces im configfile (serialdev_X)
     ret=0
     ret_serialinit=0
     i=1
     while [ -n "$(eval echo '$'serialdev_$i)" ]; do
       # Initialisierungskommandos ausfhren
       log "$myname" "initialisiere serielle Schnittstelle \"$(eval echo '$'serialdev_$i)\""
       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
         log "$myname" "Stop! \"$(eval echo '$'serialdev_$i)\" kann nicht initialisiert werden"
         echo "failed!"
	 stop_daemon
         exit 1
       fi
       ((i++))
     done
     # userdefinierbare Initialisierungskommandos ausfhren
     ret=0
     ret_userinit=0
     l=1
     while [ -n "$(eval echo '$'userinit_${l})" ]; do
	      log "$myname" "ausfren von \"$(eval echo '$'userinit_${l}) start\""
       	      # debug
	      #echo "\$userinit_${l}: $cmd_userinit" >> $logfile
	      "$(eval echo '$'userinit_${l})" start > /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
       log "$myname" "Stop! Userdefinierbares Init-Kommando fehlgeschlagen"
       echo "failed!"
       stop_daemon
       exit 1
     fi
     # Whitelist-Directories erstellen und Whitelist-Eintrge laden
     if ([ -e "$recv_whitelist_confdir" ] && [ -n "$use_recv_issi_whitelist" ]); then
	     if !([ -e "$recv_whitelist_rundir" ]); then
		     log "$myname" "erstelle Empfangs-Whitelist-Verzeichnis \"$recv_whitelist_rundir\""
		     mkdir -p "$recv_whitelist_rundir"
     	     fi
	     for file in $(find $recv_whitelist_confdir -maxdepth 1 -xtype f); do
	     log "$myname" "lade Empfangs-Whitelist-Eintrge aus \"$file\""
	     	while read -r line; do
		     touch "$recv_whitelist_rundir/$(echo $line | awk -F: '{ print $1 }')"
	     	done < "$file"
	     done
     fi

     # Readspooler auf jedem konfigurierten Interface starten
     for runVAR in $ttyToListenTo; do
       log "$myname" "starte Read-Spooler auf \"$runVAR\""
       cp "$programdir/$readspooler" "$runfiledir/$readspooler.$runVAR"
       start-stop-daemon --start --quiet --pidfile "$runfiledir/$readspooler.$runVAR.pid" --make-pidfile --background --exec  "$runfiledir/$readspooler.$runVAR"
       log "$myname" "ausfhren von \"$programdir/$inithelper start $runVAR\""
       "$programdir/$inithelper" start $runVAR &
     done
     log "$myname" "Start $skriptname abgeschlossen"
     log "$myname" "--------------------------"
     echo "done!"
   else
     echo "Daemon is still running! Nothing to do."
   fi
}

stop_daemon()
{
     echo -n "Stopping $skriptname... "
     log "$myname" "--------------------"
     log "$myname" "Stop $skriptname begonnen"

     # Schnittstelleninitialisierungsskript mit "stop" ausfhren
     for runVAR in $ttyToListenTo; do
	     log "$myname" "ausfhren von \"$programdir/$inithelper stop $runVAR\""
	     "$programdir/$inithelper" stop $runVAR
     done

     # Write-Spooler beenden
     if [ -e "$runfiledir/$writespooler.pid" ]; then
       pid=$(cat "$runfiledir/$writespooler.pid")
       log "$myname" "beende Write-Spooler mit PID \"$pid\""
       for k in $(pstree -p $(echo $pid) | sed 's/(/\n(/g' | grep '(' | sed 's/(\(.*\)).*/\1/' | tr "\n" " "); do
         kill $k > /dev/null 2>&1
       done
       log "$myname" "lsche PID-File \"$runfiledir/$writespooler.pid\""
       rm -f "$runfiledir/$writespooler.pid"
     fi
     log "$myname" "lsche  verbliebene Write-Spooler Dateien"
     for file in $(ls $writespooldir); do
       rm -f "$writespooldir/$file"
     done
     
     # Read-Spooler auf allen konfigurierten Interfaces beenden
     for runVAR in $ttyToListenTo; do
       if [ -e "$runfiledir/$readspooler.$runVAR.pid" ]; then
	 pid=$(cat "$runfiledir/$readspooler.$runVAR.pid")
	 log "$myname" "beende Read-Spooler auf $runVAR mit PID \"$pid\""
         start-stop-daemon --stop --quiet --pidfile "$runfiledir/$readspooler.$runVAR.pid" > /dev/null 2>&1
         rm -f "$runfiledir/$readspooler.$runVAR"
         log "$myname" "lsche PID-File \"$runfiledir/$readspooler.$runVAR.pid\""
         rm -f "$runfiledir/$readspooler.$runVAR.pid"
       fi
       if [ -e "$runfiledir/$runVAR.issi" ]; then
         log "$myname" "lsche FuG-Identity-File \"$runfiledir/$runVAR.issi\""
         rm -f "$runfiledir/$runVAR.issi"
       fi
       if [ -e "$runfiledir/$runVAR.gssi" ]; then
         log "$myname" "lsche FuG-Group-File \"$runfiledir/$runVAR.gssi\""
         rm -f "$runfiledir/$runVAR.gssi"
       fi
       if [ -e "$runfiledir/$runVAR.opta" ]; then
         log "$myname" "lsche FuG-OPTA-File \"$runfiledir/$runVAR.opta\""
         rm -f "$runfiledir/$runVAR.opta"
       fi
     done
         
     # Hauptprogramm beenden
     if [ -e "$runfiledir/$skriptname.pid" ]; then
       pid=$(cat "$runfiledir/$skriptname.pid")
       log "$myname" "beende $skriptname mit PID \"$pid\""
       for k in $(pstree -p $(echo $pid) | sed 's/(/\n(/g' | grep '(' | sed 's/(\(.*\)).*/\1/' | tr "\n" " "); do
         kill $k > /dev/null 2>&1
       done
       log "$myname" "lsche PID-File \"$runfiledir/$skriptname.pid\""
       rm -f "$runfiledir/$skriptname.pid"
     fi
     log "$myname" "lsche verbliebene Read-Spooler Dateien"
     for file in $(ls $readspooldir); do
       rm -f "$readspooldir/$file"
     done

     # Cronjob lschen, der beim Starten angelegt wurde
     log "$myname" "lsche Cronjob fr regular run skript"
     if [ -e "$crondir/$skriptname" ]; then
       rm -f "$crondir/$skriptname"
     fi

     # Whitelist-Verzeichnis lschen
     if [ -e "$recv_whitelist_rundir" ]; then
	     log "$myname" "lsche Whitelist-Verzeichnis \"$recv_whitelist_rundir\""
	     rm -rf "$recv_whitelist_rundir"
     fi

     # userdefinierbares Init-Skript beim Stop ausfhren
     l=1
     while [ -n "$(eval echo '$'userinit_${l})" ]; do
	     log "$myname" "ausfhren von \"$(eval echo '$'userinit_${l}) stop\""
	     "$(eval echo '$'userinit_${l})" stop > /dev/null 2>&1
	     ((l++))
     done

     # Alive-Eintrge aus DB lschen
     log "$myname" "lsche Alive-Eintrge der FuGs aus DB"
     exec_mysql "DELETE FROM $db_radios_table where radio_hostname='$host'" > /dev/null 2>&1
     log "$myname" "lsche Alive-Eintrge des Servers aus DB"
     exec_mysql "DELETE FROM $db_servers_table where server_hostname='$host'" > /dev/null 2>&1
     log "$myname" "Stop $skriptname abgeschlossen"
     log "$myname" "-------------------------"
     echo "done!"

 # Daemon is not running! Nothing to do.
 }

 status_daemon(){
	 if [ -e $runfiledir/$skriptname.pid ]; then
		 echo "Daemon is running with PID $(cat "$runfiledir/$skriptname.pid")"
	 else
		 echo "Daemon is not running"
		 exit 7
	 fi
 }

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