NFS Optionen

  • Hallo zusammen,

    ich hab mir mit OMV5 ne einfache Elternkontrolle eingerichtet, indem alle Freigaben (Videos für Kodi, Roms für batocera) für die Kinder mit NFS erfolgen und mit Cronjobs der NFS Dienst gestoppt bzw gestartet wird.

    Einziges Problem ist, dass sich Kodi aufhängt, wenn NFS während einer Wiedergabe gestoppt wird.

    Habe rausgefunden, dass ich dafür die Optionen intr bzw soft probieren kann. Wo und wie genau macht man das aktuell? In der autostart.sh? Ich will natürlich auch, dass sobald der Dienst wieder läuft, Kodi ohne Neustart drauf zugreifen kann, so wie es aktuell funktioniert (sofern der Dienst nicht während einer Wiedergabe gestoppt wurde).

  • Einziges Problem ist, dass sich Kodi aufhängt, wenn NFS während einer Wiedergabe gestoppt wird.

    Du könntest dafür ein Script schreiben, welches prüft ob auf Kodi gerade eine Wiedergabe stattfindet. Dieses Script könntest du dann vom Cronjob aus starten und dann den Dienst erst beenden, wenn keine Wiedergabe mehr stattfindet. Ob eine Wiedergabe stattfindet kannst du via curl und JSON abfragen.

    Das wäre dann mit einer "if" und einer "until" oder "while"-Schleife zu erledigen.

    Alternativ könntest du auch lokal auf dem Kodi Gerät (je nachdem, welches Gerät du da verwendest) einen Cronjob anlegen, der alle 2 Minuten läuft, checkt wieviel Uhr es ist und dann Kodi einfach beendet oder das Gerät ausschaltet. Somit wäre ein Einschalten des Kodi Geräts nur zu gewissen Uhrzeiten möglich da es ansonsten, zu anderne Uhrzeiten, einfach wieder runter fährt. Da geht natürlich am einfachsten unter Linux. Wenn du da Android verwendest, wird es natürlich schwieriger.

    An intr oder nointr würde ich mich nicht länger festklammern, weil:

    The intr / nointr mount option is deprecated after kernel 2.6.25

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • Danke für die Antwort, nur leider verstehe ich nicht alles. Kann OVM erkennen, ob auf einem anderen Gerät Kodi läuft bzw eine Wiedergabe erfolgt?

    Mit cron bekomm ich schon was hin, es hapert meist nur an den Kommandos. Wenns nur darum geht, ein Script auszuführen, wirds schon gehen. Aber ein Script ist schon etwas herausfordernder für mich, bis auf ein paar Startscripte, die ich anhand von Vorlagen angepasst habe, hab ich da kaum Erfahrung. Wo kann ich mich einlesen, wie ich solche Scripte erstelle?

  • mit dem Befehl exportfs kannst du ja die Freigaben steuern, die der NFS Server anbieten soll.

    z.B.

    exportfs -rav macht einen reexport, wenn du etwas an der /etc/exports geändert hast.


    Was passiert denn, wenn am Client ein Film läuft und du z.B. per cron zu einer bestimmten Zeit

    exportfs -au

    machst. Per unexport werden alle Freigaben eingestellt, der Server läuft aber weiter und ist ansprechbar.
    Per reexport könnte man dann die Freigaben eventuell zu einen späteren Zeitpunkt wieder aktivieren.

    (p.s. hab nix davon getestet, keine Ahnung, was passiert :D )

  • Kann OVM erkennen, ob auf einem anderen Gerät Kodi läuft bzw eine Wiedergabe erfolgt?

    OMV selbst nicht. Da OMV aber auf Linux basiert sollte OMV auch einen Befehl wie "curl" beherrschen.

    Mit dem Befehl "curl" und etwas mehr hinten dran, kann man sogenannte Kodi JSON Abfragen an die API, die Kodi anbietet, wenn der Webserver aktiviert ist, stellen. Siehe:

    https://kodi.wiki/view/JSON-RPC_API

    Für Kodi Leia ist es diese JSON Version: https://kodi.wiki/view/JSON-RPC_API/v10


    Hiermit: https://kodi.wiki/view/JSON-RPC_…etActivePlayers


    oder auch hiermit: https://kodi.wiki/view/JSON-RPC_API/v10#Player.GetItem


    in Verbindung mit "curl" kann man entweder feststellen, ob Kodi gerade einen aktiven Player hat oder (mit dem anderen Link) feststellen, welches Item der Player gerade hat.


    Wenn Kodi einen aktiven Player oder ein "Item" zurück liefert, dann kann man sich recht sicher sein, dass gerade noch was abgespielt wird.


    In dem Script könnte es sinnbildlich so aussehen:


    Das Script wird also (z. B.) um 20 Uhr per Cronjob gestartet. Dann passiert folgendes:


    Innerhalb des Scripts speichern wir die Rückgabewerte der curl-Befehl in einer Variable. Sozusagen:


    aktiver_player = $(curl .... und hier die Magic via JSON, die check ob ein Player aktiv ist)


    Dann checken wir ob der Inhalt der Variable leer ist (leer bedeutet, dass kein aktiver Player vorhanden ist und nichts abgespielt wird). Ist die Variable leer, und nichts wird abgespielt, dann stoppe den NFS server:

    if [[ -z aktiver_player ]]; then
    hier der Befehl den du verwendest um den Share zu stoppen
    fi

    Problem an der Geschichte ist, dass das nur um 20 Uhr per Cron ausgeführt wird und wenn dann noch was abgespielt wird, wird der Cronjob später nicht mehr ausgeführt.

    Entweder ändert man den Cronjob so ab, dass er alle 5 Minuten ausgeführt wird oder man schreibt in das Script noch eine weitere while oder until schleife, die solange das Script ausführt und immer wieder checkt ob ein aktiver Player verfügbar ist. Und wenn er nicht mehr verfügbar ist, dann stoppe den NFS share. Wenn der Cron alle 5 Minuten ausgeführt wird, müsste man auch noch die aktuelle Uhrzeit feststellen (Befehl dazu ist: date) und dann noch das Ausgabeformat auf die Uhrzeit anpassen: date +%H%M gibt dann sowas wie: 1504 (für 15:04 Uhr aus). Da müsste man auch die Strings noch miteinander vergleichen etc....

    Das ganze kann man natürlich auch noch recht elegant mit Funktionen lösen etc.

    Das alles ist nicht ganz trivial und wenn du keine Erfahrung im Schreiben von Bash-Scripten hast, dann wird es umso schwieriger. Ich kann mal schauen, ob ich dir so ein Script zusammen schreiben kann. Vielleicht musst du dann nur noch ein paar Kleinigkeiten ändern, wie Kodi IP oder Username und Passwort für den Webserver. Das könnte aber ein paar Tage dauert.

    Wenn du dich selbst in Bash-Scripte einlesen magst, dann kann ich erstmal das hier empfehlen:

    http://openbook.rheinwerk-verlag.de/shell_programmierung/

    Das ist schon etwas älter aber für den Einstieg nicht verkehrt. Ich nutze das immer noch teilweise als Nachschlagewerk.


    Vielleicht funktioniert ja auch schon das, was @monarc99 vorgeschlagen hat. Verkehrt hört sich das nicht an.

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • ah, ich glaube ich verstehe jetzt den Ansatz mit dem Export-Ordner.

    bei meinem aktuellen Ansatz führt
    cron systemctl stop nfs-kernel-server.service
    bzw
    systemctl start nfs-kernel-server.service
    aus

    statt dem stop-Befehl dann also exportfs -au (wobei a export/unexport ist, und u unexport (ist das nicht doppelt gemoppelt?))

    und statt dem start-Befehl dann exportfs -rav (r für reexport und v für verbose (was auch immer das ist))

    Soweit ich verstanden habe, friert ja Kodi wegen fortlaufender Serveranfragen ein, damit wär das auf jeden Fall eine sehr elegante Lösung, die ich einem Script vorziehen würde.
    Ich teste das mal heute abend oder morgen aus, und berichte, was ich damit erreichen konnte. Ansonsten würd ich gerne auf das Angebot mit dem Script zurückkommen (und Danke für die ausführliche Erklärung!). Ich hab auch keine Eile, ich habe zunächst getestet, ob und wie ich Elternkontrolle mit einem Eigenbau-NAS realisieren könnte - das NAS baue ich mir erst die Tage zusammen...

  • also die Befehle klappen perfekt - Stream wird einfach beendet und man kehrt in die Bibliothek zurück. Hervorragend!

    Wenn ich den -rav Befehl starte, kommt noch ne Meldung:

    exportfs: No host name given with /export/ToshibaNFS (fsid=1,rw,subtree_check,insecure), suggest *(fsid=1,rw,subtree_check,insecure) to avoid warning
    exportfs: No host name given with /export (ro,fsid=0,root_squash,no_subtree_check,hide), suggest *(ro,fsid=0,root_squash,no_subtree_check,hide) to avoid warning
    exporting *:/export
    exporting *:/export/ToshibaNFS

    aber es klappt trotzdem. Aber die Meldung will mir doch sicher sagen, wie diese vermieden werden kann, oder?

  • Da fehlt, für welche IPs (oder Platzhalter wie *) die Freigabe gelten soll.

    -rav steht für: reexport all verbose - exportiere alle Freigabe neu und sei dabei ausführlich (verbose - zeige alle Warnungen und Fehler an)
    Also im Script brauchst du -v dann nicht mehr, dass ist nur zum Testen, damit du siehst, obs Fehler oder Probleme gibt.

Jetzt mitmachen!

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