summaryrefslogtreecommitdiff
path: root/testprogs/ejs/minschema.js
blob: 97697c021aed7701438e29b8a6a719d22f1bbf43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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;