d4s-cdn-setup/config/api.py

94 lines
3.7 KiB
Python

# webapp.py
from functools import cached_property
from http.cookies import SimpleCookie
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import parse_qsl, urlparse
import subprocess
import os
import json
class WebRequestHandler(BaseHTTPRequestHandler):
@cached_property
def url(self):
return urlparse(self.path)
@cached_property
def query_data(self):
return dict(parse_qsl(self.url.query))
@cached_property
def post_data(self):
content_length = int(self.headers.get("Content-Length", 0))
return self.rfile.read(content_length)
@cached_property
def json_data(self):
return json.loads(self.post_data.decode("utf-8"))
@cached_property
def authorized(self):
return self.headers.get("Authorization") == os.environ["Authorization"]
def do_GET(self):
print(self.url.path)
if self.url.path == "/health":
print("returning 200 ok")
self.send_response(200, "OK")
else:
print("returning 404")
self.send_error(404, "Not found")
def do_POST(self):
if not self.authorized:
self.send_error(401, "Not authorized")
return
data = self.json_data
ret = None
message = None
if (data.get("action") == "published" or data.get("action") == "updated") and data.get("release") and data.get("repository"):
if(data["repository"]["name"] == os.environ["GIT_REPOSITORY"]):
# Must be a new release of a specific version
ret = subprocess.run(["/opt/update-version.sh", data["release"]["tag_name"]])
message = "Updating version " + data["release"]["tag_name"]
else:
message = "New release on unknown repository"
elif data.get("action") == "deleted" and data.get("release") and data.get("repository"):
if(data["repository"]["name"] == os.environ["GIT_REPOSITORY"]):
# Must be a deleteion of a release
ret = subprocess.run(["/opt/delete-version.sh", data["release"]["tag_name"]])
message = "Deleting release"
else:
message = "Deleted release on unknown repository"
elif data.get("action") == "closed" and data.get("pull_request"):
pr = data.get("pull_request")
if pr["merged"] and data["repository"]["name"] == os.environ["GIT_REPOSITORY"] and pr["base"]["ref"] == os.environ["GIT_BRANCH"]:
# Must be a pull request onto the declared branch
ret = subprocess.run(["/opt/update-head.sh"])
message = "Updating head after PR"
else:
message = "Closed PR on unknown repository"
elif data.get("commits") and data.get("pusher") and data.get("repository") and data.get("ref"):
if(data["repository"]["name"] == os.environ["GIT_REPOSITORY"] and data.get("ref") == "refs/heads/" + os.environ["GIT_BRANCH"]):
# Must be a push to the branch
ret = subprocess.run(["/opt/update-head.sh"])
message = "Updating head after push"
else:
message = "Push onto unknown branch or repository"
else:
message = "Unknwown operation"
if ret != None and ret.returncode == 0:
self.send_response(200, message)
else:
self.send_error(500, message)
self.send_header("Content-Type", "text/plain")
self.end_headers()
self.wfile.write(message.encode("UTF-8"))
self.wfile.flush()
if __name__ == "__main__":
server = HTTPServer(("0.0.0.0", 8000), WebRequestHandler)
server.serve_forever()