diff --git a/src/ldaptools/slapd.py b/src/ldaptools/slapd.py index a3d343e..2f29416 100644 --- a/src/ldaptools/slapd.py +++ b/src/ldaptools/slapd.py @@ -103,16 +103,7 @@ olcAccess: {{0}}to * data_dirs = None db_index = 1 tls = None - - def create_process(self, args, pipe=True, out=None): - if pipe: - return subprocess.Popen(args, stdin=subprocess.PIPE, env=os.environ, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - else: - DEVNULL = open(os.devnull, 'w') - out = out or DEVNULL - return subprocess.Popen(args, stdin=DEVNULL, env=os.environ, stdout=out, - stderr=out) + _close_fds = None def __init__(self, ldap_url=None, config_context=None, tls=None): assert has_slapd() @@ -192,6 +183,15 @@ olcAccess: {{0}}to * by * manage stdout, stderr = slapadd.communicate(input=bytearray(ldif, 'utf-8')) assert slapadd.returncode == 0, 'slapadd failed: %s' % stderr + def close_fds(self): + for fd in self._close_fds or []: + fd.close() + + def set_close_fds(self, close_fds): + self.close_fds() + self._close_fds = close_fds + + def start(self): '''Launch slapd''' assert not self.process @@ -201,7 +201,9 @@ olcAccess: {{0}}to * by * manage '-F' + self.config_dir, '-h', self.ldap_url] out_file = open(os.path.join(self.slapd_dir, 'stdout'), 'w') - self.process = self.create_process(cmd, pipe=False, out=out_file) + dev_null = open(os.devnull) + self.process = subprocess.Popen(cmd, stdin=dev_null, env=os.environ, stdout=out_file, stderr=out_file) + self.set_close_fds([out_file, dev_null]) atexit.register(self.clean) c = 0 @@ -263,6 +265,7 @@ olcAccess: {{0}}to * by * manage def clean(self): '''Remove directory''' + self.close_fds() try: if self.process: self.stop()