Browse Source

Create the borgmatic runtime directory if it doesn't exist (#934).

Dan Helfman 6 months ago
parent
commit
b80f60a731
2 changed files with 10 additions and 1 deletions
  1. 1 1
      borgmatic/config/paths.py
  2. 9 0
      tests/unit/config/test_paths.py

+ 1 - 1
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
         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.
         directory can change without leaving database dumps within an archive inaccessible.
         '''
         '''
-
         runtime_directory = (
         runtime_directory = (
             config.get('user_runtime_directory')
             config.get('user_runtime_directory')
             or os.environ.get('XDG_RUNTIME_DIR')  # Set by PAM on Linux.
             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'
                 base_path if final_directory == 'borgmatic' else runtime_directory, '.', 'borgmatic'
             )
             )
         )
         )
+        os.makedirs(self.runtime_path, mode=0o700, exist_ok=True)
 
 
     def __enter__(self):
     def __enter__(self):
         '''
         '''

+ 9 - 0
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():
 def test_runtime_directory_uses_config_option():
     flexmock(module).should_receive('expand_user_in_path').replace_with(lambda path: path)
     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'}
     config = {'user_runtime_directory': '/run', 'borgmatic_source_directory': '/nope'}
 
 
     with module.Runtime_directory(config) as borgmatic_runtime_directory:
     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():
 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).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'}
     config = {'user_runtime_directory': '/run/borgmatic', 'borgmatic_source_directory': '/nope'}
 
 
     with module.Runtime_directory(config) as borgmatic_runtime_directory:
     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(
     flexmock(module.os.environ).should_receive('get').with_args('XDG_RUNTIME_DIR').and_return(
         '/run'
         '/run'
     )
     )
+    flexmock(module.os).should_receive('makedirs')
 
 
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
         assert borgmatic_runtime_directory == '/run/./borgmatic'
         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(
     flexmock(module.os.environ).should_receive('get').with_args('XDG_RUNTIME_DIR').and_return(
         '/run/borgmatic'
         '/run/borgmatic'
     )
     )
+    flexmock(module.os).should_receive('makedirs')
 
 
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
         assert borgmatic_runtime_directory == '/run/./borgmatic'
         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(
     flexmock(module.os.environ).should_receive('get').with_args('RUNTIME_DIRECTORY').and_return(
         '/run'
         '/run'
     )
     )
+    flexmock(module.os).should_receive('makedirs')
 
 
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
         assert borgmatic_runtime_directory == '/run/./borgmatic'
         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(
     flexmock(module.os.environ).should_receive('get').with_args('RUNTIME_DIRECTORY').and_return(
         '/run/borgmatic'
         '/run/borgmatic'
     )
     )
+    flexmock(module.os).should_receive('makedirs')
 
 
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
         assert borgmatic_runtime_directory == '/run/./borgmatic'
         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(
     flexmock(module.tempfile).should_receive('TemporaryDirectory').with_args(
         prefix='borgmatic-', dir='/run'
         prefix='borgmatic-', dir='/run'
     ).and_return(temporary_directory)
     ).and_return(temporary_directory)
+    flexmock(module.os).should_receive('makedirs')
 
 
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
         assert borgmatic_runtime_directory == '/run/borgmatic-1234/./borgmatic'
         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(
     flexmock(module.tempfile).should_receive('TemporaryDirectory').with_args(
         prefix='borgmatic-', dir='/run'
         prefix='borgmatic-', dir='/run'
     ).and_return(temporary_directory)
     ).and_return(temporary_directory)
+    flexmock(module.os).should_receive('makedirs')
 
 
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
         assert borgmatic_runtime_directory == '/run/borgmatic-1234/./borgmatic'
         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(
     flexmock(module.tempfile).should_receive('TemporaryDirectory').with_args(
         prefix='borgmatic-', dir='/tmp'
         prefix='borgmatic-', dir='/tmp'
     ).and_return(temporary_directory)
     ).and_return(temporary_directory)
+    flexmock(module.os).should_receive('makedirs')
 
 
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
     with module.Runtime_directory({}) as borgmatic_runtime_directory:
         assert borgmatic_runtime_directory == '/tmp/borgmatic-1234/./borgmatic'
         assert borgmatic_runtime_directory == '/tmp/borgmatic-1234/./borgmatic'