mirror of
https://github.com/serghey-rodin/vesta.git
synced 2025-02-03 00:23:09 -08:00
d24f68a370
So far, no exclusions have been accounted for as fargs has not been passed. Rework the logic for fargs parsing based on domain exclusions and pass fargs to the tar command. Also add --anchored based on 37c69b8f4cd087d8d406ab3de766ad11564b978b
942 lines
29 KiB
Bash
Executable File
942 lines
29 KiB
Bash
Executable File
#!/bin/bash
|
|
# info: backup system user with all its objects
|
|
# options: USER NOTIFY
|
|
#
|
|
# The call is used for backing up user with all its domains and databases.
|
|
|
|
|
|
#----------------------------------------------------------#
|
|
# Variable&Function #
|
|
#----------------------------------------------------------#
|
|
|
|
# Importing system variables
|
|
source /etc/profile
|
|
|
|
# Argument definition
|
|
user=$1
|
|
notify=${2-no}
|
|
|
|
# Includes
|
|
source $VESTA/func/main.sh
|
|
source $VESTA/func/domain.sh
|
|
source $VESTA/func/db.sh
|
|
source $VESTA/conf/vesta.conf
|
|
|
|
|
|
#----------------------------------------------------------#
|
|
# Verifications #
|
|
#----------------------------------------------------------#
|
|
|
|
check_args '1' "$#" 'USER [NOTIFY]'
|
|
is_format_valid 'user'
|
|
is_system_enabled "$BACKUP_SYSTEM" 'BACKUP_SYSTEM'
|
|
is_object_valid 'user' 'USER' "$user"
|
|
is_object_unsuspended 'user' 'USER' "$user"
|
|
is_backup_enabled
|
|
|
|
|
|
#----------------------------------------------------------#
|
|
# Action #
|
|
#----------------------------------------------------------#
|
|
|
|
# Set backup directory if undefined
|
|
if [ -z "$BACKUP" ]; then
|
|
BACKUP=/backup
|
|
fi
|
|
mkdir -p $BACKUP
|
|
|
|
# Get current time
|
|
start_time=$(date '+%s')
|
|
|
|
# Set notification email and subject
|
|
subj="$user → backup failed"
|
|
email=$(grep CONTACT $VESTA/data/users/admin/user.conf |cut -f 2 -d \')
|
|
|
|
# Checking load average
|
|
la=$(cat /proc/loadavg |cut -f 1 -d ' ' |cut -f 1 -d '.')
|
|
i=0
|
|
while [ "$la" -ge "$BACKUP_LA_LIMIT" ]; do
|
|
echo -e "$(date "+%F %T") Load Average $la"
|
|
sleep 60
|
|
if [ "$i" -ge "15" ]; then
|
|
la_error="LoadAverage $la is above threshold"
|
|
echo "$la_error" |$SENDMAIL -s "$subj" $email $notify
|
|
sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
|
|
check_result $E_LA "$la_error"
|
|
fi
|
|
la=$(cat /proc/loadavg |cut -f 1 -d ' ' |cut -f 1 -d '.')
|
|
(( ++i))
|
|
done
|
|
|
|
if [ -z "$BACKUP_TEMP" ]; then
|
|
BACKUP_TEMP=$BACKUP
|
|
fi
|
|
|
|
# Creating temporary directory
|
|
tmpdir=$(mktemp -p $BACKUP_TEMP -d)
|
|
|
|
if [ "$?" -ne 0 ]; then
|
|
echo "Can't create tmp dir $tmpdir" |$SENDMAIL -s "$subj" $email $notify
|
|
check_result $E_NOTEXIST "can't create tmp dir"
|
|
fi
|
|
|
|
# Backup sys configs
|
|
echo "-- SYSTEM --" |tee $BACKUP/$user.log
|
|
mkdir $tmpdir/vesta
|
|
|
|
echo -e "$(date "+%F %T") $user.conf" |tee -a $BACKUP/$user.log
|
|
cp -r $USER_DATA/user.conf $tmpdir/vesta/
|
|
cp -r $USER_DATA/ssl $tmpdir/vesta/
|
|
|
|
if [ -e "$USER_DATA/stats.log" ]; then
|
|
echo -e "$(date "+%F %T") stats.log" |tee -a $BACKUP/$user.log
|
|
cp -r $USER_DATA/stats.log $tmpdir/vesta/
|
|
fi
|
|
|
|
if [ -e "$USER_DATA/history.log" ]; then
|
|
echo -e "$(date "+%F %T") history.log" |tee -a $BACKUP/$user.log
|
|
cp -r $USER_DATA/history.log $tmpdir/vesta/
|
|
fi
|
|
|
|
if [ -e "$USER_DATA/backup-excludes.conf" ]; then
|
|
echo -e "$(date "+%F %T") backup-excludes.conf" |tee -a $BACKUP/$user.log
|
|
cp -r $USER_DATA/backup-excludes.conf $tmpdir/vesta/
|
|
fi
|
|
|
|
# Backup PAM
|
|
mkdir $tmpdir/pam
|
|
echo -e "$(date "+%F %T") pam" |tee -a $BACKUP/$user.log
|
|
grep "^$user:" /etc/passwd > $tmpdir/pam/passwd
|
|
grep "^$user:" /etc/shadow > $tmpdir/pam/shadow
|
|
grep "^$user:" /etc/group > $tmpdir/pam/group
|
|
echo
|
|
|
|
# Parsing excludes
|
|
if [ -e "$USER_DATA/backup-excludes.conf" ]; then
|
|
source $USER_DATA/backup-excludes.conf
|
|
fi
|
|
|
|
# WEB domains
|
|
if [ ! -z "$WEB_SYSTEM" ] && [ "$WEB" != '*' ]; then
|
|
echo -e "\n-- WEB --" |tee -a $BACKUP/$user.log
|
|
mkdir $tmpdir/web/
|
|
|
|
# Parsing domain exclusions
|
|
conf="$USER_DATA/web.conf"
|
|
for domain in $(search_objects 'web' 'SUSPENDED' "*" 'DOMAIN'); do
|
|
exclusion=$(echo -e "$WEB" |tr ',' '\n' |grep "^$domain$")
|
|
if [ -z "$exclusion" ]; then
|
|
web_list="$web_list $domain"
|
|
else
|
|
echo "$(date "+%F %T") excluding $domain"|tee -a $BACKUP/$user.log
|
|
fi
|
|
done
|
|
web_list=$(echo "$web_list" |sed -e "s/ */\ /g" -e "s/^ //")
|
|
|
|
i=0
|
|
|
|
for domain in $web_list; do
|
|
((i ++))
|
|
echo -e "$(date "+%F %T") $domain" |tee -a $BACKUP/$user.log
|
|
mkdir -p $tmpdir/web/$domain/conf
|
|
mkdir -p $tmpdir/web/$domain/vesta
|
|
|
|
# Get domain variables
|
|
domain_idn=$domain
|
|
format_domain_idn
|
|
get_domain_values 'web'
|
|
|
|
# Backup web.conf
|
|
cd $tmpdir/web/$domain/
|
|
conf="$USER_DATA/web.conf"
|
|
grep "DOMAIN='$domain'" $conf > vesta/web.conf
|
|
|
|
# Backup vhost config
|
|
conf=$HOMEDIR/$user/conf/web/$domain.$WEB_SYSTEM.conf
|
|
if [ -e "$conf" ]; then
|
|
cp $conf conf/$WEB_SYSTEM.conf
|
|
else
|
|
# old style configs
|
|
tpl_file="$WEBTPL/$WEB_SYSTEM/$WEB_BACKEND/$TPL.tpl"
|
|
conf="$HOMEDIR/$user/conf/web/$WEB_SYSTEM.conf"
|
|
get_web_config_lines $tpl_file $conf
|
|
sed -n "$top_line,$bottom_line p" $conf > conf/$WEB_SYSTEM.conf
|
|
fi
|
|
|
|
# Backup ssl vhost
|
|
if [ "$SSL" = 'yes' ]; then
|
|
conf=$HOMEDIR/$user/conf/web/$domain.$WEB_SYSTEM.ssl.conf
|
|
if [ -e "$conf" ]; then
|
|
cp $conf conf/$WEB_SYSTEM.ssl.conf
|
|
else
|
|
tpl_file="$WEBTPL/$WEB_SYSTEM/$WEB_BACKEND/$TPL.stpl"
|
|
conf="$HOMEDIR/$user/conf/web/s$WEB_SYSTEM.conf"
|
|
get_web_config_lines $tpl_file $conf
|
|
sed -n "$top_line,$bottom_line p" $conf > \
|
|
conf/s$WEB_SYSTEM.conf
|
|
fi
|
|
fi
|
|
|
|
# Backup proxy config
|
|
if [ ! -z "$PROXY_SYSTEM" ] && [ ! -z "$PROXY" ]; then
|
|
conf=$HOMEDIR/$user/conf/web/$domain.$PROXY_SYSTEM.conf
|
|
if [ -e "$conf" ]; then
|
|
cp $conf conf/$PROXY_SYSTEM.conf
|
|
else
|
|
tpl_file="$WEBTPL/$PROXY_SYSTEM/$PROXY.tpl"
|
|
conf="$HOMEDIR/$user/conf/web/$PROXY_SYSTEM.conf"
|
|
get_web_config_lines $tpl_file $conf
|
|
sed -n "$top_line,$bottom_line p" $conf > \
|
|
conf/$PROXY_SYSTEM.conf
|
|
fi
|
|
fi
|
|
|
|
# Backup ssl proxy config
|
|
if [ ! -z "$PROXY_SYSTEM" ] && [ "$SSL" = 'yes' ]; then
|
|
conf=$HOMEDIR/$user/conf/web/$domain.$PROXY_SYSTEM.ssl.conf
|
|
if [ -e "$conf" ]; then
|
|
cp $conf conf/$PROXY_SYSTEM.ssl.conf
|
|
else
|
|
tpl_file="$WEBTPL/$PROXY_SYSTEM/$PROXY.stpl"
|
|
conf="$HOMEDIR/$user/conf/web/s$PROXY_SYSTEM.conf"
|
|
get_web_config_lines $tpl_file $conf
|
|
sed -n "$top_line,$bottom_line p" $conf >\
|
|
conf/s$PROXY_SYSTEM.conf
|
|
fi
|
|
fi
|
|
|
|
# Backup custom config / backup LE config
|
|
for sconfig in $(ls $HOMEDIR/$user/conf/web/|grep ".$domain.conf"); do
|
|
cp $HOMEDIR/$user/conf/web/$sconfig conf/
|
|
done
|
|
|
|
# Backup ssl certificates
|
|
if [ "$SSL" = 'yes' ] ; then
|
|
cp $HOMEDIR/$user/conf/web/ssl.$domain.* conf/
|
|
cp $USER_DATA/ssl/$domain.* vesta/
|
|
fi
|
|
|
|
# Changin dir to documentroot
|
|
cd $HOMEDIR/$user/web/$domain
|
|
|
|
# Define exclude arguments
|
|
exlusion=$(echo -e "$WEB" |tr ',' '\n' |grep "^$domain:")
|
|
set -f
|
|
fargs=()
|
|
fargs+=(--exclude='./logs/*')
|
|
if [ ! -z "$exlusion" ]; then
|
|
xdirs="$(echo -e "$exlusion" |tr ':' '\n' |grep -v $domain)"
|
|
for xpath in $xdirs; do
|
|
if [ -d "$xpath" ]; then
|
|
fargs+=(--exclude=$xpath/*)
|
|
echo "$(date "+%F %T") excluding directory $xpath"
|
|
msg="$msg\n$(date "+%F %T") excluding directory $xpath"
|
|
else
|
|
echo "$(date "+%F %T") excluding file $xpath"
|
|
msg="$msg\n$(date "+%F %T") excluding file $xpath"
|
|
fargs+=(--exclude=$xpath)
|
|
fi
|
|
done
|
|
fi
|
|
set +f
|
|
|
|
# Backup files
|
|
tar --anchored -cpf- ${fargs[@]} * |gzip -$BACKUP_GZIP - > $tmpdir/web/$domain/domain_data.tar.gz
|
|
done
|
|
|
|
# Print total
|
|
if [ "$i" -eq 1 ]; then
|
|
echo -e "$(date "+%F %T") *** $i domain ***" |tee -a $BACKUP/$user.log
|
|
else
|
|
echo -e "$(date "+%F %T") *** $i domains ***"|tee -a $BACKUP/$user.log
|
|
fi
|
|
fi
|
|
|
|
# DNS domains
|
|
if [ ! -z "$DNS_SYSTEM" ] && [ "$DNS" != '*' ]; then
|
|
echo -e "\n-- DNS --" |tee -a $BACKUP/$user.log
|
|
mkdir $tmpdir/dns/
|
|
|
|
# Parsing domain exclusions
|
|
for domain in $(search_objects 'dns' 'SUSPENDED' "*" 'DOMAIN'); do
|
|
exclusion=$(echo "$DNS" |tr ',' '\n' |grep "^$domain$")
|
|
if [ -z "$exclusion" ]; then
|
|
dns_list="$dns_list $domain"
|
|
else
|
|
echo "$(date "+%F %T") excluding $domain"
|
|
msg="$msg\n$(date "+%F %T") excluding $domain"
|
|
fi
|
|
done
|
|
dns_list=$(echo "$dns_list" |sed -e "s/ */\ /g" -e "s/^ //")
|
|
|
|
i=0
|
|
for domain in $dns_list; do
|
|
((i ++))
|
|
echo -e "$(date "+%F %T") $domain" |tee -a $BACKUP/$user.log
|
|
|
|
# Building directory tree
|
|
mkdir -p $tmpdir/dns/$domain/conf
|
|
mkdir -p $tmpdir/dns/$domain/vesta
|
|
|
|
# Backup dns.conf
|
|
cd $tmpdir/dns/$domain/
|
|
conf="$USER_DATA/dns.conf"
|
|
grep "DOMAIN='$domain'" $conf > vesta/dns.conf
|
|
|
|
# Backup dns recods
|
|
cp $USER_DATA/dns/$domain.conf vesta/$domain.conf
|
|
if [ "$DNS_SYSTEM" != 'remote' ]; then
|
|
cp $HOMEDIR/$user/conf/dns/$domain.db conf/$domain.db
|
|
fi
|
|
done
|
|
|
|
# Print total
|
|
if [ "$i" -eq 1 ]; then
|
|
echo -e "$(date "+%F %T") *** $i domain ***" |tee -a $BACKUP/$user.log
|
|
else
|
|
echo -e "$(date "+%F %T") *** $i domains ***"|tee -a $BACKUP/$user.log
|
|
fi
|
|
fi
|
|
|
|
# Mail domains
|
|
if [ ! -z "$MAIL_SYSTEM" ] && [ "$MAIL" != '*' ]; then
|
|
echo -e "\n-- MAIL --" |tee -a $BACKUP/$user.log
|
|
mkdir $tmpdir/mail/
|
|
|
|
# Parsing domain exclusions
|
|
conf="$USER_DATA/mail.conf"
|
|
for domain in $(search_objects 'mail' 'SUSPENDED' "*" 'DOMAIN'); do
|
|
check_exl=$(echo "$MAIL" |tr ',' '\n' |grep "^$domain$")
|
|
if [ -z "$check_exl" ]; then
|
|
mail_list="$mail_list $domain"
|
|
else
|
|
echo "$(date "+%F %T") excluding $domain"|tee -a $BACKUP/$user.log
|
|
fi
|
|
done
|
|
mail_list=$(echo "$mail_list" |sed -e "s/ */\ /g" -e "s/^ //")
|
|
|
|
i=0
|
|
for domain in $mail_list; do
|
|
((i ++))
|
|
echo -e "$(date "+%F %T") $domain" |tee -a $BACKUP/$user.log
|
|
mkdir -p $tmpdir/mail/$domain/conf
|
|
mkdir -p $tmpdir/mail/$domain/vesta
|
|
domain_idn=$domain
|
|
format_domain_idn
|
|
|
|
# Backup exim config
|
|
if [[ "$MAIL_SYSTEM" =~ exim ]]; then
|
|
cd $tmpdir/mail/$domain/
|
|
cp $HOMEDIR/$user/conf/mail/$domain/* conf/
|
|
fi
|
|
|
|
# Backup mail.conf
|
|
conf="$USER_DATA/mail.conf"
|
|
grep "DOMAIN='$domain'" $conf > vesta/mail.conf
|
|
cp $USER_DATA/mail/$domain.* vesta/
|
|
if [ ! -z "$(ls $USER_DATA/mail/|grep *@$domain)" ]; then
|
|
cp $USER_DATA/mail/*@$domain.* vesta/
|
|
fi
|
|
|
|
# Backup emails
|
|
cd $HOMEDIR/$user/mail/$domain_idn
|
|
accounts=()
|
|
for account in $(ls); do
|
|
exclusion=$(echo "$MAIL" |tr ',' '\n' |grep "$domain:")
|
|
exclusion=$(echo "$exclusion" |tr ':' '\n' |grep "^$account$")
|
|
|
|
# Checking exlusions
|
|
if [ -z "$exclusion" ] && [[ "$MAIL_SYSTEM" =~ exim ]]; then
|
|
accounts+=($account)
|
|
else
|
|
echo "$(date "+%F %T") excluding mail account $account" |\
|
|
tee -a $BACKUP/$user.log
|
|
fi
|
|
done
|
|
|
|
# Compress archive
|
|
if [ ${#accounts[@]} -gt 0 ]; then
|
|
tar -cpf- ${accounts[@]} |gzip -$BACKUP_GZIP - > $tmpdir/mail/$domain/accounts.tar.gz
|
|
fi
|
|
done
|
|
|
|
# Print total
|
|
if [ "$i" -eq 1 ]; then
|
|
echo -e "$(date "+%F %T") *** $i domain ***" |tee -a $BACKUP/$user.log
|
|
else
|
|
echo -e "$(date "+%F %T") *** $i domains ***"|tee -a $BACKUP/$user.log
|
|
fi
|
|
fi
|
|
|
|
|
|
# Databases
|
|
if [ ! -z "$DB_SYSTEM" ] && [ "$DB" != '*' ]; then
|
|
echo -e "\n-- DB --" |tee -a $BACKUP/$user.log
|
|
mkdir $tmpdir/db/
|
|
|
|
# Parsing database exclusions
|
|
for database in $(search_objects 'db' 'SUSPENDED' "*" 'DB'); do
|
|
exclusion=$(echo "$DB" |tr ',' '\n' |grep "^$database$")
|
|
if [ -z "$exclusion" ]; then
|
|
db_list="$db_list $database"
|
|
else
|
|
echo "$(date "+%F %T") excluding $database" |\
|
|
tee -a $BACKUP/$user.log
|
|
fi
|
|
done
|
|
|
|
i=0
|
|
conf="$USER_DATA/db.conf"
|
|
db_list=$(echo "$db_list" |sed -e "s/ */\ /g" -e "s/^ //")
|
|
for database in $db_list; do
|
|
((i ++))
|
|
get_database_values
|
|
|
|
echo -e "$(date "+%F %T") $database ($TYPE)" |tee -a $BACKUP/$user.log
|
|
mkdir -p $tmpdir/db/$database/conf
|
|
mkdir -p $tmpdir/db/$database/vesta
|
|
|
|
cd $tmpdir/db/$database/
|
|
grep "DB='$database'" $conf > vesta/db.conf
|
|
|
|
dump="$tmpdir/db/$database/$database.$TYPE.sql"
|
|
dumpgz="$tmpdir/db/$database/$database.$TYPE.sql.gz"
|
|
grants="$tmpdir/db/$database/conf/$database.$TYPE.$DBUSER"
|
|
if [ ! -f "$dumpgz" ]; then
|
|
case $TYPE in
|
|
mysql) dump_mysql_database ;;
|
|
pgsql) dump_pgsql_database ;;
|
|
esac
|
|
|
|
# Compress dump
|
|
gzip -$BACKUP_GZIP $dump
|
|
fi
|
|
done
|
|
|
|
# Print total
|
|
if [ "$i" -eq 1 ]; then
|
|
echo -e "$(date "+%F %T") *** $i database ***" |\
|
|
tee -a $BACKUP/$user.log
|
|
else
|
|
echo -e "$(date "+%F %T") *** $i databases ***"|\
|
|
tee -a $BACKUP/$user.log
|
|
fi
|
|
fi
|
|
|
|
# Cron jobs
|
|
if [ ! -z "$CRON_SYSTEM" ] && [ "$CRON" != '*' ]; then
|
|
echo -e "\n-- CRON --" |tee -a $BACKUP/$user.log
|
|
mkdir $tmpdir/cron/
|
|
|
|
# Backup cron.conf
|
|
cp $USER_DATA/cron.conf $tmpdir/cron/
|
|
cron_record=$(wc -l $USER_DATA/cron.conf|cut -f 1 -d ' ')
|
|
|
|
if [ -e "/var/spool/cron/$user" ]; then
|
|
cron_list="$cron_record"
|
|
cp /var/spool/cron/$user $tmpdir/cron/
|
|
fi
|
|
|
|
# Print total
|
|
if [ "$cron_record" -eq 1 ]; then
|
|
echo -e "$(date "+%F %T") *** $cron_record job ***" |\
|
|
tee -a $BACKUP/$user.log
|
|
else
|
|
echo -e "$(date "+%F %T") *** $cron_record jobs ***" |\
|
|
tee -a $BACKUP/$user.log
|
|
fi
|
|
fi
|
|
|
|
# User Directories
|
|
if [ "$USER" != '*' ]; then
|
|
echo -e "\n-- User Dir --" |tee -a $BACKUP/$user.log
|
|
mkdir $tmpdir/user_dir
|
|
cd $HOMEDIR/$user
|
|
|
|
# Parsing directory exlusions
|
|
USER=''
|
|
if [ -e "$USER_DATA/backup-excludes.conf" ]; then
|
|
source $USER_DATA/backup-excludes.conf
|
|
fi
|
|
fargs=()
|
|
for xpath in $(echo "$USER" |tr ',' '\n'); do
|
|
if [ -d "$xpath" ]; then
|
|
fargs+=(--exclude=$xpath/*)
|
|
echo "$(date "+%F %T") excluding directory $xpath" |\
|
|
tee -a $BACKUP/$user.log
|
|
else
|
|
echo "$(date "+%F %T") excluding file $xpath" |\
|
|
tee -a $BACKUP/$user.log
|
|
fargs+=(--exclude=$xpath)
|
|
fi
|
|
done
|
|
|
|
IFS=$'\n'
|
|
set -f
|
|
i=0
|
|
|
|
for udir in $(ls -a |egrep -v "^conf$|^web$|^dns$|^mail$|^\.\.$|^\.$"); do
|
|
exclusion=$(echo "$USER" |tr ',' '\n' |grep "^$udir$")
|
|
if [ -z "$exclusion" ]; then
|
|
((i ++))
|
|
udir_list="$udir_list $udir"
|
|
echo -e "$(date "+%F %T") adding $udir" |tee -a $BACKUP/$user.log
|
|
|
|
# Backup files and dirs
|
|
tar --anchored -cpf- ${fargs[@]} $udir |gzip -$BACKUP_GZIP - > $tmpdir/user_dir/$udir.tar.gz
|
|
fi
|
|
done
|
|
set +f
|
|
udir_list=$(echo "$udir_list" |sed -e "s/ */\ /g" -e "s/^ //")
|
|
|
|
# Print total
|
|
if [ "$i" -eq 1 ]; then
|
|
echo -e "$(date "+%F %T") *** $i user directory ***" |\
|
|
tee -a $BACKUP/$user.log
|
|
else
|
|
echo -e "$(date "+%F %T") *** $i directories ***" |\
|
|
tee -a $BACKUP/$user.log
|
|
fi
|
|
fi
|
|
|
|
# Get backup size
|
|
size="$(du -shm $tmpdir |cut -f 1)"
|
|
|
|
# Get current time
|
|
end_time=$(date '+%s')
|
|
time_n_date=$(date +'%T %F')
|
|
time=$(echo "$time_n_date" |cut -f 1 -d \ )
|
|
date=$(echo "$time_n_date" |cut -f 2 -d \ )
|
|
backup_new_date=$(date +"%Y-%m-%d_%H-%M-%S")
|
|
|
|
# Defining local storage function
|
|
local_backup(){
|
|
|
|
rm -f $BACKUP/$user.$backup_new_date.tar
|
|
|
|
# Checking retention
|
|
backup_list=$(ls -lrt $BACKUP/ |awk '{print $9}' |grep "^$user\." | grep ".tar")
|
|
backups_count=$(echo "$backup_list" |wc -l)
|
|
if [ "$BACKUPS" -le "$backups_count" ]; then
|
|
backups_rm_number=$((backups_count - BACKUPS + 1))
|
|
|
|
# Removing old backup
|
|
for backup in $(echo "$backup_list" |head -n $backups_rm_number); do
|
|
backup_date=$(echo $backup |sed -e "s/$user.//" -e "s/.tar$//")
|
|
echo -e "$(date "+%F %T") Rotated: $backup_date" |\
|
|
tee -a $BACKUP/$user.log
|
|
rm -f $BACKUP/$backup
|
|
done
|
|
fi
|
|
|
|
# Checking disk space
|
|
disk_usage=$(df $BACKUP |tail -n1 |tr ' ' '\n' |grep % |cut -f 1 -d %)
|
|
if [ "$disk_usage" -ge "$BACKUP_DISK_LIMIT" ]; then
|
|
rm -rf $tmpdir
|
|
rm -f $BACKUP/$user.log
|
|
sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
|
|
echo "Not enough disk space" |$SENDMAIL -s "$subj" $email $notify
|
|
check_result "$E_DISK" "Not enough dsk space"
|
|
fi
|
|
|
|
# Creating final tarball
|
|
cd $tmpdir
|
|
tar -cf $BACKUP/$user.$backup_new_date.tar .
|
|
chmod 640 $BACKUP/$user.$backup_new_date.tar
|
|
chown admin:$user $BACKUP/$user.$backup_new_date.tar
|
|
localbackup='yes'
|
|
echo -e "$(date "+%F %T") Local: $BACKUP/$user.$backup_new_date.tar" |\
|
|
tee -a $BACKUP/$user.log
|
|
}
|
|
|
|
|
|
# Defining ftp command function
|
|
ftpc() {
|
|
/usr/bin/ftp -np $HOST $PORT <<EOF
|
|
quote USER $USERNAME
|
|
quote PASS $PASSWORD
|
|
binary
|
|
$1
|
|
$2
|
|
$3
|
|
quit
|
|
EOF
|
|
}
|
|
|
|
# Defining ftp storage function
|
|
ftp_backup() {
|
|
# Checking config
|
|
if [ ! -e "$VESTA/conf/ftp.backup.conf" ]; then
|
|
error="ftp.backup.conf doesn't exist"
|
|
rm -rf $tmpdir
|
|
rm -f $BACKUP/$user.log
|
|
echo "$error" |$SENDMAIL -s "$subj" $email $notify
|
|
sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
|
|
check_result "$E_NOTEXIST" "$error"
|
|
fi
|
|
|
|
# Parse config
|
|
source $VESTA/conf/ftp.backup.conf
|
|
|
|
# Set default port
|
|
if [ -z "$(grep 'PORT=' $VESTA/conf/ftp.backup.conf)" ]; then
|
|
PORT='21'
|
|
fi
|
|
|
|
# Checking variables
|
|
if [ -z "$HOST" ] || [ -z "$USERNAME" ] || [ -z "$PASSWORD" ]; then
|
|
error="Can't parse ftp backup configuration"
|
|
rm -rf $tmpdir
|
|
rm -f $BACKUP/$user.log
|
|
echo "$error" |$SENDMAIL -s "$subj" $email $notify
|
|
sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
|
|
check_result "$E_PARSING" "$error"
|
|
fi
|
|
|
|
# Debug info
|
|
echo -e "$(date "+%F %T") Remote: ftp://$HOST$BPATH/$user.$backup_new_date.tar"
|
|
|
|
# Checking ftp connection
|
|
fconn=$(ftpc)
|
|
ferror=$(echo $fconn |grep -i -e failed -e error -e "Can't" -e "not conn")
|
|
if [ ! -z "$ferror" ]; then
|
|
error="Error: can't login to ftp ftp://$USERNAME@$HOST"
|
|
rm -rf $tmpdir
|
|
rm -f $BACKUP/$user.log
|
|
echo "$error" |$SENDMAIL -s "$subj" $email $notify
|
|
sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
|
|
check_result "$E_CONNECT" "$error"
|
|
fi
|
|
|
|
# Check ftp permissions
|
|
if [ -z $BPATH ]; then
|
|
ftmpdir="vst.bK76A9SUkt"
|
|
else
|
|
ftpc "mkdir $BPATH" > /dev/null 2>&1
|
|
ftmpdir="$BPATH/vst.bK76A9SUkt"
|
|
fi
|
|
ftpc "mkdir $ftmpdir" "rm $ftmpdir"
|
|
ftp_result=$(ftpc "mkdir $ftmpdir" "rm $ftmpdir" |grep -v Trying)
|
|
if [ ! -z "$ftp_result" ] ; then
|
|
error="Can't create ftp backup folder ftp://$HOST$BPATH"
|
|
rm -rf $tmpdir
|
|
rm -f $BACKUP/$user.log
|
|
echo "$error" |$SENDMAIL -s "$subj" $email $notify
|
|
sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
|
|
check_result "$E_FTP" "$error"
|
|
fi
|
|
|
|
# Checking retention
|
|
if [ -z $BPATH ]; then
|
|
backup_list=$(ftpc "ls" |awk '{print $9}' |grep "^$user\.")
|
|
else
|
|
backup_list=$(ftpc "cd $BPATH" "ls" |awk '{print $9}' |grep "^$user\.")
|
|
fi
|
|
backups_count=$(echo "$backup_list" |wc -l)
|
|
if [ "$backups_count" -ge "$BACKUPS" ]; then
|
|
backups_rm_number=$((backups_count - BACKUPS + 1))
|
|
for backup in $(echo "$backup_list" |head -n $backups_rm_number); do
|
|
backup_date=$(echo $backup |sed -e "s/$user.//" -e "s/.tar$//")
|
|
echo -e "$(date "+%F %T") Rotated ftp backup: $backup_date" |\
|
|
tee -a $BACKUP/$user.log
|
|
if [ -z $BPATH ]; then
|
|
ftpc "delete $backup"
|
|
else
|
|
ftpc "cd $BPATH" "delete $backup"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# Uploading backup archive
|
|
if [ "$localbackup" = 'yes' ]; then
|
|
cd $BACKUP
|
|
if [ -z $BPATH ]; then
|
|
ftpc "put $user.$backup_new_date.tar"
|
|
else
|
|
ftpc "cd $BPATH" "put $user.$backup_new_date.tar"
|
|
fi
|
|
else
|
|
cd $tmpdir
|
|
tar -cf $BACKUP/$user.$backup_new_date.tar .
|
|
cd $BACKUP/
|
|
if [ -z $BPATH ]; then
|
|
ftpc "put $user.$backup_new_date.tar"
|
|
else
|
|
ftpc "cd $BPATH" "put $user.$backup_new_date.tar"
|
|
fi
|
|
rm -f $user.$backup_new_date.tar
|
|
fi
|
|
}
|
|
|
|
# sftp command function
|
|
sftpc() {
|
|
expect -f "-" <<EOF "$@"
|
|
set timeout 60
|
|
set count 0
|
|
spawn /usr/bin/sftp -o StrictHostKeyChecking=no \
|
|
-o Port=$PORT $USERNAME@$HOST
|
|
expect {
|
|
"password:" {
|
|
send "$PASSWORD\r"
|
|
exp_continue
|
|
}
|
|
|
|
-re "Couldn't|(.*)disconnect|(.*)stalled|(.*)not found" {
|
|
set count \$argc
|
|
set output "Disconnected."
|
|
set rc $E_FTP
|
|
exp_continue
|
|
}
|
|
|
|
-re ".*denied.*(publickey|password)." {
|
|
set output "Permission denied, wrong publickey or password."
|
|
set rc $E_CONNECT
|
|
}
|
|
|
|
-re "\[0-9]*%" {
|
|
exp_continue
|
|
}
|
|
|
|
"sftp>" {
|
|
if {\$count < \$argc} {
|
|
set arg [lindex \$argv \$count]
|
|
send "\$arg\r"
|
|
incr count
|
|
} else {
|
|
send "exit\r"
|
|
set output "Disconnected."
|
|
if {[info exists rc] != 1} {
|
|
set rc $OK
|
|
}
|
|
}
|
|
exp_continue
|
|
}
|
|
|
|
timeout {
|
|
set output "Connection timeout."
|
|
set rc $E_CONNECT
|
|
}
|
|
}
|
|
|
|
if {[info exists output] == 1} {
|
|
puts "\$output"
|
|
}
|
|
|
|
exit \$rc
|
|
EOF
|
|
}
|
|
|
|
sftp_backup() {
|
|
|
|
# Checking config
|
|
if [ ! -e "$VESTA/conf/sftp.backup.conf" ]; then
|
|
error="Can't open sftp.backup.conf"
|
|
rm -rf $tmpdir
|
|
rm -f $BACKUP/$user.log
|
|
echo "$error" |$SENDMAIL -s "$subj" $email $notify
|
|
sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
|
|
check_result "$E_NOTEXIST" "$error"
|
|
fi
|
|
|
|
# Parse config
|
|
source $VESTA/conf/sftp.backup.conf
|
|
|
|
# Set default port
|
|
if [ -z "$(grep 'PORT=' $VESTA/conf/sftp.backup.conf)" ]; then
|
|
PORT='22'
|
|
fi
|
|
|
|
# Checking variables
|
|
if [ -z "$HOST" ] || [ -z "$USERNAME" ] || [ -z "$PASSWORD" ]; then
|
|
error="Can't parse sftp backup configuration"
|
|
rm -rf $tmpdir
|
|
rm -f $BACKUP/$user.log
|
|
echo "$error" |$SENDMAIL -s "$subj" $email $notify
|
|
sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
|
|
check_result "$E_PARSING" "$error"
|
|
fi
|
|
|
|
# Debug info
|
|
echo -e "$(date "+%F %T") Remote: sftp://$HOST/$BPATH/$user.$backup_new_date.tar" |\
|
|
tee -a $BACKUP/$user.log
|
|
|
|
# Checking network connection and write permissions
|
|
if [ -z $BPATH ]; then
|
|
sftmpdir="vst.bK76A9SUkt"
|
|
else
|
|
sftmpdir="$BPATH/vst.bK76A9SUkt"
|
|
fi
|
|
sftpc "mkdir $BPATH" > /dev/null 2>&1
|
|
sftpc "mkdir $sftmpdir" "rmdir $sftmpdir" > /dev/null 2>&1
|
|
rc=$?
|
|
if [[ "$rc" != 0 ]]; then
|
|
case $rc in
|
|
$E_CONNECT) error="Can't login to sftp host $HOST" ;;
|
|
$E_FTP) error="Can't create temp folder on sftp $HOST" ;;
|
|
esac
|
|
rm -rf $tmpdir
|
|
rm -f $BACKUP/$user.log
|
|
echo "$error" |$SENDMAIL -s "$subj" $email $notify
|
|
sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
|
|
check_result "$rc" "$error"
|
|
fi
|
|
|
|
# Checking retention
|
|
if [ -z $BPATH ]; then
|
|
backup_list=$(sftpc "ls -l" |awk '{print $9}'|grep "^$user\.")
|
|
else
|
|
backup_list=$(sftpc "cd $BPATH" "ls -l" |awk '{print $9}'|grep "^$user\.")
|
|
fi
|
|
backups_count=$(echo "$backup_list" |wc -l)
|
|
if [ "$backups_count" -ge "$BACKUPS" ]; then
|
|
backups_rm_number=$((backups_count - BACKUPS + 1))
|
|
for backup in $(echo "$backup_list" |head -n $backups_rm_number); do
|
|
backup_date=$(echo $backup |sed -e "s/$user.//" -e "s/.tar.*$//")
|
|
echo -e "$(date "+%F %T") Rotated sftp backup: $backup_date" |\
|
|
tee -a $BACKUP/$user.log
|
|
if [ -z $BPATH ]; then
|
|
sftpc "rm $backup" > /dev/null 2>&1
|
|
else
|
|
sftpc "cd $BPATH" "rm $backup" > /dev/null 2>&1
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# Uploading backup archive
|
|
echo "$(date "+%F %T") Uploading $user.$backup_new_date.tar"|tee -a $BACKUP/$user.log
|
|
if [ "$localbackup" = 'yes' ]; then
|
|
cd $BACKUP
|
|
if [ -z $BPATH ]; then
|
|
sftpc "put $user.$backup_new_date.tar" "chmod 0600 $user.$backup_new_date.tar" > /dev/null 2>&1
|
|
else
|
|
sftpc "cd $BPATH" "put $user.$backup_new_date.tar" "chmod 0600 $user.$backup_new_date.tar" > /dev/null 2>&1
|
|
fi
|
|
else
|
|
cd $tmpdir
|
|
tar -cf $BACKUP/$user.$backup_new_date.tar .
|
|
cd $BACKUP/
|
|
if [ -z $BPATH ]; then
|
|
sftpc "put $user.$backup_new_date.tar" "chmod 0600 $user.$backup_new_date.tar" > /dev/null 2>&1
|
|
else
|
|
sftpc "cd $BPATH" "put $user.$backup_new_date.tar" "chmod 0600 $user.$backup_new_date.tar" > /dev/null 2>&1
|
|
fi
|
|
rm -f $user.$backup_new_date.tar
|
|
fi
|
|
}
|
|
|
|
google_backup() {
|
|
|
|
# Defining google settings
|
|
source $VESTA/conf/google.backup.conf
|
|
gsutil="$VESTA/3rdparty/gsutil/gsutil"
|
|
export BOTO_CONFIG="$VESTA/conf/.google.backup.boto"
|
|
|
|
# Debug info
|
|
echo -e "$(date "+%F %T") Remote: gs://$BUCKET/$BPATH/$user.$backup_new_date.tar"
|
|
|
|
# Checking retention
|
|
backup_list=$(${gsutil} ls gs://$BUCKET/$BPATH/$user.* 2>/dev/null)
|
|
backups_count=$(echo "$backup_list" |wc -l)
|
|
if [ "$backups_count" -ge "$BACKUPS" ]; then
|
|
backups_rm_number=$((backups_count - BACKUPS))
|
|
for backup in $(echo "$backup_list" |head -n $backups_rm_number); do
|
|
echo -e "$(date "+%F %T") Rotated gcp backup: $backup"
|
|
$gsutil rm $backup > /dev/null 2>&1
|
|
done
|
|
fi
|
|
|
|
# Uploading backup archive
|
|
echo -e "$(date "+%F %T") Uploading $user.$backup_new_date.tar ..."
|
|
if [ "$localbackup" = 'yes' ]; then
|
|
cd $BACKUP
|
|
${gsutil} cp $user.$backup_new_date.tar gs://$BUCKET/$BPATH/ > /dev/null 2>&1
|
|
else
|
|
cd $tmpdir
|
|
tar -cf $BACKUP/$user.$backup_new_date.tar .
|
|
cd $BACKUP/
|
|
${gsutil} cp $user.$backup_new_date.tar gs://$BUCKET/$BPATH/ > /dev/null 2>&1
|
|
rc=$?
|
|
rm -f $user.$backup_new_date.tar
|
|
if [ "$rc" -ne 0 ]; then
|
|
check_result "$E_CONNECT" "gsutil failed to upload $user.$backup_new_date.tar"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
echo -e "\n-- SUMMARY --" |tee -a $BACKUP/$user.log
|
|
|
|
# Switching on backup system types
|
|
for backup_type in $(echo -e "${BACKUP_SYSTEM//,/\\n}"); do
|
|
case $backup_type in
|
|
local) local_backup ;;
|
|
ftp) ftp_backup ;;
|
|
sftp) sftp_backup ;;
|
|
google) google_backup ;;
|
|
esac
|
|
done
|
|
|
|
# Removing tmpdir
|
|
rm -rf $tmpdir
|
|
|
|
# Calculation run time
|
|
run_time=$((end_time - start_time))
|
|
run_time=$((run_time / 60))
|
|
current_time=$(date "+%T")
|
|
if [ "$run_time" -lt 1 ]; then
|
|
run_time=1
|
|
fi
|
|
min=minutes
|
|
if [ "$run_time" -eq 1 ]; then
|
|
min=minute
|
|
fi
|
|
|
|
echo "$(date "+%F %T") Size: $size MB" |tee -a $BACKUP/$user.log
|
|
echo "$(date "+%F %T") Runtime: $run_time $min" |tee -a $BACKUP/$user.log
|
|
|
|
|
|
#----------------------------------------------------------#
|
|
# Vesta #
|
|
#----------------------------------------------------------#
|
|
|
|
# Removing duplicate
|
|
touch $USER_DATA/backup.conf
|
|
sed -i "/$user.$backup_new_date.tar/d" $USER_DATA/backup.conf
|
|
|
|
# Registering new backup
|
|
backup_str="BACKUP='$user.$backup_new_date.tar'"
|
|
backup_str="$backup_str TYPE='$BACKUP_SYSTEM' SIZE='$size'"
|
|
backup_str="$backup_str WEB='${web_list// /,}'"
|
|
backup_str="$backup_str DNS='${dns_list// /,}'"
|
|
backup_str="$backup_str MAIL='${mail_list// /,}'"
|
|
backup_str="$backup_str DB='${db_list// /,}'"
|
|
backup_str="$backup_str CRON='$cron_list'"
|
|
backup_str="$backup_str UDIR='${udir_list// /,}'"
|
|
backup_str="$backup_str RUNTIME='$run_time' TIME='$time' DATE='$date'"
|
|
echo "$backup_str" >> $USER_DATA/backup.conf
|
|
|
|
# Removing old backups
|
|
tail -n $BACKUPS $USER_DATA/backup.conf > $USER_DATA/backup.conf_
|
|
mv -f $USER_DATA/backup.conf_ $USER_DATA/backup.conf
|
|
chmod 660 $USER_DATA/backup.conf
|
|
|
|
# Deleting task from queue
|
|
sed -i "/v-backup-user $user /d" $VESTA/data/queue/backup.pipe
|
|
|
|
U_BACKUPS=$(grep BACKUP $USER_DATA/backup.conf |wc -l)
|
|
update_user_value "$user" '$U_BACKUPS' "$U_BACKUPS"
|
|
|
|
# Send notification
|
|
if [ -e "$BACKUP/$user.log" ]; then
|
|
cd $BACKUP
|
|
subj="$user → backup has been completed"
|
|
email=$(get_user_value '$CONTACT')
|
|
cat $BACKUP/$user.log |$SENDMAIL -s "$subj" $email $notify
|
|
rm $BACKUP/$user.log
|
|
fi
|
|
|
|
# Logging
|
|
log_event "$OK" "$ARGUMENTS"
|
|
|
|
exit
|