frontend-mondvogel/source/main.py
2025-10-05 18:34:11 +02:00

238 lines
5.3 KiB
Python

#!/usr/bin/env python3
import typing as _typing
import sys as _sys
import os as _os
import json as _json
import argparse as _argparse
from log import *
from conf import *
from backend import *
def main():
## args
argument_parser = _argparse.ArgumentParser(
prog = "mondvogel",
description = "CLI-Client-Programm für Espe",
formatter_class = _argparse.ArgumentDefaultsHelpFormatter
)
argument_parser.add_argument(
type = str,
dest = "action",
choices = [
"conf-schema",
"conf-expose",
"member-list",
"member-read",
"member-delete",
"invite",
],
metavar = "<action>",
help = "auszuführende Aktion; Optionen: 'conf-schema' : JSON-Schema der Konfiguration ausgeben | 'conf-expose' : vervollständigte Konfiguration ausgegeben | 'member-list' : Liste der Mitglieder ausgeben | 'member-read' : Daten eines Mitglieds ausgeben | 'member-delete' : einer Mitglieder-Datensatz löschen | 'invite' : Einladung erstellen",
)
argument_parser.add_argument(
"-c",
"--conf-path",
type = str,
dest = "conf_path",
default = _os.path.join(_os.path.expanduser("~"), ".mondvogel", "conf.json"),
metavar = "<conf-path>",
help = "Pfad zur Konfigurations-Datei",
)
argument_parser.add_argument(
"-i",
"--id",
type = int,
dest = "id",
default = None,
metavar = "<id>",
help = "ID des Mitglieds",
)
argument_parser.add_argument(
"-N",
"--fixed-name",
dest = "fixed_name",
action = 'store_true',
)
argument_parser.add_argument(
"-n",
"--name",
type = str,
dest = "name",
default = None,
metavar = "<name>",
help = "Anmelde-Name des Mitglieds; Leerzeichen sind durch '_' zu ersetzen",
)
argument_parser.add_argument(
"-L",
"--fixed-label",
dest = "fixed_label",
action = 'store_true',
)
argument_parser.add_argument(
"-l",
"--label",
type = str,
dest = "label",
default = None,
metavar = "<label>",
help = "Anzeige-Name des Mitglieds",
)
argument_parser.add_argument(
"-E",
"--fixed-email-address",
dest = "fixed_email_address",
action = 'store_true',
)
argument_parser.add_argument(
"-e",
"--email-address",
type = str,
dest = "email_address",
default = None,
metavar = "<email-address>",
help = "E-Mail-Adresse des Mitglieds",
)
argument_parser.add_argument(
"-G",
"--fixed-groups",
dest = "fixed_groups",
action = 'store_true',
)
argument_parser.add_argument(
"-g",
"--groups",
type = str,
dest = "groups",
default = None,
metavar = "<groups>",
help = "Gruppen, zu welchen das Mitglied hinzugefügt werden soll, als Komma-getrennte Liste",
)
argument_parser.add_argument(
"-x",
"--expiry",
type = int,
dest = "expiry",
default = None,
metavar = "<expiry>",
help = "UNIX-Timestamp des Ablaufdatums der Einladung",
)
args = argument_parser.parse_args()
## conf
conf_load(args.conf_path)
log_add_output(
{
"format": conf_get()["log"]["format"],
"min_level": (
{
"error": enum_log_level.ERROR,
"warning": enum_log_level.WARNING,
"notice": enum_log_level.NOTICE,
"info": enum_log_level.INFO,
"debug": enum_log_level.DEBUG,
}[conf_get()["log"]["min_level"]]
),
}
)
## exec
data = {
"id": args.id,
"name_changeable": (not args.fixed_name),
"name_value": args.name.replace("_", " "),
"label_changeable": (not args.fixed_label),
"label_value": args.label,
"email_address_changeable": (not args.fixed_email_address),
"email_address_value": args.email_address,
"groups_changeable": (not args.fixed_groups),
"groups_value": ([] if (args.groups is None) else args.groups.split(",")),
"expiry": args.expiry,
}
_sys.stderr.write(_json.dumps(data) + "\n")
if (args.action == "conf-schema"):
_sys.stdout.write(_json.dumps(conf_schema(), indent = "\t") + "\n")
elif (args.action == "conf-expose"):
_sys.stdout.write(_json.dumps(conf_get(), indent = "\t") + "\n")
elif (args.action == "member-list"):
data = backend_api_call_member_list(
)
_sys.stdout.write(_json.dumps(data, indent = "\t") + "\n")
elif (args.action == "member-read"):
if (
(data["id"] is None)
):
log_error(
"mandatory_parameters_missing",
{
"parameters": [
"id",
]
}
)
else:
data = backend_api_call_member_read(
data["id"]
)
_sys.stdout.write(_json.dumps(data, indent = "\t") + "\n")
elif (args.action == "member-delete"):
if (
(data["id"] is None)
):
log_error(
"mandatory_parameters_missing",
{
"parameters": [
"id",
]
}
)
else:
member_id = backend_api_call_member_delete(
data["id"]
)
elif (args.action == "invite"):
if (
(data["name_value"] is None)
or
(data["label_value"] is None)
or
(data["email_address_value"] is None)
or
(data["groups_value"] is None)
):
log_error(
"mandatory_parameters_missing",
{
"parameters": [
"name",
"label",
"email_address",
"groups",
]
}
)
else:
link = backend_api_call_invitation_create(
data["name_changeable"],
data["name_value"],
data["label_changeable"],
data["label_value"],
data["email_address_changeable"],
data["email_address_value"],
data["groups_changeable"],
data["groups_value"],
data["expiry"]
)
else:
raise NotImplementedError()
try:
main()
except ValueError as error:
_sys.stderr.write(str(error) + "\n")
_sys.exit(1)