Bug 18191 - Client Tool zum OpenDVDI Verbindungsaufbau
Client Tool zum OpenDVDI Verbindungsaufbau
Status: CLOSED FIXED
Product: UCS
Classification: Unclassified
Component: OpenDVDI
UCS 2.2
Other Linux
: P5 normal (vote)
: OpenDVDI MS2
Assigned To: Arvid Requate
Philipp Hahn
:
Depends on: 20415
Blocks:
  Show dependency treegraph
 
Reported: 2010-04-20 09:27 CEST by Stefan Gohmann
Modified: 2023-03-25 06:41 CET (History)
0 users

See Also:
What kind of report is it?: ---
What type of bug is this?: ---
Who will be affected by this bug?: ---
How will those affected feel about the bug?: ---
User Pain:
Enterprise Customer affected?:
School Customer affected?:
ISV affected?:
Waiting Support:
Flags outvoted (downgraded) after PO Review:
Ticket number:
Bug group (optional):
Max CVSS v3 score:


Attachments
Fix session resume (2.99 KB, patch)
2010-12-15 11:55 CET, Philipp Hahn
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Stefan Gohmann univentionstaff 2010-04-20 09:27:55 CEST
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.
Comment 1 Stefan Gohmann univentionstaff 2010-04-26 07:58:09 CEST
(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.
Comment 2 Stefan Gohmann univentionstaff 2010-05-10 11:04:20 CEST
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.
Comment 3 Stefan Gohmann univentionstaff 2010-06-18 08:25:43 CEST
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
Comment 4 Stefan Gohmann univentionstaff 2010-06-18 08:31:53 CEST
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#
Comment 5 Stefan Gohmann univentionstaff 2010-06-24 16:50:12 CEST
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.
Comment 6 Stefan Gohmann univentionstaff 2010-06-25 09:20:36 CEST
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)')
Comment 7 Stefan Gohmann univentionstaff 2010-06-25 09:37:14 CEST
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
Comment 8 Arvid Requate univentionstaff 2010-06-28 10:55:10 CEST
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.
Comment 9 Arvid Requate univentionstaff 2010-08-10 17:02:36 CEST
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..
Comment 10 Stefan Gohmann univentionstaff 2010-09-13 08:08:36 CEST
(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.
Comment 11 Arvid Requate univentionstaff 2010-11-01 13:39:28 CET
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.
Comment 12 Arvid Requate univentionstaff 2010-12-07 19:11:09 CET
Der univention-dvs-session-broker-client wurde auf das Passwort-Übergabeformat (base64) aus UCS 3.1 umgestellt.
Comment 13 Philipp Hahn univentionstaff 2010-12-15 11:27:52 CET
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)
Comment 14 Philipp Hahn univentionstaff 2010-12-15 11:55:46 CET
Created attachment 2920 [details]
Fix session resume

Fix exception on broken pipe (Bug #19943)
Fix session not resuming.
Comment 15 Arvid Requate univentionstaff 2010-12-15 14:16:30 CET
Das Paket ist mit den Patches gegen univention-dvs-sessionbroker, univention-dvs-sessionbroker-client und UniventionDVSession.pyw neu gebaut.
Comment 16 Philipp Hahn univentionstaff 2010-12-15 19:54:49 CET
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.
Comment 17 Arvid Requate univentionstaff 2010-12-15 20:55:15 CET
Timeout ist jetzt in univentio-dvs-sessionbroker-client und in UniventionDVSession.pyw  auf 180 sec erhöht.
Comment 18 Philipp Hahn univentionstaff 2010-12-16 16:11:59 CET
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.
Comment 19 Arvid Requate univentionstaff 2010-12-16 16:37:56 CET
> 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