test: dbwrap_tool requires --persistent for the registry now
[amitay/samba.git] / source3 / script / tests / test_registry_upgrade.sh
1 #!/bin/sh
2 #
3 # Test for registry upgrades.
4 #
5 # Copyright (C) 2011 Björn Baumbach <bb@sernet.de>
6
7 if [ $# -lt 2 ]; then
8     echo "Usage: test_registry_upgrade.sh NET DBWRAP_TOOL"
9     exit 1
10 fi
11
12 SCRIPT_DIR=$(dirname $0)
13 BASE_DIR="${SCRIPT_DIR}/../../.."
14
15 NET="$1"
16 DBWRAP_TOOL="$2 --persistent"
17 DATADIR="${BASE_DIR}/testdata/samba3"
18 WORKSPACE="${PREFIX}/registry_upgrade"
19 CONFIG_FILE="${WORKSPACE}/smb.conf"
20 CONFIGURATION="--configfile=${CONFIG_FILE}"
21
22 NETCMD="$NET $CONFIGURATION"
23
24 incdir="${BASE_DIR}/testprogs/blackbox"
25 . $incdir/subunit.sh
26
27 failed=0
28
29 REGPATH="HKLM\Software\Samba"
30
31 LOGDIR_PREFIX="registry_upgrade"
32
33 registry_check()
34 (
35     CHECKNO="$1"
36     CHECKDIFF="$2"
37     REGVER=""
38     ALLOWEDERR="INFO: version =|Check database:|overwrite registry format version 0 with 1|no INFO/version found"
39
40     test "x$CHECKNO" = "x0" && {
41         REGVER="--reg-version=1"
42     }
43
44     echo "Registry check $CHECKNO" | tee -a $LOG
45     CHECK="$($NETCMD registry check $REGVER 2>&1)"
46     RC=$?
47
48     ERRORSTR="$(echo "$CHECK" | grep -vE $ALLOWEDERR )"
49     test "x$RC" = "x0" || {
50         echo "upgrade check $CHECKNO failed:" | tee -a $LOG
51         return 1
52     }
53
54     test "x$ERRORSTR" = "x" || {
55         echo "upgrade check $CHECKNO failed:" | tee -a $LOG
56         echo "reason: $CHECK" | tee -a $LOG
57         return 1
58     }
59
60     test "x$CHECKDIFF" = "xcheckdiff" && {
61         $NETCMD registry export 'HKLM' $WORKSPACE/export_${CHECKNO}.reg >> $LOG
62         test "x$?" = "x0" || {
63             echo "Error: 'net registry export HKLM' failed" | tee -a $LOG
64         }
65
66         diff -q $WORKSPACE/export_0.reg $WORKSPACE/export_${CHECKNO}.reg >> $LOG
67         test "x$?" = "x0" || {
68             echo "Error: $WORKSPACE/export_0.reg differs from $WORKSPACE/export_${CHECKNO}.reg" | tee -a  $LOG
69             return 1
70         }
71     }
72
73     return 0
74 )
75
76 registry_upgrade()
77 {
78     echo registry_upgrade $1 | tee -a $LOG
79
80     cp -v $DATADIR/registry.tdb $WORKSPACE/registry.tdb >> $LOG 2>&1
81
82     REGISTRY="${WORKSPACE}/registry.tdb"
83
84     test -e $REGISTRY || {
85         echo "Error: Database file not available" | tee -a $LOG
86         return 1
87     }
88
89     # create config file
90     echo '[global]' > ${CONFIG_FILE}
91     echo "      state directory = ${WORKSPACE}" >> ${CONFIG_FILE}
92
93     # set database INFO/version to 1
94     #$DBWRAP_TOOL $REGISTRY store 'INFO/version' uint32 1
95     #test "x$?" = "x0" || {
96     #    echo "Error: Can not set INFO/version" >> $LOG
97     #    return 1
98     #}
99
100     # check original registry.tdb
101     echo "$REGISTRY" | tee -a $LOG
102     registry_check 0
103     test "x$?" = "x0" || {
104         echo "Error: initial 'registry_check 0' failed" | tee -a $LOG
105         return 1
106     }
107
108     # trigger upgrade
109     echo "$NETCMD registry enumerate $REGPATH" >> $LOG
110     $NETCMD registry enumerate $REGPATH >> $LOG
111     test "x$?" = "x0" || {
112         echo "Error: 'net registry enumerate $REGPATH' failed" | tee -a $LOG
113         return 1
114     }
115
116     # check upgraded database
117     registry_check 1
118     test "x$?" = "x0" || {
119         echo "Error: 'registry_check 1' after upgrade failed" | tee -a $LOG
120         return 1
121     }
122
123     # export database for diffs
124     $NETCMD registry export 'HKLM' $WORKSPACE/export_0.reg | tee -a $LOG
125     test "x$?" = "x0" || {
126         echo "Error 'net registry export' failed" | tee -a $LOG
127         return 1
128     }
129
130     # remove version string
131     $DBWRAP_TOOL $REGISTRY delete INFO/version | tee -a $LOG
132     test "x$?" = "x0" || {
133         echo "Error: Can not remove INFO/version key from registry" | tee -a $LOG
134         return 1
135     }
136
137     # trigger upgrade on upgraded database
138     echo "$NETCMD registry enumerate $REGPATH" >> $LOG
139     $NETCMD registry enumerate $REGPATH >> $LOG 2>&1
140     test "x$?" = "x0" || {
141         echo "Error: 'net registry enumerate $REGPATH' failed" | tee -a $LOG
142         return 1
143     }
144
145     # check upgraded database again
146     registry_check 2 checkdiff
147     test "x$?" = "x0" || {
148         echo "Error: 'registry_check 2' after upgrade failed" | tee -a $LOG
149         return 1
150     }
151
152     # set database INFO/version to version 2
153     $DBWRAP_TOOL $REGISTRY store 'INFO/version' uint32 2
154     test "x$?" = "x0" || {
155         echo "Error: Can not set INFO/version" | tee -a $LOG
156         return 1
157     }
158
159     # trigger upgrade
160     $NETCMD registry enumerate $REGPATH >> $LOG
161     test "x$?" = "x0" || {
162         echo "Error: 'net registry enumerate $REGPATH' failed" | tee -a $LOG
163         return 1
164     }
165
166     # check upgraded database again
167     registry_check 3 checkdiff
168     test "x$?" = "x0" || {
169         echo "Error: 'registry_check 3' after upgrade failed" | tee -a $LOG
170         return 1
171     }
172 }
173
174 # remove old logs
175 for OLDDIR in $(find ${PREFIX} -type d -name "${LOGDIR_PREFIX}_*") ; do
176         echo "removing old directory ${OLDDIR}"
177         rm -rf ${OLDDIR}
178 done
179
180 # remove old workspace
181 rm -rf $WORKSPACE
182
183 mkdir $WORKSPACE
184
185 DIR=$(mktemp -d ${PREFIX}/${LOGDIR_PREFIX}_XXXXXX)
186 LOG=$DIR/log
187
188 testit "registry_upgrade" registry_upgrade || failed=`expr $failed + 1`
189
190 if [ $failed -eq 0 ]; then
191     rm -r $DIR
192 fi
193
194 testok $0 $failed
195