diff --git a/machines/gerd/services/notify/app.py b/machines/gerd/services/notify/app.py new file mode 100644 index 0000000..11ef19a --- /dev/null +++ b/machines/gerd/services/notify/app.py @@ -0,0 +1,288 @@ +#!/usr/bin/env nix-shell +#!nix-shell --pure -i python3 -p "python3.withPackages (ps: with ps; [ flask apprise mnemonic wtforms jq ])" +from typing import Any +import apprise +from flask import Flask, request +from mnemonic import Mnemonic +import sqlite3 +import os +import jq +import json + +ENV_PREFIX = "NOTIFIER_" + + +def getenv(key: str, default: Any = None) -> Any: + v = os.getenv(ENV_PREFIX + key, default) + if not v: + exit(f"{ENV_PREFIX+key} must be specified!") + + return v + + +CONFIG_URL = getenv("URL", "http://127.0.0.1") +CONFIG_PORT = int(getenv("PORT", 8080)) + +CONFIG_DATABASE_PATH = getenv("DATABASE_PATH", "notifications.db") + +CONFIG_MATRIX_BOT_TOKEN = getenv("MATRIX_BOT_TOKEN") +CONFIG_MATRIX_HOST = getenv("MATRIX_HOST") + +CONFIG_PROXY_AUTH_USERNAME_HEADER = getenv("PROXY_AUTH_USERNAME_HEADER", "Remote-User") + +CONFIG_MAIL_USERNAME = getenv("MAIL_USERNAME") +CONFIG_MAIL_PASSWORD = getenv("MAIL_PASSWORD") +CONFIG_MAIL_DOMAIN = getenv("MAIL_DOMAIN") +CONFIG_MAIL_HOST = getenv("MAIL_HOST") +CONFIG_MAIL_PORT = int(getenv("MAIL_PORT")) +CONFIG_MAIL_MODE = getenv("MAIL_MODE", "ssl") + + +script_example = r"""#!/usr/bin/env bash +BODY="$1" +TITLE=${2:-Notification} +JQ_EXPR=${3:-.} +TYPE=${4:-matrix} +TOKEN="$(cat ~/.config/notify/token)" +# TOKEN="$(cat /run/agenix/notify-token)" +URL="||URL||/notify" + +# get stdin if needed +if [ "$BODY" = "-" ]; then + BODY="$(cat -)" +fi + +# make request +curl -H "Authorization: Bearer $TOKEN" "$URL" \ + --get \ + --data-urlencode "title=$TITLE" \ + --data-urlencode "body=$BODY" \ + --data-urlencode "jq=$JQ_EXPR" \ + --data-urlencode "type=$TYPE" +""".replace( + "||URL||", "https://notify.fricloud.dk" +) + +app = Flask(__name__) + + +def get_db(): + con = sqlite3.connect(CONFIG_DATABASE_PATH) + cur = con.cursor() + cur.execute( + "CREATE TABLE IF NOT EXISTS default_room(username TEXT PRIMARY KEY, room_id TEXT NOT NULL)" + ) + cur.execute( + "CREATE TABLE IF NOT EXISTS tokens(username TEXT PRIMARY KEY, token TEXT NOT NULL)" + ) + + return con + + +@app.route("/", methods=["GET", "POST"]) +def index(): + username = request.headers.get(CONFIG_PROXY_AUTH_USERNAME_HEADER) + if not username: + return ("Not authenticated", 401) + + # handle post stuff + if request.method == "POST": + action = request.form.get("action", "").lower() + print("Action", action) + if "token" in action: + generate_token_for_user(username) + elif "room id" in action: + roomid = request.form.get("room_id") + if not roomid: + return ("Room Id cannot be empty", 400) + set_user_default_matrix_room(username, roomid) + else: + return ("Unknown action", 400) + + con = get_db() + cur = con.cursor() + res = cur.execute( + "SELECT token FROM tokens WHERE username = ?", (username,) + ).fetchone() + + token: str = "" + if res: + token = res[0] + + res = cur.execute( + "SELECT room_id FROM default_room WHERE username = ?", (username,) + ).fetchone() + + room_id: str = "" + if res: + room_id = res[0] + + tmpl = f""" + +
+ + + +
+{script_example}
+
+
+