35
from ivle import chat, interpret
37
37
class ConsoleError(Exception):
38
38
""" The console failed in some way. This is bad. """
39
def __init__(self, value):
42
return repr(self.value)
41
44
class ConsoleException(Exception):
42
45
""" The code being exectuted on the console returned an exception.
47
def __init__(self, value):
50
return repr(self.value)
46
52
class TruncateStringIO(StringIO.StringIO):
47
53
""" A class that wraps around StringIO and truncates the buffer when the
108
114
class Console(object):
109
115
""" Provides a nice python interface to the console
111
def __init__(self, config, user, jail_path, working_dir):
117
def __init__(self, config, uid, jail_path, working_dir):
112
118
"""Starts up a console service for user uid, inside chroot jail
113
119
jail_path with work directory of working_dir
115
121
super(Console, self).__init__()
117
123
self.config = config
119
125
self.jail_path = jail_path
120
126
self.working_dir = working_dir
152
158
# is (k / N) ** t (e.g. 3.2*10e-9).
157
162
self.port = int(random.uniform(3000, 8000))
159
python_console = os.path.join(self.config['paths']['share'],
160
'services/python-console')
161
args = [python_console, str(self.port), str(self.magic)]
164
interpret.execute_raw(self.config, self.user, self.jail_path,
165
self.working_dir, "/usr/bin/python", args)
164
trampoline_path = os.path.join(self.config['paths']['lib'],
167
# Start the console server (port, magic)
168
# trampoline usage: tramp uid jail_dir working_dir script_path args
169
# console usage: python-console port magic
170
res = os.spawnv(os.P_WAIT, trampoline_path, [
173
self.config['paths']['jails']['mounts'],
174
self.config['paths']['jails']['src'],
175
self.config['paths']['jails']['template'],
177
os.path.join(self.config['paths']['share'], 'services'),
179
os.path.join(self.config['paths']['share'],
180
'services/python-console'),
168
except interpret.ExecutionError, e:
172
# If we can't start the console after 5 attemps (can't find a free
173
# port during random probing, syntax errors, segfaults) throw an
192
# If we can't start the console after 5 attemps (can't find a free port
193
# during random probing, syntax errors, segfaults) throw an exception.
176
raise ConsoleError('Unable to start console service: %s'%error)
195
raise ConsoleError("Unable to start console service!")
178
197
def __chat(self, cmd, args):
179
198
""" A wrapper around chat.chat to comunicate directly with the
281
298
# Unpickle any exceptions
282
299
if 'exception' in execute:
283
execute['exception'] = cPickle.loads(execute['exception'])
300
return cPickle.loads(execute['exception'])
287
305
def set_vars(self, variables):