#! /bin/sh
#
# Revised by Mirakels in an attempt to fix camxng freezes...
# 1.51 hopefully fix service startup...
# 1.52 detect Amber enigma version or newer enigma versions
#
VERSION=1.52

if [ -x /var/bin/daemond ]; then
    CURR_VERSION=`echo $VERSION | tr -d '.'`
    VAR_VERSION=`grep ^VERSION= /var/bin/daemond | cut -d= -f2 | tr -d '.'`
    [ "$VAR_VERSION" -gt "$CURR_VERSION" ] && exec /var/bin/daemond
fi
echo "Emu daemon version $VERSION"

if grep -q Amber /.version ; then
    AMBER=1
else
    AMBER=0
fi

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 "Waiting for enigma"
    PID=""
    while [ -z "$PID" ] ; do
        let PID=`pidof enigma`
        sleep 1
    done
    echo "Enigma started"
}



check_service()
{
    S=$1
    echo "Check_service $S"
    if ! pidof $S 2>/dev/null ; then
        [ -f /tmp/cardinfo ]  && rm -f /tmp/cardinfo 
        if [ -x "$S" -o  -x "/bin/$S" -o -x "/sbin/$S" -o -x "/var/bin/$S" ] ; then
            # 
            # We know we have an executable program...
            #
            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 -o  "$S" = cardspider ; then
                $S
            else
                $S &
            fi
        fi
    fi
}



autozap()
{
    if [ $AMBER = 1 ] ; then
        CURRCHAN=`wget -O - -q http://root:dreambox@127.0.0.1/cgi-bin/streaminfo | grep '<!-- .*:-->' | sed 's/.*<!-- \(.*\)-->/\1/'`
    else
        CURRCHAN=`wget -O - -q http://root:dreambox@127.0.0.1/xml/streaminfo | grep '<reference>' | sed 's/.*<reference>\(.*\)<\/reference>/\1/'`
    fi
    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_force()
{
    # The busybox killall does not work for gbox and camd3
    D=${1:-gbox}
    echo "Killing $D"
    pids=`pidof $D`
    if [ -n "$pids" ] ; then
        kill $pids > /dev/null 2>&1
    fi
    # if still there
    pids=`pidof $D`
    if [ -n "$pids" ] ; then
        kill -9 $pids > /dev/null 2>&1
    fi
}
 

 
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 netpilot
    for d in camd3 scam rdgd xcamd gbox newcamd camxng emud mgcamd Camd netpilot ; do
	  echo "Killing $d in start_emu_daemon"
	  killall 2>/dev/null $d
	  [ "$d" = gbox -o "$d" = camd3 ] && kill_force $d
    done
    
    #
    # if 'none' we also kill the card servers and return
    #
    if [ "$DAEMONS" = none ] ; then
        for d in cardspider cardserver serverng ; do
            echo "Killing $d in start_emu_daemon"
            killall 2>/dev/null $d
        done
        return
    fi
    
    
    echo "usleep 150000"
    usleep 1500000
  
    for D in $DAEMONS ; do
        echo "D : $D"
        if ! pidof $D 2>/dev/null ; then
            # check if daemon $D exists
            if [ -e $D -o -e /bin/$D -o -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 -a -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
                $D &

#                PID=`pidof $D`
#                renice -10 -p $PID 

                if [ "$AUTOZAP" = 1 ] ; then
                    ( sleep 4; autozap ) &
                fi
            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
            if [ ! -e /dev/SCI0 ] ; then
                killall scam > /dev/null 2>&1
                ln -s sci0 /dev/SCI0
                ln -s sci1 /dev/SCI1
            fi
        fi

	for d in cardspider cardserver serverng ; do
            echo "Killing $d"
            killall $d 2>/dev/null
	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
}



#
# MAIN
#

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

start_emu_daemon none
kill_force gbox
grep ip= /proc/cmdline > /dev/null   &&   DHCP=disabled

while true ; do
    PREV=`cat 2>/dev/null /var/tmp/.prev`
    . /var/etc/rc.config
  
    echo "$EMU" >/var/tmp/.prev
    [ "$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 $EMU > /dev/null 2>&1
                     start_emu_daemon $EMU
                     ;;
            newcamd)
                     kill `cat /tmp/newcamd.pid > /dev/null 2>&1` > /dev/null 2>&1
                     start_emu_daemon newcamd
                     ;;
            gbox|camd3)
                     [ "$PREV" != "$EMU" ] && kill_force $EMU
                     start_emu_daemon $EMU
                     ;;
            scam|mgcamd)
                     killall $EMU > /dev/null 2>&1
                     start_emu_daemon $EMU
                     ;;
            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
                     /var/bin/netpilot localhost 666 888 &
                     ;;
            xcam) 
                     start_emu_daemon $EMU
                     ;;
            *)
                     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

#
# The End
#
