summaryrefslogtreecommitdiffstats
path: root/abs/core-testing/LinHES-system/bin/backupcommon
diff options
context:
space:
mode:
authorJames Meyer <james.meyer@operamail.com>2008-11-07 15:14:01 (GMT)
committerJames Meyer <james.meyer@operamail.com>2008-11-07 15:14:01 (GMT)
commit4287d6026a61f8760633574c059f6e2dead2619d (patch)
tree58b2f78c08d5edcbf7e9cdf2b8a3862e73e8afd7 /abs/core-testing/LinHES-system/bin/backupcommon
parent724988f9137cdcaf078d5e88e7efec9e664b638e (diff)
downloadlinhes_pkgbuild-4287d6026a61f8760633574c059f6e2dead2619d.zip
linhes_pkgbuild-4287d6026a61f8760633574c059f6e2dead2619d.tar.gz
linhes_pkgbuild-4287d6026a61f8760633574c059f6e2dead2619d.tar.bz2
add the r5.5 backup/restore programs.
Diffstat (limited to 'abs/core-testing/LinHES-system/bin/backupcommon')
-rwxr-xr-xabs/core-testing/LinHES-system/bin/backupcommon317
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