Ankündigung

Einklappen
Keine Ankündigung bisher.

Exec Binding - Befehl wird nicht ausgeführt

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Exec Binding - Befehl wird nicht ausgeführt

    Hallo,

    Ich möchte über das Exec-Binding die Logdateien von openhab in ein anderes Verzeichnis kopieren. Doch leider wird der Befehl nicht ausgeführt bzw. es wird nichts kopiert.

    Folgendes habe ich angelegt: (Verwende noch openhab 2.5)

    Things
    Code:
    Thing exec:command:copylog    [command="cp /var/log/openhab2/*.* /etc/openhab2/temp", autorun=false, interval=0]
    Item
    Code:
    String Copy_Log    "Kopiere Logs"    { channel="exec:command:copylog:input" }
    sitemap

    Code:
    Switch item=Copy_Log label="Kopiere Logs []" mappings=[copy="Kopieren"]
    Auch mit einer Rule funktioniert es nicht:

    Code:
    rule"CopyLog"
    when
        Item Copy received command ON
    then
        executeCommandLine("cp /var/log/openhab2/*.* /etc/openhab2/temp")    
        logInfo("Regel CopyLog", "gestartet")
    end
    Was mache ich falsch?

    Gruß Tom
    Zuletzt geändert von TomW80; 16.03.2022, 16:35.

    #2
    Hat der User mit dem OpenHab läuft Schreibrechte auf das Zielverzeichnis?

    Ansonsten habe ich noch dunkel in Erinnerung, dass es Schwierigkeiten mit einigen besonderen Zeichen gab. Bin mir allerdings nicht sicher, ob das hier und mit * der Fall war.

    Kommentar


      #3
      Hast Du die Befehlszeile in die whitelist eingetragen?

      Es wäre vermutlich besser, ein Bash Script zu schreiben, welches das Kopieren erledigt. Dieses Bash Script (egal wo es liegt) rufst Du dann über das Exec Binding auf. Aber auch hier gilt: Der Aufruf muss exakt so, wie er im Thing hinterlegt ist, zusätzlich in die whitelist eingetragen werden.

      Kommentar


        #4
        Zitat von wknx Beitrag anzeigen
        Hat der User mit dem OpenHab läuft Schreibrechte auf das Zielverzeichnis?
        Ich verwende openhabian auf meinem Raspi. Wie kann ich herausfinden unter welchen User openhab läuft?
        Der User "openhabian" hat jedenfalls Schreibrechte.

        Zitat von udo1toni Beitrag anzeigen
        Hast Du die Befehlszeile in die whitelist eingetragen?

        Es wäre vermutlich besser, ein Bash Script zu schreiben, welches das Kopieren erledigt. Dieses Bash Script (egal wo es liegt) rufst Du dann über das Exec Binding auf. Aber auch hier gilt: Der Aufruf muss exakt so, wie er im Thing hinterlegt ist, zusätzlich in die whitelist eingetragen werden.
        Ja, in die Whitelist hab ich den Befehl eingetragen, sonst kommt ja auch eine Fehlermeldung im Log.
        Das mit dem Bash-Script werde ich mal testen

        Kommentar


          #5
          Zitat von TomW80 Beitrag anzeigen
          Wie kann ich herausfinden unter welchen User openhab läuft?
          Code:
          openhab-cli info
          (Standard-User ist openhab)

          Kommentar


            #6
            Ich habe es jetzt mit dem Script probiert, damit funktioniert es nur über die Rule. Direkt leider nicht.
            Was kann jetzt noch das Problem sein?

            Things
            Code:
            Thing exec:command:copylog    [command="sudo -u openhab /usr/local/bin/copylog.sh", autorun=false]
            hier muss doch autorun=false sein da ich immer den selben Befehl sende oder?

            Item
            Code:
            StringCopy_Log    "Kopiere Logs"    { channel="exec:command:copylog:input" }
            Sitemap
            Code:
            Switch item=Copy_Log label="Kopiere Logs []" mappings=[copy="Kopieren"]
            Passt dieser Aufruf überhaupt?
            Wie sehe ich ob der Befehl beim Raspi ankommt?

            Kommentar


              #7
              Zitat von TomW80 Beitrag anzeigen
              Thing exec:command:copylog [command="sudo -u openhab /usr/local/bin/copylog.sh", autorun=false]
              Warum mit sudo? Und dann noch mit openhab als User...

              Kommentar


                #8
                Zitat von wknx Beitrag anzeigen
                Warum mit sudo? Und dann noch mit openhab als User...
                Das war ein Test ob es mit Angabe des Users openhab funktioniert. Aber auch ohne "sudo -u openhab" funktioniert es nur mit der Rule.

                Kommentar


                  #9
                  Das Exec Binding ist etwas tricky...

                  Jeder per Exec abzusetzende Befehl muss als Thing angelegt werden. Dabei hat jedes Thing einen festen Satz Channel:
                  Channel Beschreibung
                  input Die zu übergebenden Befehlszeilenparameter
                  output Die Ausgabe vom aufgerufenen Befehl
                  exit Der Rückgabewert (gewöhnlich 0 für OK oder ungleich 0 für Fehler Nummer)
                  run Starte das Script bzw. läuft das Script gerade
                  lastexecution wann lief das Script zuletzt
                  Weiterhin gibt es einen festen Satz Parameter pro Thing
                  Parameter Beschreibung
                  command Der auszuführende Befehl (kompletter Pfad)
                  transform Die Ausgabe wird noch transformiert (z.B. REGEX...)
                  interval Befehl periodisch alle <interval> Sekunden ausführen
                  timeout Wie lange darf der Befehl brauchen
                  autorun Befehl starten, sobald Input gesetzt wurde
                  autorun=false bewirkt also, dass man zwingend den Channel run mit einem Switch Item verlinken und das Kommando über diesen Schalter aktivieren muss (Der Channel zeigt auch an, wenn der Befehl gerade ausgeführt wird - das ist natürlich nur bei sehr lange laufenden Befehlen sinnvoll erkennbar)

                  openHAB läuft unter dem User openhab. Insofern ist es nicht sinnvoll, den Befehl sudo -u openhab auszuführen. Abgesehen davon ist openhab (der User) gewöhnlich gar nicht berechtigt, Anwendungen mit sudo auszuführen, erst recht nicht, ohne ein Passwort zu nutzen.

                  Das Kommando, welches als Parameter command angegeben ist, muss außerdem in der whitelist eingetragen werden, und zwar exakt so, wie es auch im Parameter angegeben ist. Führende Leerzeichen sind nicht zulässig (Führende Leerzeichen bewirken in der Bash, dass der eingegebene Befehl nicht in die History geschrieben wird - das ist aber nur relevant, wenn man direkt die Eingabeaufforderung verwendet, nicht innerhalb von Scripten)

                  Deine Thing-Definition sollte also eher so aussehen:
                  Code:
                  Thing exec:command:copylog [command="/usr/local/bin/copylog.sh", autorun=false, interval=0]
                  und das zugehörige Item:
                  Code:
                  Switch Copy_Log "Kopiere Logs" { channel="exec:command:copylog:run" }
                  Sowie in der Sitemap:
                  Code:
                  Switch item=Copy_Log label="Kopiere Logs" mappings=[ON="Kopieren"]

                  Kommentar


                    #10
                    Zitat von udo1toni Beitrag anzeigen
                    Das Exec Binding ist etwas tricky...

                    Deine Thing-Definition sollte also eher so aussehen:
                    Code:
                    Thing exec:command:copylog [command="/usr/local/bin/copylog.sh", autorun=false, interval=0]
                    und das zugehörige Item:
                    Code:
                    Switch Copy_Log "Kopiere Logs" { channel="exec:command:copylog:run" }
                    Sowie in der Sitemap:
                    Code:
                    Switch item=Copy_Log label="Kopiere Logs" mappings=[ON="Kopieren"]
                    Danke! So funktioniert es.

                    Kommentar


                      #11

                      Kommentar

                      Lädt...
                      X