commit acfd5cbdfb66f585542c7bf9b737ca760098b4fb Author: Lauri Võsandi Date: Fri Jul 29 00:55:11 2022 +0300 Initial commit diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..e7b5dfa --- /dev/null +++ b/.drone.yml @@ -0,0 +1,2 @@ +kind: template +load: docker.yaml diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..ff6c948 --- /dev/null +++ b/.flake8 @@ -0,0 +1,6 @@ +[flake8] +inline-quotes = " +multiline-quotes = """ +indent-size = 4 +max-line-length = 160 +ignore = Q003 E128 E704 E731 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..aab2253 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,6 @@ +repos: +- repo: https://github.com/PyCQA/flake8 + rev: 3.9.2 + hooks: + - id: flake8 + additional_dependencies: [flake8-typing-imports==1.10.0,flake8-quotes==3.2.0] diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..60b174c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,6 @@ +FROM harbor.k-space.ee/k-space/microservice-base +ADD backup.py /backup.py +RUN apk add mongodb-tools +RUN pip install kubernetes flask +ENTRYPOINT /backup.py +EXPOSE 3001 diff --git a/backup.py b/backup.py new file mode 100755 index 0000000..64f1666 --- /dev/null +++ b/backup.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +import base64 +import os +from kubernetes import client, config +from kubernetes.client.api_client import ApiClient +from subprocess import Popen, PIPE +from flask import Flask, request, send_file + +TOKEN = os.environ["TOKEN"] +app = Flask(__name__) +config.load_incluster_config() + +@app.route("/stream//mongo//") +def stream(namespace, user, database): + if request.headers.get("Authorization") != TOKEN: + raise + with ApiClient() as api: + v1 = client.CoreV1Api(api) + secret_name = "mongodb-%s-%s" % (user, database) + secret = v1.read_namespaced_secret(secret_name, namespace) + uri = base64.b64decode(secret.data["connectionString.standard"]).decode("ascii") + cmd = "/usr/bin/mongodump", "--uri", uri, "--gzip", "--archive" + print("Executing:", cmd) + process = Popen(cmd, stdout=PIPE, stdin=PIPE, close_fds=True, bufsize=4096 * 1024) + return send_file(process.stdout, "stream", "application/tar+gzip", download_name="%s.tar.gz" % secret_name) + + +app.run(host="0.0.0.0", debug=False, threaded=True)