Hilfe bei der Anpassung eines Python-Libvirt Programmes

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@eye:
Für einfache Terminalinteraktion reicht der Ansatz mit einem Eingabefeld und der Ausgabe in einem div. Damit kannst Du aber dann nur genau das - Befehl eingeben - Ausgabe lesen. Für echte Terminalprogramme wie top, vim, mc etc. reicht das leider nicht. Eine Zwischenvariante wäre hier der Einsatz von pexpect, das Pythonmodul bringt einen leichtgewichtigen Terminalemulator mit. Damit könnte man einen "Terminalscraper" realisieren, heisst die Terminalapp schreibt eigentlich auf dem Emulator und Du holst Dir nur die Ausgabe und schreibst sie in den Browser.

Für full featured kommst Du um einen Terminalemulator nicht herum.
Benutzeravatar
eye
User
Beiträge: 10
Registriert: Dienstag 19. November 2013, 08:36

Für full featured kommst Du um einen Terminalemulator nicht herum.
Und nehmen wir mal an ich hätte so einen Terminalemulator wie z.B. GateOne oder ShellInABox - wie bekomme ich die dazu mit dem Python Programm zu sprechen? Wo oder was ist die Schnittstelle?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

eye hat geschrieben:Und nehmen wir mal an ich hätte so einen Terminalemulator wie z.B. GateOne oder ShellInABox - wie bekomme ich die dazu mit dem Python Programm zu sprechen? Wo oder was ist die Schnittstelle?
GateOne scheint mit der entsprechenden Serverkomponente zu kommen.

Prinzipiell läuft das so - Du erzeugst einen neuen Prozess, der am Pseudoterminal hängt - `pty.fork()`. Der Aufruf gibt dem Elternprozess (dem Pythonskript) die PID des Kindprozesses und einen filedescriptor, welcher der MASTER des Pseudoterminals ist. Der Kindprozess erhält PID 0 und einen ungültigen filedescriptor. Im Kindprozess startest Du das gewünschte Programm, z.B. eine Shell.
Über MASTER im Elternprozess sprichst Du mit dem Programm via `read` und `write`. Wichtig zu wissen ist, dass der MASTER eines Pseudoterminals die Terminalseite ist. Das ist zunächst etwas verwirrend, da man normalerweise nur das andere Ende kennt (STDIN/OUT/ERR des Kindprogrammes).
Ein Emulator wie xterm liest jetzt einfach den MASTER, wertet die Steuerkommandos aus, setzt Cursor, Farben, Puffer etc. und schreibt die Eingabe (Tastendruck) nach MASTER. Für einen Terminalemulator im Browser musst Du die Streams vom MASTER noch an den Browser delegieren.

NB: Falls das unklar sein sollte - ein Pseudoterminal ist eine "clevere" Pipe, die ein MASTER- und ein Programm-Ende kennt. Clever deshalb, weil der Datenstrom nicht einfach von A nach B geschaufelt wird, sondern kernelseitig Leitungseigenschaften und Treibermodell früherer echter Terminalanbindungen emuliert werden. Die kannst Du mit `termios` und `ioctl` ansprechen (z.B. Größe des Displays, Eingabemodus etc.).
Antworten