VDR Client / Server mit automatischen Shutdown und Resume

Wichtiger Hinweis: Dieses "HowTo" ist in erster Linie als Erinnerung für mich selbst gedacht. Wenn ich jemand anderem damit ebenfalls helfen kann freue ich mich, aber aus zeitlichen Gründen kann ich im Moment nur sehr begrenzt Support geben.

Ich betreibe den yaVDR als Client/Server-Anwendung. Im Server befinden sich zwei DVB-S(2)-Karten, der Client im Wohnzimmer ist über das LAN angebunden.

Der Frontend des Client ist der ganz normale vdr-sxfe (libxineoutput), bei Bedarf kann XBMC über das Menü oder eine Taste gestartet werden. De Server selbst wird als Client nur selten benutzt, und wenn, dann meistens für Videos oder Aufnahmen. Aus diesem Grund kommt dort der XBMC mit PVR-Addon als Frontend zum Einsatz.

Damit der auf dem Server laufende VDR keine DVB-S-Karte für sich selbst belegt, schaltet das VDR-Plugin suspendoutput nach einer kurzen Wartezeit den VDR (als Client) ab:

$ grep suspendoutput /etc/vdr/setup.conf
suspendoutput.MainMenu = 1
suspendoutput.ShowLogo = 0
suspendoutput.SuspendPaused = 0
suspendoutput.SuspendTimer = 600

Damit der Server den internen Client direkt nach dem Start beendet, hilft eine kleine Zeile in /etc/rc.local vor dem "exit 0":

vdr-dbus-send /Remote remote.CallPlugin string:'suspendoutput'

Doch bei diesem Setup gibt es ein Problem, denn suspendoutput bewirkt, dass der automatische Shutdown (bzw. Standby) nach der "MinUserInactivity" des VDR bei Nichtverwendung ignoriert wird. Und selbst wenn dieser ausgelöst würde: Das laufende XBMC würde den Shutdown verhindern.

Gehen wir zuerst das einfachere Problem an. XBMC soll erst nach einem Tastendruck auf der Fernbedienung tatsächlich gestartet werden. Dies geht über das Templatesystem von yaVDR recht einfach:

$ cat > /etc/yavdr/templates_custom/etc/init/xbmc.conf/25_wait-for-remote << EOL
xset dpms force off
(irw | read -r) || true
xset dpms force on
EOL
$ process-template /etc/init/xbmc.conf 

Mit "xset" wird das Display ab- bzw. wieder eingeschaltet, und die Anweisung mit "irw | read -r" horcht auf die Fernbedienung und beendet sich nach der ersten Zeile (= dem ersten Tastendruck). Die Klammern und das "true" sind notwendig, damit ein Abbruch des "irw" durch ein "kill" nicht als Fehler interpretiert wird.

Dass der Shutdown überhaupt ausgelöst wird ist etwas schwieriger, wenn suspendoutput in Betrieb bleiben soll. Im Quelltext des Plugins gibt es sogar einen entsprechenden Codeschnipsel, der jedoch auskommentiert ist und so direkt erstmal nicht funktioniert.

Leider habe ich den Entwickler des Plugins per E-Mail nicht erreichen können, also habe ich mich selbst an die Arbeit gemacht und einen Patch geschrieben, der den Code aktiviert und einen entsprechenden Eintrag im Konfigurationsmenü ergänzt.

$ wget http://dau-sicher.de/stuff/vdr-plugin-suspendoutput-enable-shutdown.patch
$ apt-get source vdr-plugin-suspendoutput
$ cd vdr-plugin-suspendoutput-1.0.1
$ patch -p1 ../vdr-plugin-suspendoutput-enable-shutdown.patch
$ dpkg-buildpackage -rfakeroot -uc -b
$ sudo dpkg -i ../vdr-plugin-suspendoutput_1.0.1-28yavdr14~natty_amd64.deb

Nun kann in den Plugineinstellungen die Option "Shutdown after min user inactivity" aktiviert werden:

grep Shutdown /etc/vdr/setup.conf
suspendoutput.Shutdown = 1

Mit diesen Tricks sollte sich der Server nun nach der eingestellten Wartezeit in den Standby-Modus begeben und rechtzeitig zu einer Aufnahme wieder aufwachen, natürlich vorausgesetzt, dass gerade keine andere Aufnahme läuft.

Damit der Client den Server wieder aufweckt, modifiziert man am besten die Datei /etc/network/interfaces:

# The primary network interface
auto eth0
iface eth0 inet dhcp
    post-up /usr/sbin/etherwake AA:BB:CC:DD:EE:FF

AA:BB:CC:DD:EE:FF muss durch die MAC-Adresse ("Hardware address") des Servers ersetzt werden, die man mit "ifconfig" ermitteln kann. Außerdem muss das Paket "etherwake" installiert sein. Andere Wake-On-Lan-Pakete sind natürlich auch geeignet, nur muss dann der Befehl hintre "post-up" entsprechend angepasst werden.

Ein kleines Problem gibt es immer noch: Nach einem Standby wird das Interface zwangsweise neu gestartet. Um das zu erzwingen hilft noch ein kleines Script:

$ cat > /etc/pm/sleep.d/40_etherwake << EOL
#!/bin/sh

case $1 in
     hibernate|suspend)
         #Befehl vor Wechsel in Suspend
         ;;
     thaw|resume)
         #Befehl nach aufwachen aus Suspend
         /etc/init.d/networking restart
         ;;
esac

Nun sollte der Client den Server beim Einschalten automatisch aufwecken.

Den Shutdown testen kann man übrigens am besten, in dem man eine "screen"-Session öffnet, den Shutdown-Befehl mit einer Verzögerung von 10 Sekunden auslöst, die Screen-Session mit STRG-A, STRG-D detached und sich auslogt:

$ sleep 10 &&  /usr/bin/vdr-dbus-send /Remote remote.HitKey string:'Power'; exit

Der Grund für diesen Umweg ist, dass der lifeguard in der Regel den Shutdown verhindert, solange noch ein Benutzer angemeldet ist.