Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # Author: Jeffrey Vandenborne
- # Date: November 17, 2011
- # TODO: monitor whether snapshot size does the job well enough at <num>gb
- # FIX: path is now set
- PROFILE_FILES=(/etc/profile)
- for pfile in $PROFILE_FILES; do
- [ -f $pfile ] && {
- echo "Set environment variables: $pfile"
- . $pfile || exit 1
- }
- done
- RSYNC=$(which rsync)
- MOUNT=$(which mount)
- UMOUNT=$(which umount)
- LVCREATE=$(which lvcreate)
- LVREMOVE=$(which lvremove)
- GREP=$(which egrep)
- RSYNC_FLAGS="-a --delete"
- BACKUP_DIR=/backup/homes
- BDIR_IS_MOUNT=1
- BACKUPGROUP=backup
- SNAPSHOT_NAME=s_homes_bck
- SNAPSHOT_SIZE=16G
- VOL_GROUP=system
- SNAPSHOT_TARGET=home
- SNAPSHOT_DIR=/mnt/snap_home_bck
- USERS=$(egrep ^$BACKUPGROUP /etc/group | perl -pe 's/.*://g' | tr ',' ' ')
- # Make sure snapsnots are unmounted and removed upon completion of backup
- trap "cleanup; echo BACKUP END -- $(date); echo" EXIT
- trap "echo 'SIGINT/SIGTERM detected'; cleanup; echo 'TERMINATING -- '$(date); echo; kill -9 $$" SIGINT SIGTERM
- # Create snapshot for home volume
- create_snapshot() {
- $LVCREATE -L$SNAPSHOT_SIZE -s -n $SNAPSHOT_NAME /dev/$VOL_GROUP/$SNAPSHOT_TARGET
- [ $? -ne 0 ] && return 1
- if [[ ! -d "$SNAPSHOT_DIR" ]]; then
- mkdir "$SNAPSHOT_DIR" 2>/dev/null
- [ $? -ne 0 ] && return 1 || echo "$SNAPSHOT_DIR created!"
- else
- 1>&2 echo "Directory $SNAPSHOT_DIR exists, exiting"
- exit 1
- fi
- $MOUNT "/dev/$VOL_GROUP/$SNAPSHOT_NAME" "$SNAPSHOT_DIR"
- return $?
- }
- # Unmount and remove snapshot
- cleanup() {
- echo "Unmounting and removing snapshot volume: $SNAPSHOT_NAME"
- /bin/sync
- $UMOUNT "$SNAPSHOT_DIR"
- $LVREMOVE -f "/dev/$VOL_GROUP/$SNAPSHOT_NAME"
- rmdir "$SNAPSHOT_DIR" 2>/dev/null
- }
- [ -z "$USERS" ] && exit 0
- # Check wether the volume is mounted or not
- if [[ $BDIR_IS_MOUNT -eq 1 ]]; then
- if ! $MOUNT | $GREP -q "\W$BACKUP_DIR\W"; then
- 1>&2 echo "Volume is not mounted, exiting"
- exit 1
- fi
- else
- if [ ! -d $BACKUP_DIR ]; then
- 1>&2 echo "Backup dir doesnt exist"
- exit 1
- fi
- fi
- # Create a snapshot for data efficiency
- create_snapshot || {
- echo "Can't create snapshot"
- exit 1
- }
- echo "BACKUP START: $(date)"
- for user in $USERS; do
- [ ! -d $SNAPSHOT_DIR/$user ] && break
- # TODO: read backup exclude files located at $SNAPSHOT_DIR/$user/.backup.exclude
- # Every directory and file mentioned in this file will be ignored by rsync
- echo "BACKUP: $SNAPSHOT_DIR/$user"
- $RSYNC $RSYNC_FLAGS $SNAPSHOT_DIR/$user $BACKUP_DIR
- [ $? -eq 0 ] || echo "Backup for $user failed"
- done
- exit 0
Add Comment
Please, Sign In to add comment