Sicheres Poweroff-Script für Linvdr V5

  • !!!ACHTUNG!!!


    V5 So, extra für Heiwil eine neue Version mit der Möglichkeit in der .conf-Datei ein externes Script anzugeben, das die über den Output des Scripts das Herunterfahren des VDR verhindern kann. Also wenn das Script nix sagt, gibt es keine Aktivitäten, der VDR wird runtergefahren. Das Script gibt "WASAUCHIMMER" als Output, der VDR wird nicht heruntergefahren, auf dem osd gibt es die Meldung: "Shutdown abgebrochen! Aktivitäten: WASAUCHIMMER". Viel Spaß! heiwil, hoffe du kommst so klar damit! ;)



    Neu: Paket neu geladen, wegen kleinem Bug! Sorry, betrifft aber nur osd-Message!


    V4: Die OSD-Anzeige ist jetzt mit allen Events und in den .*eventfiles kann man hinter den eigentlichen Events einen Namen für das Event eintragen (durch Leerzeichen getrennt), damit man auf dem OSD nicht nur die Ports oder den namen von dem aktiven Task angezeigt bekommt. Beispiel ":3024 Vomp" Zeigt auf dem OSD Vomp an und "vdrburn.pl Burn" zeigt Burn auf dem OSD!
    Außerdem bereite ich das Einbinden von externen Scripten vor, die als Abbruch-Grund benutzt werden können. Ist aber noch nicht endgültig durchdacht!


    V3: Neu mit OSD-Info über den Grund des Abbruchs!


    V2: Neues Paket!!! Jetzt mit der überwachung von aktiven Tasks!


    Für die neue Version wird at benötigt, zu finden hier: http://pcgenie.de/linvdr/LINvd…%60s/at_3.1.8-11_i386.deb


    Installieren mit debtool -f /pfad/zur/datei/at_3.1.8-11_i386.deb
    Dann noch diese Zeileam ende der rcStart eintragen:

    Code
    start-stop-daemon -S -x /usr/sbin/atd



    Weitere Installationsanweisung weiter unten beachten!!!


    -------------------------------------------


    Moin!


    Ich habe mich die Tage mal mit den vorhandenen Möglichkeiten beschäftigt, den VDR daran zu hindern runter zu fahren, wenn noch Anwendungen (im Netzt) aktiv sind. Alles was ich gefunden habe hat mir nicht so 100%ig gefallen. Darum habe ich das hier geschrieben.


    Grund für das schreiben dieses Scripts war eigentlich, dass mein VDR sich immer abschaltete während ich im Schlafzimmer über den MVP ferngesehen habe. Als ich dann einmal dabei war, habe ich dann noch mehr Netz-Dienste in meine Liste aufgenommen (z.B. ssh, ftp, Samba, streamdev…). Konsolen-Überwachung habe ich bewußt rausgelassen, da ich den VDR, wie wahrscheinlich die meißten nur über das Netzt bearbeite und mich nicht direkt an der Konsole anmelde!


    Sinn dieses Scriptes ist es zwischen das eigentliche poweroff-Script (mit Timer setzen usw...) und das Poweroff-Event (egal ob Taste oder Timeout) geschaltet zu werden (keine Angst, ist nicht so kompliziert) um das wirkliche Runterfahren zu unterbinden, solange die Netzverbindungen aktiv sind. Die Möglichkeit das Herunterfahren von Hand (also per Taste) zu unterbrechen soll dabei aber erhalten bleiben, also auch die OSD-Mitteilung, dass ein Shutdown bevorsteht!


    Also was macht das Script? Es wird in der Zeile in der der VDR gestartet wird als Parameter –s übergeben (also als das Script, das zum runterfahren genutzt werden soll; Installation siehe unten)! Wenn das Script jetzt aufgerufen wird, sucht es in den Netztverbindungen nach den Schlüsselwörtern in der Datei /etc/safepower.event und wenn eins davon gefunden wird, wird eine OSD-Nachricht ausgegeben und nach einer Minute (kann man in der safepower.conf ändern) wird erneut der Powerknopf gedrückt (und damit das Script neu aufgerufen).


    Warum mache ich das so? Ich habe einfach versucht alle möglichen Szenarien zu bedenken. Nehmen wir an, das Script wird aufgerufen und bleibt dann solange in einer Schleife, bis die Netzverbindungen getrennt werden und fährt dann runter. Wenn aber in der Zwischenzeit eine Aufnahme angefangen hat….? Oder man hat bereits eine Aufnahme so überbrückt, dann würde die schleife den veralteteten Timer verwenden! Wenn ich aber den Powerbutton drücke, übernimmt der VDR für mich die Kontrolle, das keine Aufnahme läuft und kein Timer so kurz bevor steht, dass das Runterfahren überflüssig wäre und es wird immer der aktuell nächste Timer übergeben.


    INSTALLATION:


    1. Die Datei ins root entpacken (tar xjf /wo/ist/die/datei/safepower-0.0.2.tar.bz2 –C/)
    2. In der runvdr (unter /etc/init.d bei Linvdr) die Zeile mit dem VDR-Aufruf suchen und so anpassen:

    Zitat


    $BINDIR/vdr -L $PLUGINDIR $PLUGINS $COMMON_PARAMETER -v /video0 -c $CONFDIR -u root -P'burn -i/pub/export/dvds' -w 900 -E /ramdisk/epg.data -s /usr/bin/safepower.sh -r /usr/bin/noadcall.sh < /dev/tty$VDRTTY


    3. Die Datei /etc/safepower.conf und safepower.events an die eigenen Bedürfnisse anpassen. (wichtig, habe alle Beispiele auskommentiert!)


    Kleiner Bonus, ich habe auch ein Script beigelegt, das wenn man es in das powerbtn-ACPI-Event einträgt den Rechner nicht gnadenlos ausschaltet sondern auch den VDR-Powerbutton benutzt! Auch sinnvoll, wenn man nicht unbedacht den VDR mitten in einer Aufnahme mit dem Powerknopf ausschalten will! Zur Installation einfach in der Datei /etc/acpi/events/powerbtn den Wert action auf /usr/bin/powerbutton.sh ändern.


    So, hoffe ich habe nix vergessen und es funktioniert bei euch genauso gut wie bei mir! Getestet habe ich aber nur mit Linvdr, bei anderen Distributionen müsst ihr evt. Noch Anpassungen vornehmen! Würde mich natürlich über Feedback und Verbesserungsvorschläge freuen!


    Gruß


    Toxic


    PS.: Wer das alles gelesen hat, hat meinen tiefsten Respekt!! :D

  • Hi Toxic,
    ich werde Deine Lösung heute Abend probieren.
    Ich glaube seit der 1.3.40 wird das poweroff script nach 5 Minuten wieder neu aufgerufen, falls der vdr dann noch lebt. Also kann man seit dem problemlos das poweroff script abbrechen, falls noch ein Dienst läuft. So mache ich es z.Zt.


    Das Ganze ist aber suboptimal, weil wie bei allen mir bekannten Lösungen erst NACH Aufruf des poweroff scriptes entschieden werden kann, ob wirlich heruntergefahren werden soll oder nicht.
    Viel besser ist es, es gäbe einen zusätzlichen Startparameter für den vdr, der entweder das Ablaufen der "min Benutzer Aktivität Zeit" verhindert, oder nach Ablauf derselben den Aufruf des poweroff scriptes.


    Heiwil

    Athlon 1200+, 512 MB, 1,2 TB, Nexus-S 2.3 + 2x Skystar2
    easyvdr 0.6.10
    Quadro Atmolight

  • ?!? Aber genau das macht doch mein Script letztendlich! Der User-Timeout läuft, dann kommt die Warnung, gleich fahre ich runter! Wenn ich dann grade hinschaue gut, drücke ich eine Taste und setzte so das Timeout wieder auf 0! Wenn nicht wird mein script aufgerufen und prüft den Netztwerkstatus. Sollte sich daraus eine Grund ergeben nicht herunter zu fahren, dann wird der Shutdown abgebrochen und das script schläft 60 (oder auch mehr) Sekunden. Danach wird erneut der Powerbutten gedrückt und das spiel geht von vorne los. Erst wenn keine Einwende mehr vorliegen, wird der VDR wie immer runtergefahren! Man kann dann aber auch nach dem drücken des powerbuttens das ganze abbrechen und so die Schleife unterbrechen!


    Gruß


    Toxic

    Registrierter VDR-User #1275


    VDR-Server: Proxmox 7.1 - LXC Container - Debian 11.5 - eTobi-VDR 2.6.0

    DVB-Hardware: Digital Devices - Cine S2 V5.5 und V6

    VDR-Clients: FireTV Sticks 2 bis 4K Max und Kodi 19.4

  • Ich meine es so:
    Ein script (Checkscript o.ä.) prüft alle paar Minuten, ob irgendein Dienst läuft auf Grund dessen nicht heruntergefahren werden soll und schreibt in eine Datei seinen exit status. Diese Datei wird als zusätzlicher Startparameter an vdr übergeben. Abhängig von exitstatus des Checkscript ruft der dann das poweroff-script auf oder nicht. Damit wären alle Konstrukte rund um das poweroff obsolet.


    Wie auch immer, ich habe Dein script bisher weder angesehen noch ausprobiert. Das tue ich und melde mich dann wieder.


    Heiko

    Athlon 1200+, 512 MB, 1,2 TB, Nexus-S 2.3 + 2x Skystar2
    easyvdr 0.6.10
    Quadro Atmolight

  • An sowas habe ich uchschon gedacht, aber ich weiß nicht, ob es eine Möglichkeit gibt die Userinactivity direkt (also ohne z.B. eine Taste zu drücken) wieder auf Anfang stellen kann! Konnte natürlich ein Scrip bauen, das per cron den NW-Status prüft und dann bei Aktivität den OK-Button drückt, aber da könnte ja auch aktuelle Eingaben stören!


    Wenn jemand eine Möglichkeit kennt, kann ich das gerne als weitere Option einbauen! :]


    Gruß


    Toxic

    Registrierter VDR-User #1275


    VDR-Server: Proxmox 7.1 - LXC Container - Debian 11.5 - eTobi-VDR 2.6.0

    DVB-Hardware: Digital Devices - Cine S2 V5.5 und V6

    VDR-Clients: FireTV Sticks 2 bis 4K Max und Kodi 19.4

  • Statt dem OK Button, kann man z.B. user9 verwenden.
    Ich hatte das mal so:
    Checkscript.sh
    ____________________________________
    #!/bin/sh


    EXITCODE="0"
    HITKEY="user9" # welche Taste soll gesendet werden


    # slimserver meldet Clientzugriff
    /scripte/anybodylistening.pl || { echo "slimserver" ;EXITCODE="1"; }


    # USERCOUNT=Who|wc -l;
    # test $5 -eq 0 -a $USERCOUNT -gt 0 && { echo "$USERCOUNT users are logged in."; EXITCODE="1"; }


    # vdr2divx activ ist
    #
    pgrep 2divx >/dev/null 2>&1 && { echo divx-conversion is still running; EXITCODE="1"; }


    # noad activ ist
    #
    pgrep noad >/dev/null 2>&1 && { echo "noad is still running"; EXITCODE="1"; }


    # cutinplace activ ist
    #
    pidof cutinplace >/dev/null 2>&1 && { echo "cutinplace is still running"; EXITCODE="1"; }


    # file existiert
    #
    # test -a /some/file && { echo /some/file exists; exit 1; }


    # Zugriffe auf samba shares offen sind
    #
    netstat -n|grep ^tcp|egrep -q ":139 " && { echo "smb"; EXITCODE="1"; }


    # streamdev client activ ist
    #
    netstat -n|grep ^tcp|egrep -q ":2004 " && { echo "streamdev"; EXITCODE="1"; }


    # pc erreichbar ist
    #
    # ping -c 1 192.168.1.2 >/dev/null && { echo "pc"; EXITCODE="1"; }


    # zugriffe per ssh offen sind
    #
    netstat -n|grep ^tcp|egrep -q ":22 " && { echo "ssh"; EXITCODE="1"; }


    test "$EXITCODE" = 1 && /usr/bin/svdrpsend.pl HITK $HITKEY


    exit $EXITCODE
    ____________________________________
    Die Checkscript.sh wurde per cron alle 10 Minuten aufgerufen.
    Das Ganze hat den Nachteil, daß eine der user Tasten verbraucht wird, es gibt leider nur 9 davon.


    Heiwil

    Athlon 1200+, 512 MB, 1,2 TB, Nexus-S 2.3 + 2x Skystar2
    easyvdr 0.6.10
    Quadro Atmolight

  • Das würde aber auch den Timeout immerwieder auf die minimale Interaktivitätszeit zurücksetzen! Das könnte ziemlich lange dauern!


    Gruß


    Toxic

    Registrierter VDR-User #1275


    VDR-Server: Proxmox 7.1 - LXC Container - Debian 11.5 - eTobi-VDR 2.6.0

    DVB-Hardware: Digital Devices - Cine S2 V5.5 und V6

    VDR-Clients: FireTV Sticks 2 bis 4K Max und Kodi 19.4

  • Seit einer der letzten Versionen probiert VDR in kürzeren Abständen, herunterzufahren, falls das Script es beim ersten Mal verweigert hat. Das wurde glücklicherweise eingebaut und ich habe es auch immer bei meinen Herunterfahrscripten gebraucht (bisschen suchen, irgendwo im HowTo ist es noch). Dann hast du auch immer die Möglichkeit den Krempel jederzeit abzubrechen, was ich sehr wichtig fand.

  • schönes script!
    ich schlage eine kleine Änderung vor. Es gibt Dienste, die sich nicht per netstat erfassen lassen. Ich habe z.B. einen Server für meine Squeezebox und möchte verhindern, daß mir der Rechner beim Musikhören herunterfährt..
    Zusätzlich zum Test per netstat sollte noch ein Test per zusätzlichem Checkscript erfolgen:


    geänderte /etc/safepower.conf:


    #Konfiguration für das Safepoweroff-Script
    POWERCMD="/usr/bin/poweroff.pl"
    SVDRPSENDCMD="/usr/bin/svdrpsend.pl"
    EVENTFILE="/etc/safepower.events"
    WAIT="60"
    CHECKSCRIPT="/scripte/Checkscript.sh"


    geänderte /usr/bin/safepower.sh
    #!/bin/bash
    # Safe-Poweroff-Script for Network-Activities (like ssh, ftp, streamdev, mvp, etc.)


    CONFFILE="/etc/safepower.conf"


    source $CONFFILE


    ACT="no"


    while read LINE; do


    ACTEVENT=""


    if [ "$LINE" -a "`echo $LINE|cut -c 1`" != "#" ]; then ACTEVENT=`netstat|grep "$LINE"`
    fi


    if [ "$ACTEVENT" ]; then ACT="yes"
    fi
    done< <(cat $EVENTFILE)


    $CHECKSCRIPT && ACT="yes"


    if [ $ACT = "yes" ]; then


    $SVDRPSENDCMD MESG "Shutdown abgebrochen! Es sind noch Anwendungen aktiv!" &
    sleep $WAIT
    $SVDRPSENDCMD HITK power &


    else


    $POWERCMD $@


    fi


    Heiko

    Athlon 1200+, 512 MB, 1,2 TB, Nexus-S 2.3 + 2x Skystar2
    easyvdr 0.6.10
    Quadro Atmolight

  • Klingt nicht schlecht, ist mir so aber noch zu statisch! Werde mir mal überlegen, wie man noch aktive Scripte mit aufnehmen kann! Vielleicht über eine zweite .events-Datei! Das baue ich dann in Version 0.0.2 ein! Gruß Toxic

    Registrierter VDR-User #1275


    VDR-Server: Proxmox 7.1 - LXC Container - Debian 11.5 - eTobi-VDR 2.6.0

    DVB-Hardware: Digital Devices - Cine S2 V5.5 und V6

    VDR-Clients: FireTV Sticks 2 bis 4K Max und Kodi 19.4

  • Habe grade das Script nochmal aktualisiert (im ersten Post 0.0.1a)! Bitte unbedingt aktualisieren, anderenfalls könnten Timer verloren gehen! Weitere Infos am Anfang des ersten Posts!


    Neue Funktionen kommen Montag! :]


    Gruß


    Toxic

    Registrierter VDR-User #1275


    VDR-Server: Proxmox 7.1 - LXC Container - Debian 11.5 - eTobi-VDR 2.6.0

    DVB-Hardware: Digital Devices - Cine S2 V5.5 und V6

    VDR-Clients: FireTV Sticks 2 bis 4K Max und Kodi 19.4

    2 Mal editiert, zuletzt von Toxic-Tonic ()

  • Ups! Naja, dann werde ich erstmal noch ein bisschen daran arbeiten und dann einen neue Version veröffentlichen! Ein bisschen Geduld noch... :]


    Gruß


    Toxic

    Registrierter VDR-User #1275


    VDR-Server: Proxmox 7.1 - LXC Container - Debian 11.5 - eTobi-VDR 2.6.0

    DVB-Hardware: Digital Devices - Cine S2 V5.5 und V6

    VDR-Clients: FireTV Sticks 2 bis 4K Max und Kodi 19.4

  • Hi Toxic


    Ist es möglich auch eine Abfrage ob noad noch läuft mit reinzubringen?
    Hab es selber noch nich hinbekommen das irgendwo mit einzupflegen.


    Gruß und Dank Dirk


    VDR-1: MS-Tech MC1200 , DH77EB , G2030 4GB 1TB, 2xDD-S2 ,IR-Ein Rev4 , yaVDR 0.6


    VDR-2: Mozart , FSC1567 Cel.2G 1GB 1TB, 4xS3200 , IMon ,IR-Ein Rev4 , yaVDR 0.6


    TestVDR: NUC5i3 , Octopus 4xS2 , Octopus Net 8xS2


  • Plane eine Überwachung von aktiven Tasks mit einzubauen, also auch Noad, Burn und was noch so per Pid identifizieren läßt! Denke ich werde Montag sowas mal testen! Gruß Toxic

    Registrierter VDR-User #1275


    VDR-Server: Proxmox 7.1 - LXC Container - Debian 11.5 - eTobi-VDR 2.6.0

    DVB-Hardware: Digital Devices - Cine S2 V5.5 und V6

    VDR-Clients: FireTV Sticks 2 bis 4K Max und Kodi 19.4

  • So, habe eine neue Version bereitgestellt! bei mir läuft sie seit gestern ohne Probleme! Habe zusätzlich noch die Überwachuung von Tasks hinzugefügt (z.B. noad oder vdrsync.pl)! Die jeweiligen Tasknamen /Netzwerk-Ports müssen in die Dateien safepower.netevents und safepower.taskevents unter /etc eingetragen werden! Ich habe im Tarball alle events deaktiviert (mit einem # davor), also müssen die Dateien auf jeden fall angepasst werden!


    Viel Spass damit!


    Gruß


    Toxic


    PS.: Ohne at geht nix, als die Installations-Anweisung ganz oben beachten!

    Registrierter VDR-User #1275


    VDR-Server: Proxmox 7.1 - LXC Container - Debian 11.5 - eTobi-VDR 2.6.0

    DVB-Hardware: Digital Devices - Cine S2 V5.5 und V6

    VDR-Clients: FireTV Sticks 2 bis 4K Max und Kodi 19.4

  • Nicht übel.


    Mit dem abermaligen Drücken der Powertaste nach einer gewissen Wartezeit, um den Herunterfahrvorgang erneut anzustoßen, habe ich auch mal angefangen. Hat halt den Nachteil, dass man das ganze nicht anhalten kann, wenn man will, sondern immer warten muss, bis die Meldung kommt.
    Ist vielleicht ein kleiner Kritikpunkt.


    Und vielleicht nimmst du noch die Programme "cp" und "mv" in die Liste mit auf. Man will ja nicht, dass lange Kopiervorgänge beim Herunterfahren abgebrochen werden.

  • Die Liste kann sich ja jeder selbst anpssen, deswegen habe ich doch extra die beiden .*events-Dateien gemacht! Ist denke ich für jeden machbar! Das zwischendurch abbrechen habe ich bei mir noch in die commands.conf eingebunden, etwa so:

    Code
    Schutdown abbrechen     ?: killall waitcmd.sh


    Wenn dir das reicht....


    Gruß


    Toxic

    Registrierter VDR-User #1275


    VDR-Server: Proxmox 7.1 - LXC Container - Debian 11.5 - eTobi-VDR 2.6.0

    DVB-Hardware: Digital Devices - Cine S2 V5.5 und V6

    VDR-Clients: FireTV Sticks 2 bis 4K Max und Kodi 19.4

  • Hi Toxic,
    funktioniert gut.
    Ich baue mir zusätzlich noch ein Checkscript ein, wie weiter oben beschrieben. Ob noch jemand mit der Squeezebox Musik hört, läßt sich weder mit netstat noch mit pidof abfragen. Ich habe dafür ein perl script geschrieben (bzw. ein anderes, ähnliches verbastelt).
    Heiko

    Athlon 1200+, 512 MB, 1,2 TB, Nexus-S 2.3 + 2x Skystar2
    easyvdr 0.6.10
    Quadro Atmolight

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!