Standalone VNC client fixes
[invirt/scripts/vnc-client.git] / invirt-vnc-client
index a4a9570..8a17f1d 100755 (executable)
@@ -1,8 +1,8 @@
 #!/usr/bin/python
-from twisted.internet import reactor, ssl, protocol
+from twisted.internet import reactor, ssl, protocol, error
 from OpenSSL import SSL
 import base64, pickle
-import getopt, sys
+import getopt, sys, os, time
 
 verbose = False
 
@@ -19,10 +19,13 @@ def usage():
 class ClientContextFactory(ssl.ClientContextFactory):
 
     def _verify(self, connection, x509, errnum, errdepth, ok):
-        print '_verify (ok=%d):' % ok
-        print '  subject:', x509.get_subject()
-        print '  issuer:', x509.get_issuer()
-        print '  errnum %s, errdepth %d' % (errnum, errdepth)
+        if verbose:
+            print '_verify (ok=%d):' % ok
+            print '  subject:', x509.get_subject()
+            print '  issuer:', x509.get_issuer()
+            print '  errnum %s, errdepth %d' % (errnum, errdepth)
+        if errnum == 10:
+            print 'The VNC server certificate has expired. Please contact xvm@mit.edu.'
         return ok
 
     def getContext(self):
@@ -59,16 +62,18 @@ class ProxyClient(Proxy):
         self.transport.write(data)
         if verbose: print "ProxyClient: connection made"
     def dataReceived(self, data):
-        if not ready:
+        if not self.ready:
             if verbose: print 'ProxyClient: received data "%s"' % data
             if data.startswith("VNCProxy/1.0 200 "):
-                ready = True
+                self.ready = True
                 if "\n" in data:
-                    self.peer.transport.write(data[data.find("\n")+1:])
+                    self.peer.transport.write(data[data.find("\n")+3:])
                 self.peer.transport.resumeProducing() # Allow reading
             else:
                 print "Failed to connect: %s" % data
                 self.transport.loseConnection()
+        else:
+            self.peer.transport.write(data)
 
 class ProxyClientFactory(protocol.ClientFactory):
     protocol = ProxyClient
@@ -182,11 +187,21 @@ def main():
         sys.exit(1)
     
     if verbose: print "Will connect to %s:%s" % (connect_host, connect_port) 
+    if listen[1] is None:
+        listen[1] = 5900
+        ready = False
+        while not ready:
+            try:
+                reactor.listenTCP(listen[1], ProxyFactory(connect_host, connect_port, authtoken, machine))
+                ready = True
+            except error.CannotListenError:
+                listen[1] += 1
+    else:
+        reactor.listenTCP(listen[1], ProxyFactory(connect_host, connect_port, authtoken, machine))
     
-    listen[1] = 10003
-    reactor.listenTCP(listen[1], ProxyFactory(connect_host, connect_port, authtoken, machine))
-    
-    print "Ready to connect. Connect to %s:%s now with your VNC client. The password is 'moocow'." % (listen[0], listen[1])
+    print "Ready to connect. Connect to %s:%s (display %d) now with your VNC client. The password is 'moocow'." % (listen[0], listen[1], listen[1]-5900)
+    print "You must connect before your authentication token expires at %s." % \
+          (time.ctime(token_expires))
     
     reactor.run()