video_monitor/monitor_runtime/paths.py
2026-09-04 18:16:14 +08:00

47 lines
1.6 KiB
Python

"""Separate immutable resources from installation-owned mutable data."""
import os
import sys
from pathlib import Path
from monitor_runtime.release import RELEASE_BUILD
RESOURCE_ROOT = Path(getattr(sys, '_MEIPASS', Path(__file__).resolve().parents[1])).resolve()
if not RELEASE_BUILD and not getattr(sys, 'frozen', False) and os.environ.get('MONITOR_DEV_RESOURCE_ROOT'):
RESOURCE_ROOT = Path(os.environ['MONITOR_DEV_RESOURCE_ROOT']).resolve()
DESKTOP = RELEASE_BUILD or bool(getattr(sys, 'frozen', False)) or os.environ.get('MONITOR_DESKTOP') == '1'
DATA_ROOT = Path(os.environ.get('MONITOR_DATA_DIR') or (
Path(os.environ.get('PROGRAMDATA', 'C:/ProgramData')) / 'Monitor' if DESKTOP else RESOURCE_ROOT
)).resolve()
def resource(name):
return RESOURCE_ROOT / name
def data(name):
return DATA_ROOT / name
def public_key_path():
if not RELEASE_BUILD and not getattr(sys, 'frozen', False):
override = os.environ.get('MONITOR_DEV_PUBLIC_KEY')
if override:
return Path(override)
return resource('license-public.pem')
def atomic_json(path, value):
import json
import tempfile
path = Path(path)
path.parent.mkdir(parents=True, exist_ok=True)
fd, temporary = tempfile.mkstemp(prefix=path.name, suffix='.tmp', dir=path.parent)
try:
with os.fdopen(fd, 'w', encoding='utf-8') as handle:
json.dump(value, handle, ensure_ascii=False, indent=2)
handle.flush()
os.fsync(handle.fileno())
os.replace(temporary, path)
finally:
if os.path.exists(temporary):
os.unlink(temporary)