From 7878a34fd48ccba72d259553b74ebe46744c3c36 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Tue, 30 May 2023 15:07:34 +0200 Subject: [PATCH] add get_runtime_dir / BORG_RUNTIME_DIR, tests, docs --- docs/usage/general/environment.rst.inc | 4 ++++ src/borg/helpers/__init__.py | 3 ++- src/borg/helpers/fs.py | 12 ++++++++++++ src/borg/testsuite/helpers.py | 26 +++++++++++++++++++++++++- 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/docs/usage/general/environment.rst.inc b/docs/usage/general/environment.rst.inc index 8fbd8210d..0ac909284 100644 --- a/docs/usage/general/environment.rst.inc +++ b/docs/usage/general/environment.rst.inc @@ -150,6 +150,10 @@ Directories and files: `XDG env var`_ ``XDG_DATA_HOME`` is set, then ``$XDG_DATA_HOME/borg`` is being used instead. This directory contains all borg data directories, see the FAQ for a security advisory about the data in this directory: :ref:`home_data_borg` + BORG_RUNTIME_DIR + Defaults to ``$BORG_BASE_DIR/.cache/borg``. If ``BORG_BASE_DIR`` is not explicitly set while + `XDG env var`_ ``XDG_RUNTIME_DIR`` is set, then ``$XDG_RUNTIME_DIR/borg`` is being used instead. + This directory contains borg runtime files, like e.g. the socket file. BORG_SECURITY_DIR Defaults to ``$BORG_DATA_DIR/security``. This directory contains security relevant data. diff --git a/src/borg/helpers/__init__.py b/src/borg/helpers/__init__.py index 1a745c49a..532d8ffde 100644 --- a/src/borg/helpers/__init__.py +++ b/src/borg/helpers/__init__.py @@ -11,7 +11,8 @@ from ..constants import * # NOQA from .checks import check_extension_modules, check_python from .datastruct import StableDict, Buffer, EfficientCollectionQueue from .errors import Error, ErrorWithTraceback, IntegrityError, DecompressionError -from .fs import ensure_dir, get_security_dir, get_keys_dir, get_base_dir, join_base_dir, get_cache_dir, get_config_dir +from .fs import ensure_dir, join_base_dir +from .fs import get_security_dir, get_keys_dir, get_base_dir, get_cache_dir, get_config_dir, get_runtime_dir from .fs import dir_is_tagged, dir_is_cachedir, make_path_safe, scandir_inorder from .fs import secure_erase, safe_unlink, dash_open, os_open, os_stat, umount from .fs import O_, flags_root, flags_dir, flags_special_follow, flags_special, flags_base, flags_normal, flags_noatime diff --git a/src/borg/helpers/fs.py b/src/borg/helpers/fs.py index 80e62c403..83265f854 100644 --- a/src/borg/helpers/fs.py +++ b/src/borg/helpers/fs.py @@ -106,6 +106,18 @@ def get_data_dir(*, legacy=False): return data_dir +def get_runtime_dir(*, legacy=False): + """Determine where to store runtime files, like sockets, PID files, ...""" + assert legacy is False, "there is no legacy variant of the borg runtime dir" + runtime_dir = os.environ.get( + "BORG_RUNTIME_DIR", join_base_dir(".cache", "borg", legacy=legacy) or platformdirs.user_runtime_dir("borg") + ) + + # Create path if it doesn't exist yet + ensure_dir(runtime_dir) + return runtime_dir + + def get_cache_dir(*, legacy=False): """Determine where to repository keys and cache""" diff --git a/src/borg/testsuite/helpers.py b/src/borg/testsuite/helpers.py index 3dee5755f..4e3726244 100644 --- a/src/borg/testsuite/helpers.py +++ b/src/borg/testsuite/helpers.py @@ -27,7 +27,7 @@ from ..helpers import ( ) from ..helpers import make_path_safe, clean_lines from ..helpers import interval -from ..helpers import get_base_dir, get_cache_dir, get_keys_dir, get_security_dir, get_config_dir +from ..helpers import get_base_dir, get_cache_dir, get_keys_dir, get_security_dir, get_config_dir, get_runtime_dir from ..helpers import is_slow_msgpack from ..helpers import msgpack from ..helpers import yes, TRUISH, FALSISH, DEFAULTISH @@ -752,6 +752,30 @@ def test_get_security_dir(monkeypatch): assert get_security_dir() == "/var/tmp" +def test_get_runtime_dir(monkeypatch): + """test that get_runtime_dir respects environment""" + monkeypatch.delenv("BORG_BASE_DIR", raising=False) + home_dir = os.path.expanduser("~") + if is_win32: + monkeypatch.delenv("BORG_RUNTIME_DIR", raising=False) + assert get_runtime_dir() == os.path.join(home_dir, "AppData", "Local", "Temp", "borg", "borg") + monkeypatch.setenv("BORG_RUNTIME_DIR", home_dir) + assert get_runtime_dir() == home_dir + elif is_darwin: + monkeypatch.delenv("BORG_RUNTIME_DIR", raising=False) + assert get_runtime_dir() == os.path.join(home_dir, "Library", "Caches", "TemporaryItems", "borg") + monkeypatch.setenv("BORG_RUNTIME_DIR", "/var/tmp") + assert get_runtime_dir() == "/var/tmp" + else: + monkeypatch.delenv("XDG_RUNTIME_DIR", raising=False) + monkeypatch.delenv("BORG_RUNTIME_DIR", raising=False) + assert get_runtime_dir() == os.path.join("/run/user", str(os.getuid()), "borg") + monkeypatch.setenv("XDG_RUNTIME_DIR", "/var/tmp/.cache") + assert get_runtime_dir() == os.path.join("/var/tmp/.cache", "borg") + monkeypatch.setenv("BORG_RUNTIME_DIR", "/var/tmp") + assert get_runtime_dir() == "/var/tmp" + + def test_file_size(): """test the size formatting routines""" si_size_map = {