From 0d4f6fe8ebcc9b23c61556fd10bba4911da07430 Mon Sep 17 00:00:00 2001 From: Noriko Hosoi Date: Fri, 21 Aug 2015 17:01:01 -0700 Subject: [PATCH] Ticket #48252 - (lib389) adding get_bin_dir and dbscan Description: Adding APIs: - get_bin_dir(sroot=None, prefix=None) returns /usr/bin - dbscan(self, bename=None, index=None, key=None) runs dbscan -f /path/to/db/bename/index{.db} [-k key | -K key] If index does not contain ".db", ".db" is added. If index is id2entry and key is digit, key is translated to "-K key". If index is not id2entry, key is translated to "-k key". --- lib389/__init__.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++- lib389/_constants.py | 1 + lib389/utils.py | 9 +++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/lib389/__init__.py b/lib389/__init__.py index 8dfe28f..246dd69 100644 --- a/lib389/__init__.py +++ b/lib389/__init__.py @@ -61,7 +61,8 @@ from lib389.utils import ( escapeDNValue, update_newhost_with_fqdn, formatInfData, - get_sbin_dir + get_sbin_dir, + get_bin_dir ) from lib389.properties import * from lib389.tools import DirSrvTools @@ -2338,6 +2339,58 @@ class DirSrv(SimpleLDAPObject): return result + def dbscan(self, bename=None, index=None, key=None): + """ + @param bename - The backend name to scan + @param index - index name (e.g., cn or cn.db) to scan + @param key - index key to dump + @param id - entry id to dump + @return - dumped string + """ + DirSrvTools.lib389User(user=DEFAULT_USER) + prog = get_bin_dir(None, self.prefix) + DBSCAN + + if not bename: + log.error("dbscan: missing required backend name") + return False + + if not index: + log.error("dbscan: missing required index name") + return False + elif '.db' in index: + indexfile = "%s/db/%s/%s" % (self.dbdir, bename, index) + else: + indexfile = "%s/db/%s/%s.db" % (self.dbdir, bename, index) + + option = '' + if 'id2entry' in index: + if key and key.isdigit(): + option = ' -K %s' % key + else: + if key: + option = ' -k %s' % key + + cmd = '%s -f %s' % (prog, indexfile) + + if len(option) > 0: + cmd = cmd + option + + self.stop(timeout=10) + log.info('Running script: %s' % cmd) + result = True + proc = Popen(cmd.split(), stdout=PIPE) + outs = '' + try: + outs = proc.communicate() + except OSError as e: + log.exception('dbscan: error executing (%s): error %d - %s' % (cmd, e.errno, e.strerror)) + raise e + self.start(timeout=10) + + log.info('Output from ' + cmd) + log.info(outs) + return outs + def searchAccessLog(self, pattern): return DirSrvTools.searchFile(self.accesslog, pattern) diff --git a/lib389/_constants.py b/lib389/_constants.py index efabfc6..79f00cb 100644 --- a/lib389/_constants.py +++ b/lib389/_constants.py @@ -109,6 +109,7 @@ DB2LDIF = '/db2ldif' BAK2DB = '/bak2db' DB2BAK = '/db2bak' DB2INDEX = '/db2index' +DBSCAN = '/dbscan' RDN_REPLICA = "cn=replica" diff --git a/lib389/utils.py b/lib389/utils.py index 2c49d0a..1893336 100644 --- a/lib389/utils.py +++ b/lib389/utils.py @@ -120,6 +120,15 @@ def get_sbin_dir(sroot=None, prefix=None): return "/usr/sbin" +def get_bin_dir(sroot=None, prefix=None): + """Return the sbin directory (default /usr/bin).""" + if sroot: + return "%s/bin/slapd/admin/bin" % sroot + elif prefix and prefix != '/': + return "%s/bin" % prefix + return "/usr/bin" + + def get_data_dir(prefix=None): """Return the shared data directory (default /usr/share/dirsrv/data).""" if prefix and prefix != '/': -- 1.9.3