#!/bin/bash
# info: Download backup
# options: USER BACKUP 
#
# The function download back-up from remote server


#----------------------------------------------------------#
#                    Variable&Function                     #
#----------------------------------------------------------#

# Import Hestia variable for cron launch
source /etc/profile

# Argument definition
user=$1
backup=$2

# Define backup dir
if [ -z "$BACKUP" ]; then
    BACKUP=/backup
fi

# Includes
source $HESTIA/func/main.sh
source $HESTIA/func/domain.sh
source $HESTIA/func/ip.sh
source $HESTIA/func/db.sh
source $HESTIA/func/rebuild.sh
source $HESTIA/conf/hestia.conf

# Defining FTP command function
ftpc() {
    /usr/bin/ftp -n $HOST $PORT <<EOF
    quote USER $USERNAME
    quote PASS $PASSWORD
    lcd $BACKUP
    binary
    $1
    $2
    $3
    quit
EOF
}

# FTP backup download function
ftp_download() {
    source $HESTIA/conf/ftp.backup.conf
    if [ -z "$PORT" ]; then
        PORT='21'
    fi
    if [ -z $BPATH ]; then
        ftpc "get $1"
    else
        ftpc "cd $BPATH" "get $1"
    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 download function
sftp_download() {
    source $HESTIA/conf/sftp.backup.conf
    if [ -z "$PORT" ]; then
        PORT='22'
    fi
    cd $BACKUP
    if [ -z $BPATH ]; then
        sftpc "get $1" > /dev/null 2>&1
    else
        sftpc "cd $BPATH" "get $1" > /dev/null 2>&1
    fi

}

# Google backup download function
google_download() {
    source $HESTIA/conf/google.backup.conf
    gsutil="$HESTIA/3rdparty/gsutil/gsutil"
    export BOTO_CONFIG="$HESTIA/conf/.google.backup.boto"
    ${gsutil} cp gs://$BUCKET/$BPATH/$1 $BACKUP/ > /dev/null 2>&1
    if [ "$?" -ne 0 ]; then
        check_result "$E_CONNECT" "gsutil failed to download $1"
    fi
}


#----------------------------------------------------------#
#                    Verifications                         #
#----------------------------------------------------------#

check_args '2' "$#" 'USER BACKUP'
is_format_valid 'user' 'backup'

#----------------------------------------------------------#
#                       Action                             #
#----------------------------------------------------------#


# Checking available disk space
disk_usage=$(df $BACKUP |tail -n1 |tr ' ' '\n' |grep % |cut -f 1 -d %)
if [ "$disk_usage" -ge "$BACKUP_DISK_LIMIT" ]; then
    echo "Error: Not enough disk space" |$SENDMAIL -s "$subj" $email $notify
    sed -i "/ $user /d" $HESTIA/data/queue/backup.pipe
    check_result $E_DISK "Not enough disk space"
fi

# Checking local backup
if [ ! -e "$BACKUP/$backup" ]; then
    if [[ "$BACKUP_SYSTEM" =~ "google" ]]; then
        google_download $backup
        downloaded='yes'
    fi
    if [[ "$BACKUP_SYSTEM" =~ "sftp" ]] && [ -z "$downloaded" ]; then
        sftp_download $backup
        downloaded='yes'
    fi
    if [[ "$BACKUP_SYSTEM" =~ "ftp" ]] && [ -z "$downloaded" ]; then
        ftp_download $backup
        downloaded='yes'
    fi
    if [ -z "$downloaded" ]; then
        subj="Download of $backup failed for $user"
        $BIN/v-add-user-notification $user "$subj" "<b>Unable to retrieve backup file from remote server.</b><br><b>Error:</b> $backup file doesn't exist in '${BACKUP}' directory."
        sed -i "/v-download-backup $user /d" $HESTIA/data/queue/backup.pipe
        check_result $E_NOTEXIST "backup file $backup doesn't exist in '${BACKUP}' folder"
    else
        if [ -e "$BACKUP/$backup" ]; then
        chmod 0640 $BACKUP/$backup
        chown admin:admin $BACKUP/$backup
        echo "rm $BACKUP/$backup" | at now + 1 day
        fi
    fi
fi

#----------------------------------------------------------#
#                       Hestia                             #
#----------------------------------------------------------#

# Send notification
if [ -e "$BACKUP/$backup" ]; then
    cd $BACKUP
    subj="Download of $backup completed for $user"
    email=$(get_user_value '$CONTACT')
    echo "Backup file $backup was retrieved from the remote server and will be available to download for 12 hours." | $SENDMAIL -s "$subj" $email $notify
    $BIN/v-add-user-notification $user "$subj" "Backup file <b>$backup</b> was retrieved from the remote server and will be available to download for <b>12 hours</b>."
fi

# Cleaning restore queue
sed -i "/v-download-backup $user /d" $HESTIA/data/queue/backup.pipe

# Logging
log_event "$OK" "$ARGUMENTS"

exit
