Post by William Brown via samba-technicalThanks for your time!
William
From df2ee62b9562a63633ce714bd4b14e0dbe0ee220 Mon Sep 17 00:00:00 2001
Date: Sun, 29 Apr 2018 13:28:42 +1200
Subject: [PATCH] python/samba/netcmd/schema.py: add schema query_oc for
attribute
Often administrators need to add a specific attribute to an object, but
it may not be possible with the objectClasses present. This tool allows
searching "what objectclasses must or may?" take an attribute to help hint
to an administrator what objectclasses can be added to objects to achieve
the changes they want.
---
docs-xml/manpages/samba-tool.8.xml | 5 ++++
python/samba/netcmd/schema.py | 50
+++++++++++++++++++++++++++++++++
python/samba/tests/samba_tool/schema.py | 10 +++++++
3 files changed, 65 insertions(+)
diff --git a/docs-xml/manpages/samba-tool.8.xml b/docs-
xml/manpages/samba-tool.8.xml
index 0466e125100..23b0b275a38 100644
--- a/docs-xml/manpages/samba-tool.8.xml
+++ b/docs-xml/manpages/samba-tool.8.xml
@@ -727,6 +727,11 @@
<para>Modify the behaviour of an attribute in
schema.</para>
</refsect3>
+<refsect3>
+ <title>schema attribute query_oc
<replaceable>attribute</replaceable> [options]</title>
+ <para>Search for objectclasses that MAY or MUST contain
this attribute.</para>
+</refsect3>
+
<refsect3>
<title>schema attribute show
<replaceable>attribute</replaceable> [options]</title>
<para>Display an attribute schema definition.</para>
diff --git a/python/samba/netcmd/schema.py
b/python/samba/netcmd/schema.py
index 71ec6b21061..daeb60aebff 100644
--- a/python/samba/netcmd/schema.py
+++ b/python/samba/netcmd/schema.py
user_ldif = samdb.write_ldif(msg, ldb.CHANGETYPE_NONE)
self.outf.write(user_ldif)
+ """Query what objectclasses MAY or MUST contain an attribute.
+
+ This is useful to determine "if I need uid, what objectclasses could be
+ applied to achieve this."
+ """
+ synopsis = "%prog attribute [options]"
+
+ takes_optiongroups = {
+ "sambaopts": options.SambaOptions,
+ "versionopts": options.VersionOptions,
+ "credopts": options.CredentialsOptions,
+ }
+
+ takes_options = [
+ Option("-H", "--URL", help="LDB URL for database or target server",
+ type=str, metavar="URL", dest="H"),
+ ]
+
+ takes_args = ["attribute"]
+
+ def run(self, attribute, H=None, credopts=None,
+ lp = sambaopts.get_loadparm()
+ creds = credopts.get_credentials(lp)
+
+ samdb = SamDB(url=H, session_info=system_session(),
+ credentials=creds, lp=lp)
+
+ schema_dn = samdb.schema_dn()
+
+ may_filt =
'(&(objectClass=classSchema)(|(mayContain={0})(systemMayContain={0}
)))'.format(attribute)
+ must_filt =
'(&(objectClass=classSchema)(|(mustContain={0})(systemMustContain={
0})))'.format(attribute)
+
+ may_res = samdb.search(base=schema_dn,
scope=ldb.SCOPE_SUBTREE,
+ expression=may_filt, attrs=['cn'])
+ must_res = samdb.search(base=schema_dn,
scope=ldb.SCOPE_SUBTREE,
+ expression=must_filt, attrs=['cn'])
+
+ self.outf.write('--- MAY contain ---\n')
+ self.outf.write('%s\n' % msg['cn'][0])
+
+ self.outf.write('--- MUST contain ---\n')
+ self.outf.write('%s\n' % msg['cn'][0])
+
+
"""Show details about an objectClass from the schema.
subcommands = {}
subcommands["modify"] = cmd_schema_attribute_modify()
subcommands["show"] = cmd_schema_attribute_show()
+ subcommands["query_oc"] = cmd_schema_attribute_query_oc()
"""Query and manage objectclasses in the schema partition."""
subcommands = {}
subcommands["show"] = cmd_schema_objectclass_show()
+ # Is this needed? It's a focused show afterall ...
+ # subcommands["query_attr"] =
cmd_schema_objectclass_query_attr()
"""Schema querying and management."""
diff --git a/python/samba/tests/samba_tool/schema.py
b/python/samba/tests/samba_tool/schema.py
index fdffe23b2b8..9a3f982f9d2 100644
--- a/python/samba/tests/samba_tool/schema.py
+++ b/python/samba/tests/samba_tool/schema.py
self.assertCmdSuccess(result, out, err)
+ """Tests that we can modify searchFlags of an attribute"""
+ (result, out, err) = self.runsubcmd("schema", "attribute",
+ "query_oc", "cn",
+ "-H", "ldap://%s" %
os.environ["DC_SERVER"],
+ "-U%s%%%s" %
(os.environ["DC_USERNAME"],
+ os.environ["DC_PASSWOR
D"]))
+
+ self.assertCmdSuccess(result, out, err)
+
"""Tests that we can display schema objectclasses"""
(result, out, err) = self.runsubcmd("schema",
"objectclass",
--
2.14.3