diff options
Diffstat (limited to 'abs/core-testing/LinHES-system/bin/backupcommon')
-rwxr-xr-x | abs/core-testing/LinHES-system/bin/backupcommon | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/abs/core-testing/LinHES-system/bin/backupcommon b/abs/core-testing/LinHES-system/bin/backupcommon new file mode 100755 index 0000000..a5ed7c0 --- /dev/null +++ b/abs/core-testing/LinHES-system/bin/backupcommon @@ -0,0 +1,317 @@ +#!/bin/bash + +#---------------------------------------------------------------------------- +DATABASE="mythconverg" +DATABASE_DIR="/var/lib/mysql/$DATABASE" +BACKUP_LIST="./root ./home ./etc + ./var/www/mythweb/.htaccess ./var/lib/alsa/asound.state" +RESTORE_LIST="./root ./home ./etc/mythtv/modules ./etc/lirc ./etc/htdigest + ./etc/apache2/apache2.conf ./var/www/mythweb/.htaccess + ./etc/X11/xorg.conf ./etc/asound.conf ./etc/default/aumix + ./var/lib/alsa/asound.state ./etc/mplayer/mplayer.conf + ./etc/localtime ./etc/timezone" +# Both BLACK_LIST and IGNORE_LIST need to have only one file per line +# They also can't have any extra whitespace... +# Files and directories we should refuse to restore +BLACK_LIST='./etc/fstab +./etc/modules +./proc +./dev +./lib +./var/lib +./myth +./myth/backup +./home/mythtv/.my.cnf +./root/.my.cnf +./home/mythtv/.Xauthority +./root/.Xauthority' +# Files we ignore as differences +IGNORE_LIST='./home/mythtv/.upgrade +./home/mythtv/.configure +./home/mythtv/.newcard +./home/mythtv/.xscreensaver +./home/mythtv/appletrailer.xml +./root/ati-driver-installer-8-01-x86.x86_64.run +./root/ati-driver-installer-8-3-x86.x86_64.run +./root/mythstreamweb.tar +./home/mythtv/.Xauthority +./root/.Xauthority' +BACKUP_DIR="/myth/backup" +BACKUP_EXTRAS="$BACKUP_DIR/backup.list" +RESTORE_EXTRAS="$BACKUP_DIR/restore.list" +BACKUP_TAR="$BACKUP_DIR/savedfiles.tar" +BACKUP_SQL="$BACKUP_DIR/$DATABASE.sql" +DROP_SQL="/usr/local/share/knoppmyth/drop.sql" +# Do we really still need to update from myth-0.11 to myth-0.12 ? +UPDATE_SQL="/usr/share/mythtv/sql/0.11-to-0.12.sql" +UPDATE_FILES="/usr/local/bin/restore_fixups.sh" +COMPRESSION=".gz" +SOUNDS="/usr/share/sounds" +PLAYER="/usr/bin/aplay" +#---------------------------------------------------------------------------- + +play_sound () { + ($PLAYER $SOUNDS/$1 >& /dev/null)& +} + +# Filter against an exclude list like the black list or the ignore list above +filter_list () { + /bin/grep -vxF "$*" | + /usr/bin/sort -u +} + +# Some people just can't read or follow directions... :-/ +# This should track the directory names in the default backup list above +# We also use this to short circuit a certain incredibly dumb stunt +filter_redundant () { + filter_list "$(echo $BACKUP_LIST ./myth | /usr/bin/tr -s ' ' '\n')" | + /bin/egrep -v '^\./(root|home|etc|myth)/' | + /usr/bin/sort -u +} + +get_extras () { + # One entry per line, and normalize the prefix + /usr/bin/tr ' ' '\n' <"$1" | + /usr/bin/awk '/^$/ {next} + /^\.\// {print $0 ; next} + /^\// {print "." $0 ; next} + { print "./" $0}' +} + +[ -f "$BACKUP_EXTRAS" ] && + BACKUP_LIST="$BACKUP_LIST $(get_extras $BACKUP_EXTRAS | + filter_redundant)" + +[ -f "$RESTORE_EXTRAS" ] && + RESTORE_LIST="$RESTORE_LIST $(get_extras $RESTORE_EXTRAS | + filter_list "$BLACK_LIST")" + +# Build tar exclusion parameters out of $BLACK_LIST +EXCLUSION="" +case $0 in +*restore) + for file in $BLACK_LIST ; do + EXCLUSION="$EXCLUSION --exclude $file " + done + ;; +*) + ;; +esac + +shrink () { + case "$COMPRESSION" in + .gz) + /bin/gzip -9 "$@" + ;; + .bz2) + /bin/bzip2 -9 "$@" + ;; + *) + ;; + esac +} + +expand () { + case "$*" in + *.gz) + /bin/gunzip "$@" + ;; + *.bz2) + /bin/bunzip2 "$@" + ;; + -c\ *) + /bin/cat $2 /dev/null + ;; + -t\ *) + return 0 + ;; + *) + echo 1>&2 "Error, unknown file type!" + return 1 + ;; + esac +} + +single_format () { + candidates=$(/bin/ls -1 "$1.gz" "$1.bz2" "$1" 2>/dev/null) + case $(echo "$candidates" | /usr/bin/wc -l) in + 1) return 0 # One is good! + ;; + 0) echo "Error, no $1 found!" + return 1 + ;; + *) echo "Warning, multiple formats for $1 found!" + echo "Candidates are: $candidates" + ;; + esac +} + +compression_type () { + for compression in .gz .bz2 "" ; do + if [ -f "$1$compression" ] ; then + echo "$compression" + return 0 + fi + done + return 1 +} + +backup_roller () { # Gets the rollover sequence to use. + prev_i=$1 ; shift + for i in "$@" ; do + for c in .gz .bz2 "" ; do + for f in $BACKUP_SQL $BACKUP_TAR ; do + /bin/rm -f $f$c$prev_i + if [ -f "$f$c$i" ] ; then + echo "Moving $f$c$i to $f$c$prev_i" + /bin/mv -f $f$c$i $f$c$prev_i + fi + done + done + prev_i="$i" + done +} + +# Given "subset A B" return true if is A a subset of B +subset () { + cnt=$(/usr/bin/diff $1 $2 | /bin/grep '^<' | /usr/bin/wc -l) + [ "$cnt" -eq 0 ] && return 0 + /usr/bin/diff $1 $2 +} + +mysql_cmd () { + /usr/bin/mysql -u root $DATABASE -sBe "$*" +} + +mysql_stdin () { + /usr/bin/mysql -u root $DATABASE -sB +} + +check_files () { + OBJECT_LIST="$*" + LIVE_FILES=/tmp/live_files_$$ + SAVED_FILES=/tmp/saved_files_$$ + + echo "Checking for the existance of the backup tar file..." + single_format "$BACKUP_TAR" + c=$(compression_type "$BACKUP_TAR") || + { echo "Error, missing tar file - '$BACKUP_TAR$c'." ; return 1 ; } + echo "Using file $BACKUP_TAR$c" + echo "Backup tar file exists. Checking the compression..." + expand -t $BACKUP_TAR$c || + { echo "Error, bad compressed tarball - '$BACKUP_TAR$c'." ; return 1 ; } + echo "Compression looks OK. Checking backup tar file contents..." + + echo "Generating a list of the backup contents..." + { + expand -c $BACKUP_TAR$c | + /bin/tar tf - $OBJECT_LIST $EXCLUSION | + /bin/sed '/\/$/s///' | + filter_list "$IGNORE_LIST" >$SAVED_FILES + } 2>&1 | /bin/sed -e '/Error exit delayed from previous errors/d' + + echo "Generating a list of the directory contents..." + cd / + /usr/bin/find $OBJECT_LIST \( -type d -or -type f -or -type l \) -print | + filter_list "$IGNORE_LIST" >$LIVE_FILES + + echo "Comparing directory versus backup contents..." + case $0 in + *backup) # backup must contain everything selected from the directories + subset $LIVE_FILES $SAVED_FILES + ;; + *restore) # directories must contain everything selected from the backup + subset $SAVED_FILES $LIVE_FILES + ;; + *) + /usr/bin/diff $LIVE_FILES $SAVED_FILES + ;; + esac + FILE_STATUS=$? + /bin/rm $LIVE_FILES $SAVED_FILES + if [ $FILE_STATUS -eq 0 ] ; then + echo "Live and saved file lists match." + else + echo "Warning, file lists are not identical!" + fi + return $FILE_STATUS +} + +has_records () { + filename="$1" + description="$2" + if [ $(/usr/bin/wc -l < "$filename") -eq 0 ] ; then + echo "Warning, could not get record counts from $description!" + return 1 + fi + if [ $(/usr/bin/awk '{cnt+=$2} END {print cnt}' < "$filename") -eq 0 ] ; then + echo "Warning, total record count from $description is zero!" + return 1 + fi + return 0 +} + +check_tables () { + LIVE_TABLES=/tmp/live_tables_$$ + SAVED_TABLES=/tmp/saved_tables_$$ + + echo "Checking for the existance of the DB dump file..." + single_format "$BACKUP_SQL" + c=$(compression_type "$BACKUP_SQL") || + { echo "Error, missing DB dump - '$BACKUP_SQL$c'" ; return 1 ; } + echo "Using file $BACKUP_SQL$c" + echo "DB dump file exists. Checking the compression..." + expand -t $BACKUP_SQL$c || + { echo "Error, bad compressed DB dump - '$BACKUP_SQL$c'." ; return 1 ; } + echo "Compression looks OK. Checking DB dump contents..." + + echo "Generating a list of tables and record counts in the DB dump..." + expand -c "$BACKUP_SQL$c" | + /usr/bin/awk '/CREATE TABLE/ { tbl = $3; gsub("`","",tbl); records[tbl] = 0; } \ + /INSERT INTO/ { tbl = $3; gsub("`","",tbl); \ + n = split(substr($0,index($0,"VALUES (")+7),vals,"\\),\\("); \ + records[tbl] += n; } \ + END { for (tbl in records) print tbl, records[tbl]; }' | + /bin/sed 's/mythlog [0-9]*/mythlog 0/' | + /usr/bin/sort >$SAVED_TABLES + has_records "$SAVED_TABLES" "DB dump" || return 1 + + echo "Generating a list of tables and record counts in the live DB..." + for tbl in $(mysql_cmd "show tables") ; do + mysql_cmd "select '$tbl', count(*) from $tbl" + done | + /usr/bin/tr -s '\t' ' ' | + /bin/sed 's/mythlog [0-9]*/mythlog 0/' | + /usr/bin/sort >$LIVE_TABLES + has_records "$LIVE_TABLES" "live DB" || return 1 + + echo "Comparing live versus saved tables..." + case $0 in + *restore) # database must include everything from the backup + subset $SAVED_TABLES $LIVE_TABLES + ;; + *) # backup must exactly match the database + /usr/bin/diff $LIVE_TABLES $SAVED_TABLES + ;; + esac + TABLE_STATUS=$? + /bin/rm $LIVE_TABLES $SAVED_TABLES + if [ $TABLE_STATUS -eq 0 ] ; then + echo "Live and saved table lists match." + else + echo "Warning, table lists are not identical!" + fi + return $TABLE_STATUS +} + +check_files_and_tables () { + STATUS=0 + echo + check_files "$@" || STATUS=1 + echo + check_tables || STATUS=1 + echo + return $STATUS +} + +true # Make sure that this shows success |