Runvdr

Материал из RuVDRWiki

Перейти к: навигация, поиск
#!/bin/bash
### BEGIN INIT INFO
# Provides: vdr
# Required-Start: $local_fs $syslog $networking
# Required-Stop:
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop vdr
# Description: start and stop Video Disk Recorder (vdr)
### END INIT INFO

#export LD_ASSUME_KERNEL=2.4.1

. /lib/lsb/init-functions 
export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
export NAME="vdr" 
export HOME="/tmp"

SELFPATH="$0"

OTHER_OPTS="-l3" # Опции, которые всегда будут передаваться VDR в независимости, что прописанно в /etc/vdr/config/vdr.conf (OTHER_OPTS=" ... " )
LOG="/dev/tty9"    
DVBDEVICE="all"  # Здесь можно прописать номер/а адаптера DVB -карты, которые должен использовать VDR. При "all" используются все доступные.
VDRTTY="10"
CODEPAGE="ISO-8859-15" # Переменная $CODEPAGE, которая содержит ISO-8859-15
SELFNAME=`basename $0` # Переменная $SELFNAME, которая содержит вывод команды (basename $0) внутри скрипта
VDRCONF=`expr "$SELFNAME" : '.*run\(vdr.*\)'`
VDRBIN=$VDRCONF
VIDEODIR="/var/lib/$VDRCONF/video.0" # Путь к каталогу video

if [ -e /etc/$VDRCONF/config/vdr.conf ]; then
    . /etc/$VDRCONF/config/vdr.conf
else
    log_warning_msg "$SELFNAME: no config file found, /etc/$VDRCONF/config/vdr.conf, can't start vdr"
	exit 0
fi

# В этом IF-блоке происходит проверка на существование файла /etc/$VDRCONF/config/vdr.conf, если его нет, то скрипт пишет об этом в лог и заканчивает работу.

export VDR_CHARSET_OVERRIDE=$CODEPAGE # 
export LC_ALL=en_US.utf8 # Этой командой устанавливается локализация, установка активна до следущего рестарта компьютера.

if [ x$START_VDR == x"no" ]; then
    log_warning_msg "Digital Videorecorder ($SELFNAME): DISABLED (START_VDR=no)"
    exit 0
fi 
# В этом IF-блоке проверяется строка START_VDR в файле /etc/vdr/config/vdr.conf. Если прописано no, то скрипт не стартует и заканчивает работу.

		  
DVBDEV=""
if [ $DVBDEVICE != "all" ]; then
  DVBDEV=" -D $DVBDEVICE"
fi 

BINDIR="/usr/bin"
CONFDIR="/etc/$VDRCONF" # Путь к конфигурационному каталогу VDR
PLUGINDIR="/usr/lib/$VDRBIN/plugins" # Путь к модулям расширения VDR

VDRPID=0

check_vdr() {
        PID=`ps auxw | grep "${VDRBIN}${DVBDEV} -L" | grep -v grep | awk '{ print $2 }'`
        if [ x"$PID" != "x" ]; then
                VDRPID=$PID
                return 1
        fi
        return 0
}
 
parse_plugins() {
        PLUGINS=""
        for PLUGIN in $PLUGINLIST; do
                if [ -f /etc/$VDRCONF/config/$PLUGIN.conf ]; then
                        . /etc/$VDRCONF/config/$PLUGIN.conf
                        PLUGINPARAM=$PARAM
                        PLUGINS="$PLUGINS -P'$PLUGIN $PLUGINPARAM'"
                else
                        PLUGINS="$PLUGINS -P$PLUGIN"
                fi
        done
	if [ x$USE_INTERNAL_IR == x"yes" ]; then
	   if [ x$INVERT_SIGNAL = x"yes" ]; then
           LOADKEYS_PARAM="-i"
           fi
           /usr/bin/av7110_loadkeys $LOADKEYS_PARAM $RCMAP > /proc/av7110_ir
           # add -Premote to $PLUGINS?
           PLUGINS="$PLUGINS -Premote"
	fi
		  
}

case "$1" in
        start)
                check_vdr
                if [ $? == 0 ]; then
                        echo -n "Attempting to start $SELFNAME "
                        nohup $SELFPATH up >> $LOG 2>&1 &
                        echo -n "."
                        sleep 1
                        echo -n "."
                        check_vdr
                        if [ $? == 0 ]; then
                                echo " FALSE"
                        log_failure_msg "something wrong, $SELFNAME has not started"
                               exit 1
                        else
                                echo " OK"
                        fi
                else
                log_warning_msg "$SELFNAME already running at PID $VDRPID"
                fi
                ;;
        up)
                #restore epg.data
                if [ -e $VIDEODIR/epg-$VDRCONF.data ]; then
                        cp $VIDEODIR/epg-$VDRCONF.data /tmp/
                fi

                #sleep 5 && if [ -x /usr/bin/vdradmind.pl ] ; then /usr/bin/vdradmind.pl ; fi
                umask 0002

                while (true) do
                        #reread configuration
                        if [ -e /etc/$VDRCONF/config/vdr.conf ]; then
                                . /etc/$VDRCONF/config/vdr.conf
                                #prepare plugins
                            parse_plugins
                        fi
                        #build vdr command
                        VDRCMD="$BINDIR/${VDRBIN}${DVBDEV} -L $PLUGINDIR $PLUGINS -v $VIDEODIR -c $CONFDIR -w 30 -E /tmp/epg-$VDRCONF.data"
                        VDRCMD="$VDRCMD -s $SHUTDOWNSCRIPT $OTHER_OPTS"

                        echo -n "Starting VDR at: "; date
                        eval $VDRCMD
                        RC=$?
                        echo "RC $RC"
                        if test $RC -eq 0; then
                                echo -n "Normal program exec at: " >>$LOG; date >>$LOG
                                exit $RC
                        elif test $RC -eq 1; then
                                echo -n "An error has been detected which requires the DVB driver and vdr to be reloaded at: " >>$LOG; date >>$LOG
                        elif test $RC -eq 2; then
                                echo -n "An non-recoverable error has been detected, vdr has given up at: " >>$LOG; date >>$LOG
                                exit $RC
                        elif test $RC -eq 137 -o $RC -eq 143; then
                                echo -n "VDR killed by user at: " >>$LOG; date >>$LOG
                                exit $RC
                        else
                                echo -n "Crash VDR at: " >>$LOG; date >>$LOG
                                sleep 1
                                echo "Restarting ...">>$LOG
                fi
                done
                ;;
        stop)
                check_vdr
                if [ $? == 0 ]; then
                        log_warning_msg "$SELFNAME not started"
                else
                        if [ -e /var/run/vdr.pid ]; then
                                PID=`cat /var/run/vdr.pid`
                                if [ x"$PID" != "x" ]; then
                                        kill -9 $PID
                                fi
                                rm -f /var/run/vdr.pid
                                #else
                                #echo "pid file not found"
                        fi
                        echo -n "Attempting to kill $SELFNAME "
                        kill $VDRPID 2>/dev/null
                        echo -n "."  
                        for ((j=0; $j<10; j=$j+1)); do
                                sleep 1
                                KILLDELAY=10
                                for ((i=0; $i<$KILLDELAY; i=$i+1)); do
                                        check_vdr
                                        if [ $? == 0 ]; then
                                                break
                                        fi

                                        if test $i -lt 7; then
                                                kill $VDRPID 2>/dev/null || break
                                        else
                                                kill -9 $VDRPID 2>/dev/null || break
                                        fi
                                        sleep 1; echo -n "."
                                done
                                check_vdr
                                if [ $? == 0 ]; then
                                        break
                                fi
                                echo -n "|" # next attempt
                        done
                        echo -n "."
                        check_vdr
                        if [ $? == 0 ]; then
                                echo " OK"
                        else
                                kill -9 $VDRPID 2>/dev/null
                                echo " FALSE"
                                exit 1
                        fi
                fi

                #if [ -x /usr/bin/vdradmind.pl ] ; then /usr/bin/vdradmind.pl -k ; fi

                #backup epg.data
                if [ -e /tmp/epg-$VDRCONF.data ]; then
                        cp /tmp/epg-$VDRCONF.data $VIDEODIR
                fi
                ;;

        check|status)
                check_vdr
                if [ $? == 0 ]; then
                        log_success_msg "$SELFNAME not started"
                        exit 1
                else
                        log_success_msg "$SELFNAME running at PID $VDRPID"
                fi
                ;;
        restart)
                check_vdr
                if [ $? == 0 ]; then
                        log_warning_msg "$SELFNAME not started"
                else
                        $SELFPATH stop
                fi
                $SELFPATH start
                ;;
        *)
                echo "Usage: $SELFNAME {start|stop|restart|check|status}" >&2
                exit 1
                ;;
esac

exit 0
Личные инструменты