47 lines
1.6 KiB
Python
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)
|