aboutsummaryrefslogtreecommitdiffstats
path: root/termcast_server
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-09-23 20:49:50 -0400
committerJesse Luehrs <doy@tozt.net>2014-09-23 20:49:50 -0400
commit30729ca5c0a389781d6029d0134ac508db741475 (patch)
tree94785ca45cde5ec7405e1965180b8534bafeb181 /termcast_server
parent18cbe913dc4ccde27aa518713d2f4f3376f9dba9 (diff)
downloadpython-termcast-server-30729ca5c0a389781d6029d0134ac508db741475.tar.gz
python-termcast-server-30729ca5c0a389781d6029d0134ac508db741475.zip
actually draw the screen contents
Diffstat (limited to 'termcast_server')
-rw-r--r--termcast_server/index.html17
-rw-r--r--termcast_server/ssh.py2
-rw-r--r--termcast_server/termcast.py27
-rw-r--r--termcast_server/web.py9
4 files changed, 43 insertions, 12 deletions
diff --git a/termcast_server/index.html b/termcast_server/index.html
index 74c1d3e..373587f 100644
--- a/termcast_server/index.html
+++ b/termcast_server/index.html
@@ -8,6 +8,11 @@
.term {
display: none;
+ font-family: monospace;
+}
+
+.term .td {
+ width: 1em;
}
</style>
<script>
@@ -35,8 +40,16 @@ socket.onmessage = function (e) {
else if (type == "update_screen") {
document.querySelector('.menu').style.setProperty('display', 'none');
var termdiv = document.querySelector('.term');
- // XXX
- termdiv.innerHTML = "<h1>It's a terminal</h1>";
+ term = '<table class="screen">';
+ data.screen.forEach(function (row) {
+ term += '<tr>';
+ row.forEach(function (cell) {
+ term += '<td>' + cell.contents + '</td>';
+ });
+ term += '</td>';
+ });
+ term += '</table>';
+ termdiv.innerHTML = term;
termdiv.style.setProperty('display', 'block');
}
else if (type == "streamer_disconnect") {
diff --git a/termcast_server/ssh.py b/termcast_server/ssh.py
index 6256f22..d828fca 100644
--- a/termcast_server/ssh.py
+++ b/termcast_server/ssh.py
@@ -106,7 +106,7 @@ class Connection(object):
else:
return self.select_stream()
- def msg_new_data(self, connection_id, prev_buf, data):
+ def msg_new_data(self, connection_id, prev_buf, data, screen):
if self.watching_id != connection_id:
return
diff --git a/termcast_server/termcast.py b/termcast_server/termcast.py
index e4eed6d..28be7a0 100644
--- a/termcast_server/termcast.py
+++ b/termcast_server/termcast.py
@@ -63,13 +63,18 @@ class Handler(object):
self.idle_since = time.time()
def get_term(self):
- term = ''
+ term = []
for i in range(0, self.rows):
+ term.append([])
for j in range(0, self.cols):
- term += self.vt.cell(i, j).contents()
- term += "\n"
+ contents = self.vt.cell(i, j).contents()
+ if len(contents) == 0:
+ contents = " "
+ term[i].append({
+ "contents": contents,
+ })
- return term[:-1]
+ return term
def total_time(self):
return self._human_readable_duration(time.time() - self.created_at)
@@ -163,10 +168,14 @@ class Connection(object):
print('*** recv failed: ' + str(e))
if len(buf) > 0:
+ self.handler.process(buf)
self.publisher.notify(
- "new_data", self.connection_id, self.handler.buf, buf
+ "new_data",
+ self.connection_id,
+ self.handler.buf,
+ buf,
+ self.handler.get_term()
)
- self.handler.process(buf)
else:
self.publisher.notify("streamer_disconnect", self.connection_id)
return
@@ -176,7 +185,11 @@ class Connection(object):
return
self.viewers += 1
self.publisher.notify(
- "new_data", self.connection_id, self.handler.buf, b''
+ "new_data",
+ self.connection_id,
+ self.handler.buf,
+ b'',
+ self.handler.get_term()
)
self.client.send(b"msg watcher connected\n")
diff --git a/termcast_server/web.py b/termcast_server/web.py
index 2baca26..b0a66af 100644
--- a/termcast_server/web.py
+++ b/termcast_server/web.py
@@ -34,10 +34,15 @@ class WebSocketHandler(tornado.websocket.WebSocketHandler):
def on_finish(self):
self.publisher.unsubscribe(self)
- def msg_new_data(self, connection_id, prev_buf, data):
+ def msg_new_data(self, connection_id, prev_buf, data, screen):
if self.watching_id != connection_id:
return
- self.write_message(json.dumps({"type": "update_screen"}))
+
+ reply = {
+ "type": "update_screen",
+ "screen": screen,
+ }
+ self.write_message(json.dumps(reply))
def make_app(publisher):
return tornado.web.Application([