Telnet Wrapper via expect

Begonnen von Loredo, 11 Juli 2018, 20:08:34

Vorheriges Thema - Nächstes Thema

Loredo

Hi,


ich habe ein expect Script zusammengeschustert, mit dem man sich etwas einfacher mit der FHEM Telnet Schnittstelle verbinden kann.




#!/usr/bin/expect -f


set HOST [lindex $argv 0]
set PORT [lindex $argv 1]
set PASSWORD [lindex $argv 2]
set COMMAND [lindex $argv 3]
set timeout 10


spawn -noecho telnet $HOST $PORT
match_max 10000000
log_user 0


if { $PASSWORD != "-" } {
expect -exact "\r\r
Entering character mode\r\r
Escape character is '^\]'.\r\r
\r
Password: "
send -- "$PASSWORD\r"
expect -exact "\r
Entering line mode\r
Escape character is '^C'.\r
\r\r
\r\r
"
}


send -- "$COMMAND\r"


# start interactive session
if { $COMMAND == "" } {
  interact


# open permanent channel
} elseif { [regexp -nocase "^(inform|iowrite).*" $COMMAND] } {
  expect "$COMMAND\r"
  interact


# run one-time command
} else {
  # # FIXME does not work with FHEM because commands without output would be stuck...
  # # ... but we want this to avoid the output of our sent commands back to the user
  # # to improve scriptability
  #
  # # OPTION 1: only works for FHEM commands with multi-line output,
  # #           but longer output is still incomplete :-(
  # expect -re "\n(.*)\r"
  # log_user 1
  # puts "$expect_out(0,string)"
  # log_user 0
  # send -- "quit\r"
  # expect eof


  # # OPTION 2: only works for FHEM command without output
  # expect {
  #   # no return
  #   -exact "\n" {
  #     send -- "quit\r"
  #     expect eof
  #   }
  #
  #   # command has return text
  #   -re "\n(.*)\r" { #TODO longer output is incomplete
  #     log_user 1
  #     puts "$expect_out(0,string)"
  #     log_user 0
  #     send -- "quit\r"
  #     expect eof
  #   }
  # }


  # Fallback option that works with complete output
  # but copies sent FHEM commands to the user... :-(
  expect "$COMMAND\r"
  log_user 1
  send -- "quit\r"
  expect *eof
}



Leider funktioniert das Script nicht wie gedacht, denn die gesendeten Befehle erscheinen ebenfalls beim Benutzer.
Das ist für eine interaktive Session nicht tragisch, schränkt aber die Script-Fähigkeit leider ziemlich ein bei der Weiterverarbeitung des Outputs... Auch will man dann natürlich das "Bye..." am Ende nicht haben.


Die Schwierigkeit ist, dass ich keine funktionierende Möglichkeit finde die Ausgabe zu filtern.


Ich dachte ich frage einmal, ob sich hier damit schonmal jemand beschäftigt hat und/oder eine Lösung weiß.




Gruß
Julian
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

betateilchen

noch einfacher als die bisherige Variante geht doch kaum noch...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Loredo

Welche ist die bisherige Variante?
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

rudolfkoenig

ZitatWelche ist die bisherige Variante?
Ich vermute "perl fhem.pl [host:]port cmd cmd cmd"

Loredo

Hm okay da hab ich natürlich die Abhängigkeit, dass ich bei einem separaten System eine zweite Fhem Installation brauche (wenn auch ohne Daemon). Diese Abhängigkeit ist nicht soooo toll.

In der Doku steht leider auch nicht wie man ein Passwort mit übergibt. Ist das einfach als erster Parameter?
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Wuppi68

Zitat von: Loredo am 12 Juli 2018, 12:28:07
Hm okay da hab ich natürlich die Abhängigkeit, dass ich bei einem separaten System eine zweite Fhem Installation brauche (wenn auch ohne Daemon). Diese Abhängigkeit ist nicht soooo toll.

In der Doku steht leider auch nicht wie man ein Passwort mit übergibt. Ist das einfach als erster Parameter?

es geht doch "immer" auch ssh <user>@<fhemhost> perl fhem.pl [host:]port cmd cmd cmd
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

Loredo

Ich hab mich irgendwie dumm angestellt, habs jetzt.


Danke :-)
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Loredo

Hm, ich muss doch nochmal einhaken.


Die Nutzung von fhem.pl ermöglicht es nicht z.B. eine dauerhafte Verbindung mittels "inform on" aufzubauen.
Auch ist es nicht möglich eine interaktive Session zu starten. Diese 3 Use Cases lassen sich mit Expect aber (zumindest jeweils separat) sehr gut abbilden.


Die Frage ist nun: Bin ich tatsächlich darauf angewiesen das zu splitten und Einmalbefehle über fhem.pl auszuführen und beide anderen Fälle über Expect? Klingt für mich etwas unbefriedigend :-/
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER