186 lines
4.5 KiB
Bash
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_Mbps=50000000 # 50Mbps
|
|
SIZE=$( du -sh ${DOWNLOAD_PATH}/${TARBALL} | awk '{print $1}' )
|
|
SIZE_BITS=$( du -s ${DOWNLOAD_PATH}/${TARBALL} | awk '{print $1}' )
|
|
DOWNLOAD_SECS=$(( ${SIZE_BITS} / ${INTERNET_Mbps} ))
|
|
AVAILABLE_SECS=$(( ${DOWNLOAD_SECS} + 120 ))
|
|
AVAILABLE_MINS=$(( ${AVAILABLE_SECS} / 60 ))
|
|
|
|
# create download link
|
|
log ""
|
|
log " 🍓 DOWNLOAD"
|
|
log ""
|
|
log "URL : https://${DOMAIN}/${TARBALL}"
|
|
log "Size : ${SIZE}"
|
|
log "Available for : ${AVAILABLE_MINS} minutes"
|
|
log ""
|
|
|
|
return 0
|
|
}
|
|
|
|
#
|
|
# Delete tarball
|
|
#
|
|
function delete_tarball() {
|
|
if [ -f ${DOWNLOAD_PATH}/${TARBALL} ];then
|
|
log "Start ${AVAILABLE_SECS} seconds timer for deleting ${TARBALL}"
|
|
./safeDelete.sh "${DOWNLOAD_PATH}/${TARBALL}" ${AVAILABLE_SECS} &
|
|
else
|
|
log "Cannot find "${DOWNLOAD_PATH}/${TARBALL}" for deleting"
|
|
fi
|
|
}
|
|
|
|
function add_server_stats() {
|
|
log ""
|
|
log " 🍓 SERVER STATUS"
|
|
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
|
|
|
|
|