📄 minschema.js
字号:
var res = ldb.search("objectClass=*", dn, ldb.SCOPE_BASE, attrs); if (res.error != 0) { dprintf("Unable to fetch allowedAttributes for '%s' - %s\n", dn, res.errstr); return; } var allattrs = res.msgs[0].allowedAttributes; res = ldb.search("objectClass=*", dn, ldb.SCOPE_BASE, allattrs); if (res.error != 0) { dprintf("Unable to fetch all attributes for '%s' - %s\n", dn, res.errstr); return; } var a; var msg = res.msgs[0]; for (a in msg) { if (attributes[a] == undefined) { attributes[a] = obj_attribute(ldb, 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.error != 0) { dprintf("Unable to fetch objectClasses for '%s' - %s\n", namingContext, res.errstr); return; } var r; for (r=0;r<res.msgs.length;r++) { var msg = res.msgs[r].objectClass; var c; for (c=0;c<msg.length;c++) { var objectClass = msg[c]; if (objectclasses[objectClass] == undefined) { objectclasses[objectClass] = obj_objectClass(ldb, objectClass); objectclasses[objectClass].exampleDN = res.msgs[r].dn; } } walk_dn(ldb, res.msgs[r].dn); }}/* trim the may attributes for an objectClass*/function trim_objectclass_attributes(ldb, class) { var i,j,n; /* trim possibleInferiors, * include only the classes we extracted */ var possinf = class["possibleInferiors"]; if (possinf != undefined) { var newpossinf = new Array(); if (typeof(possinf) == "string") { possinf = new Array(possinf); } n = 0; for (j = 0;j < possinf.length; j++) { var x = possinf[j]; if (objectclasses[x] != undefined) { newpossinf[n] = x; n++; } } class["possibleInferiors"] = newpossinf; } /* trim systemMayContain, * remove duplicates */ var sysmay = class["systemMayContain"]; if (sysmay != undefined) { var newsysmay = new Array(); if (typeof(sysmay) == "string") { sysmay = new Array(sysmay); } for (j = 0;j < sysmay.length; j++) { var x = sysmay[j]; var dup = false; if (newsysmay[0] == undefined) { newsysmay[0] = x; } else { for (n = 0; n < newsysmay.length; n++) { if (newsysmay[n] == x) { dup = true; } } if (dup == false) { newsysmay[n] = x; } } } class["systemMayContain"] = newsysmay; } /* trim mayContain, * remove duplicates */ var may = class["mayContain"]; if (may != undefined) { var newmay = new Array(); if (typeof(may) == "string") { may = new Array(may); } for (j = 0;j < may.length; j++) { var x = may[j]; var dup = false; if (newmay[0] == undefined) { newmay[0] = x; } else { for (n = 0; n < newmay.length; n++) { if (newmay[n] == x) { dup = true; } } if (dup == false) { newmay[n] = x; } } } class["mayContain"] = newmay; }}/* load the basic attributes of an objectClass*/function build_objectclass(ldb, name) { var attrs = new Array("name"); var res = ldb.search( sprintf("(&(objectClass=classSchema)(ldapDisplayName=%s))", name), rootDse.schemaNamingContext, ldb.SCOPE_SUBTREE, attrs); if (res.error != 0) { dprintf("unknown class '%s'\n", name); return undefined; } if (res.msgs.length == 0) { dprintf("unknown class '%s'\n", name); return undefined; } return obj_objectClass(ldb, name);}/* append 2 lists*/function list_append(a1, a2) { var i; if (a1 == undefined) { return a2; } if (a2 == undefined) { return a1; } for (i=0;i<a2.length;i++) { a1[a1.length] = a2[i]; } return a1;}/* form a coalesced attribute list*/function attribute_list(class, attr1, attr2) { var a1 = class[attr1]; var a2 = class[attr2]; if (typeof(a1) == "string") { a1 = new Array(a1); } if (typeof(a2) == "string") { a2 = new Array(a2); } return list_append(a1, a2);}/* write out a list in aggregate form*/function aggregate_list(name, list) { if (list == undefined) { return; } var i; printf("%s ( ", name); for (i=0;i<list.length;i++) { printf("%s ", list[i]); if (i < (list.length - 1)) { printf("$ "); } } printf(") ");}/* write the aggregate record for an objectclass*/function write_aggregate_objectclass(class) { printf("objectClasses: ( %s NAME '%s' ", class.governsID, class.name); if (class['subClassOf'] != undefined) { printf("SUP %s ", class['subClassOf']); } if (class.objectClassCategory == 1) { printf("STRUCTURAL "); } else if (class.objectClassCategory == 2) { printf("ABSTRACT "); } else if (class.objectClassCategory == 3) { printf("AUXILIARY "); } var list; list = attribute_list(class, "systemMustContain", "mustContain"); aggregate_list("MUST", list); list = attribute_list(class, "systemMayContain", "mayContain"); aggregate_list("MAY", list); printf(")\n");}/* write the aggregate record for an ditcontentrule*/function write_aggregate_ditcontentrule(class) { var list = attribute_list(class, "auxiliaryClass", "systemAuxiliaryClass"); var i; if (list == undefined) { return; } printf("dITContentRules: ( %s NAME '%s' ", class.governsID, class.name); aggregate_list("AUX", list); var may_list = undefined; var must_list = undefined; for (i=0;i<list.length;i++) { var c = list[i]; var list2; list2 = attribute_list(objectclasses[c], "mayContain", "systemMayContain"); may_list = list_append(may_list, list2); list2 = attribute_list(objectclasses[c], "mustContain", "systemMustContain"); must_list = list_append(must_list, list2); } aggregate_list("MUST", must_list); aggregate_list("MAY", may_list); printf(")\n");}/* write the aggregate record for an attribute*/function write_aggregate_attribute(attrib) { printf("attributeTypes: ( %s NAME '%s' SYNTAX '%s' ", attrib.attributeID, attrib.name, map_attribute_syntax(attrib.attributeSyntax)); if (attrib['isSingleValued'] == "TRUE") { printf("SINGLE-VALUE "); } if (attrib['systemOnly'] == "TRUE") { printf("NO-USER-MODIFICATION "); } printf(")\n");}/* write the aggregate record*/function write_aggregate() { printf("dn: CN=Aggregate,${SCHEMADN}\n"); print("objectClass: topobjectClass: subSchema"); if (dump_subschema_auto == undefined) { return; } for (i in objectclasses) { write_aggregate_objectclass(objectclasses[i]); } for (i in attributes) { write_aggregate_attribute(attributes[i]); } for (i in objectclasses) { write_aggregate_ditcontentrule(objectclasses[i]); }}/* load a list from a file*/function load_list(file) { var sys = sys_init(); var s = sys.file_load(file); var a = split("\n", s); return a;}/* get the rootDSE */var res = ldb.search("", "", ldb.SCOPE_BASE);rootDse = res.msgs[0];/* load the list of classes we are interested in */var classes = load_list(classfile);var i;for (i=0;i<classes.length;i++) { var classname = classes[i]; var class = build_objectclass(ldb, classname); if (class != undefined) { objectclasses[classname] = class; }}/* expand the objectclass list as needed*/var num_classes = 0;var expanded = 0;/* calculate the actual number of classes */for (i in objectclasses) { num_classes++;}/* so EJS do not have while nor the break statement cannot find any other way than doing more loops than necessary to recursively expand all classes */var inf;for (inf = 0;inf < 500; inf++) { if (expanded < num_classes) { for (i in objectclasses) { var n = objectclasses[i]; if (objectclasses_expanded[i] != "DONE") { expand_objectclass(ldb, objectclasses[i]); objectclasses_expanded[i] = "DONE"; expanded++; } } /* recalculate the actual number of classes */ num_classes = 0; for (i in objectclasses) { num_classes++; } }}/* find objectclass properties*/for (i in objectclasses) { find_objectclass_properties(ldb, objectclasses[i]);}/* form the full list of attributes*/for (i in objectclasses) { add_objectclass_attributes(ldb, objectclasses[i]);}/* and attribute properties */for (i in attributes) { find_attribute_properties(ldb, attributes[i]);}/* trim the 'may' attribute lists to those really needed*/for (i in objectclasses) { trim_objectclass_attributes(ldb, objectclasses[i]);}/* dump an ldif form of the attributes and objectclasses*/if (dump_attributes != undefined) { write_ldif(attributes, attrib_attrs);}if (dump_classes != undefined) { write_ldif(objectclasses, class_attrs);}if (dump_subschema != undefined) { write_aggregate();}if (verbose == undefined) { exit(0);}/* 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);}printf("autocreated attributes:\n");for (i in attributes) { if (attributes[i].autocreate == true) { printf("\t%s\n", i); }}return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -