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