#51237 WIP - openldap migration support tooling
Closed 3 years ago by spichugi. Opened 3 years ago by firstyear.
firstyear/389-ds-base 50544-openldap-migration  into  master

@@ -0,0 +1,241 @@ 

+ dn: dc=example,dc=com

+ objectClass: dcObject

+ objectClass: organization

+ o: Example Company

+ dc: example

+ structuralObjectClass: organization

+ entryUUID: 67c6a9b8-eafa-1039-882d-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.130368Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=com

+ modifyTimestamp: 20200224023755Z

+ 

+ dn: cn=Manager,dc=example,dc=com

+ objectClass: organizationalRole

+ cn: Manager

+ structuralObjectClass: organizationalRole

+ entryUUID: 67c8c932-eafa-1039-882e-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.144283Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=com

+ modifyTimestamp: 20200224023755Z

+ 

+ dn: ou=People,dc=example,dc=com

+ objectClass: organizationalUnit

+ ou: People

+ structuralObjectClass: organizationalUnit

+ entryUUID: 67ca92a8-eafa-1039-882f-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.155994Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=com

+ modifyTimestamp: 20200224023755Z

+ 

+ dn: ou=Groups,dc=example,dc=com

+ objectClass: organizationalUnit

+ ou: Groups

+ structuralObjectClass: organizationalUnit

+ entryUUID: 67cc2212-eafa-1039-8830-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.166219Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=com

+ modifyTimestamp: 20200224023755Z

+ 

+ dn: cn=user0,ou=People,dc=example,dc=com

+ objectClass: account

+ objectClass: posixAccount

+ cn: user0

+ uid: user0

+ uidNumber: 80000

+ gidNumber: 80000

+ homeDirectory: /home/user0

+ structuralObjectClass: account

+ entryUUID: 67cdfcea-eafa-1039-8831-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.178373Z#000000#000#000000

+ modifyTimestamp: 20200224023755Z

+ memberOf: cn=group0,ou=groups,dc=example,dc=com

+ memberOf: cn=group1,ou=groups,dc=example,dc=com

+ memberOf: cn=group2,ou=groups,dc=example,dc=com

+ memberOf: cn=group3,ou=groups,dc=example,dc=com

+ memberOf: cn=group4,ou=groups,dc=example,dc=com

+ modifiersName: cn=Manager,dc=example,dc=com

+ 

+ dn: cn=user1,ou=People,dc=example,dc=com

+ objectClass: account

+ objectClass: posixAccount

+ cn: user1

+ uid: user1

+ uidNumber: 80001

+ gidNumber: 80001

+ homeDirectory: /home/user1

+ structuralObjectClass: account

+ entryUUID: 67d05080-eafa-1039-8832-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.193620Z#000000#000#000000

+ modifyTimestamp: 20200224023755Z

+ memberOf: cn=group0,ou=groups,dc=example,dc=com

+ memberOf: cn=group1,ou=groups,dc=example,dc=com

+ memberOf: cn=group2,ou=groups,dc=example,dc=com

+ memberOf: cn=group3,ou=groups,dc=example,dc=com

+ memberOf: cn=group4,ou=groups,dc=example,dc=com

+ modifiersName: cn=Manager,dc=example,dc=com

+ 

+ dn: cn=user2,ou=People,dc=example,dc=com

+ objectClass: account

+ objectClass: posixAccount

+ cn: user2

+ uid: user2

+ uidNumber: 80002

+ gidNumber: 80002

+ homeDirectory: /home/user2

+ structuralObjectClass: account

+ entryUUID: 67d26172-eafa-1039-8833-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.207161Z#000000#000#000000

+ modifyTimestamp: 20200224023755Z

+ memberOf: cn=group0,ou=groups,dc=example,dc=com

+ memberOf: cn=group1,ou=groups,dc=example,dc=com

+ memberOf: cn=group2,ou=groups,dc=example,dc=com

+ memberOf: cn=group3,ou=groups,dc=example,dc=com

+ memberOf: cn=group4,ou=groups,dc=example,dc=com

+ modifiersName: cn=Manager,dc=example,dc=com

+ 

+ dn: cn=user3,ou=People,dc=example,dc=com

+ objectClass: account

+ objectClass: posixAccount

+ cn: user3

+ uid: user3

+ uidNumber: 80003

+ gidNumber: 80003

+ homeDirectory: /home/user3

+ structuralObjectClass: account

+ entryUUID: 67d460bc-eafa-1039-8834-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.220249Z#000000#000#000000

+ modifyTimestamp: 20200224023755Z

+ memberOf: cn=group0,ou=groups,dc=example,dc=com

+ memberOf: cn=group1,ou=groups,dc=example,dc=com

+ memberOf: cn=group2,ou=groups,dc=example,dc=com

+ memberOf: cn=group3,ou=groups,dc=example,dc=com

+ memberOf: cn=group4,ou=groups,dc=example,dc=com

+ modifiersName: cn=Manager,dc=example,dc=com

+ 

+ dn: cn=user4,ou=People,dc=example,dc=com

+ objectClass: account

+ objectClass: posixAccount

+ cn: user4

+ uid: user4

+ uidNumber: 80004

+ gidNumber: 80004

+ homeDirectory: /home/user4

+ structuralObjectClass: account

+ entryUUID: 67d5d2a8-eafa-1039-8835-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.229723Z#000000#000#000000

+ modifyTimestamp: 20200224023755Z

+ memberOf: cn=group0,ou=groups,dc=example,dc=com

+ memberOf: cn=group1,ou=groups,dc=example,dc=com

+ memberOf: cn=group2,ou=groups,dc=example,dc=com

+ memberOf: cn=group3,ou=groups,dc=example,dc=com

+ memberOf: cn=group4,ou=groups,dc=example,dc=com

+ modifiersName: cn=Manager,dc=example,dc=com

+ 

+ dn: cn=group0,ou=Groups,dc=example,dc=com

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group0

+ member: cn=user0,ou=people,dc=example,dc=com

+ member: cn=user1,ou=people,dc=example,dc=com

+ member: cn=user2,ou=people,dc=example,dc=com

+ member: cn=user3,ou=people,dc=example,dc=com

+ member: cn=user4,ou=people,dc=example,dc=com

+ gidNumber: 90000

+ structuralObjectClass: groupOfNames

+ entryUUID: 67d6f796-eafa-1039-8836-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.237225Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=com

+ modifyTimestamp: 20200224023755Z

+ 

+ dn: cn=group1,ou=Groups,dc=example,dc=com

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group1

+ member: cn=user0,ou=people,dc=example,dc=com

+ member: cn=user1,ou=people,dc=example,dc=com

+ member: cn=user2,ou=people,dc=example,dc=com

+ member: cn=user3,ou=people,dc=example,dc=com

+ member: cn=user4,ou=people,dc=example,dc=com

+ gidNumber: 90001

+ structuralObjectClass: groupOfNames

+ entryUUID: 67da9d2e-eafa-1039-8837-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.261127Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=com

+ modifyTimestamp: 20200224023755Z

+ 

+ dn: cn=group2,ou=Groups,dc=example,dc=com

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group2

+ member: cn=user0,ou=people,dc=example,dc=com

+ member: cn=user1,ou=people,dc=example,dc=com

+ member: cn=user2,ou=people,dc=example,dc=com

+ member: cn=user3,ou=people,dc=example,dc=com

+ member: cn=user4,ou=people,dc=example,dc=com

+ gidNumber: 90002

+ structuralObjectClass: groupOfNames

+ entryUUID: 67de2822-eafa-1039-8838-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.284346Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=com

+ modifyTimestamp: 20200224023755Z

+ 

+ dn: cn=group3,ou=Groups,dc=example,dc=com

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group3

+ member: cn=user0,ou=people,dc=example,dc=com

+ member: cn=user1,ou=people,dc=example,dc=com

+ member: cn=user2,ou=people,dc=example,dc=com

+ member: cn=user3,ou=people,dc=example,dc=com

+ member: cn=user4,ou=people,dc=example,dc=com

+ gidNumber: 90003

+ structuralObjectClass: groupOfNames

+ entryUUID: 67e1a6aa-eafa-1039-8839-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.307244Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=com

+ modifyTimestamp: 20200224023755Z

+ 

+ dn: cn=group4,ou=Groups,dc=example,dc=com

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group4

+ member: cn=user0,ou=people,dc=example,dc=com

+ member: cn=user1,ou=people,dc=example,dc=com

+ member: cn=user2,ou=people,dc=example,dc=com

+ member: cn=user3,ou=people,dc=example,dc=com

+ member: cn=user4,ou=people,dc=example,dc=com

+ gidNumber: 90004

+ structuralObjectClass: groupOfNames

+ entryUUID: 67e5a50c-eafa-1039-883a-152569770969

+ creatorsName: cn=Manager,dc=example,dc=com

+ createTimestamp: 20200224023755Z

+ entryCSN: 20200224023755.333416Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=com

+ modifyTimestamp: 20200224023755Z

+ 

@@ -0,0 +1,241 @@ 

+ dn: dc=example,dc=net

+ objectClass: dcObject

+ objectClass: organization

+ o: Example Company

+ dc: example

+ structuralObjectClass: organization

+ entryUUID: 5df457fe-eafb-1039-8857-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.149265Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=net

+ modifyTimestamp: 20200224024448Z

+ 

+ dn: cn=Manager,dc=example,dc=net

+ objectClass: organizationalRole

+ cn: Manager

+ structuralObjectClass: organizationalRole

+ entryUUID: 5df55cf8-eafb-1039-8858-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.155945Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=net

+ modifyTimestamp: 20200224024448Z

+ 

+ dn: ou=People,dc=example,dc=net

+ objectClass: organizationalUnit

+ ou: People

+ structuralObjectClass: organizationalUnit

+ entryUUID: 5df60342-eafb-1039-8859-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.160202Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=net

+ modifyTimestamp: 20200224024448Z

+ 

+ dn: ou=Groups,dc=example,dc=net

+ objectClass: organizationalUnit

+ ou: Groups

+ structuralObjectClass: organizationalUnit

+ entryUUID: 5df6a57c-eafb-1039-885a-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.164355Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=net

+ modifyTimestamp: 20200224024448Z

+ 

+ dn: cn=user0,ou=People,dc=example,dc=net

+ objectClass: account

+ objectClass: posixAccount

+ cn: user0

+ uid: user0

+ uidNumber: 80000

+ gidNumber: 80000

+ homeDirectory: /home/user0

+ structuralObjectClass: account

+ entryUUID: 5df7521a-eafb-1039-885b-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.168774Z#000000#000#000000

+ modifyTimestamp: 20200224024448Z

+ memberOf: cn=group0,ou=groups,dc=example,dc=net

+ memberOf: cn=group1,ou=groups,dc=example,dc=net

+ memberOf: cn=group2,ou=groups,dc=example,dc=net

+ memberOf: cn=group3,ou=groups,dc=example,dc=net

+ memberOf: cn=group4,ou=groups,dc=example,dc=net

+ modifiersName: cn=Manager,dc=example,dc=net

+ 

+ dn: cn=user1,ou=People,dc=example,dc=net

+ objectClass: account

+ objectClass: posixAccount

+ cn: user1

+ uid: user1

+ uidNumber: 80001

+ gidNumber: 80001

+ homeDirectory: /home/user1

+ structuralObjectClass: account

+ entryUUID: 5df80f66-eafb-1039-885c-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.173619Z#000000#000#000000

+ modifyTimestamp: 20200224024448Z

+ memberOf: cn=group0,ou=groups,dc=example,dc=net

+ memberOf: cn=group1,ou=groups,dc=example,dc=net

+ memberOf: cn=group2,ou=groups,dc=example,dc=net

+ memberOf: cn=group3,ou=groups,dc=example,dc=net

+ memberOf: cn=group4,ou=groups,dc=example,dc=net

+ modifiersName: cn=Manager,dc=example,dc=net

+ 

+ dn: cn=user2,ou=People,dc=example,dc=net

+ objectClass: account

+ objectClass: posixAccount

+ cn: user2

+ uid: user2

+ uidNumber: 80002

+ gidNumber: 80002

+ homeDirectory: /home/user2

+ structuralObjectClass: account

+ entryUUID: 5df8e710-eafb-1039-885d-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.179140Z#000000#000#000000

+ modifyTimestamp: 20200224024448Z

+ memberOf: cn=group0,ou=groups,dc=example,dc=net

+ memberOf: cn=group1,ou=groups,dc=example,dc=net

+ memberOf: cn=group2,ou=groups,dc=example,dc=net

+ memberOf: cn=group3,ou=groups,dc=example,dc=net

+ memberOf: cn=group4,ou=groups,dc=example,dc=net

+ modifiersName: cn=Manager,dc=example,dc=net

+ 

+ dn: cn=user3,ou=People,dc=example,dc=net

+ objectClass: account

+ objectClass: posixAccount

+ cn: user3

+ uid: user3

+ uidNumber: 80003

+ gidNumber: 80003

+ homeDirectory: /home/user3

+ structuralObjectClass: account

+ entryUUID: 5df9c356-eafb-1039-885e-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.184778Z#000000#000#000000

+ modifyTimestamp: 20200224024448Z

+ memberOf: cn=group0,ou=groups,dc=example,dc=net

+ memberOf: cn=group1,ou=groups,dc=example,dc=net

+ memberOf: cn=group2,ou=groups,dc=example,dc=net

+ memberOf: cn=group3,ou=groups,dc=example,dc=net

+ memberOf: cn=group4,ou=groups,dc=example,dc=net

+ modifiersName: cn=Manager,dc=example,dc=net

+ 

+ dn: cn=user4,ou=People,dc=example,dc=net

+ objectClass: account

+ objectClass: posixAccount

+ cn: user4

+ uid: user4

+ uidNumber: 80004

+ gidNumber: 80004

+ homeDirectory: /home/user4

+ structuralObjectClass: account

+ entryUUID: 5dfaecc2-eafb-1039-885f-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.192376Z#000000#000#000000

+ modifyTimestamp: 20200224024448Z

+ memberOf: cn=group0,ou=groups,dc=example,dc=net

+ memberOf: cn=group1,ou=groups,dc=example,dc=net

+ memberOf: cn=group2,ou=groups,dc=example,dc=net

+ memberOf: cn=group3,ou=groups,dc=example,dc=net

+ memberOf: cn=group4,ou=groups,dc=example,dc=net

+ modifiersName: cn=Manager,dc=example,dc=net

+ 

+ dn: cn=group0,ou=Groups,dc=example,dc=net

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group0

+ member: cn=user0,ou=people,dc=example,dc=net

+ member: cn=user1,ou=people,dc=example,dc=net

+ member: cn=user2,ou=people,dc=example,dc=net

+ member: cn=user3,ou=people,dc=example,dc=net

+ member: cn=user4,ou=people,dc=example,dc=net

+ gidNumber: 90000

+ structuralObjectClass: groupOfNames

+ entryUUID: 5dfc02c4-eafb-1039-8860-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.199510Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=net

+ modifyTimestamp: 20200224024448Z

+ 

+ dn: cn=group1,ou=Groups,dc=example,dc=net

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group1

+ member: cn=user0,ou=people,dc=example,dc=net

+ member: cn=user1,ou=people,dc=example,dc=net

+ member: cn=user2,ou=people,dc=example,dc=net

+ member: cn=user3,ou=people,dc=example,dc=net

+ member: cn=user4,ou=people,dc=example,dc=net

+ gidNumber: 90001

+ structuralObjectClass: groupOfNames

+ entryUUID: 5e01038c-eafb-1039-8861-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.232297Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=net

+ modifyTimestamp: 20200224024448Z

+ 

+ dn: cn=group2,ou=Groups,dc=example,dc=net

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group2

+ member: cn=user0,ou=people,dc=example,dc=net

+ member: cn=user1,ou=people,dc=example,dc=net

+ member: cn=user2,ou=people,dc=example,dc=net

+ member: cn=user3,ou=people,dc=example,dc=net

+ member: cn=user4,ou=people,dc=example,dc=net

+ gidNumber: 90002

+ structuralObjectClass: groupOfNames

+ entryUUID: 5e06b610-eafb-1039-8862-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.269635Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=net

+ modifyTimestamp: 20200224024448Z

+ 

+ dn: cn=group3,ou=Groups,dc=example,dc=net

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group3

+ member: cn=user0,ou=people,dc=example,dc=net

+ member: cn=user1,ou=people,dc=example,dc=net

+ member: cn=user2,ou=people,dc=example,dc=net

+ member: cn=user3,ou=people,dc=example,dc=net

+ member: cn=user4,ou=people,dc=example,dc=net

+ gidNumber: 90003

+ structuralObjectClass: groupOfNames

+ entryUUID: 5e0aec76-eafb-1039-8863-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.297242Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=net

+ modifyTimestamp: 20200224024448Z

+ 

+ dn: cn=group4,ou=Groups,dc=example,dc=net

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group4

+ member: cn=user0,ou=people,dc=example,dc=net

+ member: cn=user1,ou=people,dc=example,dc=net

+ member: cn=user2,ou=people,dc=example,dc=net

+ member: cn=user3,ou=people,dc=example,dc=net

+ member: cn=user4,ou=people,dc=example,dc=net

+ gidNumber: 90004

+ structuralObjectClass: groupOfNames

+ entryUUID: 5e0f0900-eafb-1039-8864-152569770969

+ creatorsName: cn=Manager,dc=example,dc=net

+ createTimestamp: 20200224024448Z

+ entryCSN: 20200224024448.324187Z#000000#000#000000

+ modifiersName: cn=Manager,dc=example,dc=net

+ modifyTimestamp: 20200224024448Z

+ 

@@ -0,0 +1,117 @@ 

+ dn: dc=example,dc=com

+ objectclass: dcObject

+ objectclass: organization

+ o: Example Company

+ dc: example

+ 

+ dn: cn=Manager,dc=example,dc=com

+ objectclass: organizationalRole

+ cn: Manager

+ 

+ dn: ou=People,dc=example,dc=com

+ objectClass: organizationalUnit

+ ou: People

+ 

+ dn: ou=Groups,dc=example,dc=com

+ objectClass: organizationalUnit

+ ou: Groups

+ 

+ dn: cn=user0,ou=people,dc=example,dc=com

+ objectClass: Account

+ objectClass: posixAccount

+ cn: user0

+ uid: user0

+ uidnumber: 80000

+ gidnumber: 80000

+ homeDirectory: /home/user0

+ 

+ dn: cn=user1,ou=people,dc=example,dc=com

+ objectClass: Account

+ objectClass: posixAccount

+ cn: user1

+ uid: user1

+ uidnumber: 80001

+ gidnumber: 80001

+ homeDirectory: /home/user1

+ 

+ dn: cn=user2,ou=people,dc=example,dc=com

+ objectClass: Account

+ objectClass: posixAccount

+ cn: user2

+ uid: user2

+ uidnumber: 80002

+ gidnumber: 80002

+ homeDirectory: /home/user2

+ 

+ dn: cn=user3,ou=people,dc=example,dc=com

+ objectClass: Account

+ objectClass: posixAccount

+ cn: user3

+ uid: user3

+ uidnumber: 80003

+ gidnumber: 80003

+ homeDirectory: /home/user3

+ 

+ dn: cn=user4,ou=people,dc=example,dc=com

+ objectClass: Account

+ objectClass: posixAccount

+ cn: user4

+ uid: user4

+ uidnumber: 80004

+ gidnumber: 80004

+ homeDirectory: /home/user4

+ 

+ dn: cn=group0,ou=groups,dc=example,dc=com

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group0

+ member: cn=user0,ou=people,dc=example,dc=com

+ member: cn=user1,ou=people,dc=example,dc=com

+ member: cn=user2,ou=people,dc=example,dc=com

+ member: cn=user3,ou=people,dc=example,dc=com

+ member: cn=user4,ou=people,dc=example,dc=com

+ gidNumber: 90000

+ 

+ dn: cn=group1,ou=groups,dc=example,dc=com

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group1

+ member: cn=user0,ou=people,dc=example,dc=com

+ member: cn=user1,ou=people,dc=example,dc=com

+ member: cn=user2,ou=people,dc=example,dc=com

+ member: cn=user3,ou=people,dc=example,dc=com

+ member: cn=user4,ou=people,dc=example,dc=com

+ gidNumber: 90001

+ 

+ dn: cn=group2,ou=groups,dc=example,dc=com

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group2

+ member: cn=user0,ou=people,dc=example,dc=com

+ member: cn=user1,ou=people,dc=example,dc=com

+ member: cn=user2,ou=people,dc=example,dc=com

+ member: cn=user3,ou=people,dc=example,dc=com

+ member: cn=user4,ou=people,dc=example,dc=com

+ gidNumber: 90002

+ 

+ dn: cn=group3,ou=groups,dc=example,dc=com

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group3

+ member: cn=user0,ou=people,dc=example,dc=com

+ member: cn=user1,ou=people,dc=example,dc=com

+ member: cn=user2,ou=people,dc=example,dc=com

+ member: cn=user3,ou=people,dc=example,dc=com

+ member: cn=user4,ou=people,dc=example,dc=com

+ gidNumber: 90003

+ 

+ dn: cn=group4,ou=groups,dc=example,dc=com

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group4

+ member: cn=user0,ou=people,dc=example,dc=com

+ member: cn=user1,ou=people,dc=example,dc=com

+ member: cn=user2,ou=people,dc=example,dc=com

+ member: cn=user3,ou=people,dc=example,dc=com

+ member: cn=user4,ou=people,dc=example,dc=com

+ gidNumber: 90004

@@ -0,0 +1,117 @@ 

+ dn: dc=example,dc=net

+ objectclass: dcObject

+ objectclass: organization

+ o: Example Company

+ dc: example

+ 

+ dn: cn=Manager,dc=example,dc=net

+ objectclass: organizationalRole

+ cn: Manager

+ 

+ dn: ou=People,dc=example,dc=net

+ objectClass: organizationalUnit

+ ou: People

+ 

+ dn: ou=Groups,dc=example,dc=net

+ objectClass: organizationalUnit

+ ou: Groups

+ 

+ dn: cn=user0,ou=people,dc=example,dc=net

+ objectClass: Account

+ objectClass: posixAccount

+ cn: user0

+ uid: user0

+ uidnumber: 80000

+ gidnumber: 80000

+ homeDirectory: /home/user0

+ 

+ dn: cn=user1,ou=people,dc=example,dc=net

+ objectClass: Account

+ objectClass: posixAccount

+ cn: user1

+ uid: user1

+ uidnumber: 80001

+ gidnumber: 80001

+ homeDirectory: /home/user1

+ 

+ dn: cn=user2,ou=people,dc=example,dc=net

+ objectClass: Account

+ objectClass: posixAccount

+ cn: user2

+ uid: user2

+ uidnumber: 80002

+ gidnumber: 80002

+ homeDirectory: /home/user2

+ 

+ dn: cn=user3,ou=people,dc=example,dc=net

+ objectClass: Account

+ objectClass: posixAccount

+ cn: user3

+ uid: user3

+ uidnumber: 80003

+ gidnumber: 80003

+ homeDirectory: /home/user3

+ 

+ dn: cn=user4,ou=people,dc=example,dc=net

+ objectClass: Account

+ objectClass: posixAccount

+ cn: user4

+ uid: user4

+ uidnumber: 80004

+ gidnumber: 80004

+ homeDirectory: /home/user4

+ 

+ dn: cn=group0,ou=groups,dc=example,dc=net

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group0

+ member: cn=user0,ou=people,dc=example,dc=net

+ member: cn=user1,ou=people,dc=example,dc=net

+ member: cn=user2,ou=people,dc=example,dc=net

+ member: cn=user3,ou=people,dc=example,dc=net

+ member: cn=user4,ou=people,dc=example,dc=net

+ gidNumber: 90000

+ 

+ dn: cn=group1,ou=groups,dc=example,dc=net

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group1

+ member: cn=user0,ou=people,dc=example,dc=net

+ member: cn=user1,ou=people,dc=example,dc=net

+ member: cn=user2,ou=people,dc=example,dc=net

+ member: cn=user3,ou=people,dc=example,dc=net

+ member: cn=user4,ou=people,dc=example,dc=net

+ gidNumber: 90001

+ 

+ dn: cn=group2,ou=groups,dc=example,dc=net

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group2

+ member: cn=user0,ou=people,dc=example,dc=net

+ member: cn=user1,ou=people,dc=example,dc=net

+ member: cn=user2,ou=people,dc=example,dc=net

+ member: cn=user3,ou=people,dc=example,dc=net

+ member: cn=user4,ou=people,dc=example,dc=net

+ gidNumber: 90002

+ 

+ dn: cn=group3,ou=groups,dc=example,dc=net

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group3

+ member: cn=user0,ou=people,dc=example,dc=net

+ member: cn=user1,ou=people,dc=example,dc=net

+ member: cn=user2,ou=people,dc=example,dc=net

+ member: cn=user3,ou=people,dc=example,dc=net

+ member: cn=user4,ou=people,dc=example,dc=net

+ gidNumber: 90003

+ 

+ dn: cn=group4,ou=groups,dc=example,dc=net

+ objectClass: groupOfNames

+ objectClass: posixGroup

+ cn: group4

+ member: cn=user0,ou=people,dc=example,dc=net

+ member: cn=user1,ou=people,dc=example,dc=net

+ member: cn=user2,ou=people,dc=example,dc=net

+ member: cn=user3,ou=people,dc=example,dc=net

+ member: cn=user4,ou=people,dc=example,dc=net

+ gidNumber: 90004

@@ -0,0 +1,146 @@ 

+ #

+ # See slapd-config(5) for details on configuration options.

+ # This file should NOT be world readable.

+ #

+ dn: cn=config

+ objectClass: olcGlobal

+ cn: config

+ #

+ #

+ # Define global ACLs to disable default read access.

+ #

+ olcArgsFile: /var/run/slapd.args

+ olcPidFile: /var/run/slapd.pid

+ #

+ # Do not enable referrals until AFTER you have a working directory

+ # service AND an understanding of referrals.

+ #olcReferral:	ldap://root.openldap.org

+ #

+ # Sample security restrictions

+ #	Require integrity protection (prevent hijacking)

+ #	Require 112-bit (3DES or better) encryption for updates

+ #	Require 64-bit encryption for simple bind

+ #olcSecurity: ssf=1 update_ssf=112 simple_bind=64

+ 

+ 

+ #

+ # Load dynamic backend modules:

+ #

+ dn: cn=module,cn=config

+ objectClass: olcModuleList

+ cn: module

+ #olcModulepath:	%MODULEDIR%

+ olcModuleload:	back_mdb.la

+ olcModuleload:	memberof.la

+ olcModuleload:	refint.la

+ olcModuleload:  unique.la

+ #olcModuleload:	back_ldap.la

+ #olcModuleload:	back_passwd.la

+ #olcModuleload:	back_shell.la

+ 

+ 

+ dn: cn=schema,cn=config

+ objectClass: olcSchemaConfig

+ cn: schema

+ 

+ include: file:///etc/openldap/schema/core.ldif

+ include: file:///etc/openldap/schema/cosine.ldif

+ include: file:///etc/openldap/schema/inetorgperson.ldif

+ include: file:///etc/openldap/schema/rfc2307bis.ldif

+ include: file:///etc/openldap/schema/yast.ldif

+ 

+ 

+ # Frontend settings

+ #

+ dn: olcDatabase=frontend,cn=config

+ objectClass: olcDatabaseConfig

+ objectClass: olcFrontendConfig

+ olcDatabase: frontend

+ #

+ # Sample global access control policy:

+ #	Root DSE: allow anyone to read it

+ #	Subschema (sub)entry DSE: allow anyone to read it

+ #	Other DSEs:

+ #		Allow self write access

+ #		Allow authenticated users read access

+ #		Allow anonymous users to authenticate

+ #

+ olcAccess: to dn.base="" by * read

+ olcAccess: to dn.base="cn=Subschema" by * read

+ #olcAccess: to *

+ #	by self write

+ #	by users read

+ #	by anonymous auth

+ #

+ # if no access controls are present, the default policy

+ # allows anyone and everyone to read anything but restricts

+ # updates to rootdn.  (e.g., "access to * by * read")

+ #

+ # rootdn can always read and write EVERYTHING!

+ #

+ 

+ 

+ #######################################################################

+ # LMDB database definitions

+ #######################################################################

+ #

+ dn: olcDatabase={1}mdb,cn=config

+ objectClass: olcDatabaseConfig

+ objectClass: olcMdbConfig

+ olcDatabase: mdb

+ olcSuffix: dc=example,dc=com

+ olcRootDN: cn=Manager,dc=example,dc=com

+ # Cleartext passwords, especially for the rootdn, should

+ # be avoided.  See slappasswd(8) and slapd-config(5) for details.

+ # Use of strong authentication encouraged.

+ olcRootPW: secret

+ # The database directory MUST exist prior to running slapd AND 

+ # should only be accessible by the slapd and slap tools.

+ # Mode 700 recommended.

+ olcDbDirectory:	/var/lib/ldap/example_com

+ # Indices to maintain

+ olcDbIndex: objectClass eq

+ 

+ dn: olcOverlay=memberof,olcDatabase={1}mdb,cn=config

+ objectClass: olcOverlayConfig

+ objectClass: olcMemberOf

+ olcOverlay: memberof

+ olcMemberOfRefint: TRUE

+ 

+ dn: olcOverlay=refint,olcDatabase={1}mdb,cn=config

+ objectClass: olcOverlayConfig

+ objectClass: olcRefintConfig

+ olcOverlay: refint

+ olcRefintAttribute: member

+ olcRefintAttribute: memberOf

+ 

+ dn: olcOverlay=unique,olcDatabase={1}mdb,cn=config

+ objectClass: olcOverlayConfig

+ objectClass: olcUniqueConfig

+ olcOverlay: unique

+ olcUniqueURI: ldap:///?mail?sub

+ olcUniqueURI: ldap:///?uid?sub

+ 

+ dn: olcDatabase={2}mdb,cn=config

+ objectClass: olcDatabaseConfig

+ objectClass: olcMdbConfig

+ olcDatabase: mdb

+ olcSuffix: dc=example,dc=net

+ olcRootDN: cn=Manager,dc=example,dc=net

+ olcRootPW: secret

+ olcDbDirectory:	/var/lib/ldap/example_net

+ olcDbIndex: objectClass eq

+ 

+ dn: olcOverlay=memberof,olcDatabase={2}mdb,cn=config

+ objectClass: olcOverlayConfig

+ objectClass: olcMemberOf

+ olcOverlay: memberof

+ olcMemberOfRefint: TRUE

+ 

+ dn: olcOverlay=unique,olcDatabase={2}mdb,cn=config

+ objectClass: olcOverlayConfig

+ objectClass: olcUniqueConfig

+ olcOverlay: unique

+ olcUniqueURI: ldap:///?mail?sub

+ olcUniqueURI: ldap:///?uid?sub

+ 

@@ -0,0 +1,14 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 6905879f

+ dn: cn=config

+ objectClass: olcGlobal

+ cn: config

+ olcArgsFile: /var/run/slapd.args

+ olcPidFile: /var/run/slapd.pid

+ structuralObjectClass: olcGlobal

+ entryUUID: 4019c5a8-eaf5-1039-865e-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.082506Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,16 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 9b38b059

+ dn: cn=module{0}

+ objectClass: olcModuleList

+ cn: module{0}

+ olcModuleLoad: {0}back_mdb.la

+ olcModuleLoad: {1}memberof.la

+ olcModuleLoad: {2}refint.la

+ olcModuleLoad: {3}unique.la

+ structuralObjectClass: olcModuleList

+ entryUUID: 4019cc88-eaf5-1039-865f-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.082706Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,12 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 095fcaec

+ dn: cn=schema

+ objectClass: olcSchemaConfig

+ cn: schema

+ structuralObjectClass: olcSchemaConfig

+ entryUUID: 4019e6aa-eaf5-1039-8660-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.083375Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,249 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 31e6d4be

+ dn: cn={0}core

+ objectClass: olcSchemaConfig

+ cn: {0}core

+ olcAttributeTypes: {0}( 2.5.4.2 NAME 'knowledgeInformation' DESC 'RFC2256: k

+  nowledge information' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.

+  121.1.15{32768} )

+ olcAttributeTypes: {1}( 2.5.4.4 NAME ( 'sn' 'surname' ) DESC 'RFC2256: last 

+  (family) name(s) for which the entity is known by' SUP name )

+ olcAttributeTypes: {2}( 2.5.4.5 NAME 'serialNumber' DESC 'RFC2256: serial nu

+  mber of the entity' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMat

+  ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} )

+ olcAttributeTypes: {3}( 2.5.4.6 NAME ( 'c' 'countryName' ) DESC 'RFC4519: tw

+  o-letter ISO-3166 country code' SUP name SYNTAX 1.3.6.1.4.1.1466.115.121.1.

+  11 SINGLE-VALUE )

+ olcAttributeTypes: {4}( 2.5.4.7 NAME ( 'l' 'localityName' ) DESC 'RFC2256: l

+  ocality which this object resides in' SUP name )

+ olcAttributeTypes: {5}( 2.5.4.8 NAME ( 'st' 'stateOrProvinceName' ) DESC 'RF

+  C2256: state or province which this object resides in' SUP name )

+ olcAttributeTypes: {6}( 2.5.4.9 NAME ( 'street' 'streetAddress' ) DESC 'RFC2

+  256: street address of this object' EQUALITY caseIgnoreMatch SUBSTR caseIgn

+  oreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )

+ olcAttributeTypes: {7}( 2.5.4.10 NAME ( 'o' 'organizationName' ) DESC 'RFC22

+  56: organization this object belongs to' SUP name )

+ olcAttributeTypes: {8}( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) DESC

+   'RFC2256: organizational unit this object belongs to' SUP name )

+ olcAttributeTypes: {9}( 2.5.4.12 NAME 'title' DESC 'RFC2256: title associate

+  d with the entity' SUP name )

+ olcAttributeTypes: {10}( 2.5.4.14 NAME 'searchGuide' DESC 'RFC2256: search g

+  uide, deprecated by enhancedSearchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.

+  25 )

+ olcAttributeTypes: {11}( 2.5.4.15 NAME 'businessCategory' DESC 'RFC2256: bus

+  iness category' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch S

+  YNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )

+ olcAttributeTypes: {12}( 2.5.4.16 NAME 'postalAddress' DESC 'RFC2256: postal

+   address' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch

+   SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )

+ olcAttributeTypes: {13}( 2.5.4.17 NAME 'postalCode' DESC 'RFC2256: postal co

+  de' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.

+  1.4.1.1466.115.121.1.15{40} )

+ olcAttributeTypes: {14}( 2.5.4.18 NAME 'postOfficeBox' DESC 'RFC2256: Post O

+  ffice Box' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX

+   1.3.6.1.4.1.1466.115.121.1.15{40} )

+ olcAttributeTypes: {15}( 2.5.4.19 NAME 'physicalDeliveryOfficeName' DESC 'RF

+  C2256: Physical Delivery Office Name' EQUALITY caseIgnoreMatch SUBSTR caseI

+  gnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )

+ olcAttributeTypes: {16}( 2.5.4.20 NAME 'telephoneNumber' DESC 'RFC2256: Tele

+  phone Number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstring

+  sMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{32} )

+ olcAttributeTypes: {17}( 2.5.4.21 NAME 'telexNumber' DESC 'RFC2256: Telex Nu

+  mber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.52 )

+ olcAttributeTypes: {18}( 2.5.4.22 NAME 'teletexTerminalIdentifier' DESC 'RFC

+  2256: Teletex Terminal Identifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.51 )

+ olcAttributeTypes: {19}( 2.5.4.23 NAME ( 'facsimileTelephoneNumber' 'fax' ) 

+  DESC 'RFC2256: Facsimile (Fax) Telephone Number' SYNTAX 1.3.6.1.4.1.1466.11

+  5.121.1.22 )

+ olcAttributeTypes: {20}( 2.5.4.24 NAME 'x121Address' DESC 'RFC2256: X.121 Ad

+  dress' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNT

+  AX 1.3.6.1.4.1.1466.115.121.1.36{15} )

+ olcAttributeTypes: {21}( 2.5.4.25 NAME 'internationaliSDNNumber' DESC 'RFC22

+  56: international ISDN number' EQUALITY numericStringMatch SUBSTR numericSt

+  ringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{16} )

+ olcAttributeTypes: {22}( 2.5.4.26 NAME 'registeredAddress' DESC 'RFC2256: re

+  gistered postal address' SUP postalAddress SYNTAX 1.3.6.1.4.1.1466.115.121.

+  1.41 )

+ olcAttributeTypes: {23}( 2.5.4.27 NAME 'destinationIndicator' DESC 'RFC2256:

+   destination indicator' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstring

+  sMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{128} )

+ olcAttributeTypes: {24}( 2.5.4.28 NAME 'preferredDeliveryMethod' DESC 'RFC22

+  56: preferred delivery method' SYNTAX 1.3.6.1.4.1.1466.115.121.1.14 SINGLE-

+  VALUE )

+ olcAttributeTypes: {25}( 2.5.4.29 NAME 'presentationAddress' DESC 'RFC2256: 

+  presentation address' EQUALITY presentationAddressMatch SYNTAX 1.3.6.1.4.1.

+  1466.115.121.1.43 SINGLE-VALUE )

+ olcAttributeTypes: {26}( 2.5.4.30 NAME 'supportedApplicationContext' DESC 'R

+  FC2256: supported application context' EQUALITY objectIdentifierMatch SYNTA

+  X 1.3.6.1.4.1.1466.115.121.1.38 )

+ olcAttributeTypes: {27}( 2.5.4.31 NAME 'member' DESC 'RFC2256: member of a g

+  roup' SUP distinguishedName )

+ olcAttributeTypes: {28}( 2.5.4.32 NAME 'owner' DESC 'RFC2256: owner (of the 

+  object)' SUP distinguishedName )

+ olcAttributeTypes: {29}( 2.5.4.33 NAME 'roleOccupant' DESC 'RFC2256: occupan

+  t of role' SUP distinguishedName )

+ olcAttributeTypes: {30}( 2.5.4.36 NAME 'userCertificate' DESC 'RFC2256: X.50

+  9 user certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.

+  6.1.4.1.1466.115.121.1.8 )

+ olcAttributeTypes: {31}( 2.5.4.37 NAME 'cACertificate' DESC 'RFC2256: X.509 

+  CA certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.6.1.

+  4.1.1466.115.121.1.8 )

+ olcAttributeTypes: {32}( 2.5.4.38 NAME 'authorityRevocationList' DESC 'RFC22

+  56: X.509 authority revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.1466.1

+  15.121.1.9 )

+ olcAttributeTypes: {33}( 2.5.4.39 NAME 'certificateRevocationList' DESC 'RFC

+  2256: X.509 certificate revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.14

+  66.115.121.1.9 )

+ olcAttributeTypes: {34}( 2.5.4.40 NAME 'crossCertificatePair' DESC 'RFC2256:

+   X.509 cross certificate pair, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121

+  .1.10 )

+ olcAttributeTypes: {35}( 2.5.4.42 NAME ( 'givenName' 'gn' ) DESC 'RFC2256: f

+  irst name(s) for which the entity is known by' SUP name )

+ olcAttributeTypes: {36}( 2.5.4.43 NAME 'initials' DESC 'RFC2256: initials of

+   some or all of names, but not the surname(s).' SUP name )

+ olcAttributeTypes: {37}( 2.5.4.44 NAME 'generationQualifier' DESC 'RFC2256: 

+  name qualifier indicating a generation' SUP name )

+ olcAttributeTypes: {38}( 2.5.4.45 NAME 'x500UniqueIdentifier' DESC 'RFC2256:

+   X.500 unique identifier' EQUALITY bitStringMatch SYNTAX 1.3.6.1.4.1.1466.1

+  15.121.1.6 )

+ olcAttributeTypes: {39}( 2.5.4.46 NAME 'dnQualifier' DESC 'RFC2256: DN quali

+  fier' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR case

+  IgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 )

+ olcAttributeTypes: {40}( 2.5.4.47 NAME 'enhancedSearchGuide' DESC 'RFC2256: 

+  enhanced search guide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.21 )

+ olcAttributeTypes: {41}( 2.5.4.48 NAME 'protocolInformation' DESC 'RFC2256: 

+  protocol information' EQUALITY protocolInformationMatch SYNTAX 1.3.6.1.4.1.

+  1466.115.121.1.42 )

+ olcAttributeTypes: {42}( 2.5.4.50 NAME 'uniqueMember' DESC 'RFC2256: unique 

+  member of a group' EQUALITY uniqueMemberMatch SYNTAX 1.3.6.1.4.1.1466.115.1

+  21.1.34 )

+ olcAttributeTypes: {43}( 2.5.4.51 NAME 'houseIdentifier' DESC 'RFC2256: hous

+  e identifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYN

+  TAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )

+ olcAttributeTypes: {44}( 2.5.4.52 NAME 'supportedAlgorithms' DESC 'RFC2256: 

+  supported algorithms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.49 )

+ olcAttributeTypes: {45}( 2.5.4.53 NAME 'deltaRevocationList' DESC 'RFC2256: 

+  delta revocation list; use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 )

+ olcAttributeTypes: {46}( 2.5.4.54 NAME 'dmdName' DESC 'RFC2256: name of DMD'

+   SUP name )

+ olcAttributeTypes: {47}( 2.5.4.65 NAME 'pseudonym' DESC 'X.520(4th): pseudon

+  ym for the object' SUP name )

+ olcAttributeTypes: {48}( 0.9.2342.19200300.100.1.3 NAME ( 'mail' 'rfc822Mail

+  box' ) DESC 'RFC1274: RFC822 Mailbox'   EQUALITY caseIgnoreIA5Match   SUBST

+  R caseIgnoreIA5SubstringsMatch   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} 

+  )

+ olcAttributeTypes: {49}( 0.9.2342.19200300.100.1.25 NAME ( 'dc' 'domainCompo

+  nent' ) DESC 'RFC1274/2247: domain component' EQUALITY caseIgnoreIA5Match S

+  UBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SIN

+  GLE-VALUE )

+ olcAttributeTypes: {50}( 0.9.2342.19200300.100.1.37 NAME 'associatedDomain' 

+  DESC 'RFC1274: domain associated with object' EQUALITY caseIgnoreIA5Match S

+  UBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

+ olcAttributeTypes: {51}( 1.2.840.113549.1.9.1 NAME ( 'email' 'emailAddress' 

+  'pkcs9email' ) DESC 'RFC3280: legacy attribute for email addresses in DNs' 

+  EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.

+  6.1.4.1.1466.115.121.1.26{128} )

+ olcObjectClasses: {0}( 2.5.6.2 NAME 'country' DESC 'RFC2256: a country' SUP 

+  top STRUCTURAL MUST c MAY ( searchGuide $ description ) )

+ olcObjectClasses: {1}( 2.5.6.3 NAME 'locality' DESC 'RFC2256: a locality' SU

+  P top STRUCTURAL MAY ( street $ seeAlso $ searchGuide $ st $ l $ descriptio

+  n ) )

+ olcObjectClasses: {2}( 2.5.6.4 NAME 'organization' DESC 'RFC2256: an organiz

+  ation' SUP top STRUCTURAL MUST o MAY ( userPassword $ searchGuide $ seeAlso

+   $ businessCategory $ x121Address $ registeredAddress $ destinationIndicato

+  r $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ tel

+  ephoneNumber $ internationaliSDNNumber $  facsimileTelephoneNumber $ street

+   $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName 

+  $ st $ l $ description ) )

+ olcObjectClasses: {3}( 2.5.6.5 NAME 'organizationalUnit' DESC 'RFC2256: an o

+  rganizational unit' SUP top STRUCTURAL MUST ou MAY ( userPassword $ searchG

+  uide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ desti

+  nationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalId

+  entifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNu

+  mber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDelive

+  ryOfficeName $ st $ l $ description ) )

+ olcObjectClasses: {4}( 2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP to

+  p STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAls

+  o $ description ) )

+ olcObjectClasses: {5}( 2.5.6.7 NAME 'organizationalPerson' DESC 'RFC2256: an

+   organizational person' SUP person STRUCTURAL MAY ( title $ x121Address $ r

+  egisteredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNu

+  mber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumbe

+  r $  facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ posta

+  lAddress $ physicalDeliveryOfficeName $ ou $ st $ l ) )

+ olcObjectClasses: {6}( 2.5.6.8 NAME 'organizationalRole' DESC 'RFC2256: an o

+  rganizational role' SUP top STRUCTURAL MUST cn MAY ( x121Address $ register

+  edAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ 

+  teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ fac

+  simileTelephoneNumber $ seeAlso $ roleOccupant $ preferredDeliveryMethod $ 

+  street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOffic

+  eName $ ou $ st $ l $ description ) )

+ olcObjectClasses: {7}( 2.5.6.9 NAME 'groupOfNames' DESC 'RFC2256: a group of

+   names (DNs)' SUP top STRUCTURAL MUST ( member $ cn ) MAY ( businessCategor

+  y $ seeAlso $ owner $ ou $ o $ description ) )

+ olcObjectClasses: {8}( 2.5.6.10 NAME 'residentialPerson' DESC 'RFC2256: an r

+  esidential person' SUP person STRUCTURAL MUST l MAY ( businessCategory $ x1

+  21Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMet

+  hod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internati

+  onaliSDNNumber $ facsimileTelephoneNumber $ preferredDeliveryMethod $ stree

+  t $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName

+   $ st $ l ) )

+ olcObjectClasses: {9}( 2.5.6.11 NAME 'applicationProcess' DESC 'RFC2256: an 

+  application process' SUP top STRUCTURAL MUST cn MAY ( seeAlso $ ou $ l $ de

+  scription ) )

+ olcObjectClasses: {10}( 2.5.6.12 NAME 'applicationEntity' DESC 'RFC2256: an 

+  application entity' SUP top STRUCTURAL MUST ( presentationAddress $ cn ) MA

+  Y ( supportedApplicationContext $ seeAlso $ ou $ o $ l $ description ) )

+ olcObjectClasses: {11}( 2.5.6.13 NAME 'dSA' DESC 'RFC2256: a directory syste

+  m agent (a server)' SUP applicationEntity STRUCTURAL MAY knowledgeInformati

+  on )

+ olcObjectClasses: {12}( 2.5.6.14 NAME 'device' DESC 'RFC2256: a device' SUP 

+  top STRUCTURAL MUST cn MAY ( serialNumber $ seeAlso $ owner $ ou $ o $ l $ 

+  description ) )

+ olcObjectClasses: {13}( 2.5.6.15 NAME 'strongAuthenticationUser' DESC 'RFC22

+  56: a strong authentication user' SUP top AUXILIARY MUST userCertificate )

+ olcObjectClasses: {14}( 2.5.6.16 NAME 'certificationAuthority' DESC 'RFC2256

+  : a certificate authority' SUP top AUXILIARY MUST ( authorityRevocationList

+   $ certificateRevocationList $ cACertificate ) MAY crossCertificatePair )

+ olcObjectClasses: {15}( 2.5.6.17 NAME 'groupOfUniqueNames' DESC 'RFC2256: a 

+  group of unique names (DN and Unique Identifier)' SUP top STRUCTURAL MUST (

+   uniqueMember $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ de

+  scription ) )

+ olcObjectClasses: {16}( 2.5.6.18 NAME 'userSecurityInformation' DESC 'RFC225

+  6: a user security information' SUP top AUXILIARY MAY ( supportedAlgorithms

+   ) )

+ olcObjectClasses: {17}( 2.5.6.16.2 NAME 'certificationAuthority-V2' SUP cert

+  ificationAuthority AUXILIARY MAY ( deltaRevocationList ) )

+ olcObjectClasses: {18}( 2.5.6.19 NAME 'cRLDistributionPoint' SUP top STRUCTU

+  RAL MUST ( cn ) MAY ( certificateRevocationList $ authorityRevocationList $

+   deltaRevocationList ) )

+ olcObjectClasses: {19}( 2.5.6.20 NAME 'dmd' SUP top STRUCTURAL MUST ( dmdNam

+  e ) MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Add

+  ress $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $

+   telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationali

+  SDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode 

+  $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )

+ olcObjectClasses: {20}( 2.5.6.21 NAME 'pkiUser' DESC 'RFC2587: a PKI user' S

+  UP top AUXILIARY MAY userCertificate )

+ olcObjectClasses: {21}( 2.5.6.22 NAME 'pkiCA' DESC 'RFC2587: PKI certificate

+   authority' SUP top AUXILIARY MAY ( authorityRevocationList $ certificateRe

+  vocationList $ cACertificate $ crossCertificatePair ) )

+ olcObjectClasses: {22}( 2.5.6.23 NAME 'deltaCRL' DESC 'RFC2587: PKI user' SU

+  P top AUXILIARY MAY deltaRevocationList )

+ olcObjectClasses: {23}( 1.3.6.1.4.1.250.3.15 NAME 'labeledURIObject' DESC 'R

+  FC2079: object that contains the URI attribute type' MAY ( labeledURI ) SUP

+   top AUXILIARY )

+ olcObjectClasses: {24}( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObjec

+  t' DESC 'RFC1274: simple security object' SUP top AUXILIARY MUST userPasswo

+  rd )

+ olcObjectClasses: {25}( 1.3.6.1.4.1.1466.344 NAME 'dcObject' DESC 'RFC2247: 

+  domain component object' SUP top AUXILIARY MUST dc )

+ olcObjectClasses: {26}( 1.3.6.1.1.3.1 NAME 'uidObject' DESC 'RFC2377: uid ob

+  ject' SUP top AUXILIARY MUST uid )

+ structuralObjectClass: olcSchemaConfig

+ entryUUID: 4019f348-eaf5-1039-8661-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.083690Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,178 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 4e3862ab

+ dn: cn={1}cosine

+ objectClass: olcSchemaConfig

+ cn: {1}cosine

+ olcAttributeTypes: {0}( 0.9.2342.19200300.100.1.2 NAME 'textEncodedORAddress

+  ' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.

+  4.1.1466.115.121.1.15{256} )

+ olcAttributeTypes: {1}( 0.9.2342.19200300.100.1.4 NAME 'info' DESC 'RFC1274:

+   general information' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsM

+  atch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{2048} )

+ olcAttributeTypes: {2}( 0.9.2342.19200300.100.1.5 NAME ( 'drink' 'favouriteD

+  rink' ) DESC 'RFC1274: favorite drink' EQUALITY caseIgnoreMatch SUBSTR case

+  IgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )

+ olcAttributeTypes: {3}( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' DESC 'RF

+  C1274: room number' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMat

+  ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )

+ olcAttributeTypes: {4}( 0.9.2342.19200300.100.1.7 NAME 'photo' DESC 'RFC1274

+  : photo (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23{25000} )

+ olcAttributeTypes: {5}( 0.9.2342.19200300.100.1.8 NAME 'userClass' DESC 'RFC

+  1274: category of user' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstring

+  sMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )

+ olcAttributeTypes: {6}( 0.9.2342.19200300.100.1.9 NAME 'host' DESC 'RFC1274:

+   host computer' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch S

+  YNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )

+ olcAttributeTypes: {7}( 0.9.2342.19200300.100.1.10 NAME 'manager' DESC 'RFC1

+  274: DN of manager' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466

+  .115.121.1.12 )

+ olcAttributeTypes: {8}( 0.9.2342.19200300.100.1.11 NAME 'documentIdentifier'

+   DESC 'RFC1274: unique identifier of document' EQUALITY caseIgnoreMatch SUB

+  STR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )

+ olcAttributeTypes: {9}( 0.9.2342.19200300.100.1.12 NAME 'documentTitle' DESC

+   'RFC1274: title of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSub

+  stringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )

+ olcAttributeTypes: {10}( 0.9.2342.19200300.100.1.13 NAME 'documentVersion' D

+  ESC 'RFC1274: version of document' EQUALITY caseIgnoreMatch SUBSTR caseIgno

+  reSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )

+ olcAttributeTypes: {11}( 0.9.2342.19200300.100.1.14 NAME 'documentAuthor' DE

+  SC 'RFC1274: DN of author of document' EQUALITY distinguishedNameMatch SYNT

+  AX 1.3.6.1.4.1.1466.115.121.1.12 )

+ olcAttributeTypes: {12}( 0.9.2342.19200300.100.1.15 NAME 'documentLocation' 

+  DESC 'RFC1274: location of document original' EQUALITY caseIgnoreMatch SUBS

+  TR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )

+ olcAttributeTypes: {13}( 0.9.2342.19200300.100.1.20 NAME ( 'homePhone' 'home

+  TelephoneNumber' ) DESC 'RFC1274: home telephone number' EQUALITY telephone

+  NumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.1

+  15.121.1.50 )

+ olcAttributeTypes: {14}( 0.9.2342.19200300.100.1.21 NAME 'secretary' DESC 'R

+  FC1274: DN of secretary' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1

+  .1466.115.121.1.12 )

+ olcAttributeTypes: {15}( 0.9.2342.19200300.100.1.22 NAME 'otherMailbox' SYNT

+  AX 1.3.6.1.4.1.1466.115.121.1.39 )

+ olcAttributeTypes: {16}( 0.9.2342.19200300.100.1.26 NAME 'aRecord' EQUALITY 

+  caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

+ olcAttributeTypes: {17}( 0.9.2342.19200300.100.1.27 NAME 'mDRecord' EQUALITY

+   caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

+ olcAttributeTypes: {18}( 0.9.2342.19200300.100.1.28 NAME 'mXRecord' EQUALITY

+   caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

+ olcAttributeTypes: {19}( 0.9.2342.19200300.100.1.29 NAME 'nSRecord' EQUALITY

+   caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

+ olcAttributeTypes: {20}( 0.9.2342.19200300.100.1.30 NAME 'sOARecord' EQUALIT

+  Y caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

+ olcAttributeTypes: {21}( 0.9.2342.19200300.100.1.31 NAME 'cNAMERecord' EQUAL

+  ITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

+ olcAttributeTypes: {22}( 0.9.2342.19200300.100.1.38 NAME 'associatedName' DE

+  SC 'RFC1274: DN of entry associated with domain' EQUALITY distinguishedName

+  Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )

+ olcAttributeTypes: {23}( 0.9.2342.19200300.100.1.39 NAME 'homePostalAddress'

+   DESC 'RFC1274: home postal address' EQUALITY caseIgnoreListMatch SUBSTR ca

+  seIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )

+ olcAttributeTypes: {24}( 0.9.2342.19200300.100.1.40 NAME 'personalTitle' DES

+  C 'RFC1274: personal title' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubst

+  ringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )

+ olcAttributeTypes: {25}( 0.9.2342.19200300.100.1.41 NAME ( 'mobile' 'mobileT

+  elephoneNumber' ) DESC 'RFC1274: mobile telephone number' EQUALITY telephon

+  eNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.

+  115.121.1.50 )

+ olcAttributeTypes: {26}( 0.9.2342.19200300.100.1.42 NAME ( 'pager' 'pagerTel

+  ephoneNumber' ) DESC 'RFC1274: pager telephone number' EQUALITY telephoneNu

+  mberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115

+  .121.1.50 )

+ olcAttributeTypes: {27}( 0.9.2342.19200300.100.1.43 NAME ( 'co' 'friendlyCou

+  ntryName' ) DESC 'RFC1274: friendly country name' EQUALITY caseIgnoreMatch 

+  SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

+ olcAttributeTypes: {28}( 0.9.2342.19200300.100.1.44 NAME 'uniqueIdentifier' 

+  DESC 'RFC1274: unique identifer' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.

+  1.1466.115.121.1.15{256} )

+ olcAttributeTypes: {29}( 0.9.2342.19200300.100.1.45 NAME 'organizationalStat

+  us' DESC 'RFC1274: organizational status' EQUALITY caseIgnoreMatch SUBSTR c

+  aseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )

+ olcAttributeTypes: {30}( 0.9.2342.19200300.100.1.46 NAME 'janetMailbox' DESC

+   'RFC1274: Janet mailbox' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5S

+  ubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

+ olcAttributeTypes: {31}( 0.9.2342.19200300.100.1.47 NAME 'mailPreferenceOpti

+  on' DESC 'RFC1274: mail preference option' SYNTAX 1.3.6.1.4.1.1466.115.121.

+  1.27 )

+ olcAttributeTypes: {32}( 0.9.2342.19200300.100.1.48 NAME 'buildingName' DESC

+   'RFC1274: name of building' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubs

+  tringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )

+ olcAttributeTypes: {33}( 0.9.2342.19200300.100.1.49 NAME 'dSAQuality' DESC '

+  RFC1274: DSA Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.19 SINGLE-VALUE )

+ olcAttributeTypes: {34}( 0.9.2342.19200300.100.1.50 NAME 'singleLevelQuality

+  ' DESC 'RFC1274: Single Level Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13

+   SINGLE-VALUE )

+ olcAttributeTypes: {35}( 0.9.2342.19200300.100.1.51 NAME 'subtreeMinimumQual

+  ity' DESC 'RFC1274: Subtree Mininum Quality' SYNTAX 1.3.6.1.4.1.1466.115.12

+  1.1.13 SINGLE-VALUE )

+ olcAttributeTypes: {36}( 0.9.2342.19200300.100.1.52 NAME 'subtreeMaximumQual

+  ity' DESC 'RFC1274: Subtree Maximun Quality' SYNTAX 1.3.6.1.4.1.1466.115.12

+  1.1.13 SINGLE-VALUE )

+ olcAttributeTypes: {37}( 0.9.2342.19200300.100.1.53 NAME 'personalSignature'

+   DESC 'RFC1274: Personal Signature (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.12

+  1.1.23 )

+ olcAttributeTypes: {38}( 0.9.2342.19200300.100.1.54 NAME 'dITRedirect' DESC 

+  'RFC1274: DIT Redirect' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.

+  1466.115.121.1.12 )

+ olcAttributeTypes: {39}( 0.9.2342.19200300.100.1.55 NAME 'audio' DESC 'RFC12

+  74: audio (u-law)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.4{25000} )

+ olcAttributeTypes: {40}( 0.9.2342.19200300.100.1.56 NAME 'documentPublisher'

+   DESC 'RFC1274: publisher of document' EQUALITY caseIgnoreMatch SUBSTR case

+  IgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

+ olcObjectClasses: {0}( 0.9.2342.19200300.100.4.4 NAME ( 'pilotPerson' 'newPi

+  lotPerson' ) SUP person STRUCTURAL MAY ( userid $ textEncodedORAddress $ rf

+  c822Mailbox $ favouriteDrink $ roomNumber $ userClass $ homeTelephoneNumber

+   $ homePostalAddress $ secretary $ personalTitle $ preferredDeliveryMethod 

+  $ businessCategory $ janetMailbox $ otherMailbox $ mobileTelephoneNumber $ 

+  pagerTelephoneNumber $ organizationalStatus $ mailPreferenceOption $ person

+  alSignature ) )

+ olcObjectClasses: {1}( 0.9.2342.19200300.100.4.5 NAME 'account' SUP top STRU

+  CTURAL MUST userid MAY ( description $ seeAlso $ localityName $ organizatio

+  nName $ organizationalUnitName $ host ) )

+ olcObjectClasses: {2}( 0.9.2342.19200300.100.4.6 NAME 'document' SUP top STR

+  UCTURAL MUST documentIdentifier MAY ( commonName $ description $ seeAlso $ 

+  localityName $ organizationName $ organizationalUnitName $ documentTitle $ 

+  documentVersion $ documentAuthor $ documentLocation $ documentPublisher ) )

+ olcObjectClasses: {3}( 0.9.2342.19200300.100.4.7 NAME 'room' SUP top STRUCTU

+  RAL MUST commonName MAY ( roomNumber $ description $ seeAlso $ telephoneNum

+  ber ) )

+ olcObjectClasses: {4}( 0.9.2342.19200300.100.4.9 NAME 'documentSeries' SUP t

+  op STRUCTURAL MUST commonName MAY ( description $ seeAlso $ telephonenumber

+   $ localityName $ organizationName $ organizationalUnitName ) )

+ olcObjectClasses: {5}( 0.9.2342.19200300.100.4.13 NAME 'domain' SUP top STRU

+  CTURAL MUST domainComponent MAY ( associatedName $ organizationName $ descr

+  iption $ businessCategory $ seeAlso $ searchGuide $ userPassword $ locality

+  Name $ stateOrProvinceName $ streetAddress $ physicalDeliveryOfficeName $ p

+  ostalAddress $ postalCode $ postOfficeBox $ streetAddress $ facsimileTeleph

+  oneNumber $ internationalISDNNumber $ telephoneNumber $ teletexTerminalIden

+  tifier $ telexNumber $ preferredDeliveryMethod $ destinationIndicator $ reg

+  isteredAddress $ x121Address ) )

+ olcObjectClasses: {6}( 0.9.2342.19200300.100.4.14 NAME 'RFC822localPart' SUP

+   domain STRUCTURAL MAY ( commonName $ surname $ description $ seeAlso $ tel

+  ephoneNumber $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ po

+  stOfficeBox $ streetAddress $ facsimileTelephoneNumber $ internationalISDNN

+  umber $ telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ preferr

+  edDeliveryMethod $ destinationIndicator $ registeredAddress $ x121Address )

+   )

+ olcObjectClasses: {7}( 0.9.2342.19200300.100.4.15 NAME 'dNSDomain' SUP domai

+  n STRUCTURAL MAY ( ARecord $ MDRecord $ MXRecord $ NSRecord $ SOARecord $ C

+  NAMERecord ) )

+ olcObjectClasses: {8}( 0.9.2342.19200300.100.4.17 NAME 'domainRelatedObject'

+   DESC 'RFC1274: an object related to an domain' SUP top AUXILIARY MUST asso

+  ciatedDomain )

+ olcObjectClasses: {9}( 0.9.2342.19200300.100.4.18 NAME 'friendlyCountry' SUP

+   country STRUCTURAL MUST friendlyCountryName )

+ olcObjectClasses: {10}( 0.9.2342.19200300.100.4.20 NAME 'pilotOrganization' 

+  SUP ( organization $ organizationalUnit ) STRUCTURAL MAY buildingName )

+ olcObjectClasses: {11}( 0.9.2342.19200300.100.4.21 NAME 'pilotDSA' SUP dsa S

+  TRUCTURAL MAY dSAQuality )

+ olcObjectClasses: {12}( 0.9.2342.19200300.100.4.22 NAME 'qualityLabelledData

+  ' SUP top AUXILIARY MUST dsaQuality MAY ( subtreeMinimumQuality $ subtreeMa

+  ximumQuality ) )

+ structuralObjectClass: olcSchemaConfig

+ entryUUID: 401a0f9a-eaf5-1039-8662-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.084423Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,49 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 2dfdddb6

+ dn: cn={2}inetorgperson

+ objectClass: olcSchemaConfig

+ cn: {2}inetorgperson

+ olcAttributeTypes: {0}( 2.16.840.1.113730.3.1.1 NAME 'carLicense' DESC 'RFC2

+  798: vehicle license or registration plate' EQUALITY caseIgnoreMatch SUBSTR

+   caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

+ olcAttributeTypes: {1}( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' DESC

+   'RFC2798: identifies a department within an organization' EQUALITY caseIgn

+  oreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1

+  .15 )

+ olcAttributeTypes: {2}( 2.16.840.1.113730.3.1.241 NAME 'displayName' DESC 'R

+  FC2798: preferred name to be used when displaying entries' EQUALITY caseIgn

+  oreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1

+  .15 SINGLE-VALUE )

+ olcAttributeTypes: {3}( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' DESC '

+  RFC2798: numerically identifies an employee within an organization' EQUALIT

+  Y caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.

+  115.121.1.15 SINGLE-VALUE )

+ olcAttributeTypes: {4}( 2.16.840.1.113730.3.1.4 NAME 'employeeType' DESC 'RF

+  C2798: type of employment for a person' EQUALITY caseIgnoreMatch SUBSTR cas

+  eIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

+ olcAttributeTypes: {5}( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' DESC 'RF

+  C2798: a JPEG image' SYNTAX 1.3.6.1.4.1.1466.115.121.1.28 )

+ olcAttributeTypes: {6}( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' DE

+  SC 'RFC2798: preferred written or spoken language for a person' EQUALITY ca

+  seIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.

+  121.1.15 SINGLE-VALUE )

+ olcAttributeTypes: {7}( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate'

+   DESC 'RFC2798: PKCS#7 SignedData used to support S/MIME' SYNTAX 1.3.6.1.4.

+  1.1466.115.121.1.5 )

+ olcAttributeTypes: {8}( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' DESC 'RF

+  C2798: personal identity information, a PKCS #12 PFX' SYNTAX 1.3.6.1.4.1.14

+  66.115.121.1.5 )

+ olcObjectClasses: {0}( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RF

+  C2798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL 

+  MAY ( audio $ businessCategory $ carLicense $ departmentNumber $ displayNam

+  e $ employeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddre

+  ss $ initials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ page

+  r $ photo $ roomNumber $ secretary $ uid $ userCertificate $ x500uniqueIden

+  tifier $ preferredLanguage $ userSMIMECertificate $ userPKCS12 ) )

+ structuralObjectClass: olcSchemaConfig

+ entryUUID: 401a225a-eaf5-1039-8663-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.084903Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,155 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 dd0a742e

+ dn: cn={3}rfc2307bis

+ objectClass: olcSchemaConfig

+ cn: {3}rfc2307bis

+ olcAttributeTypes: {0}( 1.3.6.1.1.1.1.2 NAME 'gecos' DESC 'The GECOS field; 

+  the common name' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5Substrings

+  Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

+ olcAttributeTypes: {1}( 1.3.6.1.1.1.1.3 NAME 'homeDirectory' DESC 'The absol

+  ute path to the home directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4

+  .1.1466.115.121.1.26 SINGLE-VALUE )

+ olcAttributeTypes: {2}( 1.3.6.1.1.1.1.4 NAME 'loginShell' DESC 'The path to 

+  the login shell' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121

+  .1.26 SINGLE-VALUE )

+ olcAttributeTypes: {3}( 1.3.6.1.1.1.1.5 NAME 'shadowLastChange' EQUALITY int

+  egerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

+ olcAttributeTypes: {4}( 1.3.6.1.1.1.1.6 NAME 'shadowMin' EQUALITY integerMat

+  ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

+ olcAttributeTypes: {5}( 1.3.6.1.1.1.1.7 NAME 'shadowMax' EQUALITY integerMat

+  ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

+ olcAttributeTypes: {6}( 1.3.6.1.1.1.1.8 NAME 'shadowWarning' EQUALITY intege

+  rMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

+ olcAttributeTypes: {7}( 1.3.6.1.1.1.1.9 NAME 'shadowInactive' EQUALITY integ

+  erMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

+ olcAttributeTypes: {8}( 1.3.6.1.1.1.1.10 NAME 'shadowExpire' EQUALITY intege

+  rMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

+ olcAttributeTypes: {9}( 1.3.6.1.1.1.1.11 NAME 'shadowFlag' EQUALITY integerM

+  atch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

+ olcAttributeTypes: {10}( 1.3.6.1.1.1.1.12 NAME 'memberUid' EQUALITY caseExac

+  tIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

+ olcAttributeTypes: {11}( 1.3.6.1.1.1.1.13 NAME 'memberNisNetgroup' EQUALITY 

+  caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.146

+  6.115.121.1.26 )

+ olcAttributeTypes: {12}( 1.3.6.1.1.1.1.14 NAME 'nisNetgroupTriple' DESC 'Net

+  group triple' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1

+  .26 )

+ olcAttributeTypes: {13}( 1.3.6.1.1.1.1.15 NAME 'ipServicePort' DESC 'Service

+   port number' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SI

+  NGLE-VALUE )

+ olcAttributeTypes: {14}( 1.3.6.1.1.1.1.16 NAME 'ipServiceProtocol' DESC 'Ser

+  vice protocol name' SUP name )

+ olcAttributeTypes: {15}( 1.3.6.1.1.1.1.17 NAME 'ipProtocolNumber' DESC 'IP p

+  rotocol number' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 

+  SINGLE-VALUE )

+ olcAttributeTypes: {16}( 1.3.6.1.1.1.1.18 NAME 'oncRpcNumber' DESC 'ONC RPC 

+  number' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-V

+  ALUE )

+ olcAttributeTypes: {17}( 1.3.6.1.1.1.1.19 NAME 'ipHostNumber' DESC 'IPv4 add

+  resses as a dotted decimal omitting leading        zeros or IPv6 addresses 

+  as defined in RFC2373' SUP name )

+ olcAttributeTypes: {18}( 1.3.6.1.1.1.1.20 NAME 'ipNetworkNumber' DESC 'IP ne

+  twork as a dotted decimal, eg. 192.168,        omitting leading zeros' SUP 

+  name SINGLE-VALUE )

+ olcAttributeTypes: {19}( 1.3.6.1.1.1.1.21 NAME 'ipNetmaskNumber' DESC 'IP ne

+  tmask as a dotted decimal, eg. 255.255.255.0,        omitting leading zeros

+  ' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-V

+  ALUE )

+ olcAttributeTypes: {20}( 1.3.6.1.1.1.1.22 NAME 'macAddress' DESC 'MAC addres

+  s in maximal, colon separated hex        notation, eg. 00:00:92:90:ee:e2' E

+  QUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

+ olcAttributeTypes: {21}( 1.3.6.1.1.1.1.23 NAME 'bootParameter' DESC 'rpc.boo

+  tparamd parameter' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.1

+  21.1.26 )

+ olcAttributeTypes: {22}( 1.3.6.1.1.1.1.24 NAME 'bootFile' DESC 'Boot image n

+  ame' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

+ olcAttributeTypes: {23}( 1.3.6.1.1.1.1.26 NAME 'nisMapName' DESC 'Name of a 

+  A generic NIS map' SUP name )

+ olcAttributeTypes: {24}( 1.3.6.1.1.1.1.27 NAME 'nisMapEntry' DESC 'A generic

+   NIS entry' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch S

+  YNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

+ olcAttributeTypes: {25}( 1.3.6.1.1.1.1.28 NAME 'nisPublicKey' DESC 'NIS publ

+  ic key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SING

+  LE-VALUE )

+ olcAttributeTypes: {26}( 1.3.6.1.1.1.1.29 NAME 'nisSecretKey' DESC 'NIS secr

+  et key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SING

+  LE-VALUE )

+ olcAttributeTypes: {27}( 1.3.6.1.1.1.1.30 NAME 'nisDomain' DESC 'NIS domain'

+   EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

+ olcAttributeTypes: {28}( 1.3.6.1.1.1.1.31 NAME 'automountMapName' DESC 'auto

+  mount Map Name' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMat

+  ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

+ olcAttributeTypes: {29}( 1.3.6.1.1.1.1.32 NAME 'automountKey' DESC 'Automoun

+  t Key value' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch 

+  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

+ olcAttributeTypes: {30}( 1.3.6.1.1.1.1.33 NAME 'automountInformation' DESC '

+  Automount information' EQUALITY caseExactIA5Match SUBSTR caseExactIA5Substr

+  ingsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

+ olcObjectClasses: {0}( 1.3.6.1.1.1.2.0 NAME 'posixAccount' DESC 'Abstraction

+   of an account with POSIX attributes' SUP top AUXILIARY MUST ( cn $ uid $ u

+  idNumber $ gidNumber $ homeDirectory ) MAY ( userPassword $ loginShell $ ge

+  cos $ description ) )

+ olcObjectClasses: {1}( 1.3.6.1.1.1.2.1 NAME 'shadowAccount' DESC 'Additional

+   attributes for shadow passwords' SUP top AUXILIARY MUST uid MAY ( userPass

+  word $ description $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarni

+  ng $ shadowInactive $ shadowExpire $ shadowFlag ) )

+ olcObjectClasses: {2}( 1.3.6.1.1.1.2.2 NAME 'posixGroup' DESC 'Abstraction o

+  f a group of accounts' SUP top AUXILIARY MUST gidNumber MAY ( userPassword 

+  $ memberUid $ description ) )

+ olcObjectClasses: {3}( 1.3.6.1.1.1.2.3 NAME 'ipService' DESC 'Abstraction an

+   Internet Protocol service.        Maps an IP port and protocol (such as tc

+  p or udp)        to one or more names; the distinguished value of        th

+  e cn attribute denotes the services canonical        name' SUP top STRUCTUR

+  AL MUST ( cn $ ipServicePort $ ipServiceProtocol ) MAY description )

+ olcObjectClasses: {4}( 1.3.6.1.1.1.2.4 NAME 'ipProtocol' DESC 'Abstraction o

+  f an IP protocol. Maps a protocol number        to one or more names. The d

+  istinguished value of the cn        attribute denotes the protocols canonic

+  al name' SUP top STRUCTURAL MUST ( cn $ ipProtocolNumber ) MAY description 

+  )

+ olcObjectClasses: {5}( 1.3.6.1.1.1.2.5 NAME 'oncRpc' DESC 'Abstraction of an

+   Open Network Computing (ONC)       [RFC1057] Remote Procedure Call (RPC) b

+  inding.       This class maps an ONC RPC number to a name.       The distin

+  guished value of the cn attribute denotes       the RPC services canonical 

+  name' SUP top STRUCTURAL MUST ( cn $ oncRpcNumber ) MAY description )

+ olcObjectClasses: {6}( 1.3.6.1.1.1.2.6 NAME 'ipHost' DESC 'Abstraction of a 

+  host, an IP device. The distinguished        value of the cn attribute deno

+  tes the hosts canonical        name. Device SHOULD be used as a structural 

+  class' SUP top AUXILIARY MUST ( cn $ ipHostNumber ) MAY ( userPassword $ l 

+  $ description $ manager ) )

+ olcObjectClasses: {7}( 1.3.6.1.1.1.2.7 NAME 'ipNetwork' DESC 'Abstraction of

+   a network. The distinguished value of        the cn attribute denotes the 

+  networks canonical name' SUP top STRUCTURAL MUST ipNetworkNumber MAY ( cn $

+   ipNetmaskNumber $ l $ description $ manager ) )

+ olcObjectClasses: {8}( 1.3.6.1.1.1.2.8 NAME 'nisNetgroup' DESC 'Abstraction 

+  of a netgroup. May refer to other netgroups' SUP top STRUCTURAL MUST cn MAY

+   ( nisNetgroupTriple $ memberNisNetgroup $ description ) )

+ olcObjectClasses: {9}( 1.3.6.1.1.1.2.9 NAME 'nisMap' DESC 'A generic abstrac

+  tion of a NIS map' SUP top STRUCTURAL MUST nisMapName MAY description )

+ olcObjectClasses: {10}( 1.3.6.1.1.1.2.10 NAME 'nisObject' DESC 'An entry in 

+  a NIS map' SUP top STRUCTURAL MUST ( cn $ nisMapEntry $ nisMapName ) MAY de

+  scription )

+ olcObjectClasses: {11}( 1.3.6.1.1.1.2.11 NAME 'ieee802Device' DESC 'A device

+   with a MAC address; device SHOULD be        used as a structural class' SU

+  P top AUXILIARY MAY macAddress )

+ olcObjectClasses: {12}( 1.3.6.1.1.1.2.12 NAME 'bootableDevice' DESC 'A devic

+  e with boot parameters; device SHOULD be        used as a structural class'

+   SUP top AUXILIARY MAY ( bootFile $ bootParameter ) )

+ olcObjectClasses: {13}( 1.3.6.1.1.1.2.14 NAME 'nisKeyObject' DESC 'An object

+   with a public and secret key' SUP top AUXILIARY MUST ( cn $ nisPublicKey $

+   nisSecretKey ) MAY ( uidNumber $ description ) )

+ olcObjectClasses: {14}( 1.3.6.1.1.1.2.15 NAME 'nisDomainObject' DESC 'Associ

+  ates a NIS domain with a naming context' SUP top AUXILIARY MUST nisDomain )

+ olcObjectClasses: {15}( 1.3.6.1.1.1.2.16 NAME 'automountMap' SUP top STRUCTU

+  RAL MUST automountMapName MAY description )

+ olcObjectClasses: {16}( 1.3.6.1.1.1.2.17 NAME 'automount' DESC 'Automount in

+  formation' SUP top STRUCTURAL MUST ( automountKey $ automountInformation ) 

+  MAY description )

+ olcObjectClasses: {17}( 1.3.6.1.4.1.5322.13.1.1 NAME 'namedObject' SUP top S

+  TRUCTURAL MAY cn )

+ structuralObjectClass: olcSchemaConfig

+ entryUUID: 401a2e6c-eaf5-1039-8664-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.085186Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,108 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 442e4b40

+ dn: cn={4}yast

+ objectClass: olcSchemaConfig

+ cn: {4}yast

+ olcObjectIdentifier: {0}SUSE 1.3.6.1.4.1.7057

+ olcObjectIdentifier: {1}SUSE.YaST SUSE:10.1

+ olcObjectIdentifier: {2}SUSE.YaST.ModuleConfig SUSE:10.1.2

+ olcObjectIdentifier: {3}SUSE.YaST.ModuleConfig.OC SUSE.YaST.ModuleConfig:1

+ olcObjectIdentifier: {4}SUSE.YaST.ModuleConfig.Attr SUSE.YaST.ModuleConfig:2

+ olcAttributeTypes: {0}( SUSE.YaST.ModuleConfig.Attr:2 NAME 'suseDefaultBase'

+   DESC 'Base DN where new Objects should be created by default' EQUALITY dis

+  tinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )

+ olcAttributeTypes: {1}( SUSE.YaST.ModuleConfig.Attr:3 NAME 'suseNextUniqueId

+  ' DESC 'Next unused unique ID, can be used to generate directory wide uniqe

+   IDs' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.

+  1.1466.115.121.1.27 SINGLE-VALUE )

+ olcAttributeTypes: {2}( SUSE.YaST.ModuleConfig.Attr:4 NAME 'suseMinUniqueId'

+   DESC 'lower Border for Unique IDs' EQUALITY integerMatch ORDERING integerO

+  rderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

+ olcAttributeTypes: {3}( SUSE.YaST.ModuleConfig.Attr:5 NAME 'suseMaxUniqueId'

+   DESC 'upper Border for Unique IDs' EQUALITY integerMatch ORDERING integerO

+  rderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

+ olcAttributeTypes: {4}( SUSE.YaST.ModuleConfig.Attr:6 NAME 'suseDefaultTempl

+  ate' DESC 'The DN of a template that should be used by default' EQUALITY di

+  stinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )

+ olcAttributeTypes: {5}( SUSE.YaST.ModuleConfig.Attr:7 NAME 'suseSearchFilter

+  ' DESC 'Search filter to localize Objects' SYNTAX 1.3.6.1.4.1.1466.115.121.

+  1.15 SINGLE-VALUE )

+ olcAttributeTypes: {6}( SUSE.YaST.ModuleConfig.Attr:11 NAME 'suseDefaultValu

+  e' DESC 'an Attribute-Value-Assertions to define defaults for specific Attr

+  ibutes' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

+ olcAttributeTypes: {7}( SUSE.YaST.ModuleConfig.Attr:12 NAME 'suseNamingAttri

+  bute' DESC 'AttributeType that should be used as the RDN' EQUALITY caseIgno

+  reIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

+ olcAttributeTypes: {8}( SUSE.YaST.ModuleConfig.Attr:15 NAME 'suseSecondaryGr

+  oup' DESC 'seconday group DN' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.

+  1.4.1.1466.115.121.1.12 )

+ olcAttributeTypes: {9}( SUSE.YaST.ModuleConfig.Attr:16 NAME 'suseMinPassword

+  Length' DESC 'minimum Password length for new users' EQUALITY integerMatch 

+  ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-V

+  ALUE )

+ olcAttributeTypes: {10}( SUSE.YaST.ModuleConfig.Attr:17 NAME 'suseMaxPasswor

+  dLength' DESC 'maximum Password length for new users' EQUALITY integerMatch

+   ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-

+  VALUE )

+ olcAttributeTypes: {11}( SUSE.YaST.ModuleConfig.Attr:18 NAME 'susePasswordHa

+  sh' DESC 'Hash method to use for new users' EQUALITY caseIgnoreIA5Match SYN

+  TAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

+ olcAttributeTypes: {12}( SUSE.YaST.ModuleConfig.Attr:19 NAME 'suseSkelDir' D

+  ESC '' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

+ olcAttributeTypes: {13}( SUSE.YaST.ModuleConfig.Attr:20 NAME 'susePlugin' DE

+  SC 'plugin to use upon user/ group creation' EQUALITY caseIgnoreMatch SYNTA

+  X 1.3.6.1.4.1.1466.115.121.1.15 )

+ olcAttributeTypes: {14}( SUSE.YaST.ModuleConfig.Attr:21 NAME 'suseMapAttribu

+  te' DESC '' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

+ olcAttributeTypes: {15}( SUSE.YaST.ModuleConfig.Attr:22 NAME 'suseImapServer

+  ' DESC '' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SIN

+  GLE-VALUE )

+ olcAttributeTypes: {16}( SUSE.YaST.ModuleConfig.Attr:23 NAME 'suseImapAdmin'

+   DESC '' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SING

+  LE-VALUE )

+ olcAttributeTypes: {17}( SUSE.YaST.ModuleConfig.Attr:24 NAME 'suseImapDefaul

+  tQuota' DESC '' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 

+  SINGLE-VALUE )

+ olcAttributeTypes: {18}( SUSE.YaST.ModuleConfig.Attr:25 NAME 'suseImapUseSsl

+  ' DESC '' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-

+  VALUE )

+ olcObjectClasses: {0}( SUSE.YaST.ModuleConfig.OC:2 NAME 'suseModuleConfigura

+  tion' DESC 'Contains configuration of Management Modules' SUP top STRUCTURA

+  L MUST cn MAY suseDefaultBase )

+ olcObjectClasses: {1}( SUSE.YaST.ModuleConfig.OC:3 NAME 'suseUserConfigurati

+  on' DESC 'Configuration of user management tools' SUP suseModuleConfigurati

+  on STRUCTURAL MAY ( suseMinPasswordLength $ suseMaxPasswordLength $ susePas

+  swordHash $ suseSkelDir $ suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqu

+  eId $ suseDefaultTemplate $ suseSearchFilter $ suseMapAttribute ) )

+ olcObjectClasses: {2}( SUSE.YaST.ModuleConfig.OC:4 NAME 'suseObjectTemplate'

+   DESC 'Base Class for Object-Templates' SUP top STRUCTURAL MUST cn MAY ( su

+  sePlugin $ suseDefaultValue $ suseNamingAttribute ) )

+ olcObjectClasses: {3}( SUSE.YaST.ModuleConfig.OC:5 NAME 'suseUserTemplate' D

+  ESC 'User object template' SUP suseObjectTemplate STRUCTURAL MUST cn MAY su

+  seSecondaryGroup )

+ olcObjectClasses: {4}( SUSE.YaST.ModuleConfig.OC:6 NAME 'suseGroupTemplate' 

+  DESC 'Group object template' SUP suseObjectTemplate STRUCTURAL MUST cn )

+ olcObjectClasses: {5}( SUSE.YaST.ModuleConfig.OC:7 NAME 'suseGroupConfigurat

+  ion' DESC 'Configuration of user management tools' SUP suseModuleConfigurat

+  ion STRUCTURAL MAY ( suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $

+   suseDefaultTemplate $ suseSearchFilter $ suseMapAttribute ) )

+ olcObjectClasses: {6}( SUSE.YaST.ModuleConfig.OC:8 NAME 'suseCaConfiguration

+  ' DESC 'Configuration of CA management tools' SUP suseModuleConfiguration S

+  TRUCTURAL )

+ olcObjectClasses: {7}( SUSE.YaST.ModuleConfig.OC:9 NAME 'suseDnsConfiguratio

+  n' DESC 'Configuration of mail server management tools' SUP suseModuleConfi

+  guration STRUCTURAL )

+ olcObjectClasses: {8}( SUSE.YaST.ModuleConfig.OC:10 NAME 'suseDhcpConfigurat

+  ion' DESC 'Configuration of DHCP server management tools' SUP suseModuleCon

+  figuration STRUCTURAL )

+ olcObjectClasses: {9}( SUSE.YaST.ModuleConfig.OC:11 NAME 'suseMailConfigurat

+  ion' DESC 'Configuration of IMAP user management tools' SUP suseModuleConfi

+  guration STRUCTURAL MUST ( suseImapServer $ suseImapAdmin $ suseImapDefault

+  Quota $ suseImapUseSsl ) )

+ structuralObjectClass: olcSchemaConfig

+ entryUUID: 401a3f38-eaf5-1039-8665-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.085642Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,15 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 ebfceba5

+ dn: olcDatabase={-1}frontend

+ objectClass: olcDatabaseConfig

+ objectClass: olcFrontendConfig

+ olcDatabase: {-1}frontend

+ olcAccess: {0}to dn.base="" by * read

+ olcAccess: {1}to dn.base="cn=Subschema" by * read

+ structuralObjectClass: olcDatabaseConfig

+ entryUUID: 401a4c6c-eaf5-1039-8666-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.085980Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,20 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 e112c647

+ dn: olcDatabase={0}config

+ objectClass: olcDatabaseConfig

+ olcDatabase: {0}config

+ olcAccess: {0}to *  by * none

+ olcAddContentAcl: TRUE

+ olcLastMod: TRUE

+ olcMaxDerefDepth: 15

+ olcReadOnly: FALSE

+ olcRootDN: cn=config

+ olcSyncUseSubentry: FALSE

+ olcMonitoring: FALSE

+ structuralObjectClass: olcDatabaseConfig

+ entryUUID: 401a534c-eaf5-1039-8668-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.086158Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,18 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 c1d2cbb7

+ dn: olcDatabase={1}mdb

+ objectClass: olcDatabaseConfig

+ objectClass: olcMdbConfig

+ olcDatabase: mdb

+ olcDbDirectory: /var/lib/ldap/example_com

+ olcSuffix: dc=example,dc=com

+ olcRootDN: cn=Manager,dc=example,dc=com

+ olcRootPW:: c2VjcmV0

+ olcDbIndex: objectClass eq

+ structuralObjectClass: olcMdbConfig

+ entryUUID: 401a528e-eaf5-1039-8667-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.086134Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,14 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 82bb3fb3

+ dn: olcOverlay={0}memberof

+ objectClass: olcOverlayConfig

+ objectClass: olcMemberOf

+ olcOverlay: {0}memberof

+ olcMemberOfRefInt: TRUE

+ structuralObjectClass: olcMemberOf

+ entryUUID: 401a5f7c-eaf5-1039-8669-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.086468Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,15 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 28d25ae6

+ dn: olcOverlay={1}refint

+ objectClass: olcOverlayConfig

+ objectClass: olcRefintConfig

+ olcOverlay: {1}refint

+ olcRefintAttribute: member

+ olcRefintAttribute: memberOf

+ structuralObjectClass: olcRefintConfig

+ entryUUID: 401a66fc-eaf5-1039-866a-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.086660Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,15 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 e3a2aeac

+ dn: olcOverlay={2}unique

+ objectClass: olcOverlayConfig

+ objectClass: olcUniqueConfig

+ olcOverlay: {2}unique

+ olcUniqueURI: ldap:///?mail?sub

+ olcUniqueURI: ldap:///?uid?sub

+ structuralObjectClass: olcUniqueConfig

+ entryUUID: 401a6b02-eaf5-1039-866b-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.086763Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,18 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 1bb1ab28

+ dn: olcDatabase={2}mdb

+ objectClass: olcDatabaseConfig

+ objectClass: olcMdbConfig

+ olcDatabase: mdb

+ olcDbDirectory: /var/lib/ldap/example_net

+ olcSuffix: dc=example,dc=net

+ olcRootDN: cn=Manager,dc=example,dc=net

+ olcRootPW:: c2VjcmV0

+ olcDbIndex: objectClass eq

+ structuralObjectClass: olcMdbConfig

+ entryUUID: 401a7084-eaf5-1039-866c-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.086905Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,14 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 6b48531c

+ dn: olcOverlay={0}memberof

+ objectClass: olcOverlayConfig

+ objectClass: olcMemberOf

+ olcOverlay: {0}memberof

+ olcMemberOfRefInt: TRUE

+ structuralObjectClass: olcMemberOf

+ entryUUID: 401a7890-eaf5-1039-866d-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.087110Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

@@ -0,0 +1,15 @@ 

+ # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

+ # CRC32 027478a0

+ dn: olcOverlay={1}unique

+ objectClass: olcOverlayConfig

+ objectClass: olcUniqueConfig

+ olcOverlay: {1}unique

+ olcUniqueURI: ldap:///?mail?sub

+ olcUniqueURI: ldap:///?uid?sub

+ structuralObjectClass: olcUniqueConfig

+ entryUUID: 401a7f20-eaf5-1039-866e-dbfbf2f5e6dd

+ creatorsName: cn=config

+ createTimestamp: 20200224020101Z

+ entryCSN: 20200224020101.087278Z#000000#000#000000

+ modifiersName: cn=config

+ modifyTimestamp: 20200224020101Z

empty or binary file added
@@ -0,0 +1,76 @@ 

+ # --- BEGIN COPYRIGHT BLOCK ---

+ # Copyright (C) 2020 William Brown <william@blackhats.net.au>

+ # All rights reserved.

+ #

+ # License: GPL (version 3 or any later version).

+ # See LICENSE for details.

+ # --- END COPYRIGHT BLOCK ---

+ #

+ import pytest

+ import os

+ from lib389.topologies import topology_st

+ from lib389.password_plugins import PBKDF2Plugin

+ from lib389.utils import ds_is_older

+ 

+ from lib389.migrate.openldap.config import olConfig

+ from lib389.migrate.plan import Migration

+ # from lib389.migrate.plan import *

+ 

+ pytestmark = pytest.mark.tier1

+ 

+ DATADIR1 = os.path.join(os.path.dirname(__file__), '../../data/openldap_2_389/1/')

+ 

+ @pytest.mark.skipif(ds_is_older('1.4.3'), reason="Not implemented")

+ def test_parse_openldap_slapdd():

+     """Test parsing an example openldap configuration. We should be able to

+     at least determine the backends, what overlays they have, and some other

+     minimal amount.

+ 

+     :id: b0061ab0-fff4-45c6-b6c6-171ca3d2dfbc

+     :setup: Data directory with an openldap config directory.

+     :steps:

+         1. 

+     :expectedresults:

+         1. 

+     """

+     config_path = os.path.join(DATADIR1, 'slapd.d')

+     config = olConfig(config_path)

+ 

+     # Do we have databases?

+     assert len(config.databases) == 2

+ 

+     # Did our schema parse?

+     assert any(['suseModuleConfiguration' in x.names for x in config.schema.classes])

+ 

+ 

+ @pytest.mark.skipif(ds_is_older('1.4.3'), reason="Not implemented")

+ def test_migrate_openldap_slapdd(topology_st):

+     """

+ 

+     :id: e9748040-90a0-4d69-bdde-007104f75cc5

+     :setup: 

+     :steps:

+         1. 

+     :expectedresults:

+         1. 

+     """

+ 

+     inst = topology_st.standalone

+     config_path = os.path.join(DATADIR1, 'slapd.d')

+     config = olConfig(config_path)

+     ldifs = {

+         "dc=example,dc=com": os.path.join(DATADIR1, 'example_com.slapcat.ldif'),

+         "dc=example,dc=net": os.path.join(DATADIR1, 'example_net.slapcat.ldif'),

+     }

+ 

+     migration = Migration(config, inst, ldifs)

+ 

+     print("==== migration plan ====")

+     print(migration.__unicode__())

+     print("==== end migration plan ====")

+ 

+     migration.execute_plan()

+ 

+ 

+ 

+ 

empty or binary file added
empty or binary file added
@@ -0,0 +1,287 @@ 

+ # --- BEGIN COPYRIGHT BLOCK ---

+ # Copyright (C) 2020 William Brown <william@blackhats.net.au>

+ # All rights reserved.

+ #

+ # License: GPL (version 3 or any later version).

+ # See LICENSE for details.

+ # --- END COPYRIGHT BLOCK ---

+ #

+ 

+ import os

+ import logging

+ import ldap.schema

+ from enum import Enum

+ from ldif import LDIFParser

+ from lib389.utils import ensure_list_str, ensure_str

+ 

+ logger = logging.getLogger(__name__)

+ 

+ class SimpleParser(LDIFParser):

+     def __init__(self, f):

+         self.entries = []

+         super().__init__(f)

+         pass

+ 

+     def handle(self, dn, entry):

+         self.entries.append((dn, entry))

+ 

+ 

+ def ldif_parse(path, rpath):

+     with open(os.path.join(path, rpath), 'r') as f:

+         sp = SimpleParser(f)

+         sp.parse()

+         return sp.entries

+ 

+ def db_cond(name):

+     if name == 'olcDatabase={0}config.ldif':

+         return False

+     if name == 'olcDatabase={-1}frontend.ldif':

+         return False

+     if name.startswith('olcDatabase=') and name.endswith('.ldif'):

+         return True

+     return False

+ 

+ 

+ class olOverlayType(Enum):

+     UNKNOWN = 0

+     MEMBEROF = 1

+     REFINT = 2

+     UNIQUE = 3

+ 

+ 

+ class olOverlay(object):

+     def __init__(self, path, name, log):

+         self.log = log

+         self.log.debug(f"olOverlay path -> {path}/{name}")

+         entries = ldif_parse(path, name)

+         assert len(entries) == 1

+         self.config = entries.pop()

+         self.log.debug(f"{self.config}")

+ 

+         # olcOverlay

+ 

+         self.name = ensure_str(self.config[1]['olcOverlay'][0]).split('}', 1)[1]

+         self.classes = ensure_list_str(self.config[1]['objectClass'])

+         self.log.debug(f"{self.name} {self.classes}")

+ 

+         if 'olcMemberOf' in self.classes:

+             self.otype = olOverlayType.MEMBEROF

+             #

+         elif 'olcRefintConfig' in self.classes:

+             self.otype = olOverlayType.REFINT

+             # olcRefintAttribute

+             self.attrs = ensure_list_str(self.config[1]['olcRefintAttribute'])

+         elif 'olcUniqueConfig' in self.classes:

+             self.otype = olOverlayType.UNIQUE

+             # olcUniqueURI

+             self.attrs = ensure_list_str([

+                 # This is a ldap:///?uid?sub, so split ? [1] will give uid.

+                 attr.split('?')[1]

+                 for attr in ensure_list_str(self.config[1]['olcUniqueURI'])

+             ])

+         else:

+             self.otype = olOverlayType.UNKNOWN

+             # Should we stash extra details?

+ 

+ 

+ class olDatabase(object):

+     def __init__(self, path, name, log):

+         self.log = log

+         self.log.debug(f"olDatabase path -> {path}")

+         entries = ldif_parse(path, f'{name}.ldif')

+         assert len(entries) == 1

+         self.config = entries.pop()

+         self.log.debug(f"{self.config}")

+ 

+         # olcSuffix, olcDbIndex, entryUUID

+         self.suffix = ensure_str(self.config[1]['olcSuffix'][0])

+         self.idx = name.split('}', 1)[0].split('{', 1)[1]

+         self.uuid = ensure_str(self.config[1]['entryUUID'][0])

+ 

+         self.index = [

+             tuple(ensure_str(x).split(' '))

+             for x in self.config[1]['olcDbIndex']

+         ]

+ 

+         self.log.debug(f"settings -> {self.suffix}, {self.idx}, {self.uuid}, {self.index}")

+ 

+ 

+         overlay_path = os.path.join(path, name)

+         self.overlays = [

+             olOverlay(overlay_path, x, log)

+             for x in sorted(os.listdir(overlay_path))

+         ]

+ 

+ # See https://www.python-ldap.org/en/latest/reference/ldap-schema.html

+ class olAttribute(ldap.schema.models.AttributeType):

+     def __init__(self, value, log):

+         self.log = log

+         self.log.debug(f"olAttribute value -> {value}")

+         # This split takes {0}(stuff) and will only leave stuf.

+         super().__init__(value.split('}', 1)[1])

+         self.name_set = set([x.lower() for x in self.names])

+ 

+     def schema_str(self):

+         return super().__str__()

+ 

+     def __str__(self):

+         return self.__unicode__()

+ 

+     def __unicode__(self):

+         return f"{self.names}"

+ 

+     def inconsistent(self, ds_attr):

+         # Okay, we are attempting to merge self into ds_attr. What do we need to do?

+         #         self.log.debug(f"""

+         # Assert ->

+         # oid {self.oid} ->  {ds_attr.oid}

+         # single_value {self.single_value} ->  {ds_attr.single_value}

+         # sup {self.sup} ->  {ds_attr.sup}

+         # Merge ->

+         # names {self.names} ->  {ds_attr.names}

+         # NOT checking ->

+         # desc {self.desc} ->  {ds_attr.desc}

+         # equality {self.equality} ->  {ds_attr.equality}

+         # substr {self.substr} ->  {ds_attr.substr}

+         # ordering {self.ordering} ->  {ds_attr.ordering}

+         #         """)

+ 

+         # Assert these are the same:

+         # oid

+         # single_value

+         # sup

+         assert self.oid == ds_attr.oid

+         if self.single_value != ds_attr.single_value:

+             self.log.debug("Inconsistent single_value declaration")

+             return True

+         if set([s.lower() for s in self.sup]) != set([s.lower() for s in ds_attr.sup]):

+             self.log.debug("Inconsistent superior declaration")

+             return True

+         # names

+         if self.name_set != set([n.lower() for n in ds_attr.names]):

+             self.log.debug("Inconsistent name aliases")

+             return True

+ 

+         # ignore all else.

+         return False

+ 

+ 

+ class olClass(ldap.schema.models.ObjectClass):

+     def __init__(self, value, log):

+         self.log = log

+         self.log.debug(f"olClass value -> {value}")

+         super().__init__(value.split('}', 1)[1])

+         self.name_set = set([x.lower() for x in self.names])

+ 

+     def schema_str(self):

+         return super().__str__()

+ 

+     def __str__(self):

+         return self.__unicode__()

+ 

+     def __unicode__(self):

+         return f"""{self.oid} {self.names} may -> {self.may} must -> {self.must} sup -> {self.sup}"""

+ 

+     def debug_full(self, ds_obj):

+         self.log.debug(f"""

+ Assert ->

+ oid {self.oid} == {ds_obj.oid}

+ names {self.names} == {ds_obj.names}

+ kind {self.kind} == {ds_obj.kind}

+ sup {self.sup} == {ds_obj.sup}

+ must {self.must} ⊇ {ds_obj.must}

+ may {self.may} ⊇ {ds_obj.may}

+ 

+ Merge ->

+ must {self.must} -> iff ⊇ {ds_obj.must}

+ may {self.may} -> iff ⊇ {ds_obj.may}

+ 

+ NOT checking ->

+ desc {self.desc} -> {ds_obj.desc}

+ obsolete {self.obsolete} -> {ds_obj.obsolete}""")

+ 

+     def inconsistent(self, ds_obj, resolver):

+         assert self.oid == ds_obj.oid

+         # names

+         if self.name_set != set([n.lower() for n in ds_obj.names]):

+             self.log.debug("Inconsistent name aliases")

+             self.debug_full(ds_obj)

+             return True

+         if self.kind != ds_obj.kind:

+             self.log.debug("Inconsistent kind")

+             self.debug_full(ds_obj)

+             return True

+         if set([s.lower() for s in self.sup]) != set([s.lower() for s in ds_obj.sup]):

+             self.log.debug("Inconsistent superior declaration")

+             self.debug_full(ds_obj)

+             return True

+         if set([resolver.resolve(s) for s in self.must]) != set([resolver.resolve(s) for s in ds_obj.must]):

+             self.log.debug("Inconsistent Must Set")

+             self.debug_full(ds_obj)

+             return True

+         if set([resolver.resolve(s) for s in self.may]) != set([resolver.resolve(s) for s in ds_obj.may]):

+             self.log.debug("Inconsistent May Set")

+             self.log.debug("ol -> %s" % [resolver.resolve(s) for s in self.may])

+             self.log.debug("ds -> %s" % [resolver.resolve(s) for s in ds_obj.may])

+             self.debug_full(ds_obj)

+             return True

+         # ignore all else.

+         return False

+ 

+ class olSchema(object):

+     def __init__(self, path, log):

+         self.log = log

+         self.log.debug(f"olSchema path -> {path}")

+         schemas = sorted(os.listdir(path))

+         self.log.debug(f"olSchemas -> {schemas}")

+ 

+         self.raw_schema = []

+ 

+         for schema in schemas:

+             entries = ldif_parse(path, schema)

+             assert len(entries) == 1

+             self.raw_schema.append(entries.pop())

+         # self.log.debug(f"raw_schema -> {self.raw_schema}")

+ 

+         self.raw_attrs = []

+         self.raw_classes = []

+ 

+         for (cn, rs) in self.raw_schema:

+             self.raw_attrs += ensure_list_str(rs['olcAttributeTypes'])

+             self.raw_classes += ensure_list_str(rs['olcObjectClasses'])

+ 

+         self.attrs = [olAttribute(x, self.log) for x in self.raw_attrs]

+         self.classes = [olClass(x, self.log) for x in self.raw_classes]

+         self.log.debug(f'attrs -> {self.attrs}')

+         self.log.debug(f'classes -> {self.classes}')

+ 

+ 

+ 

+ class olConfig(object):

+     def __init__(self, path, log=None):

+         self.log = log

+         if self.log is None:

+             self.log = logger

+         self.log.debug(f"olConfig path -> {path}")

+         config_entries = ldif_parse(path, 'cn=config.ldif')

+         assert len(config_entries) == 1

+         self.config_entry = config_entries.pop()

+         self.log.debug(self.config_entry)

+ 

+         # Parse all the child values.

+         self.schema = olSchema(os.path.join(path, 'cn=config/cn=schema/'), self.log)

+ 

+         dbs = sorted([

+             os.path.split(x)[1].replace('.ldif', '')

+             for x in os.listdir(os.path.join(path, 'cn=config'))

+             if db_cond(x)

+         ])

+         self.log.debug(f"olDatabases -> {dbs}")

+ 

+         self.databases = [

+             olDatabase(os.path.join(path, f'cn=config/'), db, self.log)

+             for db in dbs

+         ]

+         self.log.debug('parsed olConfig')

+ 

+ 

@@ -0,0 +1,9 @@ 

+ # --- BEGIN COPYRIGHT BLOCK ---

+ # Copyright (C) 2020 William Brown <william@blackhats.net.au>

+ # All rights reserved.

+ #

+ # License: GPL (version 3 or any later version).

+ # See LICENSE for details.

+ # --- END COPYRIGHT BLOCK ---

+ #

+ 

@@ -0,0 +1,544 @@ 

+ # --- BEGIN COPYRIGHT BLOCK ---

+ # Copyright (C) 2020 William Brown <william@blackhats.net.au>

+ # All rights reserved.

+ #

+ # License: GPL (version 3 or any later version).

+ # See LICENSE for details.

+ # --- END COPYRIGHT BLOCK ---

+ #

+ 

+ from lib389.schema import Schema, Resolver

+ from lib389.backend import Backends

+ from lib389.migrate.openldap.config import olOverlayType

+ from lib389.plugins import MemberOfPlugin, ReferentialIntegrityPlugin, AttributeUniquenessPlugins

+ import ldap

+ import os

+ from ldif import LDIFParser

+ from ldif import LDIFWriter

+ from uuid import uuid4

+ 

+ class MigrationAction(object):

+     def __init__(self):

+         pass

+ 

+     def apply(self, inst):

+         raise Exception('not implemented')

+ 

+     def post(self):

+         pass

+         # raise Exception('not implemented')

+ 

+     def __unicode__(self):

+         raise Exception('not implemented')

+ 

+ 

+ class DatabaseCreate(MigrationAction):

+     def __init__(self, suffix, uuid):

+         self.suffix = suffix

+         self.uuid = uuid

+ 

+     def apply(self, inst):

+         bes = Backends(inst)

+         be = bes.create(properties={

+             'cn': self.uuid,

+             'nsslapd-suffix': self.suffix,

+         })

+ 

+     def __unicode__(self):

+         return f"DatabaseCreate -> {self.suffix}, {self.uuid}"

+ 

+ class DatabaseIndexCreate(MigrationAction):

+     def __init__(self, suffix, olindex):

+         self.suffix = suffix

+         self.attr = olindex[0]

+         # Will this work with multiple index types

+         self.type = olindex[1]

+ 

+     def apply(self, inst):

+         be = Backends(inst).get(self.suffix)

+         indexes = be.get_indexes()

+         try:

+             # If it exists, return. Could be the case as we created the

+             # BE and the default indexes applied now.

+             indexes.get(self.attr)

+             return

+         except ldap.NO_SUCH_OBJECT:

+             pass

+         be.add_index(self.attr, self.type)

+ 

+     def __unicode__(self):

+         return f"DatabaseIndexCreate -> {self.attr} {self.type}, {self.suffix}"

+ 

+ class DatabaseReindex(MigrationAction):

+     def __init__(self, suffix):

+         self.suffix = suffix

+ 

+     def apply(self, inst):

+         bes = Backends(inst)

+         be = bes.get(self.suffix)

+         be.reindex(wait=True)

+ 

+     def __unicode__(self):

+         return f"DatabaseReindex -> {self.suffix}"

+ 

+ class ImportTransformer(LDIFParser):

+     def __init__(self, f_import, f_outport):

+         self.f_outport = f_outport

+         self.writer = LDIFWriter(self.f_outport)

+         super().__init__(f_import)

+ 

+     def handle(self, dn, entry):

+         attrs = entry.keys()

+         # We don't know what form the keys/attrs are in

+         # so we have to establish our own map of our

+         # idea of these to the attrs idea.

+         amap = dict([(x.lower(), x) for x in attrs])

+ 

+         # Now we can do transforms

+         # This has to exist ....

+         oc_a = amap['objectclass']

+         # If mo present, as nsMemberOf.

+         try:

+             mo_a = amap['memberof']

+             # If mo_a was found, then mo is present, extend the oc.

+             entry[oc_a] += [b'nsMemberOf']

+         except:

+             # Not found

+             pass

+ 

+         # strip entryCSN

+         try:

+             ecsn_a = amap['entrycsn']

+             entry.pop(ecsn_a)

+         except:

+             # No ecsn, skip

+             pass

+ 

+         # strip sco

+         try:

+             sco_a = amap['structuralobjectclass']

+             entry.pop(sco_a)

+         except:

+             # No sco, skip

+             pass

+ 

+         # Write it out

+         self.writer.unparse(dn, entry)

+ 

+ class DatabaseLdifImport(MigrationAction):

+     def __init__(self, suffix, ldif_path):

+         self.suffix = suffix

+         self.ldif_path = ldif_path

+ 

+     def apply(self, inst):

+         # Create a unique op id.

+         op_id = str(uuid4())

+         op_path = os.path.join(inst.get_ldif_dir(), f'{op_id}.ldif')

+ 

+         with open(self.ldif_path, 'r') as f_import:

+             with open(op_path, 'w') as f_outport:

+                 p = ImportTransformer(f_import, f_outport)

+                 p.parse()

+ 

+         be = Backends(inst).get(self.suffix)

+         task = be.export_ldif()

+         task.wait()

+ 

+         task = be.import_ldif([op_path])

+         task.wait()

+ 

+     def __unicode__(self):

+         return f"DatabaseLdifImport -> {self.suffix} {self.ldif_path}"

+ 

+ class SchemaAttributeUnsupported(MigrationAction):

+     def __init__(self, attr):

+         self.attr = attr

+ 

+     def __unicode__(self):

+         return f"SchemaAttributeUnsupported -> {self.attr.__unicode__()}"

+ 

+     def apply(self, inst):

+         inst.log.debug(f"SchemaAttributeUnsupported -> {self.attr.__unicode__()} (SKIPPING)")

+ 

+ class SchemaAttributeCreate(MigrationAction):

+     def __init__(self, attr):

+         self.attr = attr

+ 

+     def __unicode__(self):

+         return f"SchemaAttributeCreate -> {self.attr.__unicode__()}"

+ 

+     def apply(self, inst):

+         schema = Schema(inst)

+         inst.log.debug("SchemaAttributeCreate -> %s" % self.attr.schema_str())

+         schema.add(self.attr.schema_attribute, self.attr.schema_str())

+ 

+ class SchemaAttributeInconsistent(MigrationAction):

+     def __init__(self, attr, ds_attr):

+         self.ds_attr = ds_attr

+         self.attr = attr

+ 

+     def __unicode__(self):

+         return f"SchemaAttributeInconsistent -> {self.ds_attr} to {self.attr.__unicode__()}"

+ 

+ class SchemaAttributeAmbiguous(MigrationAction):

+     def __init__(self, attr):

+         self.attr = attr

+ 

+     def __unicode__(self):

+         return f"SchemaAttributeInconsistent -> {self.attr.__unicode__()}"

+ 

+ class SchemaClassUnsupported(MigrationAction):

+     def __init__(self, obj):

+         self.obj = obj

+ 

+     def __unicode__(self):

+         return f"SchemaClassUnsupported -> {self.obj.__unicode__()}"

+ 

+     def apply(self, inst):

+         inst.log.debug(f"SchemaClassUnsupported -> {self.obj.__unicode__()} (SKIPPING)")

+ 

+ class SchemaClassCreate(MigrationAction):

+     def __init__(self, obj):

+         self.obj = obj

+ 

+     def __unicode__(self):

+         return f"SchemaClassCreate -> {self.obj.__unicode__()}"

+ 

+     def apply(self, inst):

+         schema = Schema(inst)

+         inst.log.debug("SchemaClassCreate -> %s" % self.obj.schema_str())

+         schema.add(self.obj.schema_attribute, self.obj.schema_str())

+ 

+ class SchemaClassInconsistent(MigrationAction):

+     def __init__(self, obj, ds_obj):

+         self.ds_obj = ds_obj

+         self.obj = obj

+ 

+     def __unicode__(self):

+         return f"SchemaClassInconsistent -> {self.ds_obj} to {self.obj.__unicode__()}"

+ 

+ class PluginMemberOfEnable(MigrationAction):

+     def __init__(self):

+         pass

+ 

+     def apply(self, inst):

+         mo = MemberOfPlugin(inst)

+         mo.enable()

+         inst.restart()

+ 

+     def __unicode__(self):

+         return "PluginMemberOfEnable"

+ 

+ class PluginMemberOfScope(MigrationAction):

+     def __init__(self, suffix):

+         self.suffix = suffix

+ 

+     def apply(self, inst):

+         mo = MemberOfPlugin(inst)

+         mo.add_entryscope(self.suffix)

+ 

+     def __unicode__(self):

+         return f"PluginMemberOfScope -> {self.suffix}"

+ 

+ class PluginMemberOfFixup(MigrationAction):

+     def __init__(self, suffix):

+         self.suffix = suffix

+ 

+     def apply(self, inst):

+         mo = MemberOfPlugin(inst)

+         task = mo.fixup(self.suffix)

+         task.wait()

+ 

+     def __unicode__(self):

+         return f"PluginMemberOfFixup -> {self.suffix}"

+ 

+ class PluginRefintEnable(MigrationAction):

+     def __init__(self):

+         pass

+         # Set refint delay to 0

+ 

+     def apply(self, inst):

+         rip = ReferentialIntegrityPlugin(inst)

+         rip.set_update_delay(0)

+         rip.enable()

+ 

+     def __unicode__(self):

+         return "PluginRefintEnable"

+ 

+ class PluginRefintAttributes(MigrationAction):

+     def __init__(self, attr):

+         self.attr = attr

+ 

+     def apply(self, inst):

+         rip = ReferentialIntegrityPlugin(inst)

+         try:

+             rip.add_membership_attr(self.attr)

+         except ldap.TYPE_OR_VALUE_EXISTS:

+             # This is okay, move on.

+             pass

+ 

+     def __unicode__(self):

+         return f"PluginRefintAttributes -> {self.attr}"

+ 

+ class PluginRefintScope(MigrationAction):

+     def __init__(self, suffix):

+         self.suffix = suffix

+ 

+     def apply(self, inst):

+         rip = ReferentialIntegrityPlugin(inst)

+         rip.add_entryscope(self.suffix)

+ 

+     def __unicode__(self):

+         return f"PluginRefintScope -> {self.suffix}"

+ 

+ class PluginUniqueConfigure(MigrationAction):

+     # This enables and configures.

+     def __init__(self, suffix, attr, uuid):

+         self.suffix = suffix

+         self.attr = attr

+         self.uuid = uuid

+ 

+     def apply(self, inst):

+         aups = AttributeUniquenessPlugins(inst)

+         aup = aups.create(properties={

+             'cn': f'cn=attr_unique_{self.attr}_{self.uuid}',

+             'uniqueness-attribute-name': self.attr,

+             'uniqueness-subtrees': self.suffix,

+             'nsslapd-pluginEnabled': 'on',

+         })

+ 

+     def __unicode__(self):

+         return f"PluginUniqueConfigure -> {self.suffix}, {self.attr} {self.uuid}"

+ 

+ class PluginUnknownManual(MigrationAction):

+     def __init__(self, overlay):

+         self.overlay = overlay

+ 

+     def __unicode__(self):

+         return f"PluginUnknownManual -> {self.overlay.name}, {self.overlay.classes}"

+ 

+ 

+ class Migration(object):

+     def __init__(self, olconfig, inst, ldifs=None):

+         """Generate a migration plan from an openldap config, the instance to migrate too

+         and an optional dictionary of { suffix: ldif_path }.

+ 

+         The migration plan once generate still needs to be executed, but the idea is that

+         this module connects to a UI program that can allow the plan to be reviewed and

+         accepted. Plan modification is "out of scope", but possible as the array could

+         be manipulated in place.

+         """

+         self.olconfig = olconfig

+         self.inst = inst

+         self.plan = []

+         self.ldifs = ldifs

+         self._schema_oid_do_not_migrate = set([

+             # We pre-modified these as they are pretty core, and we don't want

+             # them tampered with

+             '2.5.4.2', # knowledgeInformation

+             '2.5.4.7', # l, locality

+             '2.5.4.29', # presentationAddress

+             '2.5.4.30', # supportedApplication Context

+             '2.5.4.42', # givenName

+             '2.5.4.48', # protocolInformation

+             '2.5.4.54', # dmdName

+             '2.5.6.7', # organizationalPerson

+             '2.5.6.9', # groupOfNames

+             '2.5.6.10', # residentialPerson

+             '2.5.6.12', # applicationEntity

+             '2.5.6.13', # dsa

+             '2.5.6.17', # groupOfUniqueNames

+             '2.5.6.20', # dmd

+             # We ignore all of the conflicts/changes from rfc2307 and rfc2307bis

+             # as we provide rfc2307compat, which allows both to coexist.

+             '1.3.6.1.1.1.1.16', # ipServiceProtocol

+             '1.3.6.1.1.1.1.19', # ipHostNumber

+             '1.3.6.1.1.1.1.20', # ipNetworkNumber

+             '1.3.6.1.1.1.1.26', # nisMapName

+             '1.3.6.1.1.1.1.28', # nisPublicKey

+             '1.3.6.1.1.1.1.29', # nisSecretKey

+             '1.3.6.1.1.1.1.30', # nisDomain

+             '1.3.6.1.1.1.1.31', # automountMapName

+             '1.3.6.1.1.1.1.32', # automountKey

+             '1.3.6.1.1.1.1.33', # automountInformation

+             '1.3.6.1.1.1.2.2', # posixGroup

+             '1.3.6.1.1.1.2.6', # ipHost

+             '1.3.6.1.1.1.2.7', # ipNetwork

+             '1.3.6.1.1.1.2.9', # nisMap

+             '1.3.6.1.1.1.2.11', # ieee802Device

+             '1.3.6.1.1.1.2.12', # bootableDevice

+             '1.3.6.1.1.1.2.13', # nisMap

+             '1.3.6.1.1.1.2.14', # nisKeyObject

+             '1.3.6.1.1.1.2.15', # nisDomainObject

+             '1.3.6.1.1.1.2.16', # automountMap

+             '1.3.6.1.1.1.2.17', # automount

+             # This schema is buggy, we always skip it as we know the 389 version is correct.

+             '0.9.2342.19200300.100.4.14',

+         ])

+         self._schema_oid_unsupported = set([

+             # RFC4517 othermailbox syntax is not supported on 389.

+             '0.9.2342.19200300.100.1.22',

+             # The dsaquality syntax was removed in rfc4517

+             '0.9.2342.19200300.100.1.49',

+             # single level quality syntax is removed

+             '0.9.2342.19200300.100.1.50',

+             '0.9.2342.19200300.100.1.51',

+             '0.9.2342.19200300.100.1.52',

+             # Pilot person depends no otherMailbox

+             '0.9.2342.19200300.100.4.4',

+             # Pilot DSA needs dsaquality

+             '0.9.2342.19200300.100.4.21',

+             '0.9.2342.19200300.100.4.22',

+ 

+         ])

+         self._gen_migration_plan()

+ 

+     def __unicode__(self):

+         buff = ""

+         for item in self.plan:

+             buff += f"{item.__unicode__()}\n"

+         return buff

+ 

+     def _gen_schema_plan(self):

+         # Get the server schema so that we can query it repeatedly.

+         schema = Schema(self.inst)

+         schema_attrs = schema.get_attributetypes()

+         schema_objects = schema.get_objectclasses()

+ 

+         resolver = Resolver(schema_attrs)

+ 

+         # Examine schema attrs

+         for attr in self.olconfig.schema.attrs:

+             # If we have been instructed to ignore this oid, skip.

+             if attr.oid in self._schema_oid_do_not_migrate:

+                 continue

+             if attr.oid in self._schema_oid_unsupported:

+                 self.plan.append(SchemaAttributeUnsupported(attr))

+                 continue

+             # For the attr, find if anything has a name overlap in any capacity.

+             # overlaps = [ (names, ds_attr) for (names, ds_attr) in schema_attr_names if len(names.intersection(attr.name_set)) > 0]

+             overlaps = [ ds_attr for ds_attr in schema_attrs if ds_attr.oid == attr.oid]

+             if len(overlaps) == 0:

+                 # We need to add attr

+                 self.plan.append(SchemaAttributeCreate(attr))

+             elif len(overlaps) == 1:

+                 # We need to possibly adjust attr

+                 ds_attr = overlaps[0]

+                 # We need to have a way to compare the two.

+                 if attr.inconsistent(ds_attr):

+                     self.plan.append(SchemaAttributeInconsistent(attr, ds_attr))

+             else:

+                 # Ambiguous attr, the admin must intervene to migrate it.

+                 self.plan.append(SchemaAttributeAmbiguous(attr, overlaps))

+ 

+         # Examine schema classes

+         for obj in self.olconfig.schema.classes:

+             # If we have been instructed to ignore this oid, skip.

+             if obj.oid in self._schema_oid_do_not_migrate:

+                 continue

+             if obj.oid in self._schema_oid_unsupported:

+                 self.plan.append(SchemaClassUnsupported(obj))

+                 continue

+             # For the attr, find if anything has a name overlap in any capacity.

+             overlaps = [ ds_obj for ds_obj in schema_objects if ds_obj.oid == obj.oid]

+             if len(overlaps) == 0:

+                 # We need to add attr

+                 self.plan.append(SchemaClassCreate(obj))

+             elif len(overlaps) == 1:

+                 # We need to possibly adjust the objectClass as it exists

+                 ds_obj = overlaps[0]

+                 if obj.inconsistent(ds_obj, resolver):

+                     self.plan.append(SchemaClassInconsistent(obj, ds_obj))

+             else:

+                 # This should be an impossible state.

+                 raise Exception('impossible state')

+ 

+     def _gen_be_exist_plan(self, oldb, be):

+         # For each index

+         indexes = be.get_indexes()

+         for olindex in oldb.index:

+             # Assert they exist

+             try:

+                 indexes.get(olindex[0])

+             except ldap.NO_SUCH_OBJECT:

+                 self.plan.append(DatabaseIndexCreate(oldb.suffix, olindex))

+ 

+         # Reindex the db

+         self.plan.append(DatabaseReindex(oldb.suffix))

+ 

+     def _gen_be_create_plan(self, oldb):

+         # Req db create

+         self.plan.append(DatabaseCreate(oldb.suffix, oldb.uuid))

+         # For each index

+         # Assert we have the index on the db, or req it's creation

+         for olindex in oldb.index:

+             self.plan.append(DatabaseIndexCreate(oldb.suffix, olindex))

+ 

+         # Reindex the db.

+         self.plan.append(DatabaseReindex(oldb.suffix))

+ 

+     def _gen_plugin_plan(self, oldb):

+         for overlay in oldb.overlays:

+             if overlay.otype == olOverlayType.UNKNOWN:

+                 self.plan.append(PluginUnknownManual(overlay))

+             elif overlay.otype == olOverlayType.MEMBEROF:

+                 # Assert memberof enabled.

+                 self.plan.append(PluginMemberOfEnable())

+                 # Member of scope

+                 self.plan.append(PluginMemberOfScope(oldb.suffix))

+                 # Memberof fixup task.

+                 self.plan.append(PluginMemberOfFixup(oldb.suffix))

+             elif overlay.otype == olOverlayType.REFINT:

+                 self.plan.append(PluginRefintEnable())

+                 for attr in overlay.attrs:

+                     self.plan.append(PluginRefintAttributes(attr))

+                 self.plan.append(PluginRefintScope(oldb.suffix))

+             elif overlay.otype == olOverlayType.UNIQUE:

+                 for attr in overlay.attrs:

+                     self.plan.append(PluginUniqueConfigure(oldb.suffix, attr, oldb.uuid))

+             else:

+                 raise Exception("Unknown overlay type, this is a bug!")

+ 

+ 

+     def _gen_db_plan(self):

+         # Create/Manage dbs

+         # Get the set of current dbs.

+         backends = Backends(self.inst)

+ 

+         for db in self.olconfig.databases:

+             # Get the suffix

+             suffix = db.suffix

+             try:

+                 # Do we have a db with that suffix already?

+                 be = backends.get(suffix)

+                 self._gen_be_exist_plan(db, be)

+             except ldap.NO_SUCH_OBJECT:

+                 self._gen_be_create_plan(db)

+ 

+             self._gen_plugin_plan(db)

+ 

+     def _gen_import_plan(self):

+         # Given external ldifs and suffixes, generate plans to handle these.

+         if self.ldifs is None:

+             return

+         for (suffix, ldif_path) in self.ldifs.items():

+             self.plan.append(DatabaseLdifImport(suffix, ldif_path))

+ 

+     def _gen_migration_plan(self):

+         """Order of this module is VERY important!!!

+         """

+         self._gen_schema_plan()

+         self._gen_db_plan()

+         self._gen_import_plan()

+ 

+ 

+     def execute_plan(self):

+         """ Do it!"""

+         # First apply everything

+         for item in self.plan:

+             item.apply(self.inst)

+ 

+         # Then do post

+         for item in self.plan:

+             item.post()

+ 

@@ -784,3 +784,18 @@ 

              return dump_json(result)

          else:

              return (attributetype, must, may)

+ 

+ class Resolver(object):

+     def __init__(self, schema_attrs):

+         self.attr_map = {}

+         for attr in schema_attrs:

+             for name in attr.names:

+                 self.attr_map[name.lower()] = attr

+         # done

+ 

+     def resolve(self, attr_in):

+         attr_in_l = attr_in.lower()

+         if attr_in_l in self.attr_map:

+             return self.attr_map[attr_in_l].names[0]

+         else:

+             return attr_in_l

This is a rough, unfinished, un-squash commit series for openldap to 389ds migration.

At this point it consists of a library that understands how to read openldap's ldif based configuration, it can then generate a migration plan for review, and apply it. This already has some tests and sample data for testing.

In the future a cli tool, openldap2ds will be added that will interact with the migration library, able to generate the plan, present it for review to an administrator and then allow it's application.

There is still a lot to go, but I figure I should stop hiding it on my laptop and share it. @tbordaz may be curious to see it because this is the way I have been finding all the recent schema quirks.

rebased onto 3bcf21f

3 years ago

Hey @spichugi and @mreynolds this isn't complete yet, but I'd appreciate some early review about the approach. It's now at a point where I can do a full import of schema and the DB, and it all works. Still some work to do to display config of non-migrateable overlays (aka plugins), and I need to write a CLI tool for it. But I think all the logic and parts are there. So I'll probably start on the CLI next and some more tests.

Thanks!

389-ds-base is moving from Pagure to Github. This means that new issues and pull requests
will be accepted only in 389-ds-base's github repository.

This pull request has been cloned to Github as issue and is available here:
- https://github.com/389ds/389-ds-base/issues/4290

If you want to continue to work on the PR, please navigate to the github issue,
download the patch from the attachments and file a new pull request.

Thank you for understanding. We apologize for all inconvenience.

Pull-Request has been closed by spichugi

3 years ago

Pull-Request has been reopened by spichugi

3 years ago

Pull-Request has been closed by spichugi

3 years ago
Metadata
Changes Summary 30
+241
file added
dirsrvtests/tests/data/openldap_2_389/1/example_com.slapcat.ldif
+241
file added
dirsrvtests/tests/data/openldap_2_389/1/example_net.slapcat.ldif
+117
file added
dirsrvtests/tests/data/openldap_2_389/1/setup/example_com.ldif
+117
file added
dirsrvtests/tests/data/openldap_2_389/1/setup/example_net.ldif
+146
file added
dirsrvtests/tests/data/openldap_2_389/1/setup/slapd.ldif
+14
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config.ldif
+16
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/cn=module{0}.ldif
+12
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/cn=schema.ldif
+249
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/cn=schema/cn={0}core.ldif
+178
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/cn=schema/cn={1}cosine.ldif
+49
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/cn=schema/cn={2}inetorgperson.ldif
+155
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/cn=schema/cn={3}rfc2307bis.ldif
+108
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/cn=schema/cn={4}yast.ldif
+15
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/olcDatabase={-1}frontend.ldif
+20
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/olcDatabase={0}config.ldif
+18
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/olcDatabase={1}mdb.ldif
+14
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/olcDatabase={1}mdb/olcOverlay={0}memberof.ldif
+15
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/olcDatabase={1}mdb/olcOverlay={1}refint.ldif
+15
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/olcDatabase={1}mdb/olcOverlay={2}unique.ldif
+18
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/olcDatabase={2}mdb.ldif
+14
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/olcDatabase={2}mdb/olcOverlay={0}memberof.ldif
+15
file added
dirsrvtests/tests/data/openldap_2_389/1/slapd.d/cn=config/olcDatabase={2}mdb/olcOverlay={1}unique.ldif
+0
file added
dirsrvtests/tests/suites/openldap_2_389/__init__.py
+76
file added
dirsrvtests/tests/suites/openldap_2_389/migrate_test.py
+0
file added
src/lib389/lib389/migrate/__init__.py
+0
file added
src/lib389/lib389/migrate/openldap/__init__.py
+287
file added
src/lib389/lib389/migrate/openldap/config.py
+9
file added
src/lib389/lib389/migrate/openldap/schema.py
+544
file added
src/lib389/lib389/migrate/plan.py
+15 -0
file changed
src/lib389/lib389/schema.py