208ec00dfc092b0bc67a3d758aff42b543683ce6
[samba.git] / testprogs / blackbox / dbcheck-links.sh
1 #!/bin/sh
2
3 if [ $# -lt 1 ]; then
4 cat <<EOF
5 Usage: dbcheck-links.sh PREFIX RELEASE
6 EOF
7 exit 1;
8 fi
9
10 PREFIX_ABS="$1"
11 RELEASE="$2"
12 shift 2
13
14 . `dirname $0`/subunit.sh
15
16 release_dir=`dirname $0`/../../source4/selftest/provisions/$RELEASE
17
18 ldbadd="ldbadd"
19 if [ -x "$BINDIR/ldbadd" ]; then
20     ldbadd="$BINDIR/ldbadd"
21 fi
22
23 ldbmodify="ldbmodify"
24 if [ -x "$BINDIR/ldbmodify" ]; then
25     ldbmodify="$BINDIR/ldbmodify"
26 fi
27
28 ldbdel="ldbdel"
29 if [ -x "$BINDIR/ldbdel" ]; then
30     ldbdel="$BINDIR/ldbdel"
31 fi
32
33 ldbsearch="ldbsearch"
34 if [ -x "$BINDIR/ldbsearch" ]; then
35     ldbsearch="$BINDIR/ldbsearch"
36 fi
37
38 ldbrename="ldbrename"
39 if [ -x "$BINDIR/ldbrename" ]; then
40     ldbrename="$BINDIR/ldbrename"
41 fi
42
43 undump() {
44        if test -x $BINDIR/tdbrestore;
45        then
46         `dirname $0`/../../source4/selftest/provisions/undump.sh $release_dir $PREFIX_ABS/$RELEASE $BINDIR/tdbrestore
47        else
48         `dirname $0`/../../source4/selftest/provisions/undump.sh $release_dir $PREFIX_ABS/$RELEASE
49        fi
50 }
51
52 dbcheck() {
53     tmpfile=$PREFIX_ABS/$RELEASE/expected-dbcheck-link-output${1}.txt.tmp
54     tmpldif1=$PREFIX_ABS/$RELEASE/expected-dbcheck-output${1}2.txt.tmp1
55
56     TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -s base -b '' | grep highestCommittedUSN > $tmpldif1
57
58     $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $3 --fix --yes > $tmpfile
59     if [ "$?" != "$2" ]; then
60         return 1
61     fi
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
66         return 1
67     fi
68
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
71
72     diff -u $tmpldif1 $tmpldif2
73     if [ "$?" != "0" ]; then
74         return 1
75     fi
76 }
77
78 dbcheck_dangling() {
79     dbcheck "" "1" ""
80     return $?
81 }
82
83 dbcheck_one_way() {
84     dbcheck "_one_way" "0" "CN=Configuration,DC=release-4-5-0-pre1,DC=samba,DC=corp"
85     return $?
86 }
87
88 dbcheck_clean() {
89     tmpldif1=$PREFIX_ABS/$RELEASE/expected-dbcheck-output2.txt.tmp1
90
91     TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -s base -b '' | grep highestCommittedUSN > $tmpldif1
92
93     $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb
94     if [ "$?" != "0" ]; then
95         return 1
96     fi
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
99
100     diff $tmpldif1 $tmpldif2
101     if [ "$?" != "0" ]; then
102         return 1
103     fi
104 }
105
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
110         return 1
111     fi
112
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
116         return 1
117     fi
118
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
122         return 1
123     fi
124 }
125
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
130         return 1
131     fi
132
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
136         return 1
137     fi
138 }
139
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
144         return 1
145     fi
146
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
150         return 1
151     fi
152 }
153
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
158         return 1
159     fi
160
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
164         return 1
165     fi
166 }
167
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
172         return 1
173     fi
174 }
175
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
180         return 1
181     fi
182 }
183
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
188         return 1
189     fi
190 }
191
192 remove_one_link() {
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
196         return 1
197     fi
198 }
199
200 remove_one_user() {
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
204         return 1
205     fi
206 }
207
208 move_one_user() {
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
211         return 1
212     fi
213 }
214
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
220         return 1
221     fi
222 }
223
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
229         return 1
230     fi
231 }
232
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
238         return 1
239     fi
240 }
241
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
246         return 1
247     fi
248 }
249
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
254         return 1
255     fi
256 }
257
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
262         return 1
263     fi
264 }
265
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
275         return 1
276     fi
277
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
281         return 1
282     fi
283
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
287         return 1
288     fi
289
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
293         return 1
294     fi
295 }
296
297 dbcheck_dangling_multi_valued() {
298
299     $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --fix --yes
300     if [ "$?" != "1" ]; then
301         return 1
302     fi
303 }
304
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
309         return 1
310     fi
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
314         return 1
315     fi
316 }
317
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
322         return 1
323     fi
324
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`
326
327     if [ $WORDS -ne 0 ]; then
328         echo Got $WORDS links for dangling-multi5
329         return 1
330     fi
331
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`
333
334     if [ $WORDS -ne 2 ]; then
335         echo Got $WORDS links for Administrator
336         return 1
337     fi
338 }
339
340
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
370 else
371     subunit_start_test $RELEASE
372     subunit_skip_test $RELEASE <<EOF
373 no test provision
374 EOF
375
376     subunit_start_test "tombstones_expunge"
377     subunit_skip_test "tombstones_expunge" <<EOF
378 no test provision
379 EOF
380 fi
381
382 if [ -d $PREFIX_ABS/${RELEASE} ]; then
383     rm -fr $PREFIX_ABS/${RELEASE}
384 fi
385
386 exit $failed