summaryrefslogtreecommitdiff
path: root/contrib/remote-reducer
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/remote-reducer')
-rw-r--r--contrib/remote-reducer/README.md20
-rw-r--r--contrib/remote-reducer/remote_reducer.py53
2 files changed, 73 insertions, 0 deletions
diff --git a/contrib/remote-reducer/README.md b/contrib/remote-reducer/README.md
new file mode 100644
index 0000000..74adc66
--- /dev/null
+++ b/contrib/remote-reducer/README.md
@@ -0,0 +1,20 @@
+# Anastasis Remote Reducer
+
+The remote reducer is a simple HTTP service that proxies requests to
+``anastasis-reducer``. It is not meant to be used in production.
+
+## Dependencies
+
+The remote reducer needs python3 and flask. Flask can be installed via pip:
+
+```
+pip3 install flask
+```
+
+## Running the remote reducer
+
+```
+cd $ANASTASIS_GIT/contrib/remote-reducer
+export FLASK_APP=remote_reducer
+flask run -p 5000
+```
diff --git a/contrib/remote-reducer/remote_reducer.py b/contrib/remote-reducer/remote_reducer.py
new file mode 100644
index 0000000..aef6d6d
--- /dev/null
+++ b/contrib/remote-reducer/remote_reducer.py
@@ -0,0 +1,53 @@
+import flask
+from flask import Flask, request
+import subprocess
+import json
+import sys
+import os
+
+if sys.version_info.major < 3:
+ print("Python>=3 required")
+ os.exit(1)
+
+app = Flask(__name__)
+
+
+@app.route("/")
+def hello_world():
+ return "<p>Hello, World!</p>"
+
+
+@app.route("/start-recovery")
+def start_recovery():
+ res = subprocess.run(["anastasis-reducer", "-r"], capture_output=True)
+ resp = flask.Response(res.stdout)
+ resp.headers['Access-Control-Allow-Origin'] = '*'
+ return resp
+
+
+@app.route("/start-backup")
+def start_backup():
+ res = subprocess.run(["anastasis-reducer", "-b"], capture_output=True)
+ resp = flask.Response(res.stdout)
+ resp.headers['Access-Control-Allow-Origin'] = '*'
+ return resp
+
+
+@app.route("/action", methods=["POST", "OPTIONS"])
+def reduce_action():
+ if request.method == "OPTIONS":
+ resp = flask.Response()
+ resp.headers['Access-Control-Allow-Origin'] = '*'
+ resp.headers['Access-Control-Allow-Headers'] = '*'
+ resp.headers['Access-Control-Allow-Method'] = '*'
+ return resp
+
+ b = request.get_json()
+ res = subprocess.run(
+ ["anastasis-reducer", "-a", json.dumps(b["arguments"]), b["action"]],
+ capture_output=True,
+ input=json.dumps(b["state"]).encode("utf-8"),
+ )
+ resp = flask.Response(res.stdout)
+ resp.headers['Access-Control-Allow-Origin'] = '*'
+ return resp