diff --git a/src/python/.gitignore b/src/python/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..f0c705a2289d77b10c653b6f26c401a4bc5d46fc --- /dev/null +++ b/src/python/.gitignore @@ -0,0 +1,3 @@ +*~ +.*.sw? +.ipynb_checkpoints/ diff --git a/src/python/ELNJupyter/elnjupyter/server.py b/src/python/ELNJupyter/elnjupyter/server.py new file mode 100644 index 0000000000000000000000000000000000000000..640f3bae5c8b182d5439aa064f57e6474e223aca --- /dev/null +++ b/src/python/ELNJupyter/elnjupyter/server.py @@ -0,0 +1,74 @@ +import tornado.web +import tornado.ioloop +import json +import os +import pwd +import ssl +from pybis import Openbis + + +class CreateNotebook(tornado.web.RequestHandler): + def get(self, msg): + self.write(self.msg) + + def post(self, whatever): + token = self.get_argument(name='token') + folder = self.get_argument(name='folder') + filename = self.get_argument(name='filename') + content = self.request.body + + + # check if token is still valid + if not self.openbis.is_token_valid(token): + self.send_error(401, message="token is invalid") + return + + # extract username + username, code = token.split('-') + + try: + user = pwd.getpwnam(username) + except KeyError: + self.send_error(401, message="User {} does not exist on host system".format(username)) + + notebook_file = os.path.join( + user.pw_dir, + folder, + filename + ) + + # create necessary directories + os.makedirs(os.path.dirname(notebook_file), exist_ok=True) + with open(notebook_file, 'wb') as f: + f.write(content) + os.chown(notebook_file, user.pw_uid, user.pw_gid) + print(notebook_file) + + def send_error(self, status_code=500, **kwargs): + self.set_status(status_code) + self.write(json.dumps(kwargs) ) + + def initialize(self, openbis): + self.openbis = openbis + self.set_header('Content-Type', 'application/json') + +def make_app(openbis): + """All the routing goes here... + """ + app = tornado.web.Application([ + (r"/(.*)", CreateNotebook, {"openbis": openbis}) + ]) + return app + + +if __name__ == "__main__": + openbis = Openbis(url='https://localhost:8443', verify_certificates=False) + application = make_app(openbis) + application.listen( + 8123, + ssl_options={ + "certfile": "/Users/vermeul/tmp/cert.pem", + "keyfile": "/Users/vermeul/tmp/key.pem", + } + ) + tornado.ioloop.IOLoop.current().start() diff --git a/src/python/ELNJupyter/setup.py b/src/python/ELNJupyter/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..d47e43535d4fa51cabd1dc8fee4725a551fadf6f --- /dev/null +++ b/src/python/ELNJupyter/setup.py @@ -0,0 +1,17 @@ +import os + +from setuptools import setup + +setup(name='elnjupyter', + version='0.1.0', + description='A webservice to create jupyter notebooks in the users home directory', + url='https://sissource.ethz.ch/sis/pybis/', + author='SIS | ID | ETH Zuerich', + author_email='swen@ethz.ch', + license='BSD', + packages=['pybis'], + install_requires=[ + 'tornado', + 'ssl', + ], + zip_safe=True)