diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-10-14 07:38:16 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:39:51 -0500 |
commit | 840364eb9772448a5ff8e64eac58dd43b97550d6 (patch) | |
tree | 11f188c66c062d3c18885fc8a7326a3faced0f00 /testprogs/ejs | |
parent | 94473233fe8ae7f663d4872eb1d9f25f08afadb9 (diff) | |
download | samba-840364eb9772448a5ff8e64eac58dd43b97550d6.tar.gz samba-840364eb9772448a5ff8e64eac58dd43b97550d6.tar.bz2 samba-840364eb9772448a5ff8e64eac58dd43b97550d6.zip |
r10990: the beginnings of a program designed to work out the minimal schema
needed to represent all the current records on a ADS LDAP server. The
idea is we will use something based on this code to work out exactly
what schema elements we will need for our initial ADS schema. I plan
on expanding this code to automatically work out attribute properties,
and write out a schema file that we can load into ldb.
Interestingly, it looks like we only need 43 objectclasses and around
200 attributes to represent all records of a newly installed w2k3 ADS
server.
(This used to be commit 7b0ae77757d347d2b0f5bac3a49e915e24c3ab78)
Diffstat (limited to 'testprogs/ejs')
-rwxr-xr-x | testprogs/ejs/minschema.js | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/testprogs/ejs/minschema.js b/testprogs/ejs/minschema.js new file mode 100755 index 0000000000..97697c021a --- /dev/null +++ b/testprogs/ejs/minschema.js @@ -0,0 +1,112 @@ +#!/bin/sh +exec smbscript "$0" ${1+"$@"} +/* + work out the minimal schema for the existing records on a server by examining + all records and working out what objectclasses and attributes exist +*/ + +libinclude("base.js"); + +var ldb = ldb_init(); + +var options = GetOptions(ARGV, + "POPT_AUTOHELP", + "POPT_COMMON_SAMBA", + "POPT_COMMON_CREDENTIALS"); +if (options == undefined) { + println("Failed to parse options"); + return -1; +} + +if (options.ARGV.length != 1) { + println("Usage: minschema.js <URL>"); + return -1; +} + +var url = options.ARGV[0]; + + + +var ok = ldb.connect(url); +assert(ok); + +objectclasses = new Object(); +attributes = new Object(); + + +/* + process an individual record, working out what attributes it has +*/ +function walk_dn(ldb, dn) { + /* get a list of all possible attributes for this object */ + var attrs = new Array("allowedAttributes"); + var res = ldb.search("objectClass=*", dn, ldb.SCOPE_BASE, attrs); + if (res == undefined) { + printf("Unable to fetch allowedAttributes for '%s' - %s\n", + dn, ldb.errstring()); + return; + } + var allattrs = res[0].allowedAttributes; + res = ldb.search("objectClass=*", dn, ldb.SCOPE_BASE, allattrs); + if (res == undefined) { + printf("Unable to fetch all attributes for '%s' - %s\n", + dn, ldb.errstring()); + return; + } + var a; + var msg = res[0]; + for (a in msg) { + attributes[a] = a; + } +} + +/* + walk a naming context, looking for all records +*/ +function walk_naming_context(ldb, namingContext) { + var attrs = new Array("objectClass"); + var res = ldb.search("objectClass=*", namingContext, ldb.SCOPE_DEFAULT, attrs); + if (res == undefined) { + printf("Unable to fetch objectClasses for '%s' - %s\n", + namingContext, ldb.errstring()); + return; + } + var r; + for (r=0;r<res.length;r++) { + var msg = res[r].objectClass; + var c; + for (c=0;c<msg.length;c++) { + var objectClass = msg[c]; + objectclasses[objectClass] = objectClass; + } + walk_dn(ldb, res[r].dn); + } +} + +/* + get a list of naming contexts +*/ +var attrs = new Array("namingContexts"); +var res = ldb.search("", "", ldb.SCOPE_BASE, attrs); +var namingContexts = res[0].namingContexts; + +/* + walk the naming contexts, gathering objectclass values and attribute names +*/ +for (var c=0;c<namingContexts.length;c++) { + walk_naming_context(ldb, namingContexts[c]); +} + +/* + dump list of objectclasses +*/ +printf("objectClasses:\n") +for (i in objectclasses) { + printf("\t%s\n", i); +} +printf("attributes:\n") +for (i in attributes) { + printf("\t%s\n", i); +} + +return 0; |