#! /bin/sh
VERSION=1.43

if [ -x /var/bin/daemond ]; then
  CURR_VERSION=`echo $VERSION |sed -e 's/\.//'`
  eval `grep ^VERSION= /var/bin/daemond`
  VAR_VERSION=`echo $VERSION |sed -e 's/\.//'`
  [ "$VAR_VERSION" -gt "$CURR_VERSION" ] && exec /var/bin/daemond
fi
echo "Emu daemon version $CURR_VERSION"

STARTEMU=1
STARTSERVER=1

[ -e /var/etc/rc.config ] && . /var/etc/rc.config || . /var_init/etc/rc.config

PATH=/usr/bin:/var/bin:/bin:/sbin

wait_for_enigma()
{
	echo "Wait for enigma"
	PID=0
	while [ $PID -lt 10 ] ; do
		let PID=`ps ax | grep /bin/enigma | grep -v grep | awk '{ print $1}'` > /dev/null 2>&1
	done
	echo "Enigma started"
}

check_service()
{
    S=$1
    echo "Check_service $S"
    killall 2>/dev/null -0 $S || {

        rm -f /tmp/cardinfo

        if [ -x "$S" -o  -x "/bin/$S" -o -x "/sbin/$S" -o -x "/var/bin/$S" ] ; then
            echo "Starting $S"
            wget -O /tmp/daemonmsg.temp -q "http://root:dreambox@127.0.0.1/cgi-bin/xmessage?timeout=2&caption=daemond&body=Starting+$S."


            if [ "$S" = cardserver -a -x /var/bin/cardserver ] ; then
                eval "$@"
            elif [ "$S" = cardspider -a -x /var/bin/cardspider ] ; then
                eval "$@"
            else
                eval "$@" &
            fi
        fi
    }
}

autozap()
{
	CURRCHAN=`wget -O - -q http://root:dreambox@127.0.0.1/cgi-bin/streaminfo | grep '<!-- .*:-->' | sed 's/.*<!-- \(.*\)-->/\1/'`
	wget -O /tmp/goepg.temp -q "http://root:dreambox@127.0.0.1/cgi-bin/rc?1"
	wget -O /tmp/goepg.temp -q http://root:dreambox@127.0.0.1/cgi-bin/zapTo?path=$CURRCHAN
}

kill_gbox()
{
  # The busybox killall does not work for gbox
  echo "Killing gbox"
  ps |grep -v grep |grep gbox |while read x
  do
    set $x
    [ "$5" = gbox ] && kill $1 > /dev/null 2>&1
  done
}
 
start_emu_daemon()
{
  DAEMONS="$*"
  #wget -O /tmp/daemonmsg.temp -q "http://root:dreambox@127.0.0.1/cgi-bin/xmessage?timeout=2&caption=daemond&body=Killing+Daemons."
  echo "Killing daemons"
  for d in wdog scam rdgd xcamd gbox newcamd camxng emud mgcamd Camd camd3 dccamd
  do
		echo "Killing $d in start_emu_daemon"
		killall 2>/dev/null $d
		[ "$d" = gbox ] && kill_gbox
  done
  [ "$DAEMONS" = none ] && {
     for d in cardspider cardserver serverng
	  do
		 [ "`echo $DAEMONS |grep $d`" = "" ] && {
			echo "Killing $d"
			killall 2>/dev/null $d
		 }
	  done
     return
  }
  echo "usleep 150000"
  usleep 1500000
  
  for D in $DAEMONS
  do
   echo "D : $D"
	killall 2>/dev/null -0 $D || {
	# check if daemon $D exists
	if [ -e $D ] || [ -e /bin/$D ] || [ -e /var/bin/$D ] ; then 
		echo "Starting $D"
		# some users copy a new version of an emu to the DB but forget to set permissions
		chmod 755 /var/bin/$D  
		wget -O /tmp/daemonmsg.temp -q "http://root:dreambox@127.0.0.1/cgi-bin/xmessage?timeout=2&caption=daemond&body=Starting+$D."
		if [ "$D" = newcamd ] && [ -e /var/bin/newcamd ]; then 
			rm -f /tmp/camd.socket
			if [ -e /tmp/spider_error ] ; then
				wget -O /tmp/daemonmsg.temp -q "http://root:dreambox@127.0.0.1/cgi-bin/xmessage?timeout=3&caption=daemond&body=There_was_an_error_starting_cardspider."
			fi
		fi 
		if [ "$D" = camxng ] ; then
			eval wdog $D &
		else
			eval $D &
		fi

		PID=`ps ax | grep $D | grep -v grep | awk '
			BEGIN { }
				{ print $1}

			END { }'`
			renice -10 -p $PID 

		if [ "$AUTOZAP" = 1 ] ; then
			( sleep 4; autozap ) &
		fi
	fi
	}
  done
}

start_stop_services()
{
	if [ "$STARTSERVER" = 1 ] ; then
		STARTSERVER=0
		rm -f /tmp/sc_info?
		killall Camd
		rm -f /var/bin/Camd
		killall wdog
		if [ "$CS_SERVER" = enabled ]; then
			[ -e /dev/SCI0 ] && killall scam > /dev/null 2>&1
			rm -f /dev/SCI0 /dev/SCI1
		else
			[ ! -e /dev/SCI0 ] && {
				killall scam > /dev/null 2>&1
				ln -s sci0 /dev/SCI0
				ln -s sci1 /dev/SCI1
			}
	  	fi

		for d in cardspider cardserver serverng
		do
			[ "`echo $DAEMONS |grep $d`" = "" ] && {
				echo "Killing $d"
				killall 2>/dev/null $d
			}
		done

		wait_for_enigma

		[ "$NEWCAMD_CS_SERVER" = enabled ] && check_service cardserver || killall cardserver > /dev/null 2>&1
		[ "$CAMX_CS_SERVER" = enabled ] && check_service serverng || killall serverng > /dev/null 2>&1
	fi
	
	[ "$CARDSPIDER" = enabled ] && check_service cardspider || killall cardspider > /dev/null 2>&1
}

trap "start_emu_daemon none ; exit" 0 1 2 3 15

start_emu_daemon none
kill_gbox

while :
do
  PREV=`cat 2>/dev/null /var/tmp/.prev`
  . /var/etc/rc.config
  
  echo "$EMU" >/var/tmp/.prev
  [ "`grep ip= /proc/cmdline`" != "" ] && DHCP=disabled
  [ "$EMU" = rdgd -o "$EMU" = radegast ] && CS_SERVER=disabled
  start_stop_services
  
  if [ "$STARTEMU" = 1 ] ; then
     STARTEMU=0
	  case "$EMU" in
		 camxng)
			killall wdog > /dev/null 2>&1
			killall camxng > /dev/null 2>&1
			start_emu_daemon camxng
			;;
		 newcamd)
			kill `cat /tmp/newcamd.pid > /dev/null 2>&1` > /dev/null 2>&1
			start_emu_daemon newcamd
			;;
		 gbox)
			[ "$PREV" != "$EMU" ] && kill_gbox
			start_emu_daemon gbox
			;;
		 scam)
			killall scam > /dev/null 2>&1
			start_emu_daemon scam
			;;
		 rdgd|radegast)
			[ -x /var/bin/camd.radegast ] && ln -sf /var/bin/camd.radegast /var/bin/Camd || ln -sf /bin/camd.radegast /var/bin/Camd 
			start_emu_daemon rdgd emud
			;;
		 xcam)
			start_emu_daemon xcamd
			;;
		 mgcamd)
			killall mgcamd > /dev/null 2>&1
			start_emu_daemon mgcamd
			;;
         	 camd3)
         	        killall camd3 > /dev/null 2>&1
         	        start_emu_daemon camd3
         	        ;;
         	dccamd)
         	        killall dccamd > /dev/null 2>&1
         	        start_emu_daemon dccamd
         	        ;;       		    
		 *)
			start_emu_daemon none
			;;
	  esac
  fi	
  sleep 2592000 # Sleep 30 days, sleep is killed by emu plugin

  	# sleep has been killed so start over again, now check if cardserver has to be started
	if [ -e /tmp/startserver ] ; then
		rm -f /tmp/startserver
		STARTSERVER=1
	fi
	if [ -e /tmp/startemu ] ; then
		rm -f /tmp/startemu
		STARTEMU=1
	fi

done
