59 lines
1.6 KiB
Python
59 lines
1.6 KiB
Python
"""One-shot CLI: import legacy data.json into PostgreSQL.
|
|
|
|
Usage:
|
|
python -m db.migrate_json [path/to/data.json]
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
import os
|
|
import sys
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
|
|
logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
|
|
logger = logging.getLogger('migrate_json')
|
|
|
|
|
|
def main(argv: list[str] | None = None) -> int:
|
|
argv = list(argv if argv is not None else sys.argv[1:])
|
|
force = '--force' in argv
|
|
paths = [a for a in argv if not a.startswith('-')]
|
|
|
|
if getattr(sys, 'frozen', False):
|
|
app_path = os.path.dirname(sys.executable)
|
|
else:
|
|
app_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
data_file = paths[0] if paths else os.path.join(app_path, 'data.json')
|
|
|
|
from db.store import import_from_json_file, is_database_empty, load_data
|
|
|
|
if not os.path.exists(data_file):
|
|
logger.error('File not found: %s', data_file)
|
|
return 1
|
|
|
|
if not is_database_empty():
|
|
logger.warning('Database is not empty — import will overwrite panel tables.')
|
|
if not force:
|
|
logger.error('Re-run with --force to overwrite existing data.')
|
|
return 2
|
|
|
|
import_from_json_file(data_file, backup=True)
|
|
data = load_data()
|
|
logger.info(
|
|
'Done. servers=%s users=%s connections=%s tokens=%s',
|
|
len(data['servers']),
|
|
len(data['users']),
|
|
len(data['user_connections']),
|
|
len(data['api_tokens']),
|
|
)
|
|
return 0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
raise SystemExit(main())
|