"""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)