Changeset 2449 for package_branches


Ignore:
Timestamp:
Aug 21, 2009, 12:13:42 PM (15 years ago)
Author:
ecprice
Message:

Fix race condition in ajaxterm

File:
1 edited

Legend:

Unmodified
Added
Removed
  • package_branches/invirt-web/cherrypy/code/main.py

    r2440 r2449  
    11#!/usr/bin/python
    22"""Main CGI script for web interface"""
     3
     4from __future__ import with_statement
    35
    46import base64
     
    1113import simplejson
    1214import sys
     15import threading
    1316import time
    1417import urllib
     
    1619import cherrypy
    1720from StringIO import StringIO
     21
    1822def revertStandardError():
    1923    """Move stderr to stdout, and return the contents of the old stderr."""
     
    282286        atmulti = ajaxterm.Multiplex()
    283287        atsessions = {}
     288        atsessions_lock = threading.Lock()
    284289
    285290        @cherrypy.expose
     
    301306        def at(self, machine_id, k=None, c=0, force=0):
    302307            machine = validation.Validate(cherrypy.request.login, cherrypy.request.state, machine_id=machine_id).machine
    303             if machine_id in self.atsessions:
    304                 term = self.atsessions[machine_id]
    305             else:
    306                 print >>sys.stderr, "spawning new session for terminal to ",machine_id
    307                 term = self.atsessions[machine_id] = self.atmulti.create(
    308                     ["ssh", "-e","none", "-l", machine.name, config.console.hostname]
    309                     )
    310             if k:
    311                 self.atmulti.proc_write(term,k)
    312             time.sleep(0.002)
    313             dump=self.atmulti.dump(term,c,int(force))
    314             cherrypy.response.headers['Content-Type']='text/xml'
    315             if isinstance(dump,str):
    316                 return dump
    317             else:
    318                 print "Removing session for", machine_id
    319                 del self.atsessions[machine_id]
    320                 return '<?xml version="1.0"?><idem></idem>'
     308            with self.atsessions_lock:
     309                if machine_id in self.atsessions:
     310                    term = self.atsessions[machine_id]
     311                else:
     312                    print >>sys.stderr, "spawning new session for terminal to ",machine_id
     313                    term = self.atsessions[machine_id] = self.atmulti.create(
     314                        ["ssh", "-e","none", "-l", machine.name, config.console.hostname]
     315                        )
     316                if k:
     317                    self.atmulti.proc_write(term,k)
     318                time.sleep(0.002)
     319                dump=self.atmulti.dump(term,c,int(force))
     320                cherrypy.response.headers['Content-Type']='text/xml'
     321                if isinstance(dump,str):
     322                    return dump
     323                else:
     324                    print "Removing session for", machine_id
     325                    del self.atsessions[machine_id]
     326                    return '<?xml version="1.0"?><idem></idem>'
    321327
    322328    machine = MachineView()
Note: See TracChangeset for help on using the changeset viewer.