5 Usage: dbcheck-links.sh PREFIX RELEASE
14 . `dirname $0`/subunit.sh
16 release_dir=`dirname $0`/../../source4/selftest/provisions/$RELEASE
19 if [ -x "$BINDIR/ldbadd" ]; then
20 ldbadd="$BINDIR/ldbadd"
24 if [ -x "$BINDIR/ldbmodify" ]; then
25 ldbmodify="$BINDIR/ldbmodify"
29 if [ -x "$BINDIR/ldbdel" ]; then
30 ldbdel="$BINDIR/ldbdel"
34 if [ -x "$BINDIR/ldbsearch" ]; then
35 ldbsearch="$BINDIR/ldbsearch"
39 if [ -x "$BINDIR/ldbrename" ]; then
40 ldbrename="$BINDIR/ldbrename"
44 if test -x $BINDIR/tdbrestore;
46 `dirname $0`/../../source4/selftest/provisions/undump.sh $release_dir $PREFIX_ABS/$RELEASE $BINDIR/tdbrestore
48 `dirname $0`/../../source4/selftest/provisions/undump.sh $release_dir $PREFIX_ABS/$RELEASE
53 tmpfile=$PREFIX_ABS/$RELEASE/expected-dbcheck-link-output${1}.txt.tmp
54 tmpldif1=$PREFIX_ABS/$RELEASE/expected-dbcheck-output${1}2.txt.tmp1
56 TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -s base -b '' | grep highestCommittedUSN > $tmpldif1
58 $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $3 --fix --yes > $tmpfile
59 if [ "$?" != "$2" ]; then
62 sort $tmpfile > $tmpfile.sorted
63 sort $release_dir/expected-dbcheck-link-output${1}.txt > $tmpfile.expected
64 diff -u $tmpfile.sorted $tmpfile.expected
65 if [ "$?" != "0" ]; then
69 tmpldif2=$PREFIX_ABS/$RELEASE/expected-dbcheck-output${1}2.txt.tmp2
70 TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -s base -b '' | grep highestCommittedUSN > $tmpldif2
72 diff -u $tmpldif1 $tmpldif2
73 if [ "$?" != "0" ]; then
84 dbcheck "_one_way" "0" "CN=Configuration,DC=release-4-5-0-pre1,DC=samba,DC=corp"
89 tmpldif1=$PREFIX_ABS/$RELEASE/expected-dbcheck-output2.txt.tmp1
91 TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -s base -b '' | grep highestCommittedUSN > $tmpldif1
93 $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb
94 if [ "$?" != "0" ]; then
97 tmpldif2=$PREFIX_ABS/$RELEASE/expected-dbcheck-output2.txt.tmp2
98 TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -s base -b '' | grep highestCommittedUSN > $tmpldif2
100 diff $tmpldif1 $tmpldif2
101 if [ "$?" != "0" ]; then
106 add_dangling_link() {
107 ldif=$release_dir/add-dangling-forwardlink-user.ldif
108 TZ=UTC $ldbadd -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif
109 if [ "$?" != "0" ]; then
113 ldif=$release_dir/add-initially-normal-link.ldif
114 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif
115 if [ "$?" != "0" ]; then
119 ldif=$release_dir/delete-only-backlink.ldif
120 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif
121 if [ "$?" != "0" ]; then
126 add_dangling_backlink() {
127 ldif=$release_dir/add-dangling-backlink-user.ldif
128 TZ=UTC $ldbadd -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif
129 if [ "$?" != "0" ]; then
133 ldif=$release_dir/add-dangling-backlink.ldif
134 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif
135 if [ "$?" != "0" ]; then
140 add_deleted_dangling_backlink() {
141 ldif=$release_dir/add-deleted-backlink-user.ldif
142 TZ=UTC $ldbadd -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif
143 if [ "$?" != "0" ]; then
147 ldif=$release_dir/add-deleted-backlink.ldif
148 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif
149 if [ "$?" != "0" ]; then
154 add_deleted_target_backlink() {
155 ldif=$release_dir/add-deleted-target-backlink-user.ldif
156 TZ=UTC $ldbadd -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif
157 if [ "$?" != "0" ]; then
161 ldif=$release_dir/add-deleted-target-backlink.ldif
162 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif
163 if [ "$?" != "0" ]; then
168 add_deleted_target_link() {
169 ldif=$release_dir/add-dangling-deleted-link.ldif
170 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif
171 if [ "$?" != "0" ]; then
176 add_two_more_users() {
177 ldif=$release_dir/add-two-more-users.ldif
178 TZ=UTC $ldbadd -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif
179 if [ "$?" != "0" ]; then
184 add_four_more_links() {
185 ldif=$release_dir/add-four-more-links.ldif
186 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif
187 if [ "$?" != "0" ]; then
193 ldif=$release_dir/remove-one-more-link.ldif
194 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif
195 if [ "$?" != "0" ]; then
201 ldif=$release_dir/remove-one-more-user.ldif
202 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif
203 if [ "$?" != "0" ]; then
209 TZ=UTC $ldbrename -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb 'cn=user1,cn=users,DC=release-4-5-0-pre1,DC=samba,DC=corp' 'cn=user1x,cn=users,DC=release-4-5-0-pre1,DC=samba,DC=corp'
210 if [ "$?" != "0" ]; then
215 check_expected_after_links() {
216 tmpldif=$PREFIX_ABS/$RELEASE/expected-links-after-link-dbcheck.ldif.tmp
217 TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(|(cn=swimmers)(cn=leaders)(cn=helpers))' -s sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --sorted member > $tmpldif
218 diff $tmpldif $release_dir/expected-links-after-link-dbcheck.ldif
219 if [ "$?" != "0" ]; then
224 check_expected_after_deleted_links() {
225 tmpldif=$PREFIX_ABS/$RELEASE/expected-deleted-links-after-link-dbcheck.ldif.tmp
226 TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(|(cn=swimmers)(cn=leaders)(cn=helpers))' -s sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted member > $tmpldif
227 diff $tmpldif $release_dir/expected-deleted-links-after-link-dbcheck.ldif
228 if [ "$?" != "0" ]; then
233 check_expected_after_objects() {
234 tmpldif=$PREFIX_ABS/$RELEASE/expected-objects-after-link-dbcheck.ldif.tmp
235 TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(|(samaccountname=fred)(samaccountname=ddg)(samaccountname=usg)(samaccountname=user1)(samaccountname=user1x)(samaccountname=user2))' -s sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted samAccountName | grep sAMAccountName > $tmpldif
236 diff $tmpldif $release_dir/expected-objects-after-link-dbcheck.ldif
237 if [ "$?" != "0" ]; then
242 dangling_one_way_dn() {
243 ldif=$release_dir/dangling-one-way-dn.ldif
244 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif
245 if [ "$?" != "0" ]; then
250 deleted_one_way_dn() {
251 ldif=$release_dir/deleted-one-way-dn.ldif
252 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif
253 if [ "$?" != "0" ]; then
258 dangling_one_way_link() {
259 ldif=$release_dir/dangling-one-way-link.ldif
260 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/CN%3DCONFIGURATION,DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif
261 if [ "$?" != "0" ]; then
266 add_dangling_multi_valued() {
267 # multi1 - All 4 backlinks
268 # multi2 - Missing all 4 backlinks
269 # multi3 - Missing 2 backlinks
270 # Administrator - Has 2 too many backlinks
271 # multi5 - Has 2 backlinks but no forward links
272 ldif=$release_dir/add-dangling-multilink-users.ldif
273 TZ=UTC $ldbadd -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif
274 if [ "$?" != "0" ]; then
278 ldif=$release_dir/add-initially-normal-multilink.ldif
279 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif
280 if [ "$?" != "0" ]; then
284 ldif=$release_dir/delete-only-multi-backlink.ldif
285 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif
286 if [ "$?" != "0" ]; then
290 ldif=$release_dir/add-dangling-multi-backlink.ldif
291 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif
292 if [ "$?" != "0" ]; then
297 dbcheck_dangling_multi_valued() {
299 $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --fix --yes
300 if [ "$?" != "1" ]; then
305 dangling_multi_valued_check_missing() {
306 WORDS=`TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(samaccountname=dangling-multi2)' -s sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted msDS-RevealedDSAs | grep msDS-RevealedDSAs | wc -l`
307 if [ $WORDS -ne 4 ]; then
308 echo Got only $WORDS links for dangling-multi2
311 WORDS=`TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(samaccountname=dangling-multi3)' -s sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted msDS-RevealedDSAs | grep msDS-RevealedDSAs | wc -l`
312 if [ $WORDS -ne 4 ]; then
313 echo Got only $WORDS links for dangling-multi3
318 dangling_multi_valued_check_equal_or_too_many() {
319 WORDS=`TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(samaccountname=dangling-multi1)' -s sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted msDS-RevealedDSAs | grep msDS-RevealedDSAs | wc -l`
320 if [ $WORDS -ne 4 ]; then
321 echo Got $WORDS links for dangling-multi1
325 WORDS=`TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(samaccountname=dangling-multi5)' -s sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted msDS-RevealedDSAs | grep msDS-RevealedDSAs | wc -l`
327 if [ $WORDS -ne 0 ]; then
328 echo Got $WORDS links for dangling-multi5
332 WORDS=`TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(samaccountname=Administrator)' -s sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted msDS-RevealedDSAs | grep msDS-RevealedDSAs | wc -l`
334 if [ $WORDS -ne 2 ]; then
335 echo Got $WORDS links for Administrator
341 if [ -d $release_dir ]; then
342 testit $RELEASE undump
343 testit "add_two_more_users" add_two_more_users
344 testit "add_four_more_links" add_four_more_links
345 testit "remove_one_link" remove_one_link
346 testit "remove_one_user" remove_one_user
347 testit "move_one_user" move_one_user
348 testit "add_dangling_link" add_dangling_link
349 testit "add_dangling_backlink" add_dangling_backlink
350 testit "add_deleted_dangling_backlink" add_deleted_dangling_backlink
351 testit "add_deleted_target_link" add_deleted_target_link
352 testit "add_deleted_target_backlink" add_deleted_target_backlink
353 testit "dbcheck_dangling" dbcheck_dangling
354 testit "dbcheck_clean" dbcheck_clean
355 testit "check_expected_after_deleted_links" check_expected_after_deleted_links
356 testit "check_expected_after_links" check_expected_after_links
357 testit "check_expected_after_objects" check_expected_after_objects
358 testit "dangling_one_way_link" dangling_one_way_link
359 testit "dbcheck_one_way" dbcheck_one_way
360 testit "dbcheck_clean2" dbcheck_clean
361 testit "dangling_one_way_dn" dangling_one_way_dn
362 testit "deleted_one_way_dn" deleted_one_way_dn
363 testit "dbcheck_clean3" dbcheck_clean
364 testit "add_dangling_multi_valued" add_dangling_multi_valued
365 testit "dbcheck_dangling_multi_valued" dbcheck_dangling_multi_valued
366 testit "dangling_multi_valued_check_missing" dangling_multi_valued_check_missing
367 testit "dangling_multi_valued_check_equal_or_too_many" dangling_multi_valued_check_equal_or_too_many
368 # Currently this cannot pass
369 testit "dbcheck_dangling_multi_valued_clean" dbcheck_clean
371 subunit_start_test $RELEASE
372 subunit_skip_test $RELEASE <<EOF
376 subunit_start_test "tombstones_expunge"
377 subunit_skip_test "tombstones_expunge" <<EOF
382 if [ -d $PREFIX_ABS/${RELEASE} ]; then
383 rm -fr $PREFIX_ABS/${RELEASE}