From b2441c50b4cbef7509d3b9f3bcdded8eaa6e7a64 Mon Sep 17 00:00:00 2001 From: Clemens Klug Date: Thu, 1 Feb 2018 16:59:35 +0100 Subject: [PATCH] Initialer Commit --- .server.py.swp | Bin 0 -> 1024 bytes requirements.txt | 2 ++ server.py | 65 +++++++++++++++++++++++++++++++++++++++++++++++ settings.toml | 13 ++++++++++ 4 files changed, 80 insertions(+) create mode 100644 .server.py.swp create mode 100644 requirements.txt create mode 100644 server.py create mode 100644 settings.toml diff --git a/.server.py.swp b/.server.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..bcb9e73fc9639732ebdad1b74835e84587f9b552 GIT binary patch literal 1024 zcmYc?$V<%2S1{7E)H7m00tbP-<^TY7I2rr^ literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..05a0a87 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Flask==0.12.2 +toml==0.9.4 diff --git a/server.py b/server.py new file mode 100644 index 0000000..01bbd12 --- /dev/null +++ b/server.py @@ -0,0 +1,65 @@ +import json +import os +import shlex + +from subprocess import Popen + +import toml +from flask import Flask, request, abort + +app = Flask(__name__) + +SETTINGS_FILE = "settings.toml" + +config = {} + +if os.path.exists(SETTINGS_FILE): + config = toml.loads(open(SETTINGS_FILE, "r").read()) + +def json_path(obj, path): + if not type(obj) in [dict, list]: + return None + if "." not in path: + return None if path not in obj else obj[path] + key = path.split(".") + if key[0] not in obj: + return None + return json_path(obj[key[0]], ".".join(key[1:])) + +def process(target): + app.logger.error("PROCESSING: "+str(target)) + Popen(shlex.split(target["exec"]), cwd=target["path"]) + app.logger.error("POST-processing :P") + return "True", 200 + +@app.route("/", methods=['GET','POST']) +def index(): + content = request.data.decode("utf8") + try: + data = json.loads(content) + #app.logger.error(json.dumps(data, indent=1)) + except Exception as e: + app.logger.exception(e) + return "False", 400 + #app.logger.error(request.headers) + for source in config: + source = config[source] + if not "targets" in source: + continue + for target in source["targets"]: + target_name = target + target = source["targets"][target] + requested_name = json_path(data, source["name_path"]) + if not requested_name: + continue + app.logger.error(str(target_name) + str(requested_name)) + if requested_name == target_name: + if "token" in target: + if not source["tokenHeader"] in request.headers: + return "False", 403 + if not request.headers[source["tokenHeader"]] == target["token"]: + return "False", 403 + return process(target) + return "False", 404 + +app.run("0.0.0.0",8000) diff --git a/settings.toml b/settings.toml new file mode 100644 index 0000000..b8b0e8f --- /dev/null +++ b/settings.toml @@ -0,0 +1,13 @@ +[gitlab] +name_path = "project.path_with_namespace" +tokenHeader = "X-Gitlab-Token" + +[gogs] +name_path = "repository.name" +tokenHeader = "" + +[gitlab.targets."cklug/test"] +path = "/tmp/cd-target" +exec = "bash update.sh" +token = "fooBar" +