artemis/dbutils.py
2024-03-23 00:31:43 +08:00

87 lines
2.6 KiB
Python

#!/usr/bin/env python3
import argparse
import asyncio
import logging
from os import W_OK, access, mkdir, path
import yaml
from core.config import CoreConfig
from core.data import Data
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Database utilities")
parser.add_argument(
"--config", "-c", type=str, help="Config folder to use", default="config"
)
parser.add_argument(
"--version",
"-v",
type=str,
help="Version of the database to upgrade/rollback to",
)
parser.add_argument("--email", "-e", type=str, help="Email for the new user")
parser.add_argument(
"--access_code",
"-a",
type=str,
help="Access code for new/transfer user",
default="00000000000000000000",
)
parser.add_argument("--message", "-m", type=str, help="Revision message")
parser.add_argument(
"action",
type=str,
help="create, upgrade, downgrade, create-owner, migrate, create-revision, create-autorevision",
)
args = parser.parse_args()
cfg = CoreConfig()
if path.exists(f"{args.config}/core.yaml"):
cfg_dict = yaml.safe_load(open(f"{args.config}/core.yaml"))
cfg_dict.get("database", {})["loglevel"] = "info"
cfg.update(cfg_dict)
if not path.exists(cfg.server.log_dir):
mkdir(cfg.server.log_dir)
if not access(cfg.server.log_dir, W_OK):
print(
f"Log directory {cfg.server.log_dir} NOT writable, please check permissions"
)
exit(1)
data = Data(cfg)
if args.action == "create":
data.create_database()
elif args.action == "upgrade":
data.schema_upgrade(args.version)
elif args.action == "downgrade":
if not args.version:
logging.getLogger("database").error(
f"Version argument required for downgrade"
)
exit(1)
data.schema_downgrade(args.version)
elif args.action == "create-owner":
loop = asyncio.get_event_loop()
loop.run_until_complete(data.create_owner(args.email, args.access_code))
elif args.action == "migrate":
loop = asyncio.get_event_loop()
loop.run_until_complete(data.migrate())
elif args.action == "create-revision":
loop = asyncio.get_event_loop()
loop.run_until_complete(data.create_revision(args.message))
elif args.action == "create-autorevision":
loop = asyncio.get_event_loop()
loop.run_until_complete(data.create_revision_auto(args.message))
else:
logging.getLogger("database").info(f"Unknown action {args.action}")