mirror of https://github.com/nirenjan/dotfiles.git
				
				
				
			Add backup script to copy folder contents
Folder contents can be either tarred and gzipped or saved to a git repository. The default configuration is to use git and tags every time the backup is made, even if there were no commits.master
							parent
							
								
									b076b2ed23
								
							
						
					
					
						commit
						73e53323da
					
				| 
						 | 
				
			
			@ -0,0 +1,202 @@
 | 
			
		|||
#!/bin/bash
 | 
			
		||||
# Script to backup folders to either a tarball or a Git repository
 | 
			
		||||
# Script expects to run at most on a daily basis. Any faster, and you risk
 | 
			
		||||
# overwriting a previous backup.
 | 
			
		||||
 | 
			
		||||
# Default environment variables used
 | 
			
		||||
BACKUP_METHOD=git
 | 
			
		||||
BACKUP_TS=$(date +%F)
 | 
			
		||||
BACKUP_DEBUG=false
 | 
			
		||||
BACKUP_SRC=''
 | 
			
		||||
BACKUP_DST=''
 | 
			
		||||
BACKUP_DB=''
 | 
			
		||||
 | 
			
		||||
APP=$(basename $0)
 | 
			
		||||
 | 
			
		||||
# Usage function will display the usage
 | 
			
		||||
usage()
 | 
			
		||||
{
 | 
			
		||||
    local backup=$APP
 | 
			
		||||
    local exit_code=$1
 | 
			
		||||
 | 
			
		||||
    [[ -z $exit_code ]] && exit_code=0
 | 
			
		||||
 | 
			
		||||
    echo "Usage: $backup [options] <source path>"
 | 
			
		||||
    echo "Options:"
 | 
			
		||||
    echo "    -s tar    Save to a tarball, format is backup-%Y-%m-%d.tar.gz"
 | 
			
		||||
    echo "              This is the default."
 | 
			
		||||
    echo "    -s git    Save to a git repository and tag the commit"
 | 
			
		||||
    echo
 | 
			
		||||
    echo "    -t <dst>  Specify the path to save the backup to. If omitted,"
 | 
			
		||||
    echo "              it defaults to ~/backups/\$(basename <src>)"
 | 
			
		||||
    echo
 | 
			
		||||
    echo "    -d <db>   Specify a MySQL database to backup in addition to"
 | 
			
		||||
    echo "              the files in the source path. This requires you to"
 | 
			
		||||
    echo "              save the MySQL root password in ~/.my.cnf"
 | 
			
		||||
    echo
 | 
			
		||||
    echo "    -h        Display this help message"
 | 
			
		||||
 | 
			
		||||
    exit $exit_code
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Die function will print the error message to stderr and abort the script
 | 
			
		||||
die()
 | 
			
		||||
{
 | 
			
		||||
    local exit_code=$1
 | 
			
		||||
    local backup=$APP
 | 
			
		||||
    shift
 | 
			
		||||
 | 
			
		||||
    for msg in "$@"
 | 
			
		||||
    do
 | 
			
		||||
        echo -e "$backup: $msg" >&2
 | 
			
		||||
    done
 | 
			
		||||
 | 
			
		||||
    exit $exit_code
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Sanity check
 | 
			
		||||
backup_sanity()
 | 
			
		||||
{
 | 
			
		||||
    if [[ -z $BACKUP_SRC ]]
 | 
			
		||||
    then
 | 
			
		||||
        die 1 "Need to specify a source"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Run basic sanity checks on env variables
 | 
			
		||||
    if [[ -z $BACKUP_DST ]]
 | 
			
		||||
    then
 | 
			
		||||
        BACKUP_DST=$HOME/backups/$(basename $BACKUP_SRC)
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    mkdir -p $BACKUP_DST
 | 
			
		||||
    if [[ $? != 0 ]]
 | 
			
		||||
    then
 | 
			
		||||
        die 2 "Error creating backup folder"
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Retrieve data using rsync
 | 
			
		||||
backup_data()
 | 
			
		||||
{
 | 
			
		||||
    # Don't rsync if we are using tar as the backup method
 | 
			
		||||
    if [[ "$BACKUP_METHOD" != "tar" ]]
 | 
			
		||||
    then
 | 
			
		||||
        rsync -a $BACKUP_SRC $BACKUP_DST
 | 
			
		||||
 | 
			
		||||
        if [[ $? != 0 ]]
 | 
			
		||||
        then
 | 
			
		||||
            die 2 "Error syncing data from source $BACKUP_SRC"
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Backup the database
 | 
			
		||||
backup_db()
 | 
			
		||||
{
 | 
			
		||||
    if [[ ! -z $BACKUP_DB ]]
 | 
			
		||||
    then
 | 
			
		||||
        # Dump using mysqldump
 | 
			
		||||
        mysqldump -u root $BACKUP_DB >$BACKUP_DST/$BACKUP_DB.sql 2>/dev/null
 | 
			
		||||
 | 
			
		||||
        if [[ $? != 0 ]]
 | 
			
		||||
        then
 | 
			
		||||
            die 2 "Error dumping database $BACKUP_DB"
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Save the files to git repo or tarball
 | 
			
		||||
backup_save()
 | 
			
		||||
{
 | 
			
		||||
    if [[ "$BACKUP_METHOD" == "tar" ]]
 | 
			
		||||
    then
 | 
			
		||||
        cd $BACKUP_SRC
 | 
			
		||||
        local daily=$BACKUP_DST/backup-daily-$BACKUP_TS.tar.gz
 | 
			
		||||
        tar czf $daily .
 | 
			
		||||
 | 
			
		||||
        # Weekly tarballs every Sunday
 | 
			
		||||
        if [[ $(date +%w) == "0" ]]
 | 
			
		||||
        then
 | 
			
		||||
            local weekly=$BACKUP_DST/backup-weekly-$(date +%Y-%U).tar.gz
 | 
			
		||||
            ln $daily $weekly
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        # Monthly tarballs on the first of every month
 | 
			
		||||
        if [[ $(date +%-d) == "1" ]]
 | 
			
		||||
        then
 | 
			
		||||
            local monthly=$BACKUP_DST/backup-monthly-$(date +%Y-%m).tar.gz
 | 
			
		||||
            ln $daily $monthly
 | 
			
		||||
        fi
 | 
			
		||||
    else
 | 
			
		||||
        cd $BACKUP_DST
 | 
			
		||||
        git init -q
 | 
			
		||||
        git config core.safecrlf false
 | 
			
		||||
        git add .
 | 
			
		||||
        git commit -m "Backup of $BACKUP_SRC on $BACKUP_TS"
 | 
			
		||||
        git tag -am "Daily ($BACKUP_TS) backup of $BACKUP_SRC" daily-$BACKUP_TS
 | 
			
		||||
 | 
			
		||||
        # Weekly tags every Sunday
 | 
			
		||||
        if [[ $(date +%w) == "0" ]]
 | 
			
		||||
        then
 | 
			
		||||
            local week=$(date +%Y-%U)
 | 
			
		||||
            git tag -am "Weekly ($week) backup of $BACKUP_SRC" weekly-$week
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        # Monthly tags on the first of every month
 | 
			
		||||
        if [[ $(date +%-d) == "1" ]]
 | 
			
		||||
        then
 | 
			
		||||
            local month=$(date +%Y-%m)
 | 
			
		||||
            git tag -am "Monthly ($month) backup of $BACKUP_SRC" monthly-$month
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
while getopts :hs:t:d: OPTION
 | 
			
		||||
do
 | 
			
		||||
    case $OPTION in
 | 
			
		||||
    h)
 | 
			
		||||
        # Help
 | 
			
		||||
        usage 0
 | 
			
		||||
        ;;
 | 
			
		||||
 | 
			
		||||
    s)
 | 
			
		||||
        # Backup method
 | 
			
		||||
        if [[ "$OPTARG" == "git" || "$OPTARG" == "tar" ]]
 | 
			
		||||
        then
 | 
			
		||||
            BACKUP_METHOD=$OPTARG
 | 
			
		||||
        else
 | 
			
		||||
            die 1 "Backup method must be one of git or tar"
 | 
			
		||||
        fi
 | 
			
		||||
        ;;
 | 
			
		||||
    t)
 | 
			
		||||
        # Target folder
 | 
			
		||||
        BACKUP_DST=$OPTARG
 | 
			
		||||
        ;;
 | 
			
		||||
 | 
			
		||||
    d)
 | 
			
		||||
        # Database
 | 
			
		||||
        BACKUP_DB=$OPTARG
 | 
			
		||||
        ;;
 | 
			
		||||
 | 
			
		||||
    :)
 | 
			
		||||
        # Missing required argument
 | 
			
		||||
        die 1 "Missing argument for option -$OPTARG"
 | 
			
		||||
        ;;
 | 
			
		||||
 | 
			
		||||
    \?)
 | 
			
		||||
        # Invalid option
 | 
			
		||||
        die 1 "Invalid option: -$OPTARG"
 | 
			
		||||
        ;;
 | 
			
		||||
 | 
			
		||||
    esac
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
# Shift away the options
 | 
			
		||||
shift $(($OPTIND - 1))
 | 
			
		||||
 | 
			
		||||
BACKUP_SRC=$1
 | 
			
		||||
backup_sanity
 | 
			
		||||
backup_data
 | 
			
		||||
backup_db
 | 
			
		||||
backup_save
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue