Fix race condition in ajaxterm
authorEric Price <ecprice@mit.edu>
Fri, 21 Aug 2009 16:13:42 +0000 (12:13 -0400)
committerEric Price <ecprice@mit.edu>
Fri, 21 Aug 2009 16:13:42 +0000 (12:13 -0400)
svn path=/package_branches/invirt-web/ajaxterm-rebased/; revision=2756

code/main.py

index c18cd9f..f42e1fd 100755 (executable)
@@ -1,6 +1,8 @@
 #!/usr/bin/python
 """Main CGI script for web interface"""
 
 #!/usr/bin/python
 """Main CGI script for web interface"""
 
+from __future__ import with_statement
+
 import base64
 import cPickle
 import cgi
 import base64
 import cPickle
 import cgi
@@ -10,6 +12,7 @@ import os
 import random
 import sha
 import sys
 import random
 import sha
 import sys
+import threading
 import time
 import urllib
 import socket
 import time
 import urllib
 import socket
@@ -391,6 +394,7 @@ console will suffer artifacts.
 
         atmulti = ajaxterm.Multiplex()
         atsessions = {}
 
         atmulti = ajaxterm.Multiplex()
         atsessions = {}
+        atsessions_lock = threading.Lock()
 
         @cherrypy.expose
         @cherrypy.tools.mako(filename="/terminal.mako")
 
         @cherrypy.expose
         @cherrypy.tools.mako(filename="/terminal.mako")
@@ -410,24 +414,25 @@ console will suffer artifacts.
         @cherrypy.tools.gzip()
         def at(self, machine_id, k=None, c=0, force=0):
             machine = validation.Validate(cherrypy.request.login, cherrypy.request.state, machine_id=machine_id).machine
         @cherrypy.tools.gzip()
         def at(self, machine_id, k=None, c=0, force=0):
             machine = validation.Validate(cherrypy.request.login, cherrypy.request.state, machine_id=machine_id).machine
-            if machine_id in self.atsessions:
-                term = self.atsessions[machine_id]
-            else:
-                print >>sys.stderr, "spawning new session for terminal to ",machine_id
-                term = self.atsessions[machine_id] = self.atmulti.create(
-                    ["ssh", "-e","none", "-l", machine.name, config.console.hostname]
-                    )
-            if k:
-                self.atmulti.proc_write(term,k)
-            time.sleep(0.002)
-            dump=self.atmulti.dump(term,c,int(force))
-            cherrypy.response.headers['Content-Type']='text/xml'
-            if isinstance(dump,str):
-                return dump
-            else:
-                print "Removing session for", machine_id
-                del self.atsessions[machine_id]
-                return '<?xml version="1.0"?><idem></idem>'
+            with self.atsessions_lock:
+                if machine_id in self.atsessions:
+                    term = self.atsessions[machine_id]
+                else:
+                    print >>sys.stderr, "spawning new session for terminal to ",machine_id
+                    term = self.atsessions[machine_id] = self.atmulti.create(
+                        ["ssh", "-e","none", "-l", machine.name, config.console.hostname]
+                        )
+                if k:
+                    self.atmulti.proc_write(term,k)
+                time.sleep(0.002)
+                dump=self.atmulti.dump(term,c,int(force))
+                cherrypy.response.headers['Content-Type']='text/xml'
+                if isinstance(dump,str):
+                    return dump
+                else:
+                    print "Removing session for", machine_id
+                    del self.atsessions[machine_id]
+                    return '<?xml version="1.0"?><idem></idem>'
 
     machine = MachineView()
 
 
     machine = MachineView()