Allow reconnecting to the same terminal session
authorQuentin Smith <quentin@mit.edu>
Tue, 11 Aug 2009 05:15:07 +0000 (01:15 -0400)
committerQuentin Smith <quentin@mit.edu>
Tue, 11 Aug 2009 05:15:07 +0000 (01:15 -0400)
svn path=/package_branches/invirt-web/ajaxterm-rebased/; revision=2753

code/ajaxterm.py
code/main.py
code/static/ajaxterm/ajaxterm.js

index dd7e5b8..8436914 100644 (file)
@@ -320,7 +320,7 @@ class Terminal:
                return r
        def dumplatin1(self):
                return self.dump().translate(self.trl1)
-       def dumphtml(self,color=1):
+       def dumphtml(self,color=1,force=False):
                h=self.height
                w=self.width
                r=""
@@ -343,7 +343,7 @@ class Terminal:
                        if i%w==w-1:
                                span+='\n'
                r='<?xml version="1.0" encoding="ISO-8859-1"?><pre class="term">%s</pre>'%r
-               if self.last_html==r:
+               if self.last_html==r and not force:
                        return '<?xml version="1.0"?><idem></idem>'
                else:
                        self.last_html=r
@@ -436,9 +436,9 @@ class Multiplex:
                        os.write(fd,s)
                except (IOError,OSError):
                        self.proc_kill(fd)
-       def dump(self,fd,color=1):
+       def dump(self,fd,color=1,force=False):
                try:
-                       return self.proc[fd]['term'].dumphtml(color)
+                       return self.proc[fd]['term'].dumphtml(color, force)
                except KeyError:
                        return False
        def loop(self):
index 10e282f..77646c9 100755 (executable)
@@ -407,7 +407,7 @@ console will suffer artifacts.
             return d
 
         @cherrypy.expose
-        def at(self, machine_id, k=None, c=0):
+        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]
@@ -419,11 +419,12 @@ console will suffer artifacts.
             if k:
                 self.atmulti.proc_write(term,k)
             time.sleep(0.002)
-            dump=self.atmulti.dump(term,c)
+            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>'
 
index d876861..9089a96 100644 (file)
@@ -12,6 +12,7 @@ ajaxterm.Terminal_ctor=function(id,machine_id) {
        var keybuf=[];
        var sending=0;
        var rmax=1;
+       var force=true;
 
        var div=document.getElementById(id);
        var dstat=document.createElement('pre');
@@ -102,6 +103,10 @@ ajaxterm.Terminal_ctor=function(id,machine_id) {
                                send+=keybuf.pop();
                        }
                        var query=query1+send;
+                       if (force) {
+                           query=query+"&force=1";
+                           force=false;
+                       }
                        if(opt_get.className=='on') {
                                r.open("GET",base_path+"?"+query,true);
                                if(ie) {
@@ -269,6 +274,7 @@ ajaxterm.Terminal_ctor=function(id,machine_id) {
                }
                document.onkeypress=keypress;
                document.onkeydown=keydown;
+               force=true;
                timeout=window.setTimeout(update,100);
        }
        init();