diff options
Diffstat (limited to 'contrib/remote-reducer')
-rw-r--r-- | contrib/remote-reducer/README.md | 20 | ||||
-rw-r--r-- | contrib/remote-reducer/remote_reducer.py | 53 |
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 |