diff --git a/mssql-backup.sh b/mssql-backup.sh index acc046f..cd57b70 100644 --- a/mssql-backup.sh +++ b/mssql-backup.sh @@ -23,11 +23,14 @@ fi : ${LOG_FILE:="/zucchetti/backupdb/backup_log.txt"} : ${ERROR_LOG_FILE:="/zucchetti/backupdb/backup_err.txt"} : ${REMOTE_DIR:="/BackupDB"} +: ${DO_LOCAL_BACKUP:=1} # 1 per eseguire il backup locale, 0 per disabilitarlo +: ${DO_FTP_BACKUP:=1} # 1 per eseguire il backup FTP, 0 per disabilitarlo +: ${TRUST_CERTIFICATE:=1} # 1 per accettare certificati autofirmati, 0 per richiederli validi # Required variables check required_vars=( "USER" "PASSWORD" "FTP_SERVER" "FTP_USER" "FTP_PASSWORD" - "SMTP_SERVER" "SMTP_USER" "SMTP_PASS" + "SMTP_SERVER" "SMTP_USER" "SMTP_PASS" "DO_LOCAL_BACKUP" "DO_FTP_BACKUP" ) for var in "${required_vars[@]}"; do @@ -42,13 +45,23 @@ DATE=$(LC_TIME=C date +%Y%m%d%H%M%S) # Function to get all user databases get_all_databases() { - $SQLCMD -S "$HOST" -U "$USER" -P "$PASSWORD" -h-1 \ + local trust_cert_option="" + if [ "$TRUST_CERTIFICATE" -eq 1 ]; then + trust_cert_option="-C" + fi + + $SQLCMD -S "$HOST" -U "$USER" -P "$PASSWORD" $trust_cert_option -h-1 \ -Q "SELECT name FROM sys.databases WHERE database_id > 4 AND state = 0 AND is_read_only = 0" \ - -C -b | tr -d ' ' + -W -s"|" | grep -v "rows affected" | grep -v "^-" | grep -v "^$" | tr -d ' ' } # Function to check FTP connection check_ftp_connection() { + # Skip if FTP backup is disabled + if [ "$DO_FTP_BACKUP" -eq 0 ]; then + return 0 + fi + local temp_file=$(mktemp) ftp -inv $FTP_SERVER > $temp_file 2>&1 <> $LOG_FILE 2>> $ERROR_LOG_FILE user $FTP_USER $FTP_PASSWORD mkdir "$REMOTE_DB_DIR" @@ -153,18 +181,28 @@ EOF START_TIME=$(date +%s) echo "$(LC_TIME=C date): Starting backup for database: $db_name on server $SERVER_NAME" > $LOG_FILE - # Perform database backup with CHECK option (fixed SQLCMD syntax) - $SQLCMD -S "$HOST" -U "$USER" -P "$PASSWORD" \ - -Q "BACKUP DATABASE [$db_name] TO DISK = N'$BACKUP_FILE' WITH CHECKSUM, COMPRESSION, INIT" \ - -C -b >> $LOG_FILE 2>> $ERROR_LOG_FILE + # Perform local backup if enabled + if [ "$DO_LOCAL_BACKUP" -eq 1 ]; then + local trust_cert_option="" + if [ "$TRUST_CERTIFICATE" -eq 1 ]; then + trust_cert_option="-C" + fi + + $SQLCMD -S "$HOST" -U "$USER" -P "$PASSWORD" $trust_cert_option \ + -Q "BACKUP DATABASE [$db_name] TO DISK = N'$BACKUP_FILE' WITH CHECKSUM, COMPRESSION, INIT" \ + -b >> $LOG_FILE 2>> $ERROR_LOG_FILE - # Check if the local backup was successful - if [ $? -eq 0 ] && [ -f "$BACKUP_FILE" ]; then - LOCAL_STATUS=0 - echo "$(LC_TIME=C date): Local backup completed successfully for $db_name." >> $LOG_FILE + # Check if the local backup was successful + if [ $? -eq 0 ] && [ -f "$BACKUP_FILE" ]; then + LOCAL_STATUS=0 + echo "$(LC_TIME=C date): Local backup completed successfully for $db_name." >> $LOG_FILE + else + LOCAL_STATUS=1 + echo "$(LC_TIME=C date): Error during local backup of $db_name. Check error log." >> $LOG_FILE + fi else - LOCAL_STATUS=1 - echo "$(LC_TIME=C date): Error during local backup of $db_name. Check error log." >> $LOG_FILE + LOCAL_STATUS=0 + echo "$(LC_TIME=C date): Local backup disabled for $db_name." >> $LOG_FILE fi # End time and duration @@ -175,35 +213,40 @@ EOF echo "End time: $(LC_TIME=C date -d @$END_TIME)" >> $LOG_FILE echo "Duration: $((DURATION / 60)) minutes and $((DURATION % 60)) seconds" >> $LOG_FILE - # Upload backup to remote FTP server only if local backup was successful - if [ $LOCAL_STATUS -eq 0 ]; then - echo "$(LC_TIME=C date): Starting FTP upload for $db_name." >> $LOG_FILE - - if ! check_ftp_connection; then - FTP_STATUS=1 - echo "$(LC_TIME=C date): Cannot establish FTP connection. Upload failed." >> $LOG_FILE - echo "FTP connection failed - Cannot connect to server" >> $ERROR_LOG_FILE - else - if perform_ftp_upload "$BACKUP_FILE" "$REMOTE_BACKUP_FILE"; then - FTP_STATUS=0 - echo "$(LC_TIME=C date): FTP upload completed successfully for $db_name." >> $LOG_FILE - else + # Upload backup to remote FTP server if enabled and local backup was successful + if [ "$DO_FTP_BACKUP" -eq 1 ]; then + if [ "$DO_LOCAL_BACKUP" -eq 0 ] || [ $LOCAL_STATUS -eq 0 ]; then + echo "$(LC_TIME=C date): Starting FTP upload for $db_name." >> $LOG_FILE + + if ! check_ftp_connection; then FTP_STATUS=1 - echo "$(LC_TIME=C date): Error during FTP upload for $db_name. Check error log." >> $LOG_FILE + echo "$(LC_TIME=C date): Cannot establish FTP connection. Upload failed." >> $LOG_FILE + echo "FTP connection failed - Cannot connect to server" >> $ERROR_LOG_FILE + else + if perform_ftp_upload "$BACKUP_FILE" "$REMOTE_BACKUP_FILE"; then + FTP_STATUS=0 + echo "$(LC_TIME=C date): FTP upload completed successfully for $db_name." >> $LOG_FILE + else + FTP_STATUS=1 + echo "$(LC_TIME=C date): Error during FTP upload for $db_name. Check error log." >> $LOG_FILE + fi fi + else + echo "$(LC_TIME=C date): Skipping FTP upload due to local backup failure." >> $LOG_FILE + FTP_STATUS=1 fi else - echo "$(LC_TIME=C date): Skipping FTP upload due to local backup failure." >> $LOG_FILE - FTP_STATUS=1 + FTP_STATUS=0 + echo "$(LC_TIME=C date): FTP upload disabled for $db_name." >> $LOG_FILE fi - # Local retention policy - if [ $LOCAL_STATUS -eq 0 ]; then + # Local retention policy if local backup is enabled + if [ "$DO_LOCAL_BACKUP" -eq 1 ] && [ $LOCAL_STATUS -eq 0 ]; then find "$LOCAL_DB_DIR" -name "${db_name}_backup_*.bak" -type f -mtime +$RETENTION -delete >> $LOG_FILE 2>> $ERROR_LOG_FILE fi - # Remote retention policy - if [ $FTP_STATUS -eq 0 ]; then + # Remote retention policy if FTP backup is enabled + if [ "$DO_FTP_BACKUP" -eq 1 ] && [ $FTP_STATUS -eq 0 ]; then echo "$(LC_TIME=C date): Performing remote retention check." >> $LOG_FILE temp_list_file=$(mktemp) @@ -237,13 +280,29 @@ EOF rm -f $temp_list_file fi - # Determine email status - if [ $LOCAL_STATUS -eq 0 ] && [ $FTP_STATUS -eq 0 ]; then - EMAIL_STATUS="SUCCESS" - elif [ $LOCAL_STATUS -eq 1 ] && [ $FTP_STATUS -eq 1 ]; then - EMAIL_STATUS="FAILED" + # Determine email status based on enabled backups + if [ "$DO_LOCAL_BACKUP" -eq 1 ] && [ "$DO_FTP_BACKUP" -eq 1 ]; then + if [ $LOCAL_STATUS -eq 0 ] && [ $FTP_STATUS -eq 0 ]; then + EMAIL_STATUS="SUCCESS" + elif [ $LOCAL_STATUS -eq 1 ] && [ $FTP_STATUS -eq 1 ]; then + EMAIL_STATUS="FAILED" + else + EMAIL_STATUS="WARNING" + fi + elif [ "$DO_LOCAL_BACKUP" -eq 1 ]; then + if [ $LOCAL_STATUS -eq 0 ]; then + EMAIL_STATUS="SUCCESS" + else + EMAIL_STATUS="FAILED" + fi + elif [ "$DO_FTP_BACKUP" -eq 1 ]; then + if [ $FTP_STATUS -eq 0 ]; then + EMAIL_STATUS="SUCCESS" + else + EMAIL_STATUS="FAILED" + fi else - EMAIL_STATUS="WARNING" + EMAIL_STATUS="DISABLED" fi # Send email with log @@ -272,4 +331,4 @@ if [ -z "$1" ]; then else perform_backup "$1" exit $? -fi +fi \ No newline at end of file