Skip to content

Instantly share code, notes, and snippets.

@pavelmaca
Created November 13, 2010 13:29
Show Gist options
  • Select an option

  • Save pavelmaca/675321 to your computer and use it in GitHub Desktop.

Select an option

Save pavelmaca/675321 to your computer and use it in GitHub Desktop.
backup.sh
#!/bin/bash
# My first shell script :)
# Backup domains directories and MySQL database.
clear
# CONFIGURATION
MODE_D="0740"
MODE_F="0640"
DAY=$(date +%F) # YYYY-MM-DD
BACKUP_DIR="${PWD}/${DAY}"
LOG_FILE="${BACKUP_DIR}/log.txt"
# Dir to backup
DOMAINS_DIR="/www"
# Mysql DB's to backup
DB_HOST="localhost"
#DB_USERS=( "" )
log(){
if [ $# -eq 0 ]; then
echo "loger: you must sypply some text to log"
return
fi
MSG=$1
SHOW=$2
[ $SHOW == 1 ] && echo $MSG || :
if [ ! -f $LOG_FILE ]; then
if ! touch $LOG_FILE; then
echo "Can't crete log file."
return
else
chmod $MODE_F $LOG_FILE
fi
fi
echo "$(date +%T) - ${MSG}\n" >> $LOG_FILE
return
}
process_domains(){
# crete ${BACKUP_DIR}/domains dir
BDD="${BACKUP_DIR}/domains"
if [ ! -d $BDD ] && ! mkdir -p --mode=$MODE_D $BDD; then
log "Can't create folder ${BDD}" 1
return
fi
for dir in $(ls -B $DOMAINS_DIR); do
echo ""
if [ -d "${DOMAINS_DIR}/${dir}" ]; then
NAME="${BDD}/${dir}.tar.gz"
# check if backup alredy exists
if [ -f $NAME ]; then
log "Backup for ${DOMAINS_DIR}/${dir} alredy exists." 1
else
log "Processing directory: ${DOMAINS_DIR}/${dir}" 1
tar --create --gzip --dereference --file=$NAME --directory="${DOMAINS_DIR}/${dir}" $(ls "${DOMAINS_DIR}/${dir}")
if [ -f $NAME ]; then
chmod $MODE_F $NAME
log "Success: $(basename $NAME)" 1
else
log "Failure while processing: ${DOMAINS_DIR}/${dir}" 1
fi
fi # /backup alredy exists
fi
done
return
}
process_db(){
local HOST=$1
local USER_NAME=$2
local DB_NAME=$USER_NAME
# crete ${BACKUP_DIR}/database dir
local BDDB="${BACKUP_DIR}/database"
if [ ! -d $BDDB ] && ! mkdir -p --mode=$MODE_D $BDDB; then
log "Can't create folder ${BDDB}" 1
return
fi
local SQL_FILE="${BDDB}/${DB_NAME}.sql"
local GZ_FILE="${SQL_FILE}.gz"
# check if backup alredy exists
if [ -f $GZ_FILE ]; then
log "Backup for db ${DB_NAME} alredy exists." 1
else
PASSWORD=$(get_pass $USER_NAME)
echo ""
dump_db $HOST $USER_NAME $PASSWORD $DB_NAME $SQL_FILE
ret=$?
if [ $ret != 0 ]; then
[ -f $SQL_FILE ] && rm $SQL_FILE || :
# try agian?
if [ $ret == 2 ]; then
while true; do
echo -n "Bad password for: ${USER_NAME} retry? (y or n) :"
read CONFIRM
case $CONFIRM in
y|Y|YES|yes|Yes) break ;;
n|N|no|NO|No)
return
;;
*) echo Please enter only y or n
esac
done
process_db $HOST $USER_NAME
fi
return
fi
if [ -f $SQL_FILE ]; then
cat $SQL_FILE | gzip -9 > $GZ_FILE
rm $SQL_FILE
if [ ! -f $GZ_FILE ]; then
log "Failure while taring slq file" 1
return
fi
chmod $MODE_F $GZ_FILE
log "Success: $(basename $GZ_FILE)" 1
else
log "Failure while processing database: ${DB_NAME}" 1
fi
fi
return
}
get_pass(){
read -s -p "Password for user $1:" PASS
echo $PASS
return
}
dump_db(){
HOST=$1
USER=$2
PASSWORD=$3
DB_NAME=$4
FILE=$5
mysqldump --user=$USER --host=$HOST -p$PASSWORD $DB_NAME > $FILE
return
}
echo "Starting backup for date: ${DAY}"
if [ ! -d $DOMAINS_DIR ]; then
log "Folder for backup not found: ${DOMAINS_DIR}" 1
elif [ ! -d $BACKUP_DIR ] && ! mkdir -p --mode=$MODE_D $BACKUP_DIR; then
log "Can't create folder ${BACKUP_DIR}" 1
else
process_domains
# TODO do it better
for user in "user1" "user2"; do
echo ""
process_db $DB_HOST $user
done
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment