From: William Brown Date: Sun, 29 Apr 2018 01:28:42 +0000 (+1200) Subject: python/samba/netcmd/schema.py: add schema show_oc for attribute X-Git-Tag: ldb-1.4.0~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2c65184270500dc99b1697af6e830d62093a627f;p=thirdparty%2Fsamba.git python/samba/netcmd/schema.py: add schema show_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. Signed-off-by: William Brown Reviewed-by: Andrew Bartlett Reviewed-by: Garming Sam --- diff --git a/docs-xml/manpages/samba-tool.8.xml b/docs-xml/manpages/samba-tool.8.xml index 19c18645171..f785e53ae73 100644 --- a/docs-xml/manpages/samba-tool.8.xml +++ b/docs-xml/manpages/samba-tool.8.xml @@ -752,6 +752,11 @@ Display an attribute schema definition. + + schema attribute show_oc <replaceable>attribute</replaceable> [options] + Show objectclasses that MAY or MUST contain this attribute. + + schema objectclass show <replaceable>objectclass</replaceable> [options] Display an objectclass schema definition. diff --git a/python/samba/netcmd/schema.py b/python/samba/netcmd/schema.py index dbefe7999cb..8b92b10a6f0 100644 --- a/python/samba/netcmd/schema.py +++ b/python/samba/netcmd/schema.py @@ -202,6 +202,55 @@ class cmd_schema_attribute_show(Command): user_ldif = samdb.write_ldif(res[0], ldb.CHANGETYPE_NONE) self.outf.write(user_ldif) +class cmd_schema_attribute_show_oc(Command): + """Show 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, sambaopts=None, versionopts=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') + for msg in may_res: + self.outf.write('%s\n' % msg['cn'][0]) + + self.outf.write('--- MUST contain ---\n') + for msg in must_res: + self.outf.write('%s\n' % msg['cn'][0]) + + class cmd_schema_objectclass_show(Command): """Show details about an objectClass from the schema. @@ -248,6 +297,7 @@ class cmd_schema_attribute(SuperCommand): subcommands = {} subcommands["modify"] = cmd_schema_attribute_modify() subcommands["show"] = cmd_schema_attribute_show() + subcommands["show_oc"] = cmd_schema_attribute_show_oc() class cmd_schema_objectclass(SuperCommand): """Query and manage objectclasses in the schema partition.""" diff --git a/python/samba/tests/samba_tool/schema.py b/python/samba/tests/samba_tool/schema.py index 373ae16aad9..c719b1c9c0e 100644 --- a/python/samba/tests/samba_tool/schema.py +++ b/python/samba/tests/samba_tool/schema.py @@ -77,6 +77,16 @@ class SchemaCmdTestCase(SambaToolCmdTest): self.assertCmdSuccess(result, out, err) + def test_show_oc_attribute(self): + """Tests that we can modify searchFlags of an attribute""" + (result, out, err) = self.runsubcmd("schema", "attribute", + "show_oc", "cn", + "-H", "ldap://%s" % os.environ["DC_SERVER"], + "-U%s%%%s" % (os.environ["DC_USERNAME"], + os.environ["DC_PASSWORD"])) + + self.assertCmdSuccess(result, out, err) + def test_display_objectclass(self): """Tests that we can display schema objectclasses""" (result, out, err) = self.runsubcmd("schema", "objectclass",