@@ -687,6 +687,158 @@ ftp_backup() {
687687 fi
688688}
689689
690+ # sftp command function
691+ sftpc () {
692+ expect -f " -" << EOF "$@ "
693+ set timeout 60
694+ set count 0
695+ spawn /usr/bin/sftp -o StrictHostKeyChecking=no -o Port=$PORT $USERNAME @$HOST
696+ expect {
697+ "password:" {
698+ send "$PASSWORD \r"
699+ exp_continue
700+ }
701+
702+ -re "Couldn't|(.*)disconnect|(.*)stalled|(.*)not found" {
703+ set count \$ argc
704+ set output "Disconnected."
705+ set rc $E_FTP
706+ exp_continue
707+ }
708+
709+ -re ".*denied.*(publickey|password)." {
710+ set output "Permission denied, wrong publickey or password."
711+ set rc $E_CONNECT
712+ }
713+
714+ -re "\[0-9]*%" {
715+ exp_continue
716+ }
717+
718+ "sftp>" {
719+ if {\$ count < \$ argc} {
720+ set arg [lindex \$ argv \$ count]
721+ send "\$ arg\r"
722+ incr count
723+ } else {
724+ send "exit\r"
725+ set output "Disconnected."
726+ if {[info exists rc] != 1} {
727+ set rc $OK
728+ }
729+ }
730+ exp_continue
731+ }
732+
733+ timeout {
734+ set output "Connection timeout."
735+ set rc $E_CONNECT
736+ }
737+ }
738+
739+ if {[info exists output] == 1} {
740+ puts "\$ output"
741+ }
742+
743+ exit \$ rc
744+ EOF
745+ }
746+
747+ sftp_backup () {
748+ # Checking expect installation
749+ check_expect=$( which expect)
750+ if [[ ! -n $check_expect ]]
751+ then
752+ echo " Error: \" expect\" utility not found"
753+ log_event " $E_NOTEXIST " " $EVENT "
754+ exit $E_NOTEXIST
755+ fi
756+
757+ # Checking config
758+ if [ ! -e " $VESTA /conf/sftp.backup.conf" ]; then
759+ sftp_conf_error=" Can't open $VESTA /conf/sftp.backup.conf"
760+ echo " $sftp_conf_error " | $send_mail -s " $subj " $email
761+ echo " Error: $VESTA /conf/sftp.backup.conf doesn't exist"
762+ sed -i " / $user /d" $VESTA /data/queue/backup.pipe
763+ log_event " $E_NOTEXIST " " $EVENT "
764+ exit $E_NOTEXIST
765+ fi
766+
767+ # Parse config
768+ source $VESTA /conf/sftp.backup.conf
769+
770+ # Set current data
771+ DATE=$( date +%F)
772+ TIME=$( date +%T)
773+
774+ # Set default port
775+ if [ -z " $( grep ' PORT=' $VESTA /conf/sftp.backup.conf) " ]; then
776+ PORT=' 22'
777+ fi
778+
779+ # Checking variables
780+ if [ -z " $HOST " ] || [ -z " $USERNAME " ] || [ -z " $PASSWORD " ]; then
781+ rm -rf $tmpdir
782+ echo " Can't parse sftp backup configuration" | \
783+ $send_mail -s " $subj " $email
784+ echo " Error: Parsing error"
785+ sed -i " / $user /d" $VESTA /data/queue/backup.pipe
786+ log_event " $E_PARSING " " $EVENT "
787+ exit $E_PARSING
788+ fi
789+
790+ # Debug info
791+ echo -e " $( date " +%F %T" ) Remote: $HOST /$BPATH /$user .$DATE .tar"
792+
793+ # Checking network connection and write permissions
794+ echo -e " $( date " +%F %T" ) Checking network connection and write permissions ..."
795+ sftmpdir=" $BPATH /vst.bK76A9SUkt"
796+ sftpc " mkdir $BPATH " > /dev/null 2>&1
797+ sftpc " mkdir $sftmpdir " " rmdir $sftmpdir " > /dev/null 2>&1
798+ rc=$?
799+ if [[ " $rc " != 0 ]]
800+ then
801+ rm -rf $tmpdir
802+ case $rc in
803+ $E_CONNECT ) echo " Error: can't login to sftp host" | $send_mail -s " $subj " $email ;;
804+ $E_FTP ) echo " Error: can't create temp folder on the sftp host" | $send_mail -s " $subj " $email ;;
805+ esac
806+ sed -i " / $user /d" $VESTA /data/queue/backup.pipe
807+ log_event " $rc " " $EVENT "
808+ exit " $rc "
809+ fi
810+ echo -e " $( date " +%F %T" ) Connection established"
811+
812+ # Checking retention
813+ echo -e " $( date " +%F %T" ) Checking retention ..."
814+ backup_list=$( sftpc " cd $BPATH " " ls -l" | awk ' {print $9}' | grep " ^$user \." )
815+ backups_count=$( echo " $backup_list " | wc -l)
816+ if [ " $backups_count " -ge " $BACKUPS " ]; then
817+ backups_rm_number=$(( backups_count - BACKUPS + 1 ))
818+ for backup in $( echo " $backup_list " | head -n $backups_rm_number ) ; do
819+ backup_date=$( echo $backup | sed -e " s/$user .//" -e " s/.tar.*$//" )
820+ if [ -z $deprecated ]; then deprecated=" $backup_date " ; else deprecated=" $deprecated $backup_date " ; fi
821+ echo -e " $( date " +%F %T" ) Roated sftp backup: $backup_date "
822+ msg=" $msg \n$( date " +%F %T" ) Roated sftp backup: $backup_date "
823+ sftpc " cd $BPATH " " rm $backup " > /dev/null 2>&1
824+ done
825+ fi
826+
827+ # Uploading backup archive
828+ echo -e " $( date " +%F %T" ) Uploading $user .$DATE .tar ..."
829+ if [ " $localbackup " = ' yes' ]; then
830+ cd $BACKUP
831+ sftpc " cd $BPATH " " put $user .$DATE .tar" > /dev/null 2>&1
832+ else
833+ cd $tmpdir
834+ tar -cf $BACKUP /$user .$DATE .tar .
835+ cd $BACKUP /
836+ sftpc " cd $BPATH " " put $user .$DATE .tar" > /dev/null 2>&1
837+ rm -f $user .$DATE .tar
838+ fi
839+ echo -e " $( date " +%F %T" ) Upload complete"
840+ }
841+
690842echo " -- SUMMARY --"
691843msg=" $msg \n-- SUMMARY --"
692844
@@ -695,6 +847,7 @@ for backup_type in $(echo -e "${BACKUP_SYSTEM//,/\\n}"); do
695847 case $backup_type in
696848 local) local_backup ;;
697849 ftp) ftp_backup ;;
850+ sftp) sftp_backup ;;
698851 esac
699852done
700853
0 commit comments