From 1e2a7e8d3242fbcb8deea5caace9d873a5c161b8 Mon Sep 17 00:00:00 2001 From: Newnius Date: Mon, 10 Jun 2019 15:05:17 +0800 Subject: [PATCH] add files --- .gitignore | 125 +++++++++++++++++++++++++++++++++++++++++++++++---- Dockerfile | 13 ++++++ bootstrap.sh | 5 +++ executor.py | 79 ++++++++++++++++++++++++++++++++ 4 files changed, 213 insertions(+), 9 deletions(-) create mode 100644 Dockerfile create mode 100755 bootstrap.sh create mode 100644 executor.py diff --git a/.gitignore b/.gitignore index f1c181e..868550f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,119 @@ -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll +# Custom + + + +# IDEA IntelliJ +*.iml +.idea/ + + +# Tmp files +*.swp +*~ + + + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions *.so -*.dylib -# Test binary, build with `go test -c` -*.test +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST -# Output of the go coverage tool, specifically when used with LiteIDE -*.out +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d869a06 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM quickdeploy/yao-python3 + +MAINTAINER Newnius + +RUN pip3 install docker psutil + +ADD bootstrap.sh /etc/bootstrap.sh + +ADD executor.py /root/executor.py + +WORKDIR /root + +CMD ["/etc/bootstrap.sh"] \ No newline at end of file diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100755 index 0000000..f271989 --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +python3 /root/executor.py & + +sleep infinity \ No newline at end of file diff --git a/executor.py b/executor.py new file mode 100644 index 0000000..f3bd91b --- /dev/null +++ b/executor.py @@ -0,0 +1,79 @@ +#!/usr/bin/python +from http.server import BaseHTTPRequestHandler, HTTPServer +import cgi +import docker +import json +from urllib import parse + +PORT_NUMBER = 8000 + + +# This class will handles any incoming request from +# the browser +class MyHandler(BaseHTTPRequestHandler): + # Handler for the GET requests + def do_GET(self): + req = parse.urlparse(self.path) + + if req.path == "/list": + try: + client = docker.from_env() + networks = client.networks.list(filters={'name': 'yao-net-'}) + result = [] + for network in networks: + result.append(network.name) + msg = {'code': 0, 'networks': result} + except Exception as e: + msg = {'code': 1, 'error': str(e)} + self.send_response(200) + self.send_header('Content-type', 'application/json') + self.end_headers() + self.wfile.write(bytes(json.dumps(msg), "utf-8")) + + else: + self.send_error(404, 'File Not Found: %s' % self.path) + + # Handler for the POST requests + def do_POST(self): + if self.path == "/create": + form = cgi.FieldStorage( + fp=self.rfile, + headers=self.headers, + environ={ + 'REQUEST_METHOD': 'POST', + 'CONTENT_TYPE': self.headers['Content-Type'], + }) + try: + network_name = form.getvalue('name') + client = docker.from_env() + client.networks.create( + name=network_name, + driver='overlay', + attachable=True + ) + msg = {"code": 0, "error": 'Success'} + except Exception as e: + msg = {"code": 1, "error": str(e)} + + self.send_response(200) + self.send_header('Content-type', 'application/json') + self.end_headers() + self.wfile.write(bytes(json.dumps(msg), "utf-8")) + + else: + self.send_error(404, 'File Not Found: %s' % self.path) + + +try: + # Create a web server and define the handler to manage the + # incoming request + server = HTTPServer(('', PORT_NUMBER), MyHandler) + print('Started http server on port ', PORT_NUMBER) + + # Wait forever for incoming http requests + server.serve_forever() + +except KeyboardInterrupt: + print('^C received, shutting down the web server') + +server.socket.close()