@@ -9,7 +9,7 @@ ARCHIVE_DIR=${LOGROTATE_ARCHIVE_DIR:-/var/log/nginx/archive}
99REMOTE_HOST=${LOGROTATE_REMOTE_HOST:- }
1010REMOTE_USER=${LOGROTATE_REMOTE_USER:- }
1111REMOTE_PATH=${LOGROTATE_REMOTE_PATH:-/ var/ log/ nginx-archive}
12- REMOTE_METHOD=${LOGROTATE_REMOTE_METHOD:- scp} # scp, rsync, s3, etc.
12+ REMOTE_METHOD=${LOGROTATE_REMOTE_METHOD:- scp} # scp, sftp, rsync, s3
1313COMPRESS_ARCHIVE=${LOGROTATE_COMPRESS_ARCHIVE:- true}
1414CLEANUP_AFTER_REMOTE=${LOGROTATE_CLEANUP_AFTER_REMOTE:- false}
1515ENABLE_ARCHIVE=${LOGROTATE_ENABLE_ARCHIVE:- true}
@@ -108,6 +108,9 @@ transfer_to_remote() {
108108 " scp" )
109109 transfer_via_scp
110110 ;;
111+ " sftp" )
112+ transfer_via_sftp
113+ ;;
111114 " rsync" )
112115 transfer_via_rsync
113116 ;;
@@ -149,6 +152,59 @@ transfer_via_scp() {
149152 fi
150153}
151154
155+ # Function to transfer via SFTP (batch mode — works with SFTP-only servers)
156+ transfer_via_sftp () {
157+ if [ -z " $REMOTE_HOST " ] || [ -z " $REMOTE_USER " ]; then
158+ log_message " SFTP transfer requires REMOTE_HOST and REMOTE_USER"
159+ return 1
160+ fi
161+
162+ local sftp_opts=" -P $SSH_PORT -i $SSH_KEY_PATH -o StrictHostKeyChecking=no -o BatchMode=yes"
163+ local batch_file=$( mktemp /tmp/sftp-batch-XXXXXX)
164+
165+ # Create remote directories (dash prefix = ignore errors if already exists)
166+ local parent_dir=$( dirname " $REMOTE_PATH " )
167+ if [ " $parent_dir " != " /" ] && [ " $parent_dir " != " ." ]; then
168+ echo " -mkdir $parent_dir " >> " $batch_file "
169+ fi
170+ echo " -mkdir $REMOTE_PATH " >> " $batch_file "
171+
172+ # Add files to upload
173+ local file_count=0
174+ if [ " $COMPRESS_ARCHIVE " = " true" ]; then
175+ for f in " $ARCHIVE_DIR " /nginx-logs-* .tar.gz; do
176+ if [ -f " $f " ]; then
177+ echo " put $f $REMOTE_PATH /" >> " $batch_file "
178+ file_count=$(( file_count + 1 ))
179+ fi
180+ done
181+ else
182+ for f in " $ARCHIVE_DIR " /* ; do
183+ if [ -f " $f " ]; then
184+ echo " put $f $REMOTE_PATH /" >> " $batch_file "
185+ file_count=$(( file_count + 1 ))
186+ fi
187+ done
188+ fi
189+
190+ if [ " $file_count " -eq 0 ]; then
191+ log_message " No files to transfer via SFTP"
192+ rm -f " $batch_file "
193+ return 0
194+ fi
195+
196+ # Execute sftp batch
197+ if sftp $sftp_opts -b " $batch_file " " $REMOTE_USER @$REMOTE_HOST " >> " $LOG_FILE " 2>&1 ; then
198+ log_message " Transferred $file_count files to remote via SFTP"
199+ else
200+ log_message " SFTP transfer failed (exit code $? )"
201+ rm -f " $batch_file "
202+ return 1
203+ fi
204+
205+ rm -f " $batch_file "
206+ }
207+
152208# Function to transfer via rsync
153209transfer_via_rsync () {
154210 if [ -z " $REMOTE_HOST " ] || [ -z " $REMOTE_USER " ]; then
0 commit comments