diff --git a/pulsar/manager_factory.py b/pulsar/manager_factory.py index 817e23aa4d0992f324bd4ba8d75bcbf561c06f43..fdd68ddfca2579a5b7b86b6898ddf8690df5147d 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 f7c040ad4e995e7d054743ea9d9442cf7512d2c3..8b4633c4c516c6590fda2c0703fc55bbcf119f36 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 babbdbe6df49840c5eaff93a4454d580725413d6..7c77b077bb8a21259f07543546afeaf82f087910 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.