source: trunk/mondo/mondo/restore-scripts/mondo/compare-me @ 274

Last change on this file since 274 was 274, checked in by bcornec, 13 years ago

merge -r272:273 $SVN_M/branches/2.06

  • Property svn:keywords set to Id
File size: 7.4 KB
Line 
1#!/bin/sh
2
3
4
5
6
7
8Dots() {
9    local i
10    i=0
11    while [ "$i" -le "$1" ] ; do
12    echo -n "."
13    i=$(($i+2))
14    done
15}
16
17
18GetSizeOfFile() {
19    if [ -f "$1" ] ; then
20    echo `du -sk "$1" | cut -f1`
21    elif [ ! -d "$1 " ] ; then
22    echo 0
23    else
24    echo 1
25    fi
26}
27
28
29
30
31GiveSliceName() {
32    echo -e -n "/mnt/cdrom/archives/slice-`printf "%07d" $1`.`printf "%05d" $2`.dat"
33}
34
35
36
37
38IsThisTheLastCD() {
39    if [ -f "/mnt/cdrom/archives/NOT-THE-LAST" ] ; then
40    echo "no"
41    else
42    echo "yes"
43    fi
44}
45
46
47
48CompareAllBigfiles() {
49    local bf_num finished retval wildpath
50    wildpath=$1
51    bf_num=0
52    finished=no
53    retval=0
54    LogIt "Comparing big files. Please wait." 1
55    > /tmp/biggiefiles.reassembled
56    while [ "$finished" != "yes" ] ; do
57        fname=`GiveSliceName $bf_num 0`
58        echo -n "Big file $bf_num "
59        if [ ! -f "$fname" ] ; then
60            echo -n "not found. "
61        LogIt "$bf_num's 1st slice ($fname) not found"
62            if [ "`IsThisTheLastCD`" = "no" ] ; then
63                cd_number=$(($cd_number+1))
64                LogIt "Perhaps it's on the next CD ($cd_number)." 1
65                insist-on-cd $cd_number
66            else
67                LogIt "This was the last CD. Bigfile reassembly complete." 1
68                finished=yes
69            fi
70        else
71            echo -e -n "found.\r"
72            CompareBigfile $bf_num $wildpath
73            if [ "$?" -ne "0" ] ; then
74               echo " failed."
75           LogIt "An error occurred while bigfile #bf_num was being compared."
76               retval=$(($retval+1))
77            else
78               echo -e -n " OK.     \r"
79            fi
80            bf_num=$(($bf_num+1))
81        fi
82    done
83    if [ "$retval" -eq "1" ] ; then
84        echo -n "One error"
85    elif [ "$retval" -eq "0" ] ; then
86        echo -n "No errors"
87    else
88        echo -n "$retval errors"
89    fi
90    echo " occurred during verification of big files."
91    LogIt "$retval errors occurred during verification of bigfiles"
92    return $retval
93}
94
95
96
97CompareBigfile() {
98    local bf_num fname stem outputfile tempstr new_cksum \
99padded_bfnum finalsize checksum i res last_i \
100slice_num slice_fname slice_search cd_number wildpath
101    bf_num=$1
102    wildpath=$2
103    slice_num=0
104    padded_bfnum=`printf "%07d" $bf_num`
105    slice_fname=`GiveSliceName $bf_num $slice_num`
106    checksum=`cut -f1 $slice_fname`
107#    finalsize=`cut -f2 $slice_fname`
108    i=`cut -f3 $slice_fname`
109    outputfile=/mnt/RESTORING/"$i"
110    echo -n "$i "
111
112    if [ "`echo "$outputfile" | grep "$wildpath"`" = "" ] ; then
113        echo -e -n " (Skipped) "
114        return 0
115    fi
116
117    new_cksum=`md5sum "$outputfile" | cut -d' ' -f1`
118    if [ "$new_cksum" != "$checksum" ] ; then
119        LogIt "Warning - $i does not match its checksum." 1
120        LogIt "new cksum = $new_cksum"
121    LogIt "old size = $finalsize"
122        LogIt "orig cksum= $checksum"
123        LogIt "new size = `GetSizeOfFile "$outputfile"`"
124        echo "$outputfile" >> /tmp/compare-me.log
125        return 1
126    else
127        echo "$outputfile" >> /tmp/biggiefiles.reassembled
128        return 0
129    fi
130}
131
132
133
134CompareTarballs() {
135    local cd_number archive_list i noof_files current_fileno \
136start_time end_time wildpath current_fileno percentage \
137time_taken time_per minutes seconds outcome res logs retval
138    cd_number=$1
139    wildpath=$2
140    insist-on-cd $cd_number
141    retval=0
142    archive_list=`find /mnt/cdrom/archives/*afio*`
143    if [ "$?" -eq "0" ] ; then
144    noof_files=`find /mnt/cdrom/archives/*afio* | grep -n "" | tail -n 1 | cut -d':' -f1`
145    current_fileno=0
146    start_time=`date +%s`
147    for archive in $archive_list ; do
148        current_fileno=$(($current_fileno+1))
149        percentage=$(($current_fileno*100/$noof_files))
150        time_taken=$((`date +%s`-$start_time))
151        time_per=$(($time_taken*10/$current_fileno))
152        files_remaining=$(($noof_files-$current_fileno))
153        time_remaining=$(($time_per*$files_remaining/10))
154        if [ "$current_fileno" -le "2" ] ; then
155        time_remaining="5999"
156        fi
157        minutes=$(($time_remaining/60))
158        seconds=$(($time_remaining%60))
159        if [ "$seconds" -lt "10" ] ; then
160        seconds="0"$seconds
161        fi
162        echo -n -e "CD #$cd_number `Dots $percentage` $percentage% ("$minutes":"$seconds" remaining)\r"
163        compare-subroutine-me $archive "$wildpath" &> /tmp/rsm.log
164        outcome=$?
165            retval=$(($retval+$outcome))
166        grep -v ignored /tmp/rsm.log > /tmp/rsm.2.log
167        if [ "$outcome" -ne "0" ] ; then
168        echo -e -n "                                                                            \r"
169        LogIt "Tar returned warnings/errors while verifying $archive."
170        cat /tmp/rsm.2.log
171        fi
172    done
173    sync
174    LogIt "CD #$cd_number's data has been verified." 3
175    else
176    noof_files=0
177    LogIt "I could find no archives on this CD. :-/" 3
178    fi
179    echo "Time taken: $(($time_taken/60))m $(($time_taken%60))s"
180    TOTAL_FILES=$(($TOTAL_FILES+$noof_files))
181    return $retval
182}
183
184
185
186ThisCDsNumber() {
187    if [ ! -f "/mnt/cdrom/archives/THIS-CD-NUMBER" ] ; then
188        echo "(absent)"
189    else
190        cat /mnt/cdrom/archives/THIS-CD-NUMBER
191    fi
192}
193
194
195
196
197# ------------------------- main ----------------------
198
199echo "DO NOT USE THIS SCRIPT"
200exit 0
201
202> /tmp/compare-me.log
203
204LogIt "compare-me --- starting"
205
206wildpath=""
207if [ "$#" -eq "0" ] ; then
208    LogIt "compare-me: comparing everything" 2
209elif [ "$#" -eq "1" ] ; then
210    wildpath=`echo "/$1*" | tr '/' '/' --squeeze-repeats | tr '*' '*' --squeeze-repeats`
211    wildpath=`echo "$wildpath" | cut -d'/' -f2-99`
212    LogIt "compare-me: comparing $wildpath" 2
213else
214    LogIt "compare-me <wildpath>" 1
215    exit 1
216fi
217
218if [ "`mount | grep "/mnt/RESTORING"`" = "" ] ; then
219    LogIt "Please run mount-me before you run compare-me." 1
220    exit 1
221fi
222
223if [ -e "/tmp/DO-NOT-VERIFY" ] ; then
224    LogIt "WTF are you doing, calling compare-me when verify is off?"
225    rm /tmp/DO-NOT-VERIFY -f
226    LogIt "Verify is now most definitely ON, thank you very much."
227else
228    LogIt " (verify is ON)"
229fi
230echo " (verify is ON)                 "
231
232done="no"
233cd_number=0
234totalflaws=0
235TOTAL_FILES=0
236while [ "$done" != "yes" ] ; do
237    cd_number=$(($cd_number+1))
238    insist-on-cd $cd_number
239    CompareTarballs $cd_number "$wildpath"
240    res=$?
241    totalflaws=$(($totalflaws+$res))
242    if [ "$res" -ne "0" ] ; then
243    LogIt "Warning - CD #$cd_number's tarballs differed from the filesystem." 1
244    fi
245    if [ "`IsThisTheLastCD`" = "yes" ] || [ "`find /mnt/cdrom/archives/slice* 2> /dev/null`" != "" ] ; then
246        done="yes"
247    fi
248done
249LogIt "Tarballs compared." 3
250
251CompareAllBigfiles "$wildpath"
252res=$?
253totalflaws=$(($totalflaws+$res))
254[ "$res" -eq "0" ] || LogIt "Warning - errors occurred during verification of bigfiles." 1
255
256LogIt "All archives have been compared." 1
257if [ "$totalflaws" -gt "0" ] ; then
258    LogIt "$totalflaws errors occurred." 1
259else
260    LogIt "Everything checked out. :-)" 1
261fi
262
263grep -v -x "Files [^:]*:-" /tmp/compare-me.log \
264| sort | uniq > /tmp/suspect.files
265
266noof_lines=`grep -n "" /tmp/suspect.files | tail -n 1 | cut -d':' -f1`
267if [ "$noof_lines" -gt "0" ] ; then
268    echo -e -n "$noof_lines changed/removed files"
269    if [ "$noof_lines" -gt "15" ] ; then
270        echo ": too many to list here."
271    else
272    echo ":-"
273    cat /tmp/suspect.files
274    fi
275    echo "See /tmp/suspect.files for a copy of the list."
276else
277    echo "No files were reported as changed."
278fi
279
280LogIt "$noof_lines changed/removed files"
281cat /tmp/suspect.files >> /var/log/mondo-restore.log
282
283LogIt "compare-me --- leaving"
284if [ "$totalflaws" -gt "0" ] ; then
285    exit $noof_lines
286else
287    exit 0
288fi
Note: See TracBrowser for help on using the repository browser.