From b929b3f09e0b368fa4c7e717d337df7e34dc06b7 Mon Sep 17 00:00:00 2001 From: Thomas Kluyver Date: Fri, 3 Oct 2014 16:20:13 -0700 Subject: [PATCH] Initial REST API for terminals --- IPython/html/terminal/__init__.py | 3 +++ IPython/html/terminal/api_handlers.py | 35 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 IPython/html/terminal/api_handlers.py diff --git a/IPython/html/terminal/__init__.py b/IPython/html/terminal/__init__.py index fc78db306..3837d95f9 100644 --- a/IPython/html/terminal/__init__.py +++ b/IPython/html/terminal/__init__.py @@ -1,6 +1,7 @@ import os from terminado import NamedTermManager from .handlers import TerminalHandler, NewTerminalHandler, TermSocket +from . import api_handlers def initialize(webapp): shell = os.environ.get('SHELL', 'sh') @@ -10,5 +11,7 @@ def initialize(webapp): (r"/terminals/(\w+)", TerminalHandler), (r"/terminals/websocket/(\w+)", TermSocket, {'term_manager': webapp.terminal_manager}), + (r"/api/terminals", api_handlers.TerminalRootHandler), + (r"/api/terminals/(\w+)", api_handlers.TerminalHandler), ] webapp.add_handlers(".*$", handlers) \ No newline at end of file diff --git a/IPython/html/terminal/api_handlers.py b/IPython/html/terminal/api_handlers.py new file mode 100644 index 000000000..90fcd22d0 --- /dev/null +++ b/IPython/html/terminal/api_handlers.py @@ -0,0 +1,35 @@ +import json +from tornado import web +from ..base.handlers import IPythonHandler, json_errors + +class TerminalRootHandler(IPythonHandler): + @web.authenticated + @json_errors + def get(self): + tm = self.application.terminal_manager + terms = [{'name': name} for name in tm.terminals] + self.finish(json.dumps(terms)) + +class TerminalHandler(IPythonHandler): + SUPPORTED_METHODS = ('GET', 'DELETE') + + @web.authenticated + @json_errors + def get(self, name): + tm = self.application.terminal_manager + if name in tm.terminals: + self.finish(json.dumps({'name': name})) + else: + raise web.HTTPError(404, "Terminal not found: %r" % name) + + @web.authenticated + @json_errors + def delete(self, name): + tm = self.application.terminal_manager + if name in tm.terminals: + tm.kill(name) + # XXX: Should this wait for terminal to finish before returning? + self.set_status(204) + self.finish() + else: + raise web.HTTPError(404, "Terminal not found: %r" % name) \ No newline at end of file