class CliTool(object): def __init__(self, args=None): if args is not None: self.args = args self.ds = DirSrv(verbose=args.verbose) else: self.ds = DirSrv() def populate_instance_dict(self, instance): insts = self.ds.list(serverid=instance) if len(insts) != 1: # Raise an exception here? self.inst = None raise ValueError("No such instance %s" % instance) else: self.inst = insts[0] def get_rootdn_pass(self): if self.args.binddn is None: binddn = self.inst[SER_ROOT_DN] else: binddn = self.args.binddn # There is a dict get key thing somewhere ... if self.inst.get(SER_ROOT_PW, None) is None: prompt_txt = ('Enter password for %s on instance %s: ' % (binddn, self.inst[SER_SERVERID_PROP])) self.inst[SER_ROOT_PW] = getpass(prompt_txt) print("") return def connect(self): # Can we attempt the autobind? # This should be a bit cleaner perhaps # Perhaps an argument to the cli? self.ds.allocate(self.inst) if not self.ds.can_autobind(): self.get_rootdn_pass() self.ds.allocate(self.inst) self.ds.open() def disconnect(self): # Is there a ds unbind / disconnect? self.ds.close()
def get_consumer_maxcsn(self, binddn=None, bindpw=None): """Attempt to get the consumer's maxcsn from its database RUV entry :param binddn: Specifies a specific bind DN to use when contacting the remote consumer :type binddn: str :param bindpw: Password for the bind DN :type bindpw: str :returns: CSN string if found, otherwise "Unavailable" is returned """ host = self.get_attr_val_utf8(AGMT_HOST) port = self.get_attr_val_utf8(AGMT_PORT) suffix = self.get_attr_val_utf8(REPL_ROOT) protocol = self.get_attr_val_utf8('nsds5replicatransportinfo').lower() result_msg = "Unavailable" # If we are using LDAPI we need to provide the credentials, otherwise # use the existing credentials if binddn is None: binddn = self._instance.binddn if bindpw is None: bindpw = self._instance.bindpw # Get the replica id from supplier to compare to the consumer's rid from lib389.replica import Replicas replicas = Replicas(self._instance) replica = replicas.get(suffix) rid = replica.get_attr_val_utf8(REPL_ID) # Open a connection to the consumer consumer = DirSrv(verbose=self._instance.verbose) args_instance[SER_HOST] = host if protocol == "ssl" or protocol == "ldaps": args_instance[SER_SECURE_PORT] = int(port) else: args_instance[SER_PORT] = int(port) args_instance[SER_ROOT_DN] = binddn args_instance[SER_ROOT_PW] = bindpw args_standalone = args_instance.copy() consumer.allocate(args_standalone) try: consumer.open() except ldap.INVALID_CREDENTIALS as e: raise (e) except ldap.LDAPError as e: self._log.debug( 'Connection to consumer ({}:{}) failed, error: {}'.format( host, port, e)) return result_msg # Search for the tombstone RUV entry try: entry = consumer.search_s(suffix, ldap.SCOPE_SUBTREE, REPLICA_RUV_FILTER, ['nsds50ruv']) if not entry: self._log.debug( "Failed to retrieve database RUV entry from consumer") else: elements = ensure_list_str(entry[0].getValues('nsds50ruv')) for ruv in elements: if ('replica %s ' % rid) in ruv: ruv_parts = ruv.split() if len(ruv_parts) == 5: result_msg = ruv_parts[4] break except ldap.INVALID_CREDENTIALS as e: raise (e) except ldap.LDAPError as e: self._log.debug('Failed to search for the suffix ' + '({}) consumer ({}:{}) failed, error: {}'.format( suffix, host, port, e)) consumer.close() return result_msg