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