The branch, master has been updated via 24b1aa9da2e logger: use color automatically for a tty via c4bd785ac12 samba-tool ldapcmp: print DNs on predictable order via 7ebbd3731d0 netcmd/ldapcmp: make code pythonic via 26f0992c242 netcmd/ldapcmp: promote re object to global via 7d9282bf7c0 netcmd/ldapcmp: use set instead of list to compare attrs via 10855509852 netcmd/ldapcmp: fix wrong way for string copy via 2851cd5bccd netcmd/ldapcmp: pass --skip-missing-dn to LDAPBase via bbd082e7929 netcmd/ldapcmp: avoid modifying data while looping on dict via 04713870896 netcmd/ldapcmp: rm unused global var summary via f821f84f2e9 netcmd/ldapcmp: use set instead of list to find missing DNs via 86882bd12e5 netcmd/ldapcmp: avoid list comprehension in for loop via e71d0d71203 netcmd/ldapcmp: add choices arg to --view option via 263f0207847 netcmd/ldapcmp: add choices arg to --scope option via 683342b7a00 netcmd/ldapcmp: rename __eq__ to diff via 5f47c04cf3e netcmd/ldapcmp: fix typo for Bundle from a370f217bb9 replmd: Make replmd_process_linked_attribute() mem dependencies clearer
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 24b1aa9da2e53e0dba89811f6a8d14b810bd48a8 Author: Joe Guo <j...@catalyst.net.nz> Date: Wed Oct 24 16:35:50 2018 +1300 logger: use color automatically for a tty Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Autobuild-User(master): Andrew Bartlett <abart...@samba.org> Autobuild-Date(master): Wed Nov 21 10:46:20 CET 2018 on sn-devel-144 commit c4bd785ac12fe80e11e985c8c50e459be4ec9898 Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Date: Wed Nov 21 15:33:57 2018 +1300 samba-tool ldapcmp: print DNs on predictable order Rather than unstable hash order. Ideally we'd do them in proper DN order. Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 7ebbd3731d0f510c040e7dc59532a8fb5c0f609a Author: Joe Guo <j...@catalyst.net.nz> Date: Tue Nov 6 22:10:55 2018 +1300 netcmd/ldapcmp: make code pythonic Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 26f0992c24281514dd3ef079c1951a56277373a4 Author: Joe Guo <j...@catalyst.net.nz> Date: Tue Nov 6 21:37:47 2018 +1300 netcmd/ldapcmp: promote re object to global Then we can reuse the re obj. Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 7d9282bf7c02df351f976701ac6b4ed121be72f1 Author: Joe Guo <j...@catalyst.net.nz> Date: Tue Nov 6 18:16:34 2018 +1300 netcmd/ldapcmp: use set instead of list to compare attrs This will simplify the logic and improve performance. Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 10855509852f8e6bc42d5410e59e76fbf2f14657 Author: Joe Guo <j...@catalyst.net.nz> Date: Tue Nov 6 17:41:12 2018 +1300 netcmd/ldapcmp: fix wrong way for string copy Two mistakes here: - res[:-1] will copy but lost the last char - string is immutable in python, there is no need to copy it explicitly Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 2851cd5bccde53a049bbd3774911b7dc4b970467 Author: Joe Guo <j...@catalyst.net.nz> Date: Mon Oct 29 17:45:28 2018 +1300 netcmd/ldapcmp: pass --skip-missing-dn to LDAPBase This option has default value False, and was actually not passed down from cli to LDAPBase. However, LDAPBase.__init__ has default value True for it. After the change, a few tests using ldapcmp are affected. Add --skip-missing-dn explicitly to keep the behavior consistent, otherwise test will fail. Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit bbd082e7929010545deb5ce59e370ebe934aa23e Author: Joe Guo <j...@catalyst.net.nz> Date: Mon Oct 29 17:28:56 2018 +1300 netcmd/ldapcmp: avoid modifying data while looping on dict Just define another dict for return value, seems no need to modify original dict. Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 047138708965d61c122dce64d57a42419e21e501 Author: Joe Guo <j...@catalyst.net.nz> Date: Mon Oct 29 16:44:20 2018 +1300 netcmd/ldapcmp: rm unused global var summary Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit f821f84f2e9a8489dcf8842ce716546f6f8c5ff0 Author: Joe Guo <j...@catalyst.net.nz> Date: Mon Oct 29 15:00:15 2018 +1300 netcmd/ldapcmp: use set instead of list to find missing DNs This simplify the logic and improve performance a lot. Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 86882bd12e506e3a7ceac4f3e9e282df55398a7f Author: Joe Guo <j...@catalyst.net.nz> Date: Mon Oct 29 10:16:02 2018 +1300 netcmd/ldapcmp: avoid list comprehension in for loop The list comprehension will repeat for each item. For large database, this make the command freeze. Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit e71d0d71203474b1b30c8c8250c28ba4889b1f20 Author: Joe Guo <j...@catalyst.net.nz> Date: Mon Oct 29 12:12:38 2018 +1300 netcmd/ldapcmp: add choices arg to --view option So we don't need to validate ourselves. Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 263f02078471a29cad97889a28c02db4ea06a422 Author: Joe Guo <j...@catalyst.net.nz> Date: Mon Oct 29 11:54:57 2018 +1300 netcmd/ldapcmp: add choices arg to --scope option So we don't need to validate ourselves. Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 683342b7a000f370cdc7456ce51cfb69783ced58 Author: Joe Guo <j...@catalyst.net.nz> Date: Mon Oct 29 14:49:28 2018 +1300 netcmd/ldapcmp: rename __eq__ to diff This method actually changed both objects and print info. __eq__ is not a proper name and is not designed for this case. Rename to diff. Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 5f47c04cf3e7ef90a3521c097f60af49bd37615d Author: Joe Guo <j...@catalyst.net.nz> Date: Mon Oct 29 12:29:58 2018 +1300 netcmd/ldapcmp: fix typo for Bundle Bundel -> Bundle Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> ----------------------------------------------------------------------- Summary of changes: python/samba/logger.py | 7 +- python/samba/netcmd/ldapcmp.py | 207 +++++++++++++------------------- testprogs/blackbox/functionalprep.sh | 2 +- testprogs/blackbox/ldapcmp_restoredc.sh | 2 +- testprogs/blackbox/schemaupgrade.sh | 2 +- 5 files changed, 92 insertions(+), 128 deletions(-) Changeset truncated at 500 lines: diff --git a/python/samba/logger.py b/python/samba/logger.py index a3db3beeec8..667c6487a51 100644 --- a/python/samba/logger.py +++ b/python/samba/logger.py @@ -39,7 +39,7 @@ class ColoredFormatter(logging.Formatter): def get_samba_logger( - name='samba', stream=sys.stderr, use_color=True, + name='samba', stream=sys.stderr, level=None, verbose=False, quiet=False, fmt=('%(levelname)s %(asctime)s pid:%(process)d ' '%(pathname)s #%(lineno)d: %(message)s'), @@ -56,7 +56,10 @@ def get_samba_logger( logger.setLevel(level) - Formatter = use_color and ColoredFormatter or logging.Formatter + if (hasattr(stream, 'isatty') and stream.isatty()): + Formatter = ColoredFormatter + else: + Formatter = logging.Formatter formatter = Formatter(fmt=fmt, datefmt=datefmt) handler = logging.StreamHandler(stream=stream) diff --git a/python/samba/netcmd/ldapcmp.py b/python/samba/netcmd/ldapcmp.py index 312c8ecba0a..17c62928a55 100644 --- a/python/samba/netcmd/ldapcmp.py +++ b/python/samba/netcmd/ldapcmp.py @@ -37,8 +37,7 @@ from samba.netcmd import ( Option, ) -global summary -summary = {} +RE_RANGED_RESULT = re.compile("^([^;]+);range=(\d+)-(\d+|\*)$") class LDAPBase(object): @@ -106,17 +105,14 @@ class LDAPBase(object): res = self.ldb.search(base="OU=Domain Controllers,%s" % self.base_dn, scope=SCOPE_SUBTREE, expression="(objectClass=computer)", attrs=["cn"]) assert len(res) > 0 - srv = [] - for x in res: - srv.append(str(x["cn"][0])) - return srv + return [str(x["cn"][0]) for x in res] def find_netbios(self): res = self.ldb.search(base="CN=Partitions,%s" % self.config_dn, scope=SCOPE_SUBTREE, attrs=["nETBIOSName"]) assert len(res) > 0 for x in res: - if "nETBIOSName" in x.keys(): + if "nETBIOSName" in x: return x["nETBIOSName"][0] def object_exists(self, object_dn): @@ -141,9 +137,7 @@ class LDAPBase(object): It resolved ranged results e.g. member;range=0-1499 """ - r = re.compile("^([^;]+);range=(\d+)-(\d+|\*)$") - - m = r.match(key) + m = RE_RANGED_RESULT.match(key) if m is None: return key @@ -154,9 +148,7 @@ class LDAPBase(object): It resolved ranged results e.g. member;range=0-1499 """ - r = re.compile("^([^;]+);range=(\d+)-(\d+|\*)$") - - m = r.match(key) + m = RE_RANGED_RESULT.match(key) if m is None: # no range, just return the values return vals @@ -177,8 +169,8 @@ class LDAPBase(object): fm = None fvals = None - for key in res.keys(): - m = r.match(key) + for key in res: + m = RE_RANGED_RESULT.match(key) if m is None: continue @@ -211,13 +203,15 @@ class LDAPBase(object): res = dict(res[0]) # 'Dn' element is not iterable and we have it as 'distinguishedName' del res["dn"] - for key in list(res.keys()): - vals = list(res[key]) - del res[key] + + attributes = {} + for key, vals in res.items(): name = self.get_attribute_name(key) - res[name] = self.get_attribute_values(object_dn, key, vals) + # sort vals and return a list, help to compare + vals = sorted(vals) + attributes[name] = self.get_attribute_values(object_dn, key, vals) - return res + return attributes def get_descriptor_sddl(self, object_dn): res = self.ldb.search(base=object_dn, scope=SCOPE_BASE, attrs=["nTSecurityDescriptor"]) @@ -345,10 +339,8 @@ class Descriptor(object): common_aces = [] self_aces = [] other_aces = [] - self_dacl_list_fixed = [] - other_dacl_list_fixed = [] - [self_dacl_list_fixed.append(self.fix_sid(ace)) for ace in self.dacl_list] - [other_dacl_list_fixed.append(other.fix_sid(ace)) for ace in other.dacl_list] + self_dacl_list_fixed = [self.fix_sid(ace) for ace in self.dacl_list] + other_dacl_list_fixed = [other.fix_sid(ace) for ace in other.dacl_list] for ace in self_dacl_list_fixed: try: other_dacl_list_fixed.index(ace) @@ -510,7 +502,7 @@ class LDAPObject(object): self.other_attributes = ["name", "DC", ] self.other_attributes = [x.upper() for x in self.other_attributes] # - self.ignore_attributes = [x.upper() for x in self.ignore_attributes] + self.ignore_attributes = set([x.upper() for x in self.ignore_attributes]) def log(self, msg): """ @@ -566,42 +558,33 @@ class LDAPObject(object): else: raise Exception("Unknown --view option value.") # - self.screen_output = res[1][:-1] - other.screen_output = res[1][:-1] + self.screen_output = res[1] + other.screen_output = res[1] # return res[0] def cmp_attrs(self, other): res = "" - self.unique_attrs = [] self.df_value_attrs = [] - other.unique_attrs = [] - if self.attributes.keys() != other.attributes.keys(): - # - title = 4 * " " + "Attributes found only in %s:" % self.con.host - for x in self.attributes.keys(): - if x not in other.attributes.keys() and \ - not x.upper() in [q.upper() for q in other.ignore_attributes]: - if title: - res += title + "\n" - title = None - res += 8 * " " + x + "\n" - self.unique_attrs.append(x) - # - title = 4 * " " + "Attributes found only in %s:" % other.con.host - for x in other.attributes.keys(): - if x not in self.attributes.keys() and \ - not x.upper() in [q.upper() for q in self.ignore_attributes]: - if title: - res += title + "\n" - title = None - res += 8 * " " + x + "\n" - other.unique_attrs.append(x) - # - missing_attrs = [x.upper() for x in self.unique_attrs] - missing_attrs += [x.upper() for x in other.unique_attrs] + + self_attrs = set([attr.upper() for attr in self.attributes]) + other_attrs = set([attr.upper() for attr in other.attributes]) + + self_unique_attrs = self_attrs - other_attrs - other.ignore_attributes + if self_unique_attrs: + res += 4 * " " + "Attributes found only in %s:" % self.con.host + for x in self_unique_attrs: + res += 8 * " " + x + "\n" + + other_unique_attrs = other_attrs - self_attrs - self.ignore_attributes + if other_unique_attrs: + res += 4 * " " + "Attributes found only in %s:" % other.con.host + for x in other_unique_attrs: + res += 8 * " " + x + "\n" + + missing_attrs = self_unique_attrs & other_unique_attrs title = 4 * " " + "Difference in attribute values:" - for x in self.attributes.keys(): + for x in self.attributes: if x.upper() in self.ignore_attributes or x.upper() in missing_attrs: continue if isinstance(self.attributes[x], list) and isinstance(other.attributes[x], list): @@ -675,20 +658,20 @@ class LDAPObject(object): res += 8 * " " + x + " => \n%s\n%s" % (self.attributes[x], other.attributes[x]) + "\n" self.df_value_attrs.append(x) # - if self.unique_attrs + other.unique_attrs != []: - assert self.unique_attrs != other.unique_attrs - self.summary["unique_attrs"] += self.unique_attrs + if missing_attrs: + assert self_unique_attrs != other_unique_attrs + self.summary["unique_attrs"] += list(self_unique_attrs) self.summary["df_value_attrs"] += self.df_value_attrs - other.summary["unique_attrs"] += other.unique_attrs + other.summary["unique_attrs"] += list(other_unique_attrs) other.summary["df_value_attrs"] += self.df_value_attrs # they are the same # - self.screen_output = res[:-1] - other.screen_output = res[:-1] + self.screen_output = res + other.screen_output = res # return res == "" -class LDAPBundel(object): +class LDAPBundle(object): def __init__(self, connection, context, dn_list=None, filter_list=None, outf=sys.stdout, errf=sys.stderr): @@ -713,7 +696,7 @@ class LDAPBundel(object): self.context = context.upper() self.dn_list = self.get_dn_list(context) else: - raise Exception("Unknown initialization data for LDAPBundel().") + raise Exception("Unknown initialization data for LDAPBundle().") counter = 0 while counter < len(self.dn_list) and self.two_domains: # Use alias reference @@ -740,75 +723,61 @@ class LDAPBundel(object): self.size = len(self.dn_list) self.dn_list = sorted(self.dn_list) - def __eq__(self, other): + def diff(self, other): res = True if self.size != other.size: self.log("\n* DN lists have different size: %s != %s" % (self.size, other.size)) if not self.skip_missing_dn: res = False + + self_dns = set([q.upper() for q in self.dn_list]) + other_dns = set([q.upper() for q in other.dn_list]) + # # This is the case where we want to explicitly compare two objects with different DNs. # It does not matter if they are in the same DC, in two DC in one domain or in two # different domains. - if self.search_scope != SCOPE_BASE: - title = "\n* DNs found only in %s:" % self.con.host - for x in self.dn_list: - if not x.upper() in [q.upper() for q in other.dn_list]: - if title and not self.skip_missing_dn: - self.log(title) - title = None - res = False + if self.search_scope != SCOPE_BASE and not self.skip_missing_dn: + + self_only = self_dns - other_dns # missing in other + if self_only: + res = False + self.log("\n* DNs found only in %s:" % self.con.host) + for x in sorted(self_only): self.log(4 * " " + x) - self.dn_list[self.dn_list.index(x)] = "" - self.dn_list = [x for x in self.dn_list if x] - # - title = "\n* DNs found only in %s:" % other.con.host - for x in other.dn_list: - if not x.upper() in [q.upper() for q in self.dn_list]: - if title and not self.skip_missing_dn: - self.log(title) - title = None - res = False + + other_only = other_dns - self_dns # missing in self + if other_only: + res = False + self.log("\n* DNs found only in %s:" % other.con.host) + for x in sorted(other_only): self.log(4 * " " + x) - other.dn_list[other.dn_list.index(x)] = "" - other.dn_list = [x for x in other.dn_list if x] - # - self.update_size() - other.update_size() - assert self.size == other.size - assert sorted([x.upper() for x in self.dn_list]) == sorted([x.upper() for x in other.dn_list]) - self.log("\n* Objects to be compared: %s" % self.size) - index = 0 - while index < self.size: - skip = False + common_dns = self_dns & other_dns + self.log("\n* Objects to be compared: %d" % len(common_dns)) + + for dn in common_dns: + try: object1 = LDAPObject(connection=self.con, - dn=self.dn_list[index], + dn=dn, summary=self.summary, filter_list=self.filter_list, outf=self.outf, errf=self.errf) except LdbError as e: - (enum, estr) = e.args - if enum == ERR_NO_SUCH_OBJECT: - self.log("\n!!! Object not found: %s" % self.dn_list[index]) - skip = True - raise + self.log("LdbError for dn %s: %s" % (dn, e)) + continue + try: object2 = LDAPObject(connection=other.con, - dn=other.dn_list[index], + dn=dn, summary=other.summary, filter_list=self.filter_list, outf=self.outf, errf=self.errf) - except LdbError as e1: - (enum, estr) = e1.args - if enum == ERR_NO_SUCH_OBJECT: - self.log("\n!!! Object not found: %s" % other.dn_list[index]) - skip = True - raise - if skip: - index += 1 + except LdbError as e: + self.log("LdbError for dn %s: %s" % (dn, e)) continue + if object1 == object2: if self.con.verbose: self.log("\nComparing:") @@ -824,8 +793,7 @@ class LDAPBundel(object): res = False self.summary = object1.summary other.summary = object2.summary - index += 1 - # + return res def get_dn_list(self, context): @@ -863,9 +831,6 @@ class LDAPBundel(object): raise for x in res: dn_list.append(x["dn"].get_linearized()) - # - global summary - # return dn_list def print_summary(self): @@ -905,13 +870,13 @@ class cmd_ldapcmp(Command): help="Compare nTSecurityDescriptor attibutes only"), Option("--sort-aces", dest="sort_aces", action="store_true", default=False, help="Sort ACEs before comparison of nTSecurityDescriptor attribute"), - Option("--view", dest="view", default="section", + Option("--view", dest="view", default="section", choices=["section", "collision"], help="Display mode for nTSecurityDescriptor results. Possible values: section or collision."), Option("--base", dest="base", default="", help="Pass search base that will build DN list for the first DC."), Option("--base2", dest="base2", default="", help="Pass search base that will build DN list for the second DC. Used when --two or when compare two different DNs."), - Option("--scope", dest="scope", default="SUB", + Option("--scope", dest="scope", default="SUB", choices=["SUB", "ONE", "BASE"], help="Pass search scope that builds DN list. Options: SUB, ONE, BASE"), Option("--filter", dest="filter", default="", help="List of comma separated attributes to ignore in the comparision"), @@ -964,21 +929,17 @@ class cmd_ldapcmp(Command): raise CommandError("You cannot set --verbose and --quiet together") if (not base and base2) or (base and not base2): raise CommandError("You need to specify both --base and --base2 at the same time") - if descriptor and view.upper() not in ["SECTION", "COLLISION"]: - raise CommandError("Invalid --view value. Choose from: section or collision") - if not scope.upper() in ["SUB", "ONE", "BASE"]: - raise CommandError("Invalid --scope value. Choose from: SUB, ONE, BASE") con1 = LDAPBase(URL1, creds, lp, two=two, quiet=quiet, descriptor=descriptor, sort_aces=sort_aces, verbose=verbose, view=view, base=base, scope=scope, - outf=self.outf, errf=self.errf) + outf=self.outf, errf=self.errf, skip_missing_dn=skip_missing_dn) assert len(con1.base_dn) > 0 con2 = LDAPBase(URL2, creds2, lp, two=two, quiet=quiet, descriptor=descriptor, sort_aces=sort_aces, verbose=verbose, view=view, base=base2, scope=scope, - outf=self.outf, errf=self.errf) + outf=self.outf, errf=self.errf, skip_missing_dn=skip_missing_dn) assert len(con2.base_dn) > 0 filter_list = filter.split(",") @@ -988,12 +949,12 @@ class cmd_ldapcmp(Command): if not quiet: self.outf.write("\n* Comparing [%s] context...\n" % context) - b1 = LDAPBundel(con1, context=context, filter_list=filter_list, + b1 = LDAPBundle(con1, context=context, filter_list=filter_list, outf=self.outf, errf=self.errf) - b2 = LDAPBundel(con2, context=context, filter_list=filter_list, + b2 = LDAPBundle(con2, context=context, filter_list=filter_list, outf=self.outf, errf=self.errf) - if b1 == b2: + if b1.diff(b2): if not quiet: self.outf.write("\n* Result for [%s]: SUCCESS\n" % context) diff --git a/testprogs/blackbox/functionalprep.sh b/testprogs/blackbox/functionalprep.sh index 8a5eafb0966..80e82252d45 100755 --- a/testprogs/blackbox/functionalprep.sh +++ b/testprogs/blackbox/functionalprep.sh @@ -61,7 +61,7 @@ provision_2012r2() { ldapcmp_ignore() { # At some point we will need to ignore, but right now, it should be perfect IGNORE_ATTRS=$1 - $PYTHON $BINDIR/samba-tool ldapcmp tdb://$PREFIX_ABS/$2/private/sam.ldb tdb://$PREFIX_ABS/$3/private/sam.ldb --two + $PYTHON $BINDIR/samba-tool ldapcmp tdb://$PREFIX_ABS/$2/private/sam.ldb tdb://$PREFIX_ABS/$3/private/sam.ldb --two --skip-missing-dn } ldapcmp() { diff --git a/testprogs/blackbox/ldapcmp_restoredc.sh b/testprogs/blackbox/ldapcmp_restoredc.sh index d7a51aebbf2..82804b218ca 100755 --- a/testprogs/blackbox/ldapcmp_restoredc.sh +++ b/testprogs/blackbox/ldapcmp_restoredc.sh @@ -59,7 +59,7 @@ ldapcmp_with_orig() { IGNORE_ATTRS="$IGNORE_ATTRS,serverReferenceBL,msDS-IsDomainFor" LDAPCMP_CMD="$PYTHON $BINDIR/samba-tool ldapcmp" - $LDAPCMP_CMD $DB1_PATH $DB2_PATH --two --filter=$IGNORE_ATTRS $BASE_DN_OPTS + $LDAPCMP_CMD $DB1_PATH $DB2_PATH --two --skip-missing-dn --filter=$IGNORE_ATTRS $BASE_DN_OPTS } # check that the restored testenv DC basically matches the original diff --git a/testprogs/blackbox/schemaupgrade.sh b/testprogs/blackbox/schemaupgrade.sh index d04a8212454..19b71e5810e 100755 --- a/testprogs/blackbox/schemaupgrade.sh +++ b/testprogs/blackbox/schemaupgrade.sh @@ -50,7 +50,7 @@ ldapcmp_ignore() { # objects, but we don't have the 2012 DisplaySpecifiers documentation... IGNORE_ATTRS="$IGNORE_ATTRS,adminContextMenu,adminPropertyPages" - $PYTHON $BINDIR/samba-tool ldapcmp tdb://$PREFIX_ABS/$2_schema/private/sam.ldb tdb://$PREFIX_ABS/$3_schema/private/sam.ldb --two --filter=$IGNORE_ATTRS + $PYTHON $BINDIR/samba-tool ldapcmp tdb://$PREFIX_ABS/$2_schema/private/sam.ldb tdb://$PREFIX_ABS/$3_schema/private/sam.ldb --two --filter=$IGNORE_ATTRS --skip-missing-dn } ldapcmp_old() { -- Samba Shared Repository