19
class Interrupt(Exception):
21
Exception.__init__(self, "Interrupted!")
23
20
class ExpiryTimer(object):
24
21
def __init__(self, idle):
26
signal.signal(signal.SIGALRM, partial(self.timeout))
23
signal.signal(signal.SIGALRM, partial(self.timeout,self))
29
26
signal.alarm(self.idle)
45
42
def readline(self):
46
44
self.cmdQ.put({"input":None})
48
46
ln = self.lineQ.get()
54
class StdoutToWeb(object):
55
def __init__(self, cmdQ, lineQ):
60
def write(self, stuff):
61
self.remainder = self.remainder + stuff
63
# if there's less than 128 bytes, buffer
64
if len(self.remainder) < 128:
67
# if there's lots, then send it in 1/2K blocks
68
while len(self.remainder) > 512:
69
blk = self.remainder[0:512]
70
self.cmdQ.put({"output":blk})
73
self.remainder = self.remainder[512:]
75
# Finally, split the remainder up into lines, and ship all the
76
# completed lines off to the server.
77
lines = self.remainder.split("\n")
78
self.remainder = lines[-1]
83
text = "\n".join(lines)
84
self.cmdQ.put({"output":text})
91
if len(self.remainder) > 0:
92
self.cmdQ.put({"output":self.remainder})
100
"""Provides a file like interface to the Web front end of the console.
101
You may print text to the console using write(), flush any buffered output
102
using flush(), or request text from the console using readline()"""
104
def __init__(self, cmdQ, lineQ):
107
self.stdin = StdinFromWeb(self.cmdQ, self.lineQ)
108
self.stdout = StdoutToWeb(self.cmdQ, self.lineQ)
110
def write(self, stuff):
111
self.stdout.write(stuff)
118
return self.stdin.readline()
120
50
class PythonRunner(Thread):
121
51
def __init__(self, cmdQ, lineQ):
123
53
self.lineQ = lineQ
124
self.webio = WebIO(self.cmdQ, self.lineQ)
54
self.out = cStringIO.StringIO()
125
55
Thread.__init__(self)
127
57
def execCmd(self, cmd):
129
sys.stdin = self.webio
130
sys.stdout = self.webio
131
sys.stderr = self.webio
132
res = eval(cmd, self.globs)
134
self.cmdQ.put({"okay":res})
59
sys.stdin = StdinFromWeb(self.cmdQ, self.lineQ)
62
res = eval(cmd, self.globs, self.locls)
63
self.cmdQ.put({"okay":(self.out.getvalue(),res)})
135
64
self.curr_cmd = ''
65
self.out = cStringIO.StringIO()
136
66
except Exception, exc:
138
exc_classname = exc.__class__.__name__
139
self.cmdQ.put({"exc": exc_classname + ": " + str(exc)})
67
self.cmdQ.put({"exc":(self.out.getvalue(),str(exc))})
140
68
self.curr_cmd = ''
69
self.out = cStringIO.StringIO()
144
self.globs['__builtins__'] = globals()['__builtins__']
146
73
compiler = codeop.CommandCompiler()
164
91
except Exception, exc:
166
self.cmdQ.put({"exc":str(exc)})
92
self.cmdQ.put({"exc":(self.out.getvalue(),str(exc))})
167
93
self.curr_cmd = ''
94
self.out = cStringIO.StringIO()
169
96
# throw away a partial command.
171
98
cmd = compile(ln['block'], "<web session>", 'exec');
173
100
except Exception, exc:
175
self.cmdQ.put({"exc":str(exc)})
101
self.cmdQ.put({"exc":(self.out.getvalue(),str(exc))})
176
102
self.curr_cmd = ''
103
self.out = cStringIO.StringIO()
105
def init_state(self):
107
self.globs['__builtins__'] = globals()['__builtins__']
179
112
if os.fork(): # launch child and...