Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/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.
- if ! [ -x "$(command -v pigz)" ]; then
- GZIP="$(which pigz) -9 -p 16"
- else
- GZIP="$(which gzip)"
- fi
- #----------------------------------------------------------#
- # 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
- # Creating temporary directory
- tmpdir=$(mktemp -p $BACKUP -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
- # 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
- fargs+=(--exclude=$xpath/*)
- echo "$(date "+%F %T") excluding directory $xpath"
- msg="$msg\n$(date "+%F %T") excluding directory $xpath"
- done
- fi
- set +f
- # Backup files
- cd $HOMEDIR/$user/web/$domain
- tar -cpf $tmpdir/web/$domain/domain_data.tar * ${fargs[@]}
- # Compress archive
- $GZIP -$BACKUP_GZIP $tmpdir/web/$domain/domain_data.tar
- 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
- 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
- echo "$(date "+%F %T") + $account@$domain" |\
- tee -a $BACKUP/$user.log
- touch $tmpdir/mail/$domain/accounts.tar
- tar -rpf $tmpdir/mail/$domain/accounts.tar $account
- else
- echo "$(date "+%F %T") excluding mail account $account" |\
- tee -a $BACKUP/$user.log
- fi
- done
- # Compress archive
- if [ -e "$tmpdir/mail/$domain/accounts.tar" ]; then
- $GZIP -$BACKUP_GZIP $tmpdir/mail/$domain/accounts.tar
- 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"
- grants="$tmpdir/db/$database/conf/$database.$TYPE.$DBUSER"
- case $TYPE in
- mysql) dump_mysql_database ;;
- pgsql) dump_pgsql_database ;;
- esac
- # Compress dump
- $GZIP -$BACKUP_GZIP $dump
- 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
- fargs+=(-not)
- fargs+=(-path)
- fargs+=("./$xpath*")
- echo "$(date "+%F %T") excluding directory $xpath" |\
- tee -a $BACKUP/$user.log
- 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 -cpf $tmpdir/user_dir/$udir.tar $udir
- # Compress arhive
- $GZIP -$BACKUP_GZIP $tmpdir/user_dir/$udir.tar
- 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))
- # 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 -n $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))
- 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))
- 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") Roated 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement