#!/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}