From f1a9e83674dd98affbed476ba36b3ad07fa5e88b Mon Sep 17 00:00:00 2001
From: John Chilton <jmchilton@gmail.com>
Date: Fri, 10 Apr 2015 10:37:37 -0400
Subject: [PATCH] Allow explicit configuration of mode to create directories
 with.

By default pulsar will use 0777 with current umask filtered out.

Closes #65.
---
 pulsar/manager_factory.py        |  6 +++++
 pulsar/managers/base/__init__.py | 38 +++++++++++++++++++++++++++-----
 server.ini.sample                |  4 ++++
 3 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/pulsar/manager_factory.py b/pulsar/manager_factory.py
index 817e23aa..fdd68ddf 100644
--- a/pulsar/manager_factory.py
+++ b/pulsar/manager_factory.py
@@ -66,6 +66,12 @@ def _get_default_options(conf):
     if "assign_ids" in conf:
         options["assign_ids"] = conf["assign_ids"]
     options["debug"] = conf.get("debug", False)
+    # mode to create job directories with, if None just use
+    # default (usually 0777 with umask applied).
+    job_directory_mode = conf.get("job_directory_mode", None)
+    options["job_directory_mode"] = None
+    if job_directory_mode is not None:
+        options["job_directory_mode"] = int(job_directory_mode, 8)
     return options
 
 
diff --git a/pulsar/managers/base/__init__.py b/pulsar/managers/base/__init__.py
index f7c040ad..8b4633c4 100644
--- a/pulsar/managers/base/__init__.py
+++ b/pulsar/managers/base/__init__.py
@@ -56,6 +56,7 @@ class BaseManager(ManagerInterface):
         self.name = name
         self.persistence_directory = getattr(app, 'persistence_directory', None)
         self.lock_manager = locks.LockManager()
+        self._directory_maker = DirectoryMaker(kwds.get("job_directory_mode", None))
         self._setup_staging_directory(app.staging_directory)
         self.id_assigner = get_id_assigner(kwds.get("assign_ids", None))
         self.__init_galaxy_system_properties(kwds)
@@ -122,12 +123,17 @@ class BaseManager(ManagerInterface):
     def _setup_staging_directory(self, staging_directory):
         assert staging_directory is not None
         if not exists(staging_directory):
-            makedirs(staging_directory)
+            self._directory_maker.make(staging_directory, recursive=True)
         assert isdir(staging_directory)
         self.staging_directory = staging_directory
 
     def _job_directory(self, job_id):
-        return JobDirectory(self.staging_directory, job_id, self.lock_manager)
+        return JobDirectory(
+            self.staging_directory,
+            job_id,
+            self.lock_manager,
+            self._directory_maker,
+        )
 
     job_directory = _job_directory
 
@@ -183,8 +189,15 @@ class BaseManager(ManagerInterface):
 
 class JobDirectory(RemoteJobDirectory):
 
-    def __init__(self, staging_directory, job_id, lock_manager=None):
+    def __init__(
+        self,
+        staging_directory,
+        job_id,
+        lock_manager=None,
+        directory_maker=None
+    ):
         super(JobDirectory, self).__init__(staging_directory, remote_id=job_id, remote_sep=sep)
+        self._directory_maker = directory_maker or DirectoryMaker()
         self.lock_manager = lock_manager
         # Assert this job id isn't hacking path somehow.
         assert job_id == basename(job_id)
@@ -248,11 +261,11 @@ class JobDirectory(RemoteJobDirectory):
         return rmtree(self.path)
 
     def setup(self):
-        os.mkdir(self.job_directory)
+        self._directory_maker.make(self.job_directory)
 
     def make_directory(self, name):
         path = self._job_file(name)
-        os.mkdir(path)
+        self._directory_maker.make(path)
 
     def lock(self, name=".state"):
         assert self.lock_manager, "Can only use job directory locks if lock manager defined."
@@ -342,3 +355,18 @@ def __posix_to_local_path(path, local_path_module=os.path):
         (path, base) = posixpath.split(path)
         partial_path.appendleft(base)
     return local_path_module.join(*partial_path)
+
+
+class DirectoryMaker(object):
+
+    def __init__(self, mode=None):
+        self.mode = mode
+
+    def make(self, path, recursive=False):
+        makedir_args = [path]
+        if self.mode is not None:
+            makedir_args.append(self.mode)
+        if recursive:
+            makedirs(*makedir_args)
+        else:
+            os.mkdir(*makedir_args)
diff --git a/server.ini.sample b/server.ini.sample
index babbdbe6..7c77b077 100644
--- a/server.ini.sample
+++ b/server.ini.sample
@@ -23,6 +23,10 @@ paste.app_factory = pulsar.web.wsgi:app_factory
 ## to an absolute path, such as /tmp/pulsar_staging or C:\\pulsar_staging
 #staging_directory = files/staging
 
+## Mode to create job releated directories with. If unset
+## will just use 0777 with umask mask applied.
+#job_directory_mode = 0777
+
 ## Private token that must be sent as part of the request to
 ## authorize use. If security is important, please use this in
 ## combination with SSL.
-- 
GitLab