From 777772b7b57a52ad095a08901e29d4743f1c76b8 Mon Sep 17 00:00:00 2001 From: "Thierry bordaz (tbordaz)" Date: Mon, 3 Mar 2014 10:12:47 +0100 Subject: [PATCH] Ticket 47691 : lib389 support for RPM builds of 389-ds Bug Description: lib389 does not work on RPM builds. Fix Description: Instance start/stop: - error log should be monitor either RPM: /var/log/dirsrv/slapd-/errors BUILD: /var/log/dirsrv/slapd-/errors - start/stop command should be RPM: sudo systemctl start dirsrv@.service BUILD: /slapd-/-slapd Instance create: specify the prefix when calling runInfProg so that it calls RPM: sudo setup-ds.pl -s -f BUILD: setup-ds.pl -s -f Instance delete: If the instance has 'prefix' attribute RPM: sudo remove-ds.pl -i slapd- BUILD: remove-ds.pl -i slapd- Instance Backup: retrieves the files to backup either from '/' (RPM) or from (BUILD) Instance Restore: restores the files to either from '/' (RPM) or from (BUILD) IMPORTANT: If we want to run on the same platform both RPM and BUILD tests then it is required to do cleanup between runs: RPM -> BUILD: rm -rf /tmp/slapd* (else old backup will be reused) sudo remove-ds.pl -i slapd- (for all created instances) BUILD -> RPM: rm -rf /tmp/slapd* (else old backup will be reused) /sbin/remove-ds.pl -i slapd- (for all create instances) In case something is broken and remove-ds.pl fails you may need to do manual cleaning like: for i in /var/lock/dirsrv/slapd- \ /var/lib/dirsrv/slapd- \ /var/log/dirsrv/slapd- \ /usr/lib64/dirsrv/slapd- \ /etc/dirsrv/slapd- \ /lib/dirsrv/slapd- do rm -rf $PREFIX/$i done https://fedorahosted.org/389/ticket/47691 Reviewed by: ? Platforms tested: F17 Flag Day: no Doc impact: no --- lib389/__init__.py | 43 ++++++++++++++++++++++++++++++++++++------- lib389/_constants.py | 2 ++ lib389/tools.py | 20 ++++++++++++++------ 3 files changed, 52 insertions(+), 13 deletions(-) diff --git a/lib389/__init__.py b/lib389/__init__.py index 6be581e..99bd614 100644 --- a/lib389/__init__.py +++ b/lib389/__init__.py @@ -596,6 +596,10 @@ class DirSrv(SimpleLDAPObject): if privconfig_head: pattern = "%s*" % os.path.join(privconfig_head, DEFAULT_ENV_HEAD) found = search_dir(instances, pattern, self.serverid) + if len(instances) > 0: + self.log.info("List from %s" % privconfig_head) + for instance in instances: + self.log.info("list instance %r\n" % instance) if found: assert len(instances) == 1 else: @@ -607,16 +611,28 @@ class DirSrv(SimpleLDAPObject): if not found: pattern = "%s*" % os.path.join(sysconfig_head, DEFAULT_ENV_HEAD) search_dir(instances, pattern, self.serverid) + if len(instances) > 0: + self.log.info("List from %s" % sysconfig_head) + for instance in instances: + self.log.info("list instance %r\n" % instance) else: # all instances must be retrieved if privconfig_head: pattern = "%s*" % os.path.join(privconfig_head, DEFAULT_ENV_HEAD) search_dir(instances, pattern) + if len(instances) > 0: + self.log.info("List from %s" % privconfig_head) + for instance in instances: + self.log.info("list instance %r\n" % instance) pattern = "%s*" % os.path.join(sysconfig_head, DEFAULT_ENV_HEAD) search_dir(instances, pattern) - + if len(instances) > 0: + self.log.info("List from %s" % sysconfig_head) + for instance in instances: + self.log.info("list instance %r\n" % instance) + return instances @@ -662,7 +678,7 @@ class DirSrv(SimpleLDAPObject): SER_DEPLOYED_DIR: self.prefix, SER_BACKUP_INST_DIR: self.backupdir} content = formatInfData(args) - DirSrvTools.runInfProg(prog, content, verbose) + DirSrvTools.runInfProg(prog, content, verbose, prefix=self.prefix) def create(self): @@ -722,7 +738,10 @@ class DirSrv(SimpleLDAPObject): # Now time to remove the instance prog = get_sbin_dir(None, self.prefix) + CMD_PATH_REMOVE_DS - cmd = "%s -i %s%s" % (prog, DEFAULT_INST_HEAD, self.serverid) + if self.prefix: + cmd = "%s -i %s%s" % (prog, DEFAULT_INST_HEAD, self.serverid) + else: + cmd = "%s %s -i %s%s" % (CMD_SUDO, prog, DEFAULT_INST_HEAD, self.serverid) self.log.debug("running: %s " % cmd) try: os.system(cmd) @@ -958,8 +977,13 @@ class DirSrv(SimpleLDAPObject): # goes under the directory where the DS is deployed listFilesToBackup = [] here = os.getcwd() - os.chdir(self.prefix) - prefix_pattern = "%s/" % self.prefix + if self.prefix: + os.chdir("%s/" % self.prefix) + prefix_pattern = "%s/" % self.prefix + else: + os.chdir("/") + prefix_pattern = None + # build the list of directories to scan instroot = "%s/slapd-%s" % (self.sroot, self.serverid) @@ -980,7 +1004,8 @@ class DirSrv(SimpleLDAPObject): for root, dirs, files in os.walk(dirToBackup): for file in files: name = os.path.join(root, file) - name = re.sub(prefix_pattern, '', name) + if prefix_pattern: + name = re.sub(prefix_pattern, '', name) if os.path.isfile(name): listFilesToBackup.append(name) @@ -1048,7 +1073,11 @@ class DirSrv(SimpleLDAPObject): # Then restore from the directory where DS was deployed here = os.getcwd() - os.chdir(self.prefix) + if self.prefix: + prefix_pattern = "%s/" % self.prefix + else: + prefix_pattern = "/" + os.chdir(prefix_pattern) tar = tarfile.open(backup_file) for member in tar.getmembers(): diff --git a/lib389/_constants.py b/lib389/_constants.py index c85acef..7ca8c6d 100644 --- a/lib389/_constants.py +++ b/lib389/_constants.py @@ -51,6 +51,8 @@ DN_SCHEMA = "cn=schema" CMD_PATH_SETUP_DS = "/setup-ds.pl" CMD_PATH_REMOVE_DS = "/remove-ds.pl" +CMD_SUDO = "/bin/sudo" +CMD_SYSTEMCTL = "/bin/systemctl" # State of an DirSrv object DIRSRV_STATE_INIT='initial' diff --git a/lib389/tools.py b/lib389/tools.py index f283882..16033c2 100644 --- a/lib389/tools.py +++ b/lib389/tools.py @@ -169,12 +169,15 @@ class DirSrvTools(object): if hasattr(self, 'errlog'): errLog = self.errlog else: - errLog = os.path.join(self.prefix, "var/log/dirsrv/slapd-%s/errors" % self.serverid) + errLog = os.path.join(self.prefix or "/", "var/log/dirsrv/slapd-%s/errors" % self.serverid) done = False started = True lastLine = "" cmd = cmd.lower() - fullCmd = instanceDir + "/" + cmd + "-slapd" + if self.prefix: + fullCmd = instanceDir + "/" + cmd + "-slapd" + else: + fullCmd = "%s %s %s dirsrv@%s.service" % (CMD_SUDO, CMD_SYSTEMCTL, cmd, self.inst) if cmd == 'start': cmdPat = 'slapd started.' else: @@ -493,8 +496,10 @@ class DirSrvTools(object): if secport != 636: try: log.debug("Configuring SELinux on port: %s", str(secport)) - - subprocess.check_call([ "semanage", "port", "-a", "-t", "ldap_port_t", "-p", "tcp", str(secport) ]) + cmd = [ "semanage", "port", "-a", "-t", "ldap_port_t", "-p", "tcp", str(secport) ] + if dirsrv.prefix: + cmd.insert(0, CMD_SUDO) + subprocess.check_call(cmd) except OSError: log.debug("Likely SELinux not supported") pass @@ -523,9 +528,12 @@ class DirSrvTools(object): DirSrvTools.start(dirsrv, True) @staticmethod - def runInfProg(prog, content, verbose): + def runInfProg(prog, content, verbose, prefix=None): """run a program that takes an .inf style file on stdin""" - cmd = [prog] + if not prefix: + cmd = [ CMD_SUDO, prog ] + else: + cmd = [prog] if verbose: cmd.append('-ddd') else: -- 1.7.11.7