# retoor import argparse import sys from molodetz.cli import commands def build_parser(): parser = argparse.ArgumentParser(prog="molodetz", description="Admin CLI for Molodetz.") groups = parser.add_subparsers(dest="group", required=True) role = groups.add_parser("role", help="Read and set roles").add_subparsers(dest="action", required=True) 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) 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) posts.add_parser("list").set_defaults(handler=commands.posts_list) posts_import = posts.add_parser("import", help="Import .md or .pdf as a draft") posts_import.add_argument("path") posts_import.add_argument("--topic", default="roll", choices=["roll", "standard"]) 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) joins.add_parser("list").set_defaults(handler=commands.joins_list) backups = groups.add_parser("backups", help="Backups").add_subparsers(dest="action", required=True) 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) 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) 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") 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) emoji = groups.add_parser("emoji", help="Emoji map").add_subparsers(dest="action", required=True) 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())