[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Need help/feedback on backup script



on Sat, Oct 28, 2000 at 10:49:16PM -0400, Jesse Goerz (jgoerz@linuxfreemail.com) wrote:
> I've created a backup script and would like some feedback/help on it.
> Any tips or pointers would be greatly appreciated.  Feel free to
> use/hack it on your own.

Comments inline.

Not bad, but not how I'd do things.

> here it is:
> 
> <-- Begin Script -->
> #!/bin/bash
> 
> # Many thanks to Robb Kidd who brought up the question of backup
> # strategies on the Debian-user mailing list and Karsten M. Self's
> # responses. This script wouldn't have been possible without them. :-)
> 
> 
> # To do list
> 	# I would like to make all the configuration
> 	# done in the variable section.  Let the script
> 	# remain the same; just update/change variables
> 	# as necessary.  That way anyone can use it.
> 
> 	# Need to read up on sed or awk so I can change
> 	# the "/" of the directories and change them
> 	# to "." for the saved tar's filename.
> 
> 	# Develop a system which allows tar to exclude files
> 	# based on choices made in the variable section.
> 	# This will have to be pretty flexible. This should
> 	# take care of the way the /usr/local section looks
> 	# right now.  :-(
> 
> 	# Would it be possible to create one base script
> 	# and then just loop through it with variables
> 	# controlling what is backed up and what is not?
> 	# Of course.  This is Linux. Study harder!
> 
> 	# Script to rebuild.
> 
> # My simple script for backing up files (it started that way, jeesh)
> 
> 	# Create variables
> 		# The root directory of the backed up files 
> 		# before you commit it to the backup media.
> 		# Note, this could be the media itself if you
> 		# don't use another program to put it there.
> 		# (i.e. Zip/tape drives vs. CD-R's)
>  		ARCHIVE_ROOT="/usr/local/cdsrc/backup"
> 
> 		# This is where you'll put the tar-zipped files.
> 		# I add this primarily for users who put files
> 		# in their backup other than what is covered in
> 		# this script.  (i.e. custom .deb files, etc.)
> 		# This way you can keep these files "seperate"
> 		# from the remainder of your backup volume. I
> 		# believe this really only helps debian users
> 		# who are making the media "apt-getable".
> 		BACKUP_DIR="$ARCHIVE_ROOT/backup"
> 
> 		# This is where you store your custom kernel.
> 		# Do not change this variable or comment it out
> 		# if you do not have a custom kernel.
> 		# The script tests against it being "not_set".
> 		# If you do not set this, the script will attempt
> 		# to grab the kernel from /usr/src/linux/.config
> 		# If you do have a custom kernel include the full
> 		# absolute path AND filename of the configuration file.
> 		CUSTOM_KER="not_set"
> 
> 		# Default tar options are -IPpscvf.  I recommend you
> 		# leave it in verbose (-v) mode at least the first time
> 		# through so you know it's doing what you want.  You can
> 		# find out exactly what the options are doing by typing
> 		# man tar at the prompt.  One weird thing I noticed about
> 		# tar; you need to keep the capital letter options first.
> 		# Keep that in mind if you edit this variable.
> 		TAR_OPT_DEF="-IPpscf"

I'd strongly encourage you *not* to use the -P (preserve paths) option,
and question the -I (bzip2) compression option, particularly when
archiving to tape.  A corrupted compressed file is going to be very
difficult to recover.  Not sure that -s matters.  I'd recommend using
long-name versions of the -P and -I options -- this makes the script
self-documenting.

> 		# The tar file suffix.  In case you want .tgz or .bzip2, etc.
> 		# Note: do not include a "." in front of the suffix (extentsion)
> 		TAR_FILE_SUF="bzip2"

...what about tar.bzip2?

> ############################################################################
> # Once this script is complete, people shouldn't have to configure anything#
> # below this point.                                                        #
> ############################################################################
> 
> 
> 	# Create "Test" variables.  These will be used in the
> 	# "Test script configuration" section.
> 		# If you add more variables ensure there is a
> 		# space between them. Testing to see if the
> 		# root and backup directories exist and are directories.
> 		DIR_VAR_LIST="$ARCHIVE_ROOT $BACKUP_DIR"
> 
> 		# Program variables (setting up for PROG_VAR_LIST)
> 		PROG_TAR=`which tar`
> 		PROG_GZIP=`which gzip`
> 		PROG_BZIP2=`which bzip2`
> 		PROG_TEST_NULL=
> 
> 			# So the variable list below works we need to set variables
> 			# to some value if they're not here, otherwise the output
> 			# of the for loop doesn't look right.
> 			if [ $PROG_TAR == $PROG_TEST_NULL ]; then
> 			PROG_TAR="tar"
> 			fi
> 	
> 			if [ $PROG_GZIP == $PROG_TEST_NULL ]; then
> 			PROG_GZIP="gzip"
> 			fi
> 	
> 			if [ $PROG_BZIP2 == $PROG_TEST_NULL ]; then
> 			PROG_BZIP2="bzip2"
> 			fi
> 
> 		# If you add more variables ensure there is a
> 		# space between them and you add an if statement
> 		# covering it like the ones above. Testing to see
> 		# if the programs needed are here.
> 		PROG_VAR_LIST="$PROG_TAR $PROG_GZIP $PROG_BZIP2"
> 
>  	# For future use, if I get around to it.
> 	# Would allow user to change backed up file's name, etc.
> 	#COPY_DIR="directory being copied"
> 	#COPY_DIR_FN="The aboves filename after back up"
> 
> 
> # Test script configuration
> 	echo ""
> 	echo "Testing script configuration..."	
> 
> 	for CURRENT_VAR in $DIR_VAR_LIST;
> 	do
> 		if [ -d $CURRENT_VAR ]; then
> 			echo "$CURRENT_VAR exists."
> 		else
> 			echo "$CURRENT_VAR does not exist."
> 			echo "There is a problem with the way your variables are configured."
> 			echo "Check your script configuration."
> 			exit 1
> 		fi
> 	done
> 	
> 	echo "Variable configuration seems to be OK.  All directories exist."
> 	echo ""
> 
> 	echo "Testing to see if needed programs are available..."
> 
> 	for CURRENT_VAR in $PROG_VAR_LIST;
> 	do
> 		if [ -e $CURRENT_VAR ]; then
> 			echo "$CURRENT_VAR exists."
> 		else
> 			echo ""
> 			echo "$CURRENT_VAR is not located on this system,"
> 			echo "could not be found, or is not in your path."
> 			echo "If you know the program is installed put it"
> 			echo "in your path, otherwise you can ignore this message."
> 			echo ""
> 		fi
> 	done	
> 
> 
> 	echo "Some programs are not required depending on how you"
> 	echo "configure this script. This message is meant to be"
> 	echo "informative in case you are having problems."
> 	echo ""
> 	echo "Done testing for programs."
> 
> 
> 
> # Backup the /home directory

I would create a loop to handle specific directory paths.  Makes the
script shorter, easier to modify, maintains integrity across sections.

> 	# Change to backup directory. I
> 	# keep all my backup files inside
> 	# a backup directory on the root
> 	# of the archive.
> 		cd $BACKUP_DIR
> 		tar $TAR_OPT_DEF home.$TAR_FILE_SUF /home
> 		echo '/home directory backed up!'	
> 
> 
> # Backup the /usr/local directory
> 
> 	# change to root directory
> 	cd $ARCHIVE_ROOT
> 
> 	# I keep my backup inside /usr/local
> 	# so I need to exclude the backup 
> 	# directory so I don't back it up twice
> 	# This creates a list of files tar will exclude
> 	find . * > excludelist
> 	tar -IPX excludelist -pscvf usr.local.$TAR_FILE_SUF /usr/local
> 
> 	# I like to keep all backup files together
> 	# Move usr.local.bzip2 and excludelist to backup directory
> 	cd $ARCHIVE_ROOT
> 	mv usr.local.$TAR_FILE_SUF $BACKUP_DIR/
> 	mv excludelist $BACKUP_DIR/
> 	echo '/usr/local directory backed up!'
> 
> 
> # Backup the /etc directory
> 
> 	# Haven't figured out how to incorporate
> 	# this one in yet. Need to do some studying.
> 	# I guess I could run the whole script as root
> 	# but would that affect permissions?  Shouldn't with
> 	# tar's -p option?  Maybe give a choice to su?
> 	# Don't want to su if I don't have to. Too much power.
> 
> 	# Change to backup directory
> 	#cd $BACKUP_DIR
> 	
> 	# Need to be root for permissions sake.
> 	# su  
> 	# tar $TAR_OPT_DEF etc.$TAR_FILE_SUF /etc
> 	# echo '/etc directory backed up!'
> 
> 
> # If it's Debian ;-> Backup dpkg's database of what's installed

Useful.  But somewhat orthogonal to the task of backing up filesystems.
I use /etc/cron.daily to back up specific system information -- package
selections (already indicated, BTW, under /var/lib/dpkg/status) might be
one option.  I keep my partition tables there as well.  Use your
filesystem backup script for backups.  Archive system state elsewhere.

> 
> 	if [ -e /etc/debian_version ]; then
> 	     	cd $BACKUP_DIR/
> 		echo -n "Getting copy of dpkg database..."
> 		dpkg --get-selections > dpkg.selections
> 		echo "Done"
> 	else
> 		echo "This doesn't appear to be a Debian system...8-("
> 		echo "Skipping dpkg --get-selections"
> 	fi
> 
> 
> # Backup kernel configuration 
> 
> 	# Change to backup directory
> 	cd $BACKUP_DIR
> 
> 	# Grab custom kernel if CUSTOM_KER doesn't equal not_set
> 	if [ $CUSTOM_KER != "not_set" ]; then
> 		echo -n "Getting copy of custom kernel config file..."
> 		cp $CUSTOM_KER kernel.custom.config
> 		echo "Done"
> 	# Grab default kernel configuration if CUSTOM_KER equals not_set
> 	elif [ -e /usr/src/linux/.config ]; then
> 		echo -n "Getting copy of kernel config file..."
> 		cp /usr/src/linux/.config kernel.custom.config
> 		echo "Done"
> 		echo 'CUSTOM_KER not set in script.  No custom kernel!?'
> 		echo 'You are not taking advantage of Linux like you could!'
> 	else
> 		echo "No kernel .config file found on your system!"
> 		echo "If you have a custom kernel or it's not located"
> 		echo "in /usr/src/linux then set the CUSTOM_KER variable"
> 		echo "in this script to back it up.  If you don't know"
> 		echo "what this is about, you don't need to worry."
> 		echo "Kernel .config file NOT backed up!"
> 	fi
> 
> 
> # Reminder to copy /etc as root. Plus you can just cut
> # and paste it from the console this way.
> 	echo ''
> 	echo ''
> 	echo '/etc directory not backed up! You need to be root!'
> 	echo "Please use the command:"
> 	echo " cd $BACKUP_DIR; tar $TAR_OPT_DEF etc.$TAR_FILE_SUF /etc"
> 
> 
> # Reminder about custom kernels
> 
> 	echo ""
> 	echo ""
> 	echo "Warning!"
> 	echo "Your kernel config file may need to be backed up"
> 	echo "to media other than your backup volume.  This is especially"
> 	echo "true if you backup to hardware you had to configure in the"
> 	echo "kernel during installation of your OS in order to use it."
> 	echo "A zip or tape drive would be an example."
> 	echo "Warning !"
> 	echo ""
> 	echo ""
> 
> <-- End Script -->
> 
> -- 
> Got freedom?
> http://www.debian.org
> 
> 
> -- 
> Unsubscribe?  mail -s unsubscribe debian-user-request@lists.debian.org < /dev/null
> 

-- 
Karsten M. Self <kmself@ix.netcom.com>     http://www.netcom.com/~kmself
 Evangelist, Opensales, Inc.                    http://www.opensales.org
  What part of "Gestalt" don't you understand?      There is no K5 cabal
   http://gestalt-system.sourceforge.net/        http://www.kuro5hin.org

Attachment: pgpV21KmRjxMu.pgp
Description: PGP signature


Reply to: