47
47
def start(self, req, cwd=''):
48
48
working_dir = os.path.join("/home", req.user.login, cwd)
53
51
jail_path = os.path.join(req.config['paths']['jails']['mounts'],
55
cons = ivle.console.Console(req.config, uid, jail_path, working_dir)
53
cons = ivle.console.Console(req.config, req.user, jail_path,
57
56
# Assemble the key and return it. Yes, it is double-encoded.
58
57
return {'key': cjson.encode({"host": cons.host,
82
81
working_dir = os.path.join("/home", req.user.login, cwd)
85
83
# XXX: JSONRESTView should do this for us.
86
84
text = text.decode('utf-8')
88
86
msg = {'cmd':kind, 'text':text}
90
json_response = ivle.chat.chat(host, port, msg, magic,decode=False)
92
# Snoop the response from python-console to check that it's valid
89
json_response = ivle.chat.chat(host, port, msg, magic,decode=False)
90
# Snoop the response from python-console to check that it's valid
94
91
response = cjson.decode(json_response)
95
except cjson.DecodeError:
92
except (cjson.DecodeError, ivle.chat.ProtocolError):
96
93
# Could not decode the reply from the python-console server
97
94
response = {"terminate":
98
"Communication to console process lost"}
99
96
if "terminate" in response:
100
response = restart_console(req.config, uid, jail_path,
97
response = restart_console(req.config, req.user, jail_path,
101
98
working_dir, response["terminate"])
102
99
except socket.error, (enumber, estring):
103
100
if enumber == errno.ECONNREFUSED:
104
101
# Timeout: Restart the session
105
response = restart_console(req.config, uid, jail_path,
102
response = restart_console(req.config, req.user, jail_path,
107
"The IVLE console has timed out due to inactivity")
104
"Timed out due to inactivity")
108
105
elif enumber == errno.ECONNRESET:
109
106
# Communication issue: Restart the session
110
response = restart_console(req.config, uid, jail_path,
107
response = restart_console(req.config, req.user, jail_path,
112
"Connection with the console has been reset")
114
111
# Some other error - probably serious
115
112
raise socket.error, (enumber, estring)
119
def restart_console(config, uid, jail_path, working_dir, reason):
116
def restart_console(config, user, jail_path, working_dir, reason):
120
117
"""Tells the client that it must be issued a new console since the old
121
118
console is no longer availible. The client must accept the new key.
122
119
Returns the JSON response to be given to the client.
124
121
# Start a new console server console
125
cons = ivle.console.Console(config, uid, jail_path, working_dir)
122
cons = ivle.console.Console(config, user, jail_path, working_dir)
127
124
# Make a JSON object to tell the browser to restart its console client
128
125
new_key = cjson.encode(