Upstart: Wie kann man den VDR und die Plugins ereignisbasiert gestalten?

  • EDIT: Xineliboutput-Frage mit Workaround geklärt; jetzt geht's um's Prinzip.


    Hallo zusammen,


    ich beschäftige mich gerade mit Upstart. Wirklich eine schöne Sache. Gerade bei reinen Streamingsclients war die bisher notwendige Anpassung der Startreihenfolge mit passenden "Sleeps" teilweise sehr lästig. Den VDR starte ich nun z.B. erst dann, wenn der Server pingbar ist. Jetzt hänge ich aber an einer Stelle fest und hoffe, ihr könnt mir helfen:


    Hat jemand einen Tipp für mich, wie ich einen Event erzeugen kann (mittels "initctl emit") der ausgelöst wird, sobald der VDR mit dem Starten fertig und das Xineliboutput-Plugin bereit ist, Anfragen von remote Frontends entgegen zu nehmen? Ich hatte die Idee, das Syslog nach Einträgen á la "[xine... put]" zu greppen, aber meine Scriptingkenntnisse sind doch sehr, sehr dürftig. Hab's nicht hinbekommen.


    Oder gibt es gar bereits bestehende Events, die ich für den Start des vdr-sxfe Scripts abfragen könnte?


    Viele Grüße
    Holger


    PS: Verwende noch Ubuntu Jaunty, demnächst Karmic.

  • Quote

    Original von HolgerR
    Hat jemand einen Tipp für mich, wie ich einen Event erzeugen kann (mittels "initctl emit") der ausgelöst wird, sobald der VDR mit dem Starten fertig und das Xineliboutput-Plugin bereit ist, Anfragen von remote Frontends entgegen zu nehmen? Ich hatte die Idee, das Syslog nach Einträgen á la "[xine... put]" zu greppen, aber meine Scriptingkenntnisse sind doch sehr, sehr dürftig. Hab's nicht hinbekommen.


    Mal so in Kladde gedacht, wäre es nicht besser mit netstat nachzusehen, ob der Port schon von xineliboutput belegt ist, oder mit netcat so was wie eine Kommunikation mit dem Port zu versuchen?


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Hi Gerald,


    Quote

    Original von gda
    Mal so in Kladde gedacht, wäre es nicht besser mit netstat nachzusehen, ob der Port schon von xineliboutput belegt ist, oder mit netcat so was wie eine Kommunikation mit dem Port zu versuchen?



    ... vielversprechende Idee! Da war ich nicht drauf gekommen. Ich schau mal, ob das was Brauchbares auswirft.


    Gruß
    Holger

  • An der Baustelle spiele ich auch gerade herum. Diesen Part habe ich wie folgt gelöst:

    Code
    1. while ! netcat -z localhost 2001; do sleep 1; done;


    Dabei warte ich nur darauf, dass der VDR den SVDRP-Port aufmacht. Eventuell kann man das auch noch verbessern und ein HELP-Kommando oder so absetzen um noch sicherer zu gehen.


    Grüße,
    Holger

    VDR 1-3: Zotac ZBox HD-ID42, yavdr-0.5
    VDR 4: AMD5900/Asus M3N-78, yavdr-0.5
    DVB-Empfang: Netceiver
    Storage: via NFS von separatem Fileserver

    [size=10]

    The post was edited 1 time, last by hsteinhaus ().

  • Quote

    Original von hsteinhaus
    An der Baustelle spiele ich auch gerade herum. Diesen Part habe ich wie folgt gelöst:

    Code
    1. while ! netcat -z localhost 2001; do sleep 1; done;


    Dabei warte ich nur darauf, dass der VDR den SVDRP-Port aufmacht. Eventuell kann man das auch noch verbessern und ein HELP-Kommando oder so absetzen um noch sicherer zu gehen.


    Noch sicherer ginge man natürlich mit dem xineliboutput-Port. Ich kann mir schon vorstellen, dass der Thread für den SVDRP-Port eventuell etwas früher bereit ist.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Ich konnte mich schwach erinnern, das vdr-sxfe von runvdr-extreme auf den VDR wartet um vdr-sxfe zu starten. Ich hab mal nachgeschaut und dort wird das so gemacht:


    Code
    1. while ( ! pidof vdr 1>/dev/null 2>&1); do
    2. sleep 1
    3. .....
    4. done


    Gruß
    Sven

  • Quote

    Original von cokker
    Ich konnte mich schwach erinnern, das vdr-sxfe von runvdr-extreme auf den VDR wartet um vdr-sxfe zu starten. Ich hab mal nachgeschaut und dort wird das so gemacht:


    Code
    1. while ( ! pidof vdr 1>/dev/null 2>&1); do
    2. sleep 1
    3. .....
    4. done


    Gruß
    Sven


    Das ist doch viel zu früh.


    Geral


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Ich hatte mal das Problem, das der VDR immer wieder in unregelmaessigen Abstaenden abgekachelt war. Hab mir dann ein Script geschrieben, das nachschaut, ob er noch laeuft, wenn nein, neu gestartet hat. Ich hab das ueber svdrsend.pl gemacht
    => Irgnedeine Anfrage ( HELP zB )
    => Wenn 250 ( glaub ich ) zurueckkommt - OK


    while [ 1 ]
    do
    rc=$(svdrsendpl --weis-param-nicht-mehr | awk '$1 ~ /[0-9]/ {print $1}')

    case $rc in
    250)
    echo "ist OK"
    <code> ...
    ;;
    esac


    sleep 360
    done


    Ja, so irgendwie koennte es gehen.

    Server PC leap42.3 ::: vdr-2.3.8 ::: DD Cine C2 + 1 Erweiterung headless

    zbox leap42.3 ::: vdr-2.3.8 + SatIP Plugin

    OctopusNet DVBC mit 4 Tunern

    Clients 2 x Raspberry 2 + libreElec 8.2.1 verbunden mit zbox

  • Da sollte es doch bessere Möglichkeiten geben. Sollte man ncht besser einen Event generieren nach dem start up vom VDR ? Oder gibt es den Event nicht schon ? Ich denke das Problem sollte doch so ziemlich Standard sein oder hab ich was verpasst ?


    http://www.netsplit.com/category/tech/upstart/


    Wieder was wo es interessant ist sich einzulesen :)

  • Quote

    Original von steffen_b
    Da sollte es doch bessere Möglichkeiten geben. Sollte man ncht besser einen Event generieren nach dem start up vom VDR ?


    Und wie? Entweder du startest den VDR im Vordergrund, dann bekommst du aber nie mehr die Kontrolle zurück um das Event zu generieren, außer der VDR stürzt ab, oder du startest den VDR im Hintergrund und generierst das Event dann, aber dann kommt das Event zu früh, weil der Thread mit dem Plugin noch nicht ready ist und dann sind wir wieder bei der Ausgangssituation des ersten Posts.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Quote

    Original von asshep
    Hab mir dann ein Script geschrieben, das nachschaut, ob er noch laeuft, wenn nein, neu gestartet hat. Ich hab das ueber svdrsend.pl gemacht


    Das ist nur eine kompliziertere Variante von hsteinhaus Skript ein paar Posts vorher, deshalb gilt das dort gesagte.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Moin,


    hier ist ja richtig was los. Danke für den Input :)


    Ich habe mir gestern abend ein Mini-Script gebastelt, was auf den Port 37890 achtet und das Event auslöst. Naja, besser gesagt: Auslösen *soll*. Scheinbar muss ich das doch in eine Schleife packen, denn so richtig zuverlässig ist das leider nicht. Könnte allerdings auch an der etwas älteren Version von Upstart in Jaunty liegen. In den Weiten des Internets findet sich der eine oder andere Hinweis, dass da wohl noch nicht allles golden ist.


    Nichtsdestotrotz:
    Je mehr ich darüber nachdenke, desto mehr gefällt mir der Gedanke, das ganze über das "Mitschneiden" des Syslogs zu realisieren. Das ließe sich nämlich wunderbar recyclen. Im Syslog lauern unendliche Weiten. Mir fallen bestimmt tausend Sachen ein, die ich mit Events belegen würde: Eine am Server gestartete Aufnahme verschickt einen Befehl zum Aktualisieren des Aufnahmeverzeichnisses an die Clients, beim Umschalten auf "laute" Sender wird automatisch die Lautstärke verringert, und, und, und. Ich weiß, das geht auch irgendwie anders mit schon bestehenden Lösungen, aber darum geht es ja jetzt nicht.


    Gruß
    Holger

  • Quote

    Original von HolgerR
    Je mehr ich darüber nachdenke, desto mehr gefällt mir der Gedanke, das ganze über das "Mitschneiden" des Syslogs zu realisieren.


    kannst du natürlich machen, aber mir gefällt das nicht. Ist sehr Fehler trächtig, bei nächster Gelegenheit hat die Syslog-Ausgabe eine andere Form und du findest sie nicht, oder Syslog ist ausgeschaltet, ... Außerdem erzeugt das eine Menge I/O.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Dann schon lieber xineliboutput patchen, sodass es eine leere Datei erzeugt, wenn es fertig ist. Mit dem xine-plugin geht es einfacher, einfach nachsehen ob das Socket schon da ist.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Hi Gerald,


    das I/O Problem macht mir dabei in der Tat auch Sorgen. Im Quellcode des xineliboutput hatte ich gestern auch schon gewühlt. Die Stelle im Code, wo "Aktion X" ausgelöst werden soll habe ich auch schon dingfest gemacht, bin mir aber noch nicht im Klaren, was ich da tun will. Das mit der anzulegenden Datei wäre ja schon mal ein Weg, ist mir aber (zumindest beim ersten darüber Nachdenken) zu "indirekt".


    Idee zum "Monitoren": Hat hier jemand Erfahrung mit "swatch"? -> Manpage


    Gruß
    Holger


    PS: Gerade eine Thread dazu gefunden. steffen_b : Oder halt "inotify" ;)


    PPS: Idee hinter dem Einsatz von "swatch": Um unnötige I/O-Last zu vermeiden, könnte man das ja beim Rechnerstart starten und dann beenden lassen, wenn der VDR komplett "oben" ist.

  • Quote

    Original von HolgerR
    Datei wäre ja schon mal ein Weg, ist mir aber (zumindest beim ersten darüber Nachdenken) zu "indirekt".


    Na dann mach an der Stelle doch einen system() call der das event direkt auslöst. Direkter geht doch wohl nicht.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Quote

    Original von gda


    Na dann mach an der Stelle doch einen system() call der das event direkt auslöst. Direkter geht doch wohl nicht.


    Gerald


    Wie?!? Das geht so einfach?!? Kennst mich doch: Echten Plan von Programmierung habe ich nicht, kann mich nur mit Hilfe von passenden Stichwörtern "durchwurschteln".


    Vielen Dank für den Tipp. Kannst du mir einen großen Gefallen tun? Für dich ist's bestimmt leicht: Wie würde denn die Zeile Code aussehen, wenn ich damit das Event "vdr-ready" auslösen möchte?


    Gruß
    Holger

  • Quote

    Original von HolgerR
    Vielen Dank für den Tipp. Kannst du mir einen großen Gefallen tun? Für dich ist's bestimmt leicht: Wie würde denn die Zeile Code aussehen, wenn ich damit das Event "vdr-ready" auslösen möchte?


    So ganz auf die Schnelle kriege ich das auch nicht hin, bin ja auf der Arbeit und habe auch sonst nicht viel Zeit.


    Code
    1. #include <stdlib.h>
    2. system("/sbin/initctl emit xineliboutput-is-ready");


    Würde es wohl schon tun, aber Achtung! Das wird im Kontext des VDR-Users ausgeführt. Der darf initctl gar nicht ausführen. Da musst du dann wohl einen Eintrag in /etc/sudoers machen für vdr und initctl. Zum Testen kannst du ja den VDR erstmal als root laufen lassen. Ist natürlich ein schmutziger hack, weil gar nicht getestet wird, ob initctl überhaupt da ist.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470


  • Klasse! Vielen Dank! Ich hoffe ich komme heute abend zum Testen. Das mit dem VDR User ist für mich kein Problem: Schmutzig hin oder her; meine VDRs laufen aus anderen Gründen bereits unter root ;)


    Gruß
    Holger