X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-web.git/blobdiff_plain/5f4f2a93ebd266141eb97a3068af272bdb5ed5e5..b6de14922fb1565d0d1f4a44b1dacc3a95e265a9:/code/ajaxterm.py
diff --git a/code/ajaxterm.py b/code/ajaxterm.py
index 8b3af37..8436914 100644
--- a/code/ajaxterm.py
+++ b/code/ajaxterm.py
@@ -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='
%s
'%r
- if self.last_html==r:
+ if self.last_html==r and not force:
return ''
else:
self.last_html=r
@@ -367,19 +367,18 @@ class SynchronizedMethod:
return r
class Multiplex:
- def __init__(self,cmd=None):
- signal.signal(signal.SIGCHLD, signal.SIG_IGN)
- self.cmd=cmd
+ def __init__(self):
self.proc={}
self.lock=threading.RLock()
self.thread=threading.Thread(target=self.loop)
+ self.thread.daemon=True
self.alive=1
# synchronize methods
for name in ['create','fds','proc_read','proc_write','dump','die','run']:
orig=getattr(self,name)
setattr(self,name,SynchronizedMethod(self.lock,orig))
self.thread.start()
- def create(self,w=80,h=25):
+ def create(self,cmd,w=80,h=25):
pid,fd=pty.fork()
if pid==0:
try:
@@ -391,21 +390,6 @@ class Multiplex:
os.close(i)
except OSError:
pass
- if self.cmd:
- cmd=['/bin/sh','-c',self.cmd]
- elif os.getuid()==0:
- cmd=['/bin/login']
- else:
- sys.stdout.write("Login: ")
- login=sys.stdin.readline().strip()
- if re.match('^[0-9A-Za-z-_. ]+$',login):
- cmd=['ssh']
- cmd+=['-oPreferredAuthentications=keyboard-interactive,password']
- cmd+=['-oNoHostAuthenticationForLocalhost=yes']
- cmd+=['-oLogLevel=FATAL']
- cmd+=['-F/dev/null','-l',login,'localhost']
- else:
- os._exit(0)
env={}
env["COLUMNS"]=str(w)
env["LINES"]=str(h)
@@ -452,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):