Hallo,
ich habe mal ein Skript geschrieben um Timer vom Client zum Server zu verschieben. Bei mir gibt es dazu einen cron Eintrag der jede Minute nach neuen lokalen Timern schaut ("* * * * * /var/lib/vdr/record_on_server.sh"). Der lokale root User braucht dazu ssh Zugriff auf den Aufnahme Server (ohne Password), am einfachsten einen key erzeugen ("ssh-keygen -t dsa") und den Inhalt der Datei id_dsa.pub auf dem Server in die .ssh/authorized_keys eintragen. Die Variablen $testcheck und $testdir wurden nur eingebaut um Aufnahmen von einem Sender testweise in ein anderes Unterverzeichnis zu legen.
Damit die Anzahl der Aufnahmen kalkuliert werden kann, muß man die Anzahl der vorhanden DVB Karten angeben (bei mir 2 DVBS):
typeset -i DVBS=2
typeset -i DVBC=0
typeset -i DVBT=0
Das Paket etherwake muß installiert sein ("apt-get install etherwake")
$ETHDEV ist das Interface vom Client
$PORT ist der Port den svdrsend.pl nutzt
$REMOTEPC der Name des Servers
$WAKEUPMAC Macadresse(n) des Servers
$maxtransponder gibt an wieviele Aufnahme mit einer DVB Karte gemacht werden können, wenn der Transponder des Sender identisch ist
#!/bin/bash
# Script: /var/lib/vdr/record_on_server.sh
ETHDEV="eth0"
SVDRCMD="/usr/lib/vdr/svdrpsend.pl"
PORT="2001"
REMOTEPC="vdrserver"
LOCALPC="`hostname`"
testcheck="XYZ"
testdir="TEST"
WAKEUPMAC="90:E6:4A:1D:0F:CF 90:E6:5A:01:0F:A2"
typeset -i DVBS=2
typeset -i DVBC=0
typeset -i DVBT=0
typeset -i localcount=0
typeset -i maxrecordings=0
typeset -i maxtransponder=1
typeset -i moveonserver=0
/usr/bin/touch /srv/vdr/video.00/.update
/usr/bin/touch /srv/vdr/video.00/SERVER/.update
if [ "`ps -ef | grep -v grep | grep 'xbmc'`" != "" ];then
echo "xbmc is running ..."
exit 0
fi
if $($SVDRCMD -p $PORT -d $LOCALPC LSTT | grep "^250" 1>/dev/null);then
echo ""
echo "Lokaler Timer gefunden ..."
echo ""
# Falls Kommando nicht ausgefuehrt werden kann => aufwecken
if [ "`$SVDRCMD -p $PORT -d $REMOTEPC LSTC 1 2>&1 | grep refused`" != "" ];then
if [ "`ssh $REMOTEPC ps -ef|grep vdr`" = "" ];then
echo "VDR not running on $REMOTEPC ..."
$SVDRCMD -p $PORT -d $LOCALPC MESG "starting VDR on $REMOTEPC" 1>/dev/null
ssh $REMOTEPC /etc/init.d/vdr start
fi
exit 1
elif [ "`$SVDRCMD -p $PORT -d $REMOTEPC LSTC 1 | grep "^250" `" = "" ];then
echo "Waking up $REMOTEPC ..."
$SVDRCMD -p $PORT -d $LOCALPC MESG "Waking up $REMOTEPC" 1>/dev/null
for i in $WAKEUPMAC
do
/usr/sbin/etherwake -i $ETHDEV $i
done
exit 1
fi
else
echo "no local recordings ..."
$SVDRCMD -p $PORT -d $REMOTEPC LSTT | grep "^250"
exit 0
fi
IFS="
"
for LOCALRECORDS in $($SVDRCMD -p $PORT -d $LOCALPC LSTT | grep "^250" | sed "s/^250[ -]//g")
do
typeset -i remotecount=0
typeset -i timercount=0
typeset -i sametransponder=0
SAMETIMER="false"
IFS=":"
read L_RECNUMBER L_RECCHANID L_RECDATE L_RECSTART L_RECSTOP L_RECPRIO L_RECLIFETIME L_RECNAME <<EOA
$LOCALRECORDS
EOA
IFS="
"
((localcount=$localcount+1))
L_RECNUMBER=$(echo "$L_RECNUMBER" | awk '{print $1}')
echo ""
echo "--------------------------------------------------"
echo " L O C A L T I M E R "
echo "--------------------------------------------------"
echo " Nummer : $L_RECNUMBER"
echo " Kanal : $L_RECCHANID"
echo " Datum : $L_RECDATE "
echo " von : $L_RECSTART"
echo " bis : $L_RECSTOP"
#echo " Prio : $L_RECPRIO"
#echo " Lifetime: $L_RECLIFETIME"
echo " Name : $L_RECNAME"
# check lokaler Kanal ist welcher remote kanal
LOCALCHAN=$($SVDRCMD -p $PORT -d $LOCALPC LSTC $L_RECCHANID | grep "^250" | sed "s/^250[ -]//g")
IFS=":"
read LNAME LFREQ LPARA LSOURCE LSRATE LVPID LAPID LPID LCAD LSID LNID LTID LRID <<EOB
$LOCALCHAN
EOB
IFS="
"
LCHANID=$(echo $LNAME | awk '{print $1}')
echo ""
echo " C H A N N E L I N F O"
echo " LNAME : $LNAME"
echo " CHAN : $LCHANID "
echo " FREQ : $LFREQ "
echo " PARA : $LPARA "
echo " SOURCE : $LSOURCE"
echo " SRATE : $LSRATE "
echo " VPID : $LVPID "
echo " APID : $LAPID"
echo " PID : $LPID"
echo " CAD : $LCAD"
echo " SID : $LSID"
echo " NID : $LNID"
echo " TID : $LTID"
echo " RID : $LRID"
if [ "$LSOURCE" = "S13.0E" -o "$LSOURCE" = "S19.2E" ];then
((maxrecordings=$DVBS))
LCARD="DVB-S"
elif [ "$LSOURCE" = "C" ];then
((maxrecordings=$DVBC))
LCARD="DVB-C"
else
((maxrecordings=$DVBT))
LCARD="DVB-T"
fi
echo " REC max. $LSOURCE: $maxrecordings"
echo ""
echo ""
#######################################################################
################### Channel Remote same as Local? #####################
#######################################################################
CHECKED_R_CHAN=$($SVDRCMD -p $PORT -d $REMOTEPC LSTC | egrep ":${LSOURCE}:.*:${LSID}:${LNID}:${LTID}:${LRID}" | sed "s/^250[ -]//g" )
CHECKED_R_CHANID=$(echo $CHECKED_R_CHAN | awk -F' ' '{print $1}')
if [ "$CHECKED_R_CHANID" != "$LCHANID" ];then
echo " Different Remote Channel: $CHECKED_R_CHANID"
fi
#######################################################################
################### Move to Subdirectory? #####################
#######################################################################
CHECKTEST=$(echo $LNAME | egrep -i "$testcheck")
#######################################################################
################### Timer String that will be sent ####################
#######################################################################
if [ -z "$CHECKTEST" ];then
NEWSERVERTIMER="1:$CHECKED_R_CHANID:$L_RECDATE:$L_RECSTART:$L_RECSTOP:$L_RECPRIO:$L_RECLIFETIME:$L_RECNAME"
else
NEWSERVERTIMER="1:$CHECKED_R_CHANID:$L_RECDATE:$L_RECSTART:$L_RECSTOP:$L_RECPRIO:$L_RECLIFETIME:${testdir}~${L_RECNAME}"
fi
###### echo " New Timer: $NEWSERVERTIMER"
############################################
# Check if recording is on next day #
############################################
SEC_LSTART=$(date -d "$L_RECDATE $L_RECSTART" +%s)
if [ $L_RECSTOP -lt $L_RECSTART ];then
SEC_LSTOP=$((`date -d "$L_RECDATE $L_RECSTOP" +%s` + 86400))
else
SEC_LSTOP=$(date -d "$L_RECDATE $L_RECSTOP" +%s)
fi
######################################################################
############### Remote Recordings ########################
######################################################################
for REMOTERECORDS in $($SVDRCMD -p $PORT -d $REMOTEPC LSTT | grep "^250" | sed "s/^250[ -]//g")
do
IFS=":"
read R_RECNUMBER R_RECCHANID R_RECDATE R_RECSTART R_RECSTOP R_RECPRIO R_RECLIFETIME R_RECNAME <<EOC
$REMOTERECORDS
EOC
IFS="
"
((remotecount=$remotecount+1))
###########################################
# LAENGE DER AUFZEICHNUNG PRUEFEN #
###########################################
SEC_RSTART=$(date -d "$R_RECDATE $R_RECSTART" +%s)
if [ $R_RECSTOP -lt $R_RECSTART ];then
SEC_RSTOP=$((`date -d "$R_RECDATE $R_RECSTOP" +%s` + 86400))
else
SEC_RSTOP=$(date -d "$R_RECDATE $R_RECSTOP" +%s)
fi
############################################
# Check Aufzeichnung zur gleichen Zeit #
############################################
if [ $SEC_LSTART -le $SEC_RSTART -a $SEC_LSTOP -ge $SEC_RSTART ] || [ $SEC_LSTART -ge $SEC_RSTART -a $SEC_LSTART -lt $SEC_RSTOP ];then
###########################################
# Aufzeichnung existiert bereits #
###########################################
if [ "$CHECKED_R_CHANID" = "$R_RECCHANID" ] && [ $SEC_LSTART -eq $SEC_RSTART ];then
SAMETIMER="true"
continue
###########################################
# Aufzeichnung existiert bereits #
###########################################
elif [ "$CHECKED_R_CHANID" = "$R_RECCHANID" ] && [ $SEC_LSTOP -eq $SEC_RSTOP ];then
SAMETIMER="true"
continue
else
REMOTECHAN=$($SVDRCMD -p $PORT -d $REMOTEPC LSTC $R_RECCHANID| grep "^250" | sed "s/^250[ -]//g")
IFS=":"
read RNAME RFREQ RPARA RSOURCE RSRATE RVPID RAPID RPID RCAD RSID RNID RTID RRID <<EOB
$REMOTECHAN
EOB
IFS="
"
RCHANID=$(echo $RNAME | awk '{print $1}')
echo " #################################"
echo " R E C O R D I N G"
echo " #################################"
echo " Number: $remotecount"
echo " CHAN : $R_RECCHANID"
echo " DATE : $R_RECDATE"
echo " START : $R_RECSTART"
echo " STOP : $R_RECSTOP"
echo " LSTART: $SEC_LSTART"
echo " LSTOP : $SEC_LSTOP"
echo " RSTART: $SEC_RSTART"
echo " RSTOP : $SEC_RSTOP"
echo " ----------------------"
echo " C H A N N E L I N F O"
echo " ----------------------"
echo " NAME : $RNAME"
echo " CHAN : $RCHANID "
echo " FREQ : $RFREQ "
echo " PARA : $RPARA "
echo " SOURCE : $RSOURCE"
echo " SRATE : $RSRATE "
echo " VPID : $RVPID "
echo " APID : $RAPID"
echo " PID : $RPID"
echo " CAD : $RCAD"
echo " SID : $RSID"
echo " NID : $RNID"
echo " TID : $RTID"
echo " RID : $RRID"
########################
# Check gleiche Karte #
########################
if [ "$RSOURCE" = "S13.0E" -o "$RSOURCE" = "S19.2E" ];then
RCARD="DVB-S"
elif [ "$RSOURCE" = "C" ];then
RCARD="DVB-C"
else
RCARD="DVB-T"
fi
if [ "$LCARD" != "$RCARD" ];then
echo ""
echo " not on same card ..."
echo ""
continue
fi
###############################
# Check gleicher Transponder #
###############################
if [ "$LFREQ" = "$RFREQ" ] && [ "$LPARA" = "$RPARA" ] && [ "$LSRATE" = "$RSRATE" ];then
echo ""
echo " is on same transponder ..."
echo ""
((sametransponder=$sametransponder+1))
fi
((timercount=$timercount+1))
fi
###########################################
# Ende Aufzeichnung existiert bereits #
###########################################
fi
################################################
# Ende Check Aufzeichnung zur gleichen Zeit #
################################################
done
######################################################################
##################### Ende Remote Recordings #########################
######################################################################
echo ""
echo " ------------------"
echo " R E S U L T "
echo " ------------------"
echo ""
((checkrecording=$timercount-$sametransponder))
if [ "$SAMETIMER" = "true" ];then
echo " ${L_RECNAME}: same TIMER exists!"
$SVDRCMD -p $PORT -d $LOCALPC MESG "${L_RECNAME}: timer already exists!" 1>/dev/null
elif [ $timercount -gt $maxrecordings ] && [ $sametransponder -eq 0 ];then
echo " ${L_RECNAME}: max. records reached!"
echo " [${timercount}/${maxrecordings} $sametransponder/$maxtransponder]"
$SVDRCMD -p $PORT -d $LOCALPC MESG "${L_RECNAME}: max. recording reached!" 1>/dev/null
$SVDRCMD -p $PORT -d $LOCALPC MESG "[${timercount}/${maxrecordings} $sametransponder/$maxtransponder]" 1>/dev/null
elif [ $timercount -gt $maxrecordings ] && [ $sametransponder -gt $maxtransponder ];then
echo " ${L_RECNAME}: max. recording reached!"
echo " [${timercount}/${maxrecordings} $sametransponder/$maxtransponder]"
$SVDRCMD -p $PORT -d $LOCALPC MESG "${L_RECNAME}: max. recording reached!" 1>/dev/null
$SVDRCMD -p $PORT -d $LOCALPC MESG "[${timercount}/${maxrecordings} $sametransponder/$maxtransponder]" 1>/dev/null
elif [ $checkrecording -gt $maxrecordings ];then
echo " ${L_RECNAME}: max. recording reached!"
echo " [${timercount}/${maxrecordings} $sametransponder/$maxtransponder]"
$SVDRCMD -p $PORT -d $LOCALPC MESG "${L_RECNAME}: max. recording reached!" 1>/dev/null
$SVDRCMD -p $PORT -d $LOCALPC MESG "[${timercount}/${maxrecordings} $sametransponder/$maxtransponder]" 1>/dev/null
else
((moveonserver=$moveonserver+1))
$SVDRCMD -p $PORT -d $REMOTEPC NEWT "$NEWSERVERTIMER" 1>/dev/null
echo "$NEWSERVERTIMER" >> /etc/vdr/remotetimer.log
echo " ${L_RECNAME}: moving recording to Server ..."
echo " Datum: $L_RECDATE Start: $L_RECSTART Records: [${timercount}/${maxrecordings} $sametransponder/$maxtransponder]"
$SVDRCMD -p $PORT -d $LOCALPC MESG "${L_RECNAME}: sending to Server" 1>/dev/null
$SVDRCMD -p $PORT -d $LOCALPC MESG "Datum: $L_RECDATE Start: $L_RECSTART Records: [${timercount}/${maxrecordings} $sametransponder/$maxtransponder]" 1>/dev/null
fi
$SVDRCMD -p $PORT -d $LOCALPC MODT 1 off 1>/dev/null
$SVDRCMD -p $PORT -d $LOCALPC DELT 1 1>/dev/null
echo ""
done
echo "----------------------------------"
echo "Aufnahmen (lokal) : $localcount"
echo "Aufnahmen (remote) : $remotecount"
echo "Aufnahmen verschoben: $moveonserver"
echo "----------------------------------"
$SVDRCMD -p $PORT -d $REMOTEPC LSTT | grep "^250" >> /etc/vdr/remotetimer.log
Alles anzeigen
Das Script kann man sicher noch verbessern, es läuft bei mir derzeit einwandfrei