Shellscript für Werbezapper

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Shellscript für Werbezapper

      Hallo zusammen

      Ich bin einmal mehr am verzweifeln....

      Ich wollte mir ein Script schreiben, was nach den üblichen 7 Minuten bei der RTL Group zurück zum RTL Sender schaltet. Der Plan ist, das über Multiquickbutton aufzurufen, danach fröhlich herum schalten zu können und nach 7 Minuten geht es zum zuvor geschauten Sender zurück.
      Über Konsole klappt das auch einwandfrei, nur über die Fernbedienung nicht... Anscheinend werden meine Variablen die ich im Script auslese nicht weiter verarbeitet.....

      Das Python script hänge ich hier jetzt einmal nicht an, ich fange mit dem Start script an. Startscript deshalb, weil ansonsten der Script Bildschirm bis zum Ende sichtbar war und somit das eigentliche Script nicht gelaufen ist....

      Das hier wird über Python aufgerufen:

      bash /usr/script/Werbepause3.sh > /dev/null & (Aufruf so notwendig, damit Script im HG läuft)


      Und das darin aufgerufene Script macht folgendes:

      #!/bin/sh
      user=root
      pass=******
      ip=localhost


      channel="`wget -q -O - subservices | grep e2servicereference | cut -b 23-100`" (checkt den aktuellen Kanal)
      channel=${channel%<*} (entfernt den Rest außer der service Ref)

      wget -q --spider http://$user:$pass@$ip/web/remotecontrol?command=174 (sended "exit" per Remote Control Command)
      sleep 420 (wartet 7 Minuten)
      wget -q -O - zap?sRef=$channel (schaltet zurück zum alten Kanal)


      Bin für jeden Tipp dankbar!
      LG skamm71

      "Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat's gemacht."
    • Pack mal das echte Script in einen Code-Block (das Passwort kannste gerne draussen lassen) - das da in deinem Beitrag ist ja so nicht lauffähig mit den Kommentaren in Klammern. Das Script ist schon ausführbar gemacht und mit Unix Zeilenenden gespeichert, oder? Warum benutzt du "--spider" bei wget?

      Edit: @ditschi1691's Vorschlag ist definitiv die bessere Lösung.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von rdamas ()

    • OK, hier alles als Code:

      Python:

      Python-Quellcode

      1. root@vuduo2:/usr/lib/enigma2/python/Plugins/Extensions/AA_Werbepause# cat plugin.py
      2. from Plugins.Plugin import PluginDescriptor
      3. from Screens.Console import Console
      4. cmd = "/usr/script/Werbepause.sh"
      5. def main(session, **kwargs):
      6. session.open(Console,_("Werbepause.sh"),[cmd])
      7. def Plugins(**kwargs):
      8. return [PluginDescriptor(name="Werbepause", description=_("Aus dem /usr/script Verzeichnis"), where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main),
      9. PluginDescriptor(name="Werbepause", description=_("Aus dem /usr/script Verzeichnins"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=main)]
      Alles anzeigen


      Script 1:

      Shell-Script

      1. root@vuduo2:/usr/script# cat Werbepause.sh
      2. #!/bin/sh
      3. bash /usr/script/Werbepause3.sh > /dev/null &
      Script 2:

      Shell-Script

      1. #!/bin/sh
      2. Datum=$(date)
      3. user=root
      4. pass=*****
      5. ip=localhost
      6. channel="`wget -q -O - http://127.0.0.1/web/subservices | grep e2servicereference | cut -b 23-100`"
      7. channel=${channel%<*}
      8. echo $channel >> /tmp/channel.zap
      9. wget -q --spider http://$user:$pass@$ip/web/remotecontrol?command=174
      10. sleep 60
      11. wget -q -O - http://127.0.0.1/web/zap?sRef=$channel >> /tmp/channel.zap
      Alles anzeigen

      Ja, Vorhandenes nutzen ist eine Sache, selbst basteln und Erfahrungen sammeln eine andere ;)
      Grundsätzlich klappt ja mein Ansatz. Nur halt nicht über die FB.
      LG skamm71

      "Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat's gemacht."
    • Noch seh ich nicht, was da nicht funktionieren sollte (außer ein paar Verbesserungsvorschlägen - später).

      Magst du dein Script 1 mal etwas umschreiben um ein paar Infos mehr zu erhalten? Mach aus dem Aufruf des zweiten Scripts mal
      bash -x /usr/script/Werbepause3.sh > /tmp/debug-werbepause.log 2>&1 &

      Das legt ein Logfile unter /tmp an in dem die Kommandos und Fehler mitgeloggt werden, die beim zweiten Script passieren.
    • Ein Verbesserungsvorschlag schon mal: du brauchst keine zwei Shell-Scripten - geht auch mit einem, z.B. so:

      Shell-Script

      1. #!/bin/bash
      2. current=$(wget -q -O- http://localhost/web/getcurrent|xmllint --xpath '/e2currentserviceinformation/e2service/e2servicereference/text()' -)
      3. ( sleep 60; wget -q -O /dev/null "http://localhost/web/zap?sRef=$current" ) &
    • Hallo rdamas

      Danke für Deine Antworten!

      Hier die Ausgabe des Log Files welches ich mit den Einstellungen Deines ersten posts gemacht habe. Wie erwartet, ist hier der Aufruf zum zappen ohne Service:

      Shell-Script

      1. root@vuduo2:/usr/script# cat /tmp/debug-werbepause.log
      2. + date
      3. + Datum=Wed Oct 11 07:38:00 CEST 2017
      4. + user=root
      5. + pass=******
      6. + ip=localhost
      7. + grep e2servicereference
      8. + wget -q -O - http://127.0.0.1/web/subservices
      9. + cut -b 23-100
      10. wget: short write
      11. + channel=
      12. + channel=
      13. + echo
      14. + wget -q --spider http://root:Sascha+220771@localhost/web/remotecontrol?command=174
      15. + sleep 60
      16. + wget -q -O - http://127.0.0.1/web/zap?sRef=
      Alles anzeigen

      Bei der zweiten von Dir genannten Variante bleibt dann für 60 Sekunden der Bildschirm auf dem Screen "Externen Befehl ausführen" stehen und ich kann nichts machen bis die Zeit um ist. Das ist nicht so im Sinne des Erinders ;)

      LG

      Ich hatte zuvor auch schon mit Ausgaben aus dem 2. Script heraus gearbeitet und dabei auch festgestellt, dass die Files mit "root" Rechten angelegt werden. Also kann das ja auch kein Rechte Problem sein. Der wget befehl zum holen des aktuellen Kanals schreibt noch Inhalt in ein File, die Variable hernach nichts mehr. Das file wurde angelegt, aber ohne Inhalt. Führe ich das auf der Console aus, hat es Inhalt... Komisch, oder?
      LG skamm71

      "Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat's gemacht."
    • Ich schau mir nachher mal die Busybox Sourcen an, was einen "short write" verursachen kann (du benutzt hier doch das wget von Busybox, oder)?

      Für den Hänger ist der Aufruf im Python Script "verantwortlich", auch dafür gibt's eine einfache Lösung. Im Grunde bist du mit dem Python Script aber ja schon fast soweit, dass du darüber einen Umschalt-Timer anlegen könntest. Mal darüber nachgedacht?
    • Also, der Fehler bleibt für mich komisch - der passiert aber definitiv an der Stelle, wo busybox wget etwas nach stdout schreiben möchte aber nicht kann; warum der Filedescriptor hier nicht schreibbar ist, ist mir nicht klar, vielleicht liegt's daran, wie du die Shellscripten aufrufst (erstes Script ruft ein zweites Script auf, schickt es in den Hintergrund und beendet sich dann).

      Versuch mal mein Script mit einer kleinen Ergänzung in der letzten Zeile:

      Shell-Script

      1. #!/bin/bash
      2. current=$(wget -q -O- http://localhost/web/subservices | xmllint --xpath '/e2servicelist/e2service/e2servicereference/text()' -)
      3. ( sleep 60; wget -q -O /dev/null "http://localhost/web/zap?sRef=$current" ) & disown
    • Hi rdamas

      Ich bewege mich auf Shell scripten zwar nicht mehr im absoluten Anfänger Bereich, allerdings ist es da auch noch dünn.
      Python habe ich mal so null Erfahrung. Das hier verwendete script habe ich mal erhalten und setze es für kleinere Dinge ein wie FTP mounten z.B. was auch gut klappt.
      Ich bin aktuell noch mit einem Kollegen zu Gange, er kam auf die Idee das python script per console aufzurufen, aber da meckert die console dass es die zu importierenden Plugins nicht findet. Lasse ich die dann weg, haben wir das python schon mal so umgebaut dass es auf console läuft, aber dann findet es die Box wieder nicht als Plugin....
      Alles Mist :D
      Aber theoretisch muss ja der Fehler irgendwo im python liegen, denn nur wenn diese die scripts aufruft, dann klappt es nicht...

      Danke für's kümmern,
      LG

      Hi rdamas

      So, konnte Deinen letzten Vorschlag gerade eben erst testen, funktioniert aber leider auch nicht...
      Bin schon am überlegen, das ganze Konstrukt in meine Alexa zu verlegen, aber das würde "aufgeben" bedeuten ;)

      LG

      PS: disown kennt die Box nicht.
      LG skamm71

      "Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat's gemacht."
    • doch...
      root@vusolo2:/# disown
      -sh: disown: current: no such job
      root@vusolo2:/#

      skamm71 schrieb:

      Das hier wird über Python aufgerufen:
      bash /usr/script/Werbepause3.sh > /dev/null & (Aufruf so notwendig, damit Script im HG läuft)
      nur so eine Idee...

      versuch mal
      /bin/bash -c /usr/script/Werbepause3.sh > /dev/null &

      Nachtrag:
      oder PATH im Script setzen
      PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
      Rechtschreibfehler sind beabsichtigt und fördern ein genaueres Lesen

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von hajeku123 ()

    • ;)

      root@vuduo2:/usr/script# disown
      -sh: disown: not found
      root@vuduo2:/usr/script#

      -c klappt auch nicht.......
      LG skamm71

      "Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat's gemacht."
    • Ich hab jetzt selber mal ein bisschen getestet und bin inzwischen der Meinung, dass das mit der Screen.Console Klasse nicht so ohne weiteres funktioniert. Die wartet nämlich offenbar immer darauf, dass die gestartete Shell inklusive aller Subshells beendet sind, bevor es die Kontrolle an Enigma2 zurück gibt - was Shell-Scripting angeht: ich geb auf.

      Wenn du es immer noch selber lösen willst, ist das meiner Meinung nach eine ideale Möglichkeit, etwas tiefer in die Python-Programmierung einzusteigen. Ich würde hier wirklich versuchen, einen Umschalttimer anzulegen. Schau dir einfach einmal an, wie das OpenWebif einen Timer anlegt:
      e2openplugin-OpenWebif/timers.py at 6757d0e5d0084513db714754bb38e67aa5670d7c · E2OpenPlugins/e2openplugin-OpenWebif · GitHub ist eigentlich in einer Funktion alles drin, was du brauchst. Und die aktuelle Service-Reference bekommst du aus der Session als serviceref = session.nav.getCurrentlyPlayingServiceReference()

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von rdamas ()

    • @rdamas: Ja, aber da muss ich mich dann wirklich erst einmal einlesen...
      Ich möchte halt auch zumindest verstehen, warum es eben nicht so geht;-)

      @hajeku123: Gute Idee, macht es aber auch nicht.

      Ich habe ja das log nach /tmp noch laufen. Oben ein Versuch über MQB (der schaut genauso aus wie über plugin.py) und unten drunter die Ausgabe wenn über console gestartet.
      Was hat denn dieses wget: short write zu bedeuten???


      Quellcode

      1. root@vuduo2:/usr/script# cat /tmp/debug-werbepause.log
      2. + date
      3. + Datum=Wed Oct 11 11:46:09 CEST 2017
      4. + user=root
      5. + pass=*****
      6. + ip=localhost
      7. + grep e2servicereference
      8. + cut -b 23-100
      9. + wget -q -O - http://root:*****@localhost/web/subservices
      10. wget: short write
      11. + channel=
      12. + channel=
      13. + echo
      14. + wget -q --spider http://root:*****@localhost/web/remotecontrol?command=174
      15. + sleep 10
      16. + wget -q -O - http://127.0.0.1/web/zap?sRef=
      17. root@vuduo2:/usr/script# ./Werbepause.sh
      18. root@vuduo2:/usr/script# cat /tmp/debug-werbepause.log
      19. + date
      20. + Datum=Wed Oct 11 11:46:51 CEST 2017
      21. + user=root
      22. + pass=*****
      23. + ip=localhost
      24. + wget -q -O - http://root:*****@localhost/web/subservices
      25. + grep e2servicereference
      26. + cut -b 23-100
      27. + channel=1:0:1:6F47:445:1:C00000:0:0:0:</e2servicereference>
      28. + channel=1:0:1:6F47:445:1:C00000:0:0:0:
      29. + echo 1:0:1:6F47:445:1:C00000:0:0:0:
      30. + wget -q --spider http://root:*****@localhost/web/remotecontrol?command=174
      31. + sleep 10
      32. + wget -q -O - http://127.0.0.1/web/zap?sRef=1:0:1:6F47:445:1:C00000:0:0:0:
      33. root@vuduo2:/usr/script#
      Alles anzeigen
      LG skamm71

      "Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat's gemacht."
    • Und wie wäre es, wenn du einen Umschalttimer über die API anlegst? Sowas wie

      Shell-Script: addtimer.sh

      1. #!/bin/bash
      2. # aktuelle Service-Reference
      3. current=$(wget -q -O- http://localhost/web/getcurrent|xmllint --xpath '/e2currentserviceinformation/e2service/e2servicereference/text()' -)
      4. # Timestamp Sekunden seit 1970
      5. now=$(date +%s)
      6. # Timestamp in 7 Miunten, also +420 Sekunden
      7. begin=$((now+420))
      8. end=$((now+425))
      9. # Umschalttimer anlegen
      10. wget -q -O- "http://localhost/web/timeradd?sRef=$current&begin=$begin&end=$end&name=Zap+Back&always_zap=1&justplay=1" | xmllint --xpath '/e2simplexmlresult/e2statetext/text()' -
      Alles anzeigen
    • schreib mal die Ausgabe von wget gezielt in eine Datei oder erweitere wget mit Parameter -P
      Ich meine irgendwo mal gelesen zu haben, dass short write in Verbindung mit wget = kein Platz zum Schreiben bedeutet
      Rechtschreibfehler sind beabsichtigt und fördern ein genaueres Lesen
    • @hajeku123: ich denke das kommt aus dem Aufruf von libbb/xfuncs.c::xwrite(), welches libbb/full_write.c::full_write(int fd, const void *buf, size_t len) aufruft. Das wiederum ruft safe_write(fd, buf, len) auf und wird dort -1 als Antwort bekommen. safe_write() wiederum ruft das libc write() auf.

      Ich kann mir nicht vorstellen, dass @skamm71 eine volle Platte hat; ich denke eher, dass stdout geschlossen wurde und der Fehler deshalb auftritt. Ganz genau werden wir das aber nur mit "strace" herausbekommen.
    • Die Ausgabe von wget hatte ich auch schon mal nach /tmp geschrieben. Das macht das script noch.
      Das direkte einlesen der Variable über wget war ja dann schon der zweite Schritt, weil das über den Umweg mit der Datei nicht geklappt hat.
      Denn: sobald ich versuche, das File wieder in eine Variable einzulesen - ab da geht es schief...

      Das mit dem Timer würde ja auch nur funktionieren, wenn die Variable $current mit der Service Ref befüllt würde und das tut sie ja nicht ;)

      Habe in der Zwischenzeit noch bissl mit MQB gespielt, das eine und das andere Script aufgerufen, das & mal hier und mal da eingesetzt, keine Chance. Zwischendurch musste ich dann sogar neu starten, weil ausser dem Spinner nix mehr passiert ist :)
      LG skamm71

      "Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat's gemacht."
    • rdamas schrieb:

      @hajeku123: ich denke das kommt aus dem Aufruf von libbb/xfuncs.c::xwrite(), welches libbb/full_write.c::full_write(int fd, const void *buf, size_t len) aufruft. Das wiederum ruft safe_write(fd, buf, len) auf und wird dort -1 als Antwort bekommen. safe_write() wiederum ruft das libc write() auf.
      Bitte was???? :D

      Wie geht das mit dem strace?
      LG skamm71

      "Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat's gemacht."