Univention Bugzilla – Bug 18191
Client Tool zum OpenDVDI Verbindungsaufbau
Last modified: 2023-03-25 06:41:40 CET
Es wird ein Client-Tool für den Aufbau der OpenDVDI-Verbindung benötigt. Das Client Tool muss sich ebenfalls mit dem Sessionmanagement verbinden und Alive-Events an das Sessionmanagement schicken. Das Tool sollte für das Thin Client System und für Windows zur Verfügung gestellt werden.
(In reply to comment #0) > Es wird ein Client-Tool für den Aufbau der OpenDVDI-Verbindung benötigt. Das > Client Tool muss sich ebenfalls mit dem Sessionmanagement verbinden und > Alive-Events an das Sessionmanagement schicken. Die Alive-Events erfolgen per HTTPS.
Es sollte sichergestellt sein, dass auch vom Server Befehle an den Client geschickt werden. Hierfür könnte HTTP Server Push verwendet werden: http://en.wikipedia.org/wiki/Push_technology#HTTP_server_push Für den ersten Meilenstein reicht eine Abbildung über ein Thin Client Startskript.
Das Paket univention-opendvdi-login habe ich neu gebaut. Der Sessionbroker Client wird derzeit nur auf dem Terminalserver installiert, hier fehlt noch ein univention-thin-client-apt install univention-opendvdi-sessionbroker-client
root@xen1:/var/lib/univention-client-root# /usr/bin/univention-opendvdi-sessionbroker-client Kein Benutzername angegeben, verwende aktuellen Benutzer root Kein Sessionbroker erreichbar für SRV Eintrag _opendvdi_sessionbroker._tcp.opendvdi.local. root@xen1:/var/lib/univention-client-root# host -t SRV _opendvdi_sessionbroker._tcp.opendvdi.local _opendvdi_sessionbroker._tcp.opendvdi.local has SRV record 0 0 7372 xen1.opendvdi.local. root@xen1:/var/lib/univention-client-root# ps -ef | grep -i session root 22442 1 0 08:41 ? 00:00:00 /usr/bin/python2.4 /usr/sbin/univention-opendvdi-sessionbroker -d root 22511 9649 0 08:42 pts/3 00:00:00 grep -i session root@xen1:/var/lib/univention-client-root#
Der Sessionbroker Client hat den SRV-Record mit einem "." am Ende abgefragt und verglichen, ob die Ausgabe dem entspricht, also root@ucs-master:~# host -t SRV _opendvdi_sessionbroker._tcp.opendvdi.demo. _opendvdi_sessionbroker._tcp.opendvdi.demo has SRV record 0 0 7372 ucs-master.opendvdi.demo. root@ucs-master:~# Im Code stand dann "_opendvdi_sessionbroker._tcp.opendvdi.demo." == "_opendvdi_sessionbroker._tcp.opendvdi.demo" Ich habe das Problem temporär gelöst, indem ich ohne Punkt am Ende abfrage, besser ist es aber vermutlich hier eine Python DNS Klasse zu verwenden.
Traceback beim Test in der Thin Client Umgebung: Exception in thread Thread-2: Traceback (most recent call last): File "/usr/lib/python2.4/threading.py", line 442, in __bootstrap self.run() File "/usr/lib/python2.4/threading.py", line 422, in run self.__target(*self.__args, **self.__kwargs) File "/usr/bin/univention-opendvdi-sessionbroker-client", line 220, in HTTP11_client time.sleep( response_dict['update_interval'] ) TypeError: a float is required Und dieser Exception in thread Thread-2: Traceback (most recent call last): File "/usr/lib/python2.4/threading.py", line 442, in __bootstrap self.run() File "/usr/lib/python2.4/threading.py", line 422, in run self.__target(*self.__args, **self.__kwargs) File "/usr/bin/univention-opendvdi-sessionbroker-client", line 225, in HTTP11_client conn2.request("GET", "/alive?session_id=%(session_id)s" % response_dict) File "/usr/lib/python2.4/httplib.py", line 804, in request self._send_request(method, url, body, headers) File "/usr/lib/python2.4/httplib.py", line 827, in _send_request self.endheaders() File "/usr/lib/python2.4/httplib.py", line 798, in endheaders self._send_output() File "/usr/lib/python2.4/httplib.py", line 679, in _send_output self.send(msg) File "/usr/lib/python2.4/httplib.py", line 658, in send self.sock.sendall(str) File "/usr/lib/python2.4/httplib.py", line 1046, in send return self._ssl.write(stuff) error: (32, 'Daten\xc3\xbcbergabe unterbrochen (broken pipe)')
Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib/python2.4/threading.py", line 442, in __bootstrap self.run() File "/usr/lib/python2.4/threading.py", line 422, in run self.__target(*self.__args, **self.__kwargs) File "/usr/bin/univention-opendvdi-sessionbroker-client", line 124, in HTTP11_streaming_client sleep(0.1) NameError: global name 'sleep' is not defined
Es wird jetzt python-dns zur DNS-Abfrage verwendet (fix für Comment 5). Der Traceback aus Comment 7 ist gefixed und auch die Tracebacks aus Comment 6 werden behandelt, ob das reicht muss sich noch zeigen. Zusätzlich sollte der Client jetzt KeyboardInterrupt abfangen und bei laufendem RDP als SIGINT an den subprozess weiterleiten.
Server und Client wurden nochmal angepasst, um Fehler beim Anlegen der Mysql-Datenbank deutlicher erkennbar zu machen und serverseitige Tracebacks und schlechte HTTP-Status am Client auszugeben. Der cherrypy wsgiserver verschluckt leider tracebacks per default..
(In reply to comment #0) > Das Tool sollte für das Thin Client System und für Windows zur Verfügung > gestellt werden. Für Windows gibt es einen separaten Bug: Bug #19954.
Mit UCS TCS 3.0 funktioniert das soweit, wie für den UCS DVS Prototypen getestet. Dafür wurden von Philipp und mir ein paar Anpassungen an der Inter-Thread-Kommunikation vorgenommen. Verbesserungswürdig ist noch: * Es wird zur Zeit solange versucht eine rdesktop-Verbindung zum Ziehlhost aufzumachen, bis das klappt. Da wäre vermutlich ein Timeout sinnvoll. * Bug 20562 Für MS2 ist das erstmal so ok. Bug clonen, wenn da noch was geändert werden muss.
Der univention-dvs-session-broker-client wurde auf das Passwort-Übergabeformat (base64) aus UCS 3.1 umgestellt.
Auf einem TC nach einem simulierten Aussetzer in der Verbindung: Der SB hat die Sitzung bereits beendet, der SB-C versucht sein nächstes Lebenszeichen zu senden und scheitert daran. Auszug aus <file:/home/phahn/.xsession-errors>: [Keep-alive Thread] HTTP11_client sendet nächstes Lebenszeichen für session_id=455aa012-a22f-515b-b9f7-e2d2f34c0642 [Keep-alive Thread] alive event server response 408: [Keep-alive Thread] Terminating process [Keep-alive Thread] HTTP11_client schießt session_id=455aa012-a22f-515b-b9f7-e2d2f34c0642 Exception in thread Keep-alive Thread: Traceback (most recent call last): File "/usr/lib/python2.4/threading.py", line 442, in __bootstrap self.run() File "/usr/lib/python2.4/threading.py", line 422, in run self.__target(*self.__args, **self.__kwargs) File "/usr/bin/univention-dvs-sessionbroker-client", line 316, in HTTP11_client conn2.request("GET", "/close?session_id=%(session_id)s" % response_dict) File "/usr/lib/python2.4/httplib.py", line 804, in request self._send_request(method, url, body, headers) File "/usr/lib/python2.4/httplib.py", line 827, in _send_request self.endheaders() File "/usr/lib/python2.4/httplib.py", line 798, in endheaders self._send_output() File "/usr/lib/python2.4/httplib.py", line 679, in _send_output self.send(msg) File "/usr/lib/python2.4/httplib.py", line 658, in send self.sock.sendall(str) File "/usr/lib/python2.4/httplib.py", line 1046, in send return self._ssl.write(stuff) error: (32, 'Daten\xc3\xbcbergabe unterbrochen (broken pipe)') --- univention-dvs-sessionbroker-client (Revision 21497) +++ univention-dvs-sessionbroker-client (Arbeitskopie) @@ -283,7 +282,7 @@ # Reconnect after closing current (defunc) connection try: conn2 - except: + except NameError: conn2 = httplib.HTTPSConnection(options.sessionbrokerhost, options.port) conn2.auto_open = False conn2.connect() @@ -295,7 +294,14 @@ log(2, 'alive event server response %d: %s\n' % (response.status, body)) if response.status == httplib.OK: # 200 continue + elif response.status == httplib.REQUEST_TIMEOUT: # 408 + log(0, 'timeout sending alive event, retrying') + continue + elif response.status == httplib.BAD_REQUEST: # 400 + log(0, 'session invalidated by session broker, terminating') + terminate() else: + log(0, 'Unhandled error code %d, terminating' % response.status) terminate() except httplib.BadStatusLine: log(0, 'connection closed while receiving alive event') @@ -318,6 +324,8 @@ body = response.read() except httplib.CannotSendRequest: pass + except socket.error, (err, errstr): + pass conn2.close() Patch lässt sich identisch auch für UniventionDVSession.pyw anwenden: patch UniventionDVSession.pyw 18191_dvs_sbc_close.diff Ein weiteres Problem tritt beim Wiederaufnehmen einer Sitzung auf: Der Status in der DB bleibt auf SILENT, weshalb im Logfile ständig die Meldung erscheint, daß die Sitzung wiederaufgenommen wird: 2010-12-15 11:24:06,330 - SessionBroker - DEBUG - /alive b24df4f5-a372-51d1-b721-2f2b2ae1c36d 2010-12-15 11:24:06,359 - SessionBroker - DEBUG - Cancelling previous timer <_Timer(b24df4f5-a372-51d1-b721-2f2b2ae1c36d, started daemon)> 2010-12-15 11:24:06,359 - SessionBroker - INFO - Resuming session b24df4f5-a372-51d1-b721-2f2b2ae1c36d --- univention-dvs-sessionbroker (Revision 21497) +++ univention-dvs-sessionbroker (Arbeitskopie) @@ -451,8 +451,8 @@ if status == SESSION_STATUS_SILENT: logger.info(_("Resuming session %s") % session_id) ## periodic alive event - query = "UPDATE sessions SET expires=DATE_ADD(now(),INTERVAL %s SECOND) WHERE session_id=%s" - values = (2*update_interval, session_id) + query = "UPDATE sessions SET expires=DATE_ADD(now(),INTERVAL %s SECOND), status=%s WHERE session_id=%s" + values = (2*update_interval, SESSION_STATUS_ACTIVE, session_id) rows = cursor.execute(query, values) if rows != 1: logger.warning(query % values)
Created attachment 2920 [details] Fix session resume Fix exception on broken pipe (Bug #19943) Fix session not resuming.
Das Paket ist mit den Patches gegen univention-dvs-sessionbroker, univention-dvs-sessionbroker-client und UniventionDVSession.pyw neu gebaut.
SessionBroker-Client funktioniert soweit: Benutzer kann sich anmelden, wenn die Instanz schon läuft. Wenn die VM allerdings mal heruntergefahren wurde, dauert der Startvorgang erheblich länger. Der SB-C probiert zwar wiederholt, die Instanz zu erreichen, bricht aber dann schließlich ab: # tail -f /home/pmhahn/.xsession-errors ... ERROR: scard_enum_devices: PCSC service not available ERROR: 10.201.154.75: unable to connect PARALLEL LPT2 to /dev/usb/lp0 PARALLEL LPT3 to /dev/lp0 [MainThread] Terminating process None ... [¹⁴°] None [Keep-alive Thread] HTTP11_client sendet nächstes Lebenszeichen für session_id=4a4f3312-ed2b-555f-bc5e-51ff3368fc34 [Keep-alive Thread] alive event server response 200: (dp1 S'session_id' p2 S'4a4f3312-ed2b-555f-bc5e-51ff3368fc34' p3 s. [Keep-alive Thread] HTTP11_client schießt session_id=4a4f3312-ed2b-555f-bc5e-51ff3368fc34 + rm -rf /tmp/passwd + exit 0 Aus /usr/bin/univention-dvs-sessionbroker-client:437: »·»···while (t-t0) < 90:»·# try at most 90 seconds before returning control to the user Mit 900s hat es funktioniert. Mit der Stoppuhr wurde folgendes gemessen: 0:45 Login-Dialog erscheint in VNC 1:45 Login per RDP wird angenommen 2:30 Benutzer-Bildschirm erscheint per RDP Empfehlung: Verdoppeln auf 3 Minuten = 180 Sekunden.
Timeout ist jetzt in univentio-dvs-sessionbroker-client und in UniventionDVSession.pyw auf 180 sec erhöht.
Mit dem neuen Timeout von 180 s hat nun der Sitzungsaufbau funktioniert. In Zukunft wäre ein Fortschrittsbalken für den Benutzer ganz hilfreich. Derzeit gibt der Client auch noch sehr viele Fehler und Debugging-Meldungen aus, ggf. sollte das noch mal reduziert werden.
> Mit dem neuen Timeout von 180 s hat nun der Sitzungsaufbau funktioniert. In > Zukunft wäre ein Fortschrittsbalken für den Benutzer ganz hilfreich. Ja, ich wusste nur nicht direkt, wie man das dann realisiert. Der Windows-Client würde das dann auch brauchen, in Qt, vielleicht würde sich das ja auch für den X-Client eignen (bräuchte man dann allerdings in der TC-Umgebung). > Derzeit gibt der Client auch noch sehr viele Fehler und Debugging-Meldungen > aus, ggf. sollte das noch mal reduziert werden. Das ist nur eine Eigenheit der aktuellen Testumgebung, extra aktiviert in /var/lib/univention-client-root/etc/gdm/Sessions/DVS