#!/bin/sh
#
# copyright Juergen Schmidt, c't magazin
#
# Licence: GPL
#
# call  ./runvdr [vdr-dir] [port1] [port2] [port3]
#


# Variablen
VIDEO=/video
TVDIR=/usr/src/tv
CFG=/etc/vdr

VDRDIR=${1:-$TVDIR/VDR}
PORT1=${2:-2001}
PORT2=${3:-2002}
PORT3=${4:-2003}

VDRPRG="$VDRDIR/vdr"
DVBDIR="$TVDIR/DVB/driver"

VDR1CMD="$VDRPRG -d -w 60 -p $PORT1 -D 2 -v $VIDEO -c $CFG/vdr1"
VDR2CMD="$VDRPRG -d -w 60 -p $PORT2 -D 1 -v $VIDEO -c $CFG/vdr2"
VDR3CMD="$VDRPRG -d -w 60 -p $PORT3 -D 0 -v $VIDEO -c $CFG/vdr3"

ALIVE1="/bin/fuser -sn tcp $PORT1"
ALIVE2="/bin/fuser -sn tcp $PORT2"
ALIVE3="/bin/fuser -sn tcp $PORT3"

# alternatives
#ALIVE1="echo 'quit' | nc localhost $PORT1" 
#ALIVE1="/bin/fuser -sn file /dev/ost/frontend0"


echo "=================="
echo " external Restart "
echo "=================="

# Endlos-Schleife
while (true) do
      echo "--------------"
      echo -n "Starting VDR: "; date
      # sind die Treiber bereits geladen?
      LSMOD="`/sbin/lsmod | grep -w '^dvb' | wc -l`"
      if [ $LSMOD -eq 0 ] ; then
	echo "Loading DVB drivers"
	(cd $DVBDIR; make insmod) > /dev/null 2>&1
      fi
      $VDR1CMD; $VDR2CMD; $VDR3CMD 
      sleep 30

      RESTART=0

      while [ $RESTART -eq 0 ] ; do

	sleep 30

	if ( ! $ALIVE1 ) ; then
	    echo -n "VDR 1 died (restarting): "; date
	    # try to restart process
	    $VDR1CMD
	    sleep 5
	    if ( ! $ALIVE1 ) ; then
		RESTART=1
		echo "Restart failed - shutting down"
	    fi
	fi

	if ( ! $ALIVE2 && [ $RESTART -eq 0 ] ) ; then
	    echo -n "VDR 2 died (restarting): "; date
	    $VDR2CMD
	    sleep 5
	    if ( ! $ALIVE2 ) ; then
		RESTART=1
		echo "Restart failed - shutting down"
	    fi
	fi

	if ( ! $ALIVE3 && [ $RESTART -eq 0 ] ) ; then
	    echo -n "VDR 3 died (restarting): "; date
	    $VDR3CMD
	    sleep 5
	    if ( ! $ALIVE3 ) ; then
		RESTART=1
		echo "Restart failed - shutting down"
	    fi
	    tail -50 /var/log/vdr.log | grep -q 'ERROR: video data stream broken'
	    if [ $? -eq 0 ] ; then
	    	RESTART=1
		echo "Broken video stream - shutting down"
	    fi	
	fi

	if [ $RESTART -eq 1 ] ; then
	    echo "- - - - - - - -"
	    echo -n "VDR died: "; date
	    # some informations for debugging purposes
	    /bin/fuser -vn tcp $PORT1 $PORT2 $PORT3
	    # ps auxw | grep vdr
	    dmesg | grep dvb | tail -4
	    killall -TERM vdr
	    sleep 5
	    killall -9 vdr
	    (cd $DVBDIR; make rmmod) > /dev/null 2>&1
	fi
    done
done
