diff options
author | Jesse Luehrs <doy@tozt.net> | 2014-09-23 20:49:50 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2014-09-23 20:49:50 -0400 |
commit | 30729ca5c0a389781d6029d0134ac508db741475 (patch) | |
tree | 94785ca45cde5ec7405e1965180b8534bafeb181 /termcast_server | |
parent | 18cbe913dc4ccde27aa518713d2f4f3376f9dba9 (diff) | |
download | python-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.html | 17 | ||||
-rw-r--r-- | termcast_server/ssh.py | 2 | ||||
-rw-r--r-- | termcast_server/termcast.py | 27 | ||||
-rw-r--r-- | termcast_server/web.py | 9 |
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([ |