Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:dovecot_backup_-_skript

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
tachtler:dovecot_backup_-_skript [2022/10/30 08:56] – [Skript] klaustachtler:dovecot_backup_-_skript [2023/07/05 19:07] (aktuell) – [Dovecot Backup - Skript] klaus
Zeile 12: Zeile 12:
  
 ^ Beschreibung  ^ Externer Link                                                                   ^ ^ Beschreibung  ^ Externer Link                                                                   ^
-| Linux-Magazin | [[http://www.linux-magazin.de/ausgaben/2018/06/backups-von-e-mails/|Wie Admins ihre Mailserver vor Datenverlust schützen]] / {{ :tachtler:protected:054-058_email_backup_v2.pdf |Artikel aus Ausgabe 06/2018}} |+| Linux-Magazin | [[http://www.linux-magazin.de/ausgaben/2018/06/backups-von-e-mails/|Wie Admins ihre Mailserver vor Datenverlust schützen]]\\ [[https://www.linux-magazin.de/ausgaben/2018/06/backups-von-e-mails/4/|Wie Admins ihre Mailserver vor Datenverlust schützen (Seite 4) - Erwähnung]]\\ {{ :tachtler:protected:054-058_email_backup_v2.pdf |Artikel aus Ausgabe 06/2018 - geschützt}} |
 | Homepage      | [[http://dovecot.org|http://dovecot.org]]                                       | | Homepage      | [[http://dovecot.org|http://dovecot.org]]                                       |
 | Dokumentation | [[http://dovecot.org/documentation.html|http://dovecot.org/documentation.html]] | | Dokumentation | [[http://dovecot.org/documentation.html|http://dovecot.org/documentation.html]] |
Zeile 229: Zeile 229:
  
 <code bash> <code bash>
-#!/bin/bash+#!/usr/bin/env bash
  
 ############################################################################## ##############################################################################
Zeile 238: Zeile 238:
 #               will be send by e-mail.                                      # #               will be send by e-mail.                                      #
 #                                                                            # #                                                                            #
-# Last update : 30.10.2022                                                   # +# Last update : 03.07.2023                                                   # 
-# Version     : 1.18                                                         #+# Version     : 1.20                                                         #
 #                                                                            # #                                                                            #
 # Author      : Klaus Tachtler, <klaus@tachtler.net>                         # # Author      : Klaus Tachtler, <klaus@tachtler.net>                         #
Zeile 252: Zeile 252:
 #  +----------------------------------------------------------------------+  # #  +----------------------------------------------------------------------+  #
 #                                                                            # #                                                                            #
-# Copyright (c) 2022 by Klaus Tachtler.                                      #+# Copyright (c) 2023 by Klaus Tachtler.                                      #
 #                                                                            # #                                                                            #
 ############################################################################## ##############################################################################
Zeile 368: Zeile 368:
 # -------------------------------------------------------------------------- # # -------------------------------------------------------------------------- #
 # Version     : 1.18                                                         # # Version     : 1.18                                                         #
 +# Description : Introduction of zstd compression as an alternative choice to #
 +#               gzip compression. So now by setting the variable COMPRESSION #
 +#               the type of compression can be selected between zst and gz.  #
 +#               The zstd compression can lower the execution time by half.   #
 +#               The design of the code was also revised.                     #
 +#               The error handling was also been improved.                   #
 +#               Thanks to Marco De Lellis.                                   #
 +# -------------------------------------------------------------------------- #
 +# Version     : 1.19                                                         #
 # Description : GitHub: Issue #24                                            # # Description : GitHub: Issue #24                                            #
 #               Correct the license mismatch between GitHub and the script.  # #               Correct the license mismatch between GitHub and the script.  #
 #               Thanks to David Haerdeman (Alphix).                          # #               Thanks to David Haerdeman (Alphix).                          #
 +# -------------------------------------------------------------------------- #
 +# Version     : 1.20                                                         #
 +# Description : GitHub: Pull request #26                                     #
 +#               Improved FreeBSD compatibility.                              #
 +#               Thanks to wombelix (Dominik Wombacher)                       #
 # -------------------------------------------------------------------------- # # -------------------------------------------------------------------------- #
 # Version     : x.xx                                                         # # Version     : x.xx                                                         #
Zeile 383: Zeile 397:
 # CUSTOM - Script-Name. # CUSTOM - Script-Name.
 SCRIPT_NAME='dovecot_backup' SCRIPT_NAME='dovecot_backup'
 +
 +# CUSTOM - Backup-Files compression method - (possible values: gz zst).
 +COMPRESSION='gz'
  
 # CUSTOM - Backup-Files. # CUSTOM - Backup-Files.
 TMP_FOLDER='/srv/backup' TMP_FOLDER='/srv/backup'
 DIR_BACKUP='/srv/backup' DIR_BACKUP='/srv/backup'
-FILE_BACKUP=dovecot_backup_`date '+%Y%m%d_%H%M%S'`.tar.gz +FILE_BACKUP=dovecot_backup_`date '+%Y%m%d_%H%M%S'`.tar.$COMPRESSION 
-FILE_DELETE='*.tar.gz'+FILE_DELETE=$(printf '*.tar.%s$COMPRESSION)
 BACKUPFILES_DELETE=14 BACKUPFILES_DELETE=14
  
Zeile 419: Zeile 436:
  
 # Variables. # Variables.
-DSYNC_COMMAND=`command -v dsync` 
 TAR_COMMAND=`command -v tar` TAR_COMMAND=`command -v tar`
 +GZIP_COMMAND=`command -v gzip`
 +ZSTD_COMMAND=`command -v zstd`
 TOUCH_COMMAND=`command -v touch` TOUCH_COMMAND=`command -v touch`
 RM_COMMAND=`command -v rm` RM_COMMAND=`command -v rm`
Zeile 445: Zeile 463:
 VAR_COUNT_USER=0 VAR_COUNT_USER=0
 VAR_COUNT_FAIL=0 VAR_COUNT_FAIL=0
 +
 +# FreeBSD specific commands
 +if [ "$OSTYPE" = "FreeBSD" ]; then
 +        DSYNC_COMMAND=`command -v doveadm`
 +        STAT_COMMAND_PARAM_FORMAT='-f'
 +        STAT_COMMAND_ARG_FORMAT_USER='%Su'
 +        STAT_COMMAND_ARG_FORMAT_GROUP='%Sg'
 +        MKTEMP_COMMAND_PARAM_ARG="-d ${TMP_FOLDER}/${SCRIPT_NAME}-XXXXXXXXXXXX"
 +else
 + DSYNC_COMMAND=`command -v dsync`
 +        STAT_COMMAND_PARAM_FORMAT='-c'
 +        STAT_COMMAND_ARG_FORMAT_USER='%U'
 +        STAT_COMMAND_ARG_FORMAT_GROUP='%G'
 +        MKTEMP_COMMAND_PARAM_ARG="-d -p ${TMP_FOLDER} -t ${SCRIPT_NAME}-XXXXXXXXXXXX"
 +fi
  
 # Functions. # Functions.
Zeile 568: Zeile 601:
 log "" log ""
 log "SCRIPT_NAME.................: $SCRIPT_NAME" log "SCRIPT_NAME.................: $SCRIPT_NAME"
 +log ""
 +log "OS_TYPE.....................: $OSTYPE"
 +log ""
 +log "COMPRESSION.................: $COMPRESSION"
 log "" log ""
 log "TMP_FOLDER..................: $TMP_FOLDER" log "TMP_FOLDER..................: $TMP_FOLDER"
Zeile 578: Zeile 615:
 log "FILE_USERLIST_VALIDATE_EMAIL: $FILE_USERLIST_VALIDATE_EMAIL" log "FILE_USERLIST_VALIDATE_EMAIL: $FILE_USERLIST_VALIDATE_EMAIL"
 log "" log ""
 +
 +# Check if compress extension is allowed.
 +if [[ $COMPRESSION != 'zst' && $COMPRESSION != 'gz' ]]; then
 +        logline "Check compression extension" false
 +        log ""
 +        log "ERROR: Compression extension $COMPRESSION unsupported: choose between gz and zst"
 +        log ""
 +        error 19
 +fi
  
 # Check if command (file) NOT exist OR IS empty. # Check if command (file) NOT exist OR IS empty.
Zeile 594: Zeile 640:
 checkcommand $STAT_COMMAND checkcommand $STAT_COMMAND
 checkcommand $PROG_SENDMAIL checkcommand $PROG_SENDMAIL
 +
 +if [ $COMPRESSION = 'gz' ]; then
 +        checkcommand $GZIP_COMMAND
 +fi
 +
 +if [ $COMPRESSION = 'zst' ]; then
 +        checkcommand $ZSTD_COMMAND
 +fi
  
 # Check if LOCK file NOT exist. # Check if LOCK file NOT exist.
Zeile 623: Zeile 677:
  
 # Check if TMP_FOLDER is owned by $MAILDIR_USER. # Check if TMP_FOLDER is owned by $MAILDIR_USER.
-if [ "$MAILDIR_USER" != `$STAT_COMMAND -c '%U' $TMP_FOLDER` ]; then+if [ "$MAILDIR_USER" != `$STAT_COMMAND $STAT_COMMAND_PARAM_FORMAT "$STAT_COMMAND_ARG_FORMAT_USER" $TMP_FOLDER` ]; then
         logline "Check if TMP_FOLDER owner is $MAILDIR_USER " false         logline "Check if TMP_FOLDER owner is $MAILDIR_USER " false
  $CHOWN_COMMAND -R $MAILDIR_USER:$MAILDIR_GROUP $TMP_FOLDER  $CHOWN_COMMAND -R $MAILDIR_USER:$MAILDIR_GROUP $TMP_FOLDER
Zeile 637: Zeile 691:
  
 # Check if TMP_FOLDER group is $MAILDIR_GROUP. # Check if TMP_FOLDER group is $MAILDIR_GROUP.
-if [ "$MAILDIR_GROUP" != `$STAT_COMMAND -c '%G' $TMP_FOLDER` ]; then+if [ "$MAILDIR_GROUP" != `$STAT_COMMAND $STAT_COMMAND_PARAM_FORMAT "$STAT_COMMAND_ARG_FORMAT_GROUP" $TMP_FOLDER` ]; then
         logline "Check if TMP_FOLDER group is $MAILDIR_GROUP " false         logline "Check if TMP_FOLDER group is $MAILDIR_GROUP " false
  $CHOWN_COMMAND -R $MAILDIR_USER:$MAILDIR_GROUP $TMP_FOLDER  $CHOWN_COMMAND -R $MAILDIR_USER:$MAILDIR_GROUP $TMP_FOLDER
Zeile 665: Zeile 719:
  
 # Check if DIR_BACKUP is owned by $MAILDIR_USER. # Check if DIR_BACKUP is owned by $MAILDIR_USER.
-if [ "$MAILDIR_USER" != `$STAT_COMMAND -c '%U' $DIR_BACKUP` ]; then+if [ "$MAILDIR_USER" != `$STAT_COMMAND $STAT_COMMAND_PARAM_FORMAT "$STAT_COMMAND_ARG_FORMAT_USER" $DIR_BACKUP` ]; then
         logline "Check if DIR_BACKUP owner is $MAILDIR_USER " false         logline "Check if DIR_BACKUP owner is $MAILDIR_USER " false
  $CHOWN_COMMAND -R $MAILDIR_USER:$MAILDIR_GROUP $DIR_BACKUP  $CHOWN_COMMAND -R $MAILDIR_USER:$MAILDIR_GROUP $DIR_BACKUP
Zeile 679: Zeile 733:
  
 # Check if DIR_BACKUP group is $MAILDIR_GROUP. # Check if DIR_BACKUP group is $MAILDIR_GROUP.
-if [ "$MAILDIR_GROUP" != `$STAT_COMMAND -c '%G' $DIR_BACKUP` ]; then+if [ "$MAILDIR_GROUP" != `$STAT_COMMAND $STAT_COMMAND_PARAM_FORMAT "$STAT_COMMAND_ARG_FORMAT_GROUP" $DIR_BACKUP` ]; then
         logline "Check if DIR_BACKUP group is $MAILDIR_GROUP " false         logline "Check if DIR_BACKUP group is $MAILDIR_GROUP " false
  $CHOWN_COMMAND -R $MAILDIR_USER:$MAILDIR_GROUP $DIR_BACKUP  $CHOWN_COMMAND -R $MAILDIR_USER:$MAILDIR_GROUP $DIR_BACKUP
Zeile 757: Zeile 811:
  
 # Make temporary directory DIR_TEMP inside TMP_FOLDER. # Make temporary directory DIR_TEMP inside TMP_FOLDER.
-DIR_TEMP=$($MKTEMP_COMMAND -d -p $TMP_FOLDER -t $SCRIPT_NAME-XXXXXXXXXXXX)+DIR_TEMP=$($MKTEMP_COMMAND $MKTEMP_COMMAND_PARAM_ARG)
 if [ "$?" != "0" ]; then if [ "$?" != "0" ]; then
  logline "Create temporary '$DIR_TEMP' folder " false  logline "Create temporary '$DIR_TEMP' folder " false
Zeile 787: Zeile 841:
  
  log "Extract mailbox data for user: $users ..."  log "Extract mailbox data for user: $users ..."
- $DSYNC_COMMAND -o plugin/quota= -f -u $users backup $MAILDIR_TYPE:$LOCATION+ 
 +        if [ "$OSTYPE" = "FreeBSD" ]; then 
 +         $DSYNC_COMMAND -o plugin/quota= backup -u $users $MAILDIR_TYPE:$LOCATION 
 + else 
 + $DSYNC_COMMAND -o plugin/quota= -f -u $users backup $MAILDIR_TYPE:$LOCATION 
 + fi
  
  # Check the status of dsync and continue the script depending on the result.  # Check the status of dsync and continue the script depending on the result.
Zeile 809: Zeile 868:
  
  log "Packaging to archive for user: $users ..."  log "Packaging to archive for user: $users ..."
- $TAR_COMMAND -cvzf $users-$FILE_BACKUP $USERPART --atime-preserve --preserve-permissions+ if [ "$OSTYPE" = "FreeBSD" ]; then 
 + $TAR_COMMAND -cvzf $users-$FILE_BACKUP $USERPART 
 + else 
 + $TAR_COMMAND -cvzf $users-$FILE_BACKUP $USERPART --atime-preserve --preserve-permissions 
 + fi
  
  log "Delete mailbox files for user: $users ..."  log "Delete mailbox files for user: $users ..."
- $RM_COMMAND "$DIR_TEMP/$DOMAINPART" -rf+ $RM_COMMAND -rf "$DIR_TEMP/$DOMAINPART"
  if [ "$?" != "0" ]; then  if [ "$?" != "0" ]; then
         logline "Delete mailbox files at: $DIR_TEMP " false         logline "Delete mailbox files at: $DIR_TEMP " false
Zeile 843: Zeile 906:
  
 # Delete the temporary folder DIR_TEMP. # Delete the temporary folder DIR_TEMP.
-$RM_COMMAND $DIR_TEMP -rf+$RM_COMMAND -rf $DIR_TEMP
 if [ "$?" != "0" ]; then if [ "$?" != "0" ]; then
  logline "Delete temporary '$DIR_TEMP' folder " false  logline "Delete temporary '$DIR_TEMP' folder " false
Zeile 907: Zeile 970:
 log "" log ""
 END_TIMESTAMP=`$DATE_COMMAND '+%s'` END_TIMESTAMP=`$DATE_COMMAND '+%s'`
-log "Runtime: `$DATE_COMMAND -u -d "0 $END_TIMESTAMP seconds - $RUN_TIMESTAMP seconds" +'%H:%M:%S'` time elapsed."+if [ "$OSTYPE" = "FreeBSD" ]; then 
 +        DELTA=$((END_TIMESTAMP-RUN_TIMESTAMP)) 
 +        log "$(printf 'Runtime: %02d:%02d:%02d time elapsed.\n' $((DELTA/3600)) $((DELTA%3600/60)) $((DELTA%60)))" 
 +else 
 + log "Runtime: `$DATE_COMMAND -u -d "0 $END_TIMESTAMP seconds - $RUN_TIMESTAMP seconds" +'%H:%M:%S'` time elapsed." 
 +fi
 log "" log ""
 headerblock "Finished creating the backups [`$DATE_COMMAND '+%a, %d %b %Y %H:%M:%S (%z)'`]" headerblock "Finished creating the backups [`$DATE_COMMAND '+%a, %d %b %Y %H:%M:%S (%z)'`]"
Zeile 967: Zeile 1035:
  
 SCRIPT_NAME.................: dovecot_backup SCRIPT_NAME.................: dovecot_backup
 +
 +OS_TYPE.....................: linux-gnu
  
 COMPRESSION.................: gz COMPRESSION.................: gz
Zeile 1050: Zeile 1120:
  
 SCRIPT_NAME.................: dovecot_backup SCRIPT_NAME.................: dovecot_backup
 +
 +OS_TYPE.....................: linux-gnu
  
 COMPRESSION.................: gz COMPRESSION.................: gz
tachtler/dovecot_backup_-_skript.1667116582.txt.gz · Zuletzt geändert: 2022/10/30 08:56 von klaus