Files
ad/molodetz/cli/main.py
T

87 lines
4.1 KiB
Python
Raw Normal View History

2026-10-05 09:36:43 +02:00
# retoor <retoor@molodetz.nl>
import argparse
import sys
from molodetz.cli import commands
def build_parser():
parser = argparse.ArgumentParser(prog="molodetz", description="Admin CLI for Molodetz.")
2026-10-05 09:36:43 +02:00
groups = parser.add_subparsers(dest="group", required=True)
role = groups.add_parser("role", help="Read and set roles").add_subparsers(dest="action", required=True)
2026-10-05 09:36:43 +02:00
role_get = role.add_parser("get")
role_get.add_argument("username")
role_get.set_defaults(handler=commands.role_get)
role_set = role.add_parser("set")
role_set.add_argument("username")
role_set.add_argument("role", choices=["Member", "Admin"])
role_set.set_defaults(handler=commands.role_set)
apikey = groups.add_parser("apikey", help="API keys").add_subparsers(dest="action", required=True)
2026-10-05 09:36:43 +02:00
key_get = apikey.add_parser("get")
key_get.add_argument("username")
key_get.set_defaults(handler=commands.apikey_get)
key_reset = apikey.add_parser("reset")
key_reset.add_argument("username")
key_reset.set_defaults(handler=commands.apikey_reset)
apikey.add_parser("backfill").set_defaults(handler=commands.apikey_backfill)
posts = groups.add_parser("posts", help="Posts").add_subparsers(dest="action", required=True)
2026-10-05 09:36:43 +02:00
posts.add_parser("list").set_defaults(handler=commands.posts_list)
posts_import = posts.add_parser("import", help="Import .md or .pdf as a draft")
2026-10-05 09:36:43 +02:00
posts_import.add_argument("path")
posts_import.add_argument("--topic", default="roll", choices=["roll", "standard"])
2026-10-05 09:36:43 +02:00
posts_import.add_argument("--title")
posts_import.add_argument("--publish", action="store_true")
posts_import.set_defaults(handler=commands.posts_import)
joins = groups.add_parser("joins", help="Join requests").add_subparsers(dest="action", required=True)
2026-10-05 09:36:43 +02:00
joins.add_parser("list").set_defaults(handler=commands.joins_list)
backups = groups.add_parser("backups", help="Backups").add_subparsers(dest="action", required=True)
2026-10-05 09:36:43 +02:00
backups.add_parser("list").set_defaults(handler=commands.backups_list)
backup_run = backups.add_parser("run")
backup_run.add_argument("--target", default="database", choices=["database", "uploads", "keys", "full"])
backup_run.add_argument("--codec", default="zstd", choices=["zstd", "brotli"])
backup_run.set_defaults(handler=commands.backups_run)
backup_prune = backups.add_parser("prune")
backup_prune.add_argument("--keep", type=int, default=14)
backup_prune.add_argument("--dry-run", action="store_true")
backup_prune.set_defaults(handler=commands.backups_prune)
backup_clear = backups.add_parser("clear")
backup_clear.add_argument("--dry-run", action="store_true")
backup_clear.set_defaults(handler=commands.backups_clear)
sessions = groups.add_parser("sessions", help="Sessions").add_subparsers(dest="action", required=True)
2026-10-05 09:36:43 +02:00
sessions_prune = sessions.add_parser("prune")
sessions_prune.add_argument("--dry-run", action="store_true")
sessions_prune.set_defaults(handler=commands.sessions_prune)
audit = groups.add_parser("audit", help="Audit log").add_subparsers(dest="action", required=True)
2026-10-05 09:36:43 +02:00
audit_prune = audit.add_parser("prune")
audit_prune.add_argument("--days", type=int, default=365)
audit_prune.add_argument("--dry-run", action="store_true")
audit_prune.set_defaults(handler=commands.audit_prune)
system = groups.add_parser("system", help="System maintenance").add_subparsers(dest="action", required=True)
system_prune = system.add_parser("prune", help="Remove orphan blobs")
2026-10-05 09:36:43 +02:00
system_prune.add_argument("--dry-run", action="store_true")
system_prune.set_defaults(handler=commands.system_prune)
system.add_parser("sql-lint", help="Parse all SQL literals with sqlglot").set_defaults(handler=commands.system_sql_lint)
2026-10-05 09:36:43 +02:00
emoji = groups.add_parser("emoji", help="Emoji map").add_subparsers(dest="action", required=True)
2026-10-05 09:36:43 +02:00
emoji.add_parser("regenerate").set_defaults(handler=commands.emoji_regenerate)
return parser
def main(argv=None):
parser = build_parser()
args = parser.parse_args(argv)
commands.prepare()
return args.handler(args) or 0
if __name__ == "__main__":
sys.exit(main())