dev/production/download_site/backup-drupal.sh

186 lines
4.5 KiB
Bash

#!/bin/bash
DIR_PATH="$(echo ${1} | sed 's:/*$::')"
DIR=$(basename ${DIR_PATH})
LOG="${DIR}.log"
TIMESTAMP=`date +%Y/%m/%d' '%H:%M:%S`
echo
#
# show to screen and also write to log
#
function log() {
echo -e "\e[96m`date +'%d/%m/%Y %H:%M:%S'`\e[39m ${1}"
echo -e "`date +'%d/%m/%Y %H:%M:%S'` ${1}" >> ${LOG}
}
#
# database - get credentials from settings.php
#
function get_credentials() {
SETTINGS=$(find ${DIR_PATH} -name settings.php | grep default)
DATABASE=$(cat $SETTINGS | tr -d ' ' | grep "^'database'" | awk -F\' '{print $4}')
USERNAME=$(cat $SETTINGS | tr -d ' ' | grep "^'username'" | awk -F\' '{print $4}')
PASSWORD=$(cat $SETTINGS | tr -d ' ' | grep "^'password'" | awk -F\' '{print $4}')
DOMAIN=$(echo ${DIR_PATH} | awk -F/ '{print $5}')
[[ -z "${SETTINGS}" ]] && log "Empty variable SETTINGS" && return 1
[[ -z "${DATABASE}" ]] && log "Empty variable DATABASE" && return 1
[[ -z "${USERNAME}" ]] && log "Empty variable USERNAME" && return 1
[[ -z "${PASSWORD}" ]] && log "Empty variable PASSWORD" && return 1
[[ -z "${DOMAIN}" ]] && log "Empty variable DOMAIN" && return 1
log "DIR : ${DIR}"
log "SETTINGS : $(basename ${SETTINGS})"
log "DATABASE : ${DATABASE}"
log "USERNAME : ${USERNAME}"
return 0
}
#
# database - verify credentials
#
function verify_credentials() {
mysql -u"${USERNAME}" -p"${PASSWORD}" --batch --skip-column-names -e "SHOW DATABASES;" | grep "^${DATABASE}$" > /dev/null;
if [ $? -ne 0 ];then
log "Verify database credentials [FAIL]"
return 1
fi
log "Verify database credentials [ OK ]"
return 0
}
#
# database - export data
#
function export_databse() {
mysqldump -u"${USERNAME}" -p"${PASSWORD}" ${DATABASE} > ${DATABASE}.sql
if [ $? -ne 0 ];then
log "Export database [FAIL]"
return 1
fi
log "Export database [ OK ]"
return 0
}
#
# Create TarBall
#
function create_tarball() {
TARBALL="$(echo $RANDOM | md5sum | head -c 32; echo;)-${DIR}.tar.gz"
tar -czpf ${TARBALL} ${DIR_PATH} ${DATABASE}.sql &> /dev/null
if [ $? -ne 0 ];then
log "Create tarball [FAIL]"
return 1
fi
log "Create tarball [ OK ]"
rm -f "${DATABASE}.sql"
# move to download path
DOWNLOAD_PATH=${DIR_PATH}
if [ -d "${DIR_PATH}/web" ];then
DOWNLOAD_PATH="${DIR_PATH}/web"
fi
mv ${TARBALL} ${DOWNLOAD_PATH}
# calculate download time and add 2 minutes for the user to click the download link
INTERNET=40000 # 5Mbps
SIZE=$( du -sh ./${TARBALL} | awk '{print $1}' )
SIZE_BYTES=$( du ./${TARBALL} | awk '{print $1}' )
SIZE_BITS=$(( SIZE_BYTES * 8 ))
DOWNLOAD_SECS=$(( ${SIZE_BITS} / ${INTERNET} ))
AVAILABLE_SECS=$(( ${DOWNLOAD_SECS} + 120 ))
AVAILABLE_MINS=$(( ${AVAILABLE_SECS} / 60 ))
# create download link
echo >> ${LOG}
log " 🍓 DOWNLOAD"
echo >> ${LOG}
echo "URL : https://${DOMAIN}/${TARBALL} " >> ${LOG}
echo "Size : ${SIZE}" >> ${LOG}
echo "Available for : ${AVAILABLE_MINS} minutes" >> ${LOG}
echo >> ${LOG}
return 0
}
#
# Delete tarball
#
function delete_tarball() {
if [ -f ${DOWNLOAD_PATH}/${TARBALL} ];then
./safeDelete.sh "${DOWNLOAD_PATH}/${TARBALL}" ${AVAILABLE_SECS} &
else
log "Cannot find "${DOWNLOAD_PATH}/${TARBALL}" for deleting"
fi
}
function add_server_stats() {
echo >> ${LOG}
log " 🍓 SERVER STATUS"
echo >> ${LOG}
log " - Users and Uptime"
echo "$(w)" >> ${LOG}
echo "" >> ${LOG}
log " - Disk Usage"
echo "$(df -h)" >> ${LOG}
echo "" >> ${LOG}
log " - Memory Usage"
echo "$(free -g)" >> ${LOG}
echo "" >> ${LOG}
log " - Network Interface"
echo "$(ifconfig eth0)" >> ${LOG}
echo "" >> ${LOG}
log " - System TOP 10 resources"
echo "$(ps -eo pid,%cpu,%mem,user,comm --sort=-%cpu | head -n 11)" >> ${LOG}
echo "" >> ${LOG}
}
#
# Send mail
#
function send_mail_log() {
SUBJECT="Backup ${DIR}"
RECIPIENTS="stefanos@dotsoft.gr"
cat ${LOG} | mailx -a 'Content-Type: text/html' -s ${SUBJECT} ${RECIPIENTS}
}
# dont start if you dont have a valid drupal directory
[ $# -lt 1 ] && echo "${TIMESTAMP} Directory argument is missing" > backup.log && exit
[ $# -gt 1 ] && echo "${TIMESTAMP} Too many arguments" > backup.log && exit
[ ! -d ${DIR_PATH} ] && echo "${TIMESTAMP} ${DIR} does not exist" > backup.log && exit
# Start
function main () {
echo -e "<html><head></head><body><pre style='font: monospace'>" > ${LOG}
if get_credentials; then
if verify_credentials; then
if export_databse; then
if create_tarball; then
delete_tarball
fi
fi
fi
fi
add_server_stats
echo -e "</pre></body></html>" >> ${LOG}
send_mail_log
}
main