diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 00000000..60917eeb --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,6 @@ +version: "3" +services: + web: + build: ./web + ports: ["5000:5000"] + volumes: ['./web:/app'] diff --git a/docker/web/Dockerfile b/docker/web/Dockerfile new file mode 100644 index 00000000..4389cc5f --- /dev/null +++ b/docker/web/Dockerfile @@ -0,0 +1,19 @@ +FROM alpine:3.12 + +RUN apk update && apk add --no-cache \ + gcc libc-dev g++ graphviz python3 py-pip python3-dev ttf-opensans curl fontconfig + +COPY . /app +WORKDIR app + +RUN pip3 install -r requirements.txt + +# add fonts to support CJK languages +RUN curl -O https://noto-website.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip \ +&& mkdir -p /usr/share/fonts/NotoSansCJKjp \ +&& unzip NotoSansCJKjp-hinted.zip -d /usr/share/fonts/NotoSansCJKjp/ \ +&& rm NotoSansCJKjp-hinted.zip \ +&& fc-cache -fv + +ENTRYPOINT ["python3"] +CMD ["app.py"] diff --git a/docker/web/app.py b/docker/web/app.py new file mode 100644 index 00000000..32fc9420 --- /dev/null +++ b/docker/web/app.py @@ -0,0 +1,56 @@ +from flask import Flask, render_template + +app = Flask(__name__) + + +@app.route('/') +def welcome(): + """Top welcome page.""" + template = 'welcome.html' + + values = { + "aa": "bjc" + } + + return render_template(template, **values) + + +@app.route('/builder', methods=['POST', 'GET']) +def builder(): + """Builder page with python input.""" + import os + import subprocess + from flask import request + + template = 'builder.html' + values = {} + diag_folder = "static/diagrams/" + + code = request.form.get('code') + if code: + # clean the directory + _, _, filenames = next(os.walk(diag_folder)) + for one_file in filenames: + os.remove('%s%s' % (diag_folder, one_file)) + # write the code in a file and execute + with open("%stemp_code.py" % diag_folder, "w") as f: + f.write(code) + result = subprocess.run(["python3", "temp_code.py"], cwd=diag_folder, capture_output=True) + # TODO get the result if there's error to display on the template + print('stdout: ', result.stdout) + print('stderr: ', result.stderr) + # delete the temp file + os.remove("%stemp_code.py" % diag_folder) + # get the pic to display + _, _, filenames = next(os.walk(diag_folder)) + pic_name = filenames[0] + values.update({ + "code": code, + "pic_name": pic_name, + }) + + return render_template(template, **values) + + +if __name__ == '__main__': + app.run(debug=True, host='0.0.0.0') diff --git a/docker/web/requirements.txt b/docker/web/requirements.txt new file mode 100644 index 00000000..7809a40e --- /dev/null +++ b/docker/web/requirements.txt @@ -0,0 +1,2 @@ +diagrams +Flask diff --git a/docker/web/static/diagrams.png b/docker/web/static/diagrams.png new file mode 100644 index 00000000..1e710e5b Binary files /dev/null and b/docker/web/static/diagrams.png differ diff --git a/docker/web/static/diagrams/grouped_workersぽぽ.png b/docker/web/static/diagrams/grouped_workersぽぽ.png new file mode 100644 index 00000000..86492dbf Binary files /dev/null and b/docker/web/static/diagrams/grouped_workersぽぽ.png differ diff --git a/docker/web/static/favicon.ico b/docker/web/static/favicon.ico new file mode 100644 index 00000000..c9f63032 Binary files /dev/null and b/docker/web/static/favicon.ico differ diff --git a/docker/web/templates/builder.html b/docker/web/templates/builder.html new file mode 100644 index 00000000..2afd5e20 --- /dev/null +++ b/docker/web/templates/builder.html @@ -0,0 +1,6 @@ +
+ + +
+ + diff --git a/docker/web/templates/welcome.html b/docker/web/templates/welcome.html new file mode 100644 index 00000000..65ea2f43 --- /dev/null +++ b/docker/web/templates/welcome.html @@ -0,0 +1,3 @@ +Diagrams + +You can use the builder Here