tevent: version 0.9.35
[Samba.git] / testprogs / blackbox / dbcheck-links.sh
blob778edf002c90f09d4f637b1873178ff63141de67
1 #!/bin/sh
3 if [ $# -lt 1 ]; then
4 cat <<EOF
5 Usage: dbcheck-links.sh PREFIX RELEASE
6 EOF
7 exit 1;
8 fi
10 PREFIX_ABS="$1"
11 RELEASE="$2"
12 shift 2
14 . `dirname $0`/subunit.sh
16 . `dirname $0`/common-links.sh
18 dbcheck() {
19 tmpfile=$PREFIX_ABS/$RELEASE/expected-dbcheck-link-output${1}.txt.tmp
20 tmpldif1=$PREFIX_ABS/$RELEASE/expected-dbcheck-output${1}2.txt.tmp1
22 TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -s base -b '' | grep highestCommittedUSN > $tmpldif1
24 $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $3 --fix --yes > $tmpfile
25 if [ "$?" != "$2" ]; then
26 return 1
28 sort $tmpfile > $tmpfile.sorted
29 sort $release_dir/expected-dbcheck-link-output${1}.txt > $tmpfile.expected
30 diff -u $tmpfile.sorted $tmpfile.expected
31 if [ "$?" != "0" ]; then
32 return 1
35 tmpldif2=$PREFIX_ABS/$RELEASE/expected-dbcheck-output${1}2.txt.tmp2
36 TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -s base -b '' | grep highestCommittedUSN > $tmpldif2
38 diff -u $tmpldif1 $tmpldif2
39 if [ "$?" != "0" ]; then
40 return 1
44 dbcheck_dangling() {
45 dbcheck "" "1" ""
46 return $?
49 dbcheck_one_way() {
50 dbcheck "_one_way" "0" "CN=Configuration,DC=release-4-5-0-pre1,DC=samba,DC=corp"
51 return $?
54 dbcheck_clean() {
55 tmpldif1=$PREFIX_ABS/$RELEASE/expected-dbcheck-output2.txt.tmp1
57 TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -s base -b '' | grep highestCommittedUSN > $tmpldif1
59 $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb
60 if [ "$?" != "0" ]; then
61 return 1
63 tmpldif2=$PREFIX_ABS/$RELEASE/expected-dbcheck-output2.txt.tmp2
64 TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -s base -b '' | grep highestCommittedUSN > $tmpldif2
66 diff $tmpldif1 $tmpldif2
67 if [ "$?" != "0" ]; then
68 return 1
72 check_expected_after_links() {
73 tmpldif=$PREFIX_ABS/$RELEASE/expected-links-after-link-dbcheck.ldif.tmp
74 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
75 diff $tmpldif $release_dir/expected-links-after-link-dbcheck.ldif
76 if [ "$?" != "0" ]; then
77 return 1
81 check_expected_after_deleted_links() {
82 tmpldif=$PREFIX_ABS/$RELEASE/expected-deleted-links-after-link-dbcheck.ldif.tmp
83 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
84 diff $tmpldif $release_dir/expected-deleted-links-after-link-dbcheck.ldif
85 if [ "$?" != "0" ]; then
86 return 1
90 check_expected_after_objects() {
91 tmpldif=$PREFIX_ABS/$RELEASE/expected-objects-after-link-dbcheck.ldif.tmp
92 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
93 diff $tmpldif $release_dir/expected-objects-after-link-dbcheck.ldif
94 if [ "$?" != "0" ]; then
95 return 1
99 duplicate_member() {
100 # We use an exisiting group so we have a stable GUID in the
101 # dbcheck output
102 LDIF1=$(TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -b 'CN=Enterprise Admins,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp' -s base --reveal --extended-dn member)
103 DN=$(echo "${LDIF1}" | grep '^dn: ')
104 MSG=$(echo "${LDIF1}" | grep -v '^dn: ' | grep -v '^#' | grep -v '^$')
105 ldif=$PREFIX_ABS/${RELEASE}/duplicate-member-multi.ldif
107 echo "${DN}"
108 echo "changetype: modify"
109 echo "replace: member"
110 echo "${MSG}"
111 echo "${MSG}" | sed -e 's!RMD_LOCAL_USN=[1-9][0-9]*!RMD_LOCAL_USN=0!'
112 } > $ldif
114 TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif
115 if [ "$?" != "0" ]; then
116 return 1
120 dbcheck_duplicate_member() {
121 dbcheck "_duplicate_member" "1" ""
122 return $?
125 check_expected_after_duplicate_links() {
126 tmpldif=$PREFIX_ABS/$RELEASE/expected-duplicates-after-link-dbcheck.ldif.tmp
127 TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(|(cn=administrator)(cn=enterprise admins))' -s sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --sorted memberOf member > $tmpldif
128 diff $tmpldif $release_dir/expected-duplicates-after-link-dbcheck.ldif
129 if [ "$?" != "0" ]; then
130 return 1
134 forward_link_corruption() {
136 # Step1: add a duplicate forward link from
137 # "CN=Enterprise Admins" to "CN=Administrator"
139 LDIF1=$(TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -b 'CN=Enterprise Admins,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp' -s base --reveal --extended-dn member)
140 DN=$(echo "${LDIF1}" | grep '^dn: ')
141 MSG=$(echo "${LDIF1}" | grep -v '^dn: ' | grep -v '^#' | grep -v '^$')
142 ldif=$PREFIX_ABS/${RELEASE}/forward_link_corruption1.ldif
144 echo "${DN}"
145 echo "changetype: modify"
146 echo "replace: member"
147 echo "${MSG}"
148 echo "${MSG}" | sed -e 's!RMD_LOCAL_USN=[1-9][0-9]*!RMD_LOCAL_USN=0!'
149 } > $ldif
151 out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif)
152 if [ "$?" != "0" ]; then
153 echo "ldbmodify returned:\n$out"
154 return 1
158 # Step2: add user "dangling"
160 ldif=$PREFIX_ABS/${RELEASE}/forward_link_corruption2.ldif
161 cat > $ldif <<EOF
162 dn: CN=dangling,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp
163 changetype: add
164 objectclass: user
165 samaccountname: dangling
166 objectGUID: fd8a04ac-cea0-4921-b1a6-c173e1155c22
169 out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --relax $ldif)
170 if [ "$?" != "0" ]; then
171 echo "ldbmodify returned:\n$out"
172 return 1
176 # Step3: add a dangling backlink from
177 # "CN=dangling" to "CN=Enterprise Admins"
179 ldif=$PREFIX_ABS/${RELEASE}/forward_link_corruption3.ldif
181 echo "dn: CN=dangling,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp"
182 echo "changetype: modify"
183 echo "add: memberOf"
184 echo "memberOf: <GUID=304ad703-468b-465e-9787-470b3dfd7d75>;<SID=S-1-5-21-4177067393-1453636373-93818738-519>;CN=Enterprise Admins,CN=Users,DC=release-4-5-0-pre1,DC=samba,DC=corp"
185 } > $ldif
187 out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif)
188 if [ "$?" != "0" ]; then
189 echo "ldbmodify returned:\n$out"
190 return 1
194 dbcheck_forward_link_corruption() {
195 dbcheck "-forward-link-corruption" "1" ""
196 return $?
199 check_expected_after_dbcheck_forward_link_corruption() {
200 tmpldif=$PREFIX_ABS/$RELEASE/expected-after-dbcheck-forward-link-corruption.ldif.tmp
201 TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(|(cn=dangling)(cn=enterprise admins))' -s sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --sorted memberOf member > $tmpldif
202 diff $tmpldif $release_dir/expected-after-dbcheck-forward-link-corruption.ldif
203 if [ "$?" != "0" ]; then
204 return 1
208 dbcheck_dangling_multi_valued() {
210 $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --fix --yes
211 if [ "$?" != "1" ]; then
212 return 1
216 dangling_multi_valued_check_missing() {
217 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`
218 if [ $WORDS -ne 4 ]; then
219 echo Got only $WORDS links for dangling-multi2
220 return 1
222 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`
223 if [ $WORDS -ne 4 ]; then
224 echo Got only $WORDS links for dangling-multi3
225 return 1
229 dangling_multi_valued_check_equal_or_too_many() {
230 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`
231 if [ $WORDS -ne 4 ]; then
232 echo Got $WORDS links for dangling-multi1
233 return 1
236 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`
238 if [ $WORDS -ne 0 ]; then
239 echo Got $WORDS links for dangling-multi5
240 return 1
243 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`
245 if [ $WORDS -ne 2 ]; then
246 echo Got $WORDS links for Administrator
247 return 1
252 if [ -d $release_dir ]; then
253 testit $RELEASE undump
254 testit "add_two_more_users" add_two_more_users
255 testit "add_four_more_links" add_four_more_links
256 testit "remove_one_link" remove_one_link
257 testit "remove_one_user" remove_one_user
258 testit "move_one_user" move_one_user
259 testit "add_dangling_link" add_dangling_link
260 testit "add_dangling_backlink" add_dangling_backlink
261 testit "add_deleted_dangling_backlink" add_deleted_dangling_backlink
262 testit "revive_links_on_deleted_group" revive_links_on_deleted_group
263 testit "revive_backlink_on_deleted_group" revive_backlink_on_deleted_group
264 testit "add_deleted_target_link" add_deleted_target_link
265 testit "add_deleted_target_backlink" add_deleted_target_backlink
266 testit "dbcheck_dangling" dbcheck_dangling
267 testit "dbcheck_clean" dbcheck_clean
268 testit "check_expected_after_deleted_links" check_expected_after_deleted_links
269 testit "check_expected_after_links" check_expected_after_links
270 testit "check_expected_after_objects" check_expected_after_objects
271 testit "duplicate_member" duplicate_member
272 testit "dbcheck_duplicate_member" dbcheck_duplicate_member
273 testit "check_expected_after_duplicate_links" check_expected_after_duplicate_links
274 testit "duplicate_clean" dbcheck_clean
275 testit "forward_link_corruption" forward_link_corruption
276 testit "dbcheck_forward_link_corruption" dbcheck_forward_link_corruption
277 testit "check_expected_after_dbcheck_forward_link_corruption" check_expected_after_dbcheck_forward_link_corruption
278 testit "forward_link_corruption_clean" dbcheck_clean
279 testit "dangling_one_way_link" dangling_one_way_link
280 testit "dbcheck_one_way" dbcheck_one_way
281 testit "dbcheck_clean2" dbcheck_clean
282 testit "dangling_one_way_dn" dangling_one_way_dn
283 testit "deleted_one_way_dn" deleted_one_way_dn
284 testit "dbcheck_clean3" dbcheck_clean
285 testit "add_dangling_multi_valued" add_dangling_multi_valued
286 testit "dbcheck_dangling_multi_valued" dbcheck_dangling_multi_valued
287 testit "dangling_multi_valued_check_missing" dangling_multi_valued_check_missing
288 testit "dangling_multi_valued_check_equal_or_too_many" dangling_multi_valued_check_equal_or_too_many
289 # Currently this cannot pass
290 testit "dbcheck_dangling_multi_valued_clean" dbcheck_clean
291 else
292 subunit_start_test $RELEASE
293 subunit_skip_test $RELEASE <<EOF
294 no test provision
297 subunit_start_test "tombstones_expunge"
298 subunit_skip_test "tombstones_expunge" <<EOF
299 no test provision
303 if [ -d $PREFIX_ABS/${RELEASE} ]; then
304 rm -fr $PREFIX_ABS/${RELEASE}
307 exit $failed