From 9ec7d6fe8cfcf4ca69a89e938374456facae803a Mon Sep 17 00:00:00 2001 From: Clemens Klug Date: Wed, 17 Oct 2018 16:45:35 +0200 Subject: [PATCH] Initialer Commit --- Dockerfile | 10 ++++++ docker-compose.yml | 6 ++++ src/config.json | 28 +++++++++++++++ src/requirements.txt | 2 ++ src/spammer.py | 81 ++++++++++++++++++++++++++++++++++++++++++++ src/templates.py | 76 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 203 insertions(+) create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 src/config.json create mode 100644 src/requirements.txt create mode 100644 src/spammer.py create mode 100644 src/templates.py diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..df6520a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM alpine:3.8 +ADD src /app +RUN apk add --update --no-cache python3 && \ + pip3 --no-cache-dir install -r /app/requirements.txt && \ + adduser -D app +USER app +EXPOSE 5000 +ENV FLASK_APP=spammer.py +WORKDIR /app +CMD ["flask", "run", "-h", "0.0.0.0"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..2d61382 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,6 @@ +version: "3" + +services: + rzspam: + build: . + image: docker.wiai.de/fswiai/rzspam:0.1 \ No newline at end of file diff --git a/src/config.json b/src/config.json new file mode 100644 index 0000000..1f93272 --- /dev/null +++ b/src/config.json @@ -0,0 +1,28 @@ +{ + "placeholders": { + "port": { + "type": "text", + "desc": "Portnummer/Dienst" + }, + "raum": { + "desc": "Raumnummer" + }, + "wlan": { + "type": "text", + "desc": "Wlan-name", + "default": "eduroam" + }, + "anzahl": { + "type": "number", + "desc": "Anzahl" + } + }, + "RZ": { + "mail": "fachschaft.wiai@uni-bamberg.de", + "templates": { + "Portsperre": "liebes RZ, Port {port} ist zu. das ist doof :(", + "WLAN": "hallo RZ, in Raum {raum} funkt das WLAN {wlan} nicht. das ist doof :(", + "test": "ich bin ein test mit einer zahl: {anzahl}" + } + } +} \ No newline at end of file diff --git a/src/requirements.txt b/src/requirements.txt new file mode 100644 index 0000000..b090c5a --- /dev/null +++ b/src/requirements.txt @@ -0,0 +1,2 @@ +Flask==1.0.2 +Flask-Mail==0.9.1 \ No newline at end of file diff --git a/src/spammer.py b/src/spammer.py new file mode 100644 index 0000000..a57cb89 --- /dev/null +++ b/src/spammer.py @@ -0,0 +1,81 @@ +import json +from collections import namedtuple +from string import Formatter + +from flask import Flask +from flask import request +from flask_mail import Mail, Message + +import templates + +Placeholder = namedtuple("Placeholder", ["name", "type", "desc", "default"]) + +def load_config(conf="config.json"): + config = json.load(open(conf)) + placeholders = [] + for i in config["placeholders"]: + p_h = config["placeholders"][i] + p = Placeholder( + name=i, + type=p_h.get("type", "text"), + desc=p_h["desc"], + default=p_h.get("default")) + placeholders.append(p) + config.pop("placeholders") + flat = {} + for org in config: + target = config[org] + templates = [] + for issue_name in target["templates"]: + text = target["templates"][issue_name] + fields = [name for _, name, _, _ in Formatter().parse(text)] + flat[f"{org}: {issue_name}"] = { + "org": org, + "name": issue_name, + "mail": config[org]["mail"], + "text": text, + "placeholders": [i._asdict() for i in placeholders if i.name in fields] + } + return flat + +MAIL_SERVER = "smtp.uni-bamberg.de" +MAIL_PORT = 587 +#TESTING=True +#MAIL_USE_TLS=True +#MAIL_USE_SSL=True +MAIL_DEBUG=True + +app = Flask(__name__) +app.config.from_object(__name__) + + + +mail = Mail(app) + +issues = load_config() + +@app.route("/") +def index(): + return templates.format_index(issues) + +@app.route("/send", methods=["POST"]) +def send(): + if all([field in request.form for field in ("text", "sender", "target")]): + text = request.form["text"] + print("all fields present") + fields = [name for _, name, _, _ in Formatter().parse(text)] + if None in fields: + fields.remove(None) + if all([field in request.form for field in fields]): + values = {field: request.form[field] for field in fields} + text = text.format(**values) + sender = request.form["sender"] + recipients = [request.form["target"]] + msg = Message("Störungsmeldung", body=text, sender=sender, recipients=recipients) + print(msg) + return str(mail.send(msg)) + print([(field,field in request.form) for field in fields]) + return "2" + print([(field,field in request.form) for field in ("text", "sender", "target")]) + print(request.form) + return "1" \ No newline at end of file diff --git a/src/templates.py b/src/templates.py new file mode 100644 index 0000000..f6ed084 --- /dev/null +++ b/src/templates.py @@ -0,0 +1,76 @@ +import json +BASE = """ + + +spammer + + + +""" + +INDEX = """

Welcome

+

choose an issue, fill the placeholders, enter your uni-mail, then hit send

+ +
+

+ +

+

+

+ + +

+
+ +
+""" + +def format_page(body): + return BASE + str(body) + "\n" + +def format_index(issues): + html = "" + for issue in issues: + html+=f"\n" + index = INDEX.format(issues=html) + return format_page(index) \ No newline at end of file