From b80f60a731386a076e02e06fee3e3ef323c3335d Mon Sep 17 00:00:00 2001 From: Dan Helfman Date: Sat, 16 Nov 2024 16:03:18 -0800 Subject: [PATCH] Create the borgmatic runtime directory if it doesn't exist (#934). --- borgmatic/config/paths.py | 2 +- tests/unit/config/test_paths.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/borgmatic/config/paths.py b/borgmatic/config/paths.py index 19bb9d95..54eb0921 100644 --- a/borgmatic/config/paths.py +++ b/borgmatic/config/paths.py @@ -59,7 +59,6 @@ class Runtime_directory: does not get stored in the file path within an archive. That way, the path of the runtime directory can change without leaving database dumps within an archive inaccessible. ''' - runtime_directory = ( config.get('user_runtime_directory') or os.environ.get('XDG_RUNTIME_DIR') # Set by PAM on Linux. @@ -82,6 +81,7 @@ class Runtime_directory: base_path if final_directory == 'borgmatic' else runtime_directory, '.', 'borgmatic' ) ) + os.makedirs(self.runtime_path, mode=0o700, exist_ok=True) def __enter__(self): ''' diff --git a/tests/unit/config/test_paths.py b/tests/unit/config/test_paths.py index 5a8e674d..33288f55 100644 --- a/tests/unit/config/test_paths.py +++ b/tests/unit/config/test_paths.py @@ -35,6 +35,7 @@ def test_get_borgmatic_source_directory_without_config_option_uses_default(): def test_runtime_directory_uses_config_option(): flexmock(module).should_receive('expand_user_in_path').replace_with(lambda path: path) + flexmock(module.os).should_receive('makedirs') config = {'user_runtime_directory': '/run', 'borgmatic_source_directory': '/nope'} with module.Runtime_directory(config) as borgmatic_runtime_directory: @@ -43,6 +44,7 @@ def test_runtime_directory_uses_config_option(): def test_runtime_directory_uses_config_option_without_adding_duplicate_borgmatic_subdirectory(): flexmock(module).should_receive('expand_user_in_path').replace_with(lambda path: path) + flexmock(module.os).should_receive('makedirs') config = {'user_runtime_directory': '/run/borgmatic', 'borgmatic_source_directory': '/nope'} with module.Runtime_directory(config) as borgmatic_runtime_directory: @@ -54,6 +56,7 @@ def test_runtime_directory_falls_back_to_xdg_runtime_dir(): flexmock(module.os.environ).should_receive('get').with_args('XDG_RUNTIME_DIR').and_return( '/run' ) + flexmock(module.os).should_receive('makedirs') with module.Runtime_directory({}) as borgmatic_runtime_directory: assert borgmatic_runtime_directory == '/run/./borgmatic' @@ -64,6 +67,7 @@ def test_runtime_directory_falls_back_to_xdg_runtime_dir_without_adding_duplicat flexmock(module.os.environ).should_receive('get').with_args('XDG_RUNTIME_DIR').and_return( '/run/borgmatic' ) + flexmock(module.os).should_receive('makedirs') with module.Runtime_directory({}) as borgmatic_runtime_directory: assert borgmatic_runtime_directory == '/run/./borgmatic' @@ -75,6 +79,7 @@ def test_runtime_directory_falls_back_to_runtime_directory(): flexmock(module.os.environ).should_receive('get').with_args('RUNTIME_DIRECTORY').and_return( '/run' ) + flexmock(module.os).should_receive('makedirs') with module.Runtime_directory({}) as borgmatic_runtime_directory: assert borgmatic_runtime_directory == '/run/./borgmatic' @@ -86,6 +91,7 @@ def test_runtime_directory_falls_back_to_runtime_directory_without_adding_duplic flexmock(module.os.environ).should_receive('get').with_args('RUNTIME_DIRECTORY').and_return( '/run/borgmatic' ) + flexmock(module.os).should_receive('makedirs') with module.Runtime_directory({}) as borgmatic_runtime_directory: assert borgmatic_runtime_directory == '/run/./borgmatic' @@ -103,6 +109,7 @@ def test_runtime_directory_falls_back_to_tmpdir_and_adds_temporary_subdirectory_ flexmock(module.tempfile).should_receive('TemporaryDirectory').with_args( prefix='borgmatic-', dir='/run' ).and_return(temporary_directory) + flexmock(module.os).should_receive('makedirs') with module.Runtime_directory({}) as borgmatic_runtime_directory: assert borgmatic_runtime_directory == '/run/borgmatic-1234/./borgmatic' @@ -121,6 +128,7 @@ def test_runtime_directory_falls_back_to_temp_and_adds_temporary_subdirectory_th flexmock(module.tempfile).should_receive('TemporaryDirectory').with_args( prefix='borgmatic-', dir='/run' ).and_return(temporary_directory) + flexmock(module.os).should_receive('makedirs') with module.Runtime_directory({}) as borgmatic_runtime_directory: assert borgmatic_runtime_directory == '/run/borgmatic-1234/./borgmatic' @@ -139,6 +147,7 @@ def test_runtime_directory_falls_back_to_hard_coded_tmp_path_and_adds_temporary_ flexmock(module.tempfile).should_receive('TemporaryDirectory').with_args( prefix='borgmatic-', dir='/tmp' ).and_return(temporary_directory) + flexmock(module.os).should_receive('makedirs') with module.Runtime_directory({}) as borgmatic_runtime_directory: assert borgmatic_runtime_directory == '/tmp/borgmatic-1234/./borgmatic'