Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:dovecot_backup_-_skript

Dies ist eine alte Version des Dokuments!


Dovecot Backup - Skript

:!: HINWEIS - Die Nachfolgende Konfiguration von Dovecot setzt eine lauffähige Installation von Dovecot voraus, wie unter nachfolgendem internen Link beschrieben !!!

Dovecot ist ein Open-Source-IMAP-und POP3-E-Mail-Server für Linux bzw. UNIX-ähnlichen Systeme, entwickelt mit dem Hauptaugenmerk auf Sicherheit. Dovecot ist eine ausgezeichnete Wahl für kleine und große Installationen. Dovecot ist schnell und einfach zu installieren, erfordert keine besonderen Voraussetzungen und ist Ressourcenschonend.

Dovecot wird von Timo Sirainen entwickelt.

Ab hier werden root-Rechte zur Ausführung der nachfolgenden Befehle benötigt. Um root zu werden geben Sie bitte folgenden Befehl ein:

$ su -
Password: 

Backup

Nachfolgendes Skript ermöglicht die Erstellung einer *.tar.gz-Datei

  • von allen Benutzerkonten
  • oder über eine Datei mit E-Mail-Adressen, der zu sichernden Benutzerkonten
  • pro Benutzer eine eigene *.tar.gz-Datei
  • auf Dateiebene
  • mit konfigurierbaren Parametern
  • und automatischer Löschung von älteren Sicherungsdateien
  • und Erstellung einer fortlaufenden Log-Datei unter /var/log/

Nachfolgende Parameter sind in der aktuellen Version konfigurierbar: (Nur relevanter Ausschnitt)

...
##############################################################################
# >>> Please edit following lines for personal settings and custom usages. ! #
##############################################################################
 
# CUSTOM - Script-Name.
SCRIPT_NAME='dovecot_backup'
 
# CUSTOM - Backup-Files.
DIR_BACKUP='/srv/backup'
FILE_BACKUP=dovecot_backup_`date '+%Y%m%d_%H%M%S'`.tar.gz
FILE_DELETE='*.tar.gz'
BACKUPFILES_DELETE=14
 
# CUSTOM - dovecot Folders.
MAILDIR_TYPE='maildir'
MAILDIR_NAME='Maildir'
MAILDIR_USER='vmail'
MAILDIR_GROUP='vmail'
 
# CUSTOM - Path and file name of a file with e-mail addresses to backup, if
#          SET. If NOT, the script will determine all mailboxes by default.
# FILE_USERLIST='/path/and/file/name/of/user/list/with/one/email/per/line'
# - OR -
# FILE_USERLIST=''
FILE_USERLIST=''
 
# CUSTOM - Mail-Recipient.
MAIL_RECIPIENT='root@tachtler.net'
 
# CUSTOM - Status-Mail [Y|N].
MAIL_STATUS='N'
 
##############################################################################
# >>> Normaly there is no need to change anything below this comment line. ! #
##############################################################################
...
Parametername Beschreibung
SCRIPT_NAME Name des Skriptes
DIR_BACKUP Verzeichnis in dem die Backup-Dateien erstellt werden sollen
FILE_BACKUP Allgemeiner Teil der Bezeichnung für die Backup-Dateien
FILE_DELETE Endung zur Löschung von älteren Archivdateien, muss wie FILE_BACKUP enden !
BACKUPFILES_DELETE Anzahl der Backup-Dateien pro Benutzer die gespeichert bleiben sollen
MAILDIR_TYPE Maildir-Format - :!: ohne Doppelpunkt
MAILDIR_NAME Name des Maildir-Verzeichnisses unterhalb des home-Verzeichnisses des Benutzers
MAILDIR_USER Benutzername unter dem alle Postfächer (Mailboxes) verwaltet werden, siehe auch:
Dovecot CentOS 6 - Konfiguration Authentifizierung - Authentifizierungsbenutzer
Dovecot CentOS 7 - Konfiguration Authentifizierung - Authentifizierungsbenutzer
MAILDIR_GROUP Benutzergruppe unter dem alle Postfächer (Mailboxes) verwaltet werden, siehe auch:
Dovecot CentOS 6 - Konfiguration Authentifizierung - Authentifizierungsbenutzer
Dovecot CentOS 7 - Konfiguration Authentifizierung - Authentifizierungsbenutzer
FILE_USERLIST Datei mit E-Mail-Adressen (eine pro Zeile), welche Mailboxen/Benutzer gesichert werden, anstelle der Ermittlung durch doveadm user ”*”, um nicht alle Mailboxen/Benutzer zwangsweise zu sichern
MAIL_RECIPIENT Empfänger E-Mail-Adresse für E-Mails des Skripts
MAIL_STATUS Versand einer Status E-Mail nach erfolgreicher Skript Ausführung

/var/lib/dovecot

Damit nachfolgendes Backup-Skript die nötigen Rechte zum lesen der Konfigurationsdatei

  • /var/lib/dovecot/db/shared-mailboxes.db

hat, müssen die Besitzrechte am Verzeichnis

  • /var/lib/dovecot

wie folgt angepasst werden:

# chown dovecot:vmail /var/lib/dovecot

Ein Überprüfung der entsprechenden Besitzrechte sollte dann wie folgt aussehen:

# ls -ld /var/lib/dovecot/
drwxr-x--- 3 dovecot vmail 56 Mar 16 15:01 /var/lib/dovecot/

:!: WICHTIG - Vorhergehend werden der Gruppe vmail die Rechte: lesen und ausführen eingeräumt.

Skript

#!/bin/bash
 
##############################################################################
# Script-Name : dovecot_backup.sh                                            #
# Description : Script to backup the mailboxes from dovecot.                 #
#               On successful execution only a LOG file will be written.     #
#               On error while execution, a LOG file and a error message     #
#               will be send by e-mail.                                      #
#                                                                            #
# Last update : 30.01.2019                                                   #
# Version     : 1.09                                                         #
#                                                                            #
# Author      : Klaus Tachtler, <klaus@tachtler.net>                         #
# DokuWiki    : http://www.dokuwiki.tachtler.net                             #
# Homepage    : http://www.tachtler.net                                      #
#                                                                            #
#  +----------------------------------------------------------------------+  #
#  | This program is free software; you can redistribute it and/or modify |  #
#  | it under the terms of the GNU General Public License as published by |  #
#  | the Free Software Foundation; either version 2 of the License, or    |  #
#  | (at your option) any later version.                                  |  #
#  +----------------------------------------------------------------------+  #
#                                                                            #
# Copyright (c) 2019 by Klaus Tachtler.                                      #
#                                                                            #
##############################################################################
 
##############################################################################
#                                H I S T O R Y                               #
##############################################################################
# Version     : 1.01                                                         #
# Description : Bugfix: Delete all temporary domain directories not only the #
#               last one. Thanks to Guenther J. Niederwimmer.                #
# -------------------------------------------------------------------------- #
# Version     : 1.02                                                         #
# Description : GitHub: Issue #1                                             #
#               The name of the variable to delete the number of old backup  #
#               files $DAYS_DELETE was renamed to $BACKUPFILES_DELETE. This  #
#               was done for better understanding, because if the script was #
#               running more than once a day, this could be misunderstood.   #
#               Thanks to Diane Trout.                                       #
# -------------------------------------------------------------------------- #
# Version     : 1.03                                                         #
# Description : Quota calculation double the calculated size of a mailbox,   #
#               when dict was used. See also following mailing-list entry:   #
#                                                                            #
#               https://www.dovecot.org/list/dovecot/2012-February/          #
#               063585.html                                                  #
#                                                                            #
#               Thanks to André Peters.                                      #
# -------------------------------------------------------------------------- #
# Version     : 1.04                                                         #
# Description : Typo: Correction of the return code query of                 #
#               "# Delete LOCK file." in a pure string comparison.           #
#               Thanks to Oli Sennhauser.                                    #
# -------------------------------------------------------------------------- #
# Version     : 1.05                                                         #
# Description : GitHub: Issue #4                                             #
#               Add error handling for dsync command.                        #
#               Add runtime statistics.                                      #
#               Thanks to HenrikWMG.                                         #
# -------------------------------------------------------------------------- #
# Version     : 1.06                                                         #
# Description : Avoid an error when trying to delete backup files, if the    #
#               $BACKUPFILES_DELETE count is NOT reached.                    #
#               Change file owner, after backup was created.                 #
#               Change file permissions to 600, after backup was created.    #
#               Thanks to Seep1959.                                          #
# -------------------------------------------------------------------------- #
# Version     : 1.07                                                         #
# Description : Compatibility: Change the parameter order for the step       #
#               "Delete archive files for user" for better compatibility     #
#               with FreeBSD.                                                #
#               Thanks to Alexander Preyer.                                  #
# -------------------------------------------------------------------------- #
# Version     : 1.08                                                         #
# Description : GitHub Issue #9                                              #
#               Add ability to only backup specific mailboxes, by using the  # 
#               variable FILE_USERLIST with the file path and file name as   #
#               content. The file must contain one e-mail address per line.  #
#               Add the calculation of the script runtime.                   #
#               Thanks to graue Ritter.                                      #
# -------------------------------------------------------------------------- #
# Version     : 1.09                                                         #
# Description : Add a switch to enable or disable e-mail address check, when #
#               FILE_USERLIST was set and used.                              #
#               Thanks to kbridger.                                          #
# -------------------------------------------------------------------------- #
# Version     : x.xx                                                         #
# Description : <Description>                                                #
# -------------------------------------------------------------------------- #
##############################################################################
 
##############################################################################
# >>> Please edit following lines for personal settings and custom usages. ! #
##############################################################################
 
# CUSTOM - Script-Name.
SCRIPT_NAME='dovecot_backup'
 
# CUSTOM - Backup-Files.
DIR_BACKUP='/srv/backup'
FILE_BACKUP=dovecot_backup_`date '+%Y%m%d_%H%M%S'`.tar.gz
FILE_DELETE='*.tar.gz'
BACKUPFILES_DELETE=14
 
# CUSTOM - dovecot Folders.
MAILDIR_TYPE='maildir'
MAILDIR_NAME='Maildir'
MAILDIR_USER='vmail'
MAILDIR_GROUP='vmail'
 
# CUSTOM - Path and file name of a file with e-mail addresses to backup, if
#          SET. If NOT, the script will determine all mailboxes by default.
# FILE_USERLIST='/path/and/file/name/of/user/list/with/one/user/per/line'
# - OR -
# FILE_USERLIST=''
FILE_USERLIST=''
 
# CUSTOM - Check when FILE_USERLIST was used, if the user per line was a
#          valid e-mail address [Y|N].
FILE_USERLIST_VALIDATE_EMAIL='N'
 
# CUSTOM - Mail-Recipient.
MAIL_RECIPIENT='root@tachtler.net'
 
# CUSTOM - Status-Mail [Y|N].
MAIL_STATUS='N'
 
##############################################################################
# >>> Normaly there is no need to change anything below this comment line. ! #
##############################################################################
 
# Variables.
DSYNC_COMMAND=`command -v dsync`
TAR_COMMAND=`command -v tar`
TOUCH_COMMAND=`command -v touch`
RM_COMMAND=`command -v rm`
PROG_SENDMAIL=`command -v sendmail`
CAT_COMMAND=`command -v cat`
DATE_COMMAND=`command -v date`
MKDIR_COMMAND=`command -v mkdir`
CHOWN_COMMAND=`command -v chown`
CHMOD_COMMAND=`command -v chmod`
GREP_COMMAND=`command -v grep`
FILE_LOCK='/tmp/'$SCRIPT_NAME'.lock'
FILE_LOG='/var/log/'$SCRIPT_NAME'.log'
FILE_LAST_LOG='/tmp/'$SCRIPT_NAME'.log'
FILE_MAIL='/tmp/'$SCRIPT_NAME'.mail'
FILE_MBOXLIST='/tmp/'$SCRIPT_NAME'.mboxlist'
VAR_HOSTNAME=`uname -n`
VAR_SENDER='root@'$VAR_HOSTNAME
VAR_EMAILDATE=`$DATE_COMMAND '+%a, %d %b %Y %H:%M:%S (%Z)'`
declare -a VAR_LISTED_USER=()
declare -a VAR_FAILED_USER=()
VAR_COUNT_USER=0
VAR_COUNT_FAIL=0
 
# Functions.
function log() {
        echo $1
        echo `$DATE_COMMAND '+%Y/%m/%d %H:%M:%S'` " INFO:" $1 >>${FILE_LAST_LOG}
}
 
function retval() {
if [ "$?" != "0" ]; then
        case "$?" in
        *)
                log "ERROR: Unknown error $?"
        ;;
        esac
fi
}
 
function movelog() {
	$CAT_COMMAND $FILE_LAST_LOG >> $FILE_LOG
	$RM_COMMAND -f $FILE_LAST_LOG	
	$RM_COMMAND -f $FILE_LOCK
}
 
function sendmail() {
        case "$1" in
        'STATUS')
                MAIL_SUBJECT='Status execution '$SCRIPT_NAME' script.'
        ;;
        *)
                MAIL_SUBJECT='ERROR while execution '$SCRIPT_NAME' script !!!'
        ;;
        esac
 
$CAT_COMMAND <<MAIL >$FILE_MAIL
Subject: $MAIL_SUBJECT
Date: $VAR_EMAILDATE
From: $VAR_SENDER
To: $MAIL_RECIPIENT
 
MAIL
 
$CAT_COMMAND $FILE_LAST_LOG >> $FILE_MAIL
 
$PROG_SENDMAIL -f $VAR_SENDER -t $MAIL_RECIPIENT < $FILE_MAIL
 
$RM_COMMAND -f $FILE_MAIL
 
}
 
# Main.
log ""
RUN_TIMESTAMP=`$DATE_COMMAND '+%s'`
log "+-----------------------------------------------------------------+"
log "| Start backup of the mailboxes [`$DATE_COMMAND '+%a, %d %b %Y %H:%M:%S (%Z)'`] |"
log "+-----------------------------------------------------------------+"
log ""
log "SCRIPT_NAME.................: $SCRIPT_NAME"
log ""
log "DIR_BACKUP..................: $DIR_BACKUP"
log ""
log "MAIL_RECIPIENT..............: $MAIL_RECIPIENT"
log "MAIL_STATUS.................: $MAIL_STATUS"
log ""
log "FILE_USERLIST...............: $FILE_USERLIST"
log "FILE_USERLIST_VALIDATE_EMAIL: $FILE_USERLIST_VALIDATE_EMAIL"
log ""
 
# Check if command (file) NOT exist OR IS empty.
if [ ! -s "$DSYNC_COMMAND" ]; then
        log "Check if command '$DSYNC_COMMAND' was found....................[FAILED]"
        sendmail ERROR
	movelog
        exit 11
else
        log "Check if command '$DSYNC_COMMAND' was found....................[  OK  ]"
fi
 
# Check if command (file) NOT exist OR IS empty.
if [ ! -s "$TAR_COMMAND" ]; then
        log "Check if command '$TAR_COMMAND' was found......................[FAILED]"
        sendmail ERROR
	movelog
        exit 12
else
        log "Check if command '$TAR_COMMAND' was found......................[  OK  ]"
fi
 
# Check if command (file) NOT exist OR IS empty.
if [ ! -s "$TOUCH_COMMAND" ]; then
        log "Check if command '$TOUCH_COMMAND' was found....................[FAILED]"
        sendmail ERROR
	movelog
        exit 13
else
        log "Check if command '$TOUCH_COMMAND' was found....................[  OK  ]"
fi
 
# Check if command (file) NOT exist OR IS empty.
if [ ! -s "$RM_COMMAND" ]; then
        log "Check if command '$RM_COMMAND' was found.......................[FAILED]"
        sendmail ERROR
	movelog
        exit 14
else
        log "Check if command '$RM_COMMAND' was found.......................[  OK  ]"
fi
 
# Check if command (file) NOT exist OR IS empty.
if [ ! -s "$CAT_COMMAND" ]; then
        log "Check if command '$CAT_COMMAND' was found......................[FAILED]"
        sendmail ERROR
	movelog
        exit 15
else
        log "Check if command '$CAT_COMMAND' was found......................[  OK  ]"
fi
 
# Check if command (file) NOT exist OR IS empty.
if [ ! -s "$DATE_COMMAND" ]; then
        log "Check if command '$DATE_COMMAND' was found.....................[FAILED]"
        sendmail ERROR
	movelog
        exit 16
else
        log "Check if command '$DATE_COMMAND' was found.....................[  OK  ]"
fi
 
# Check if command (file) NOT exist OR IS empty.
if [ ! -s "$MKDIR_COMMAND" ]; then
        log "Check if command '$MKDIR_COMMAND' was found....................[FAILED]"
        sendmail ERROR
	movelog
        exit 17
else
        log "Check if command '$MKDIR_COMMAND' was found....................[  OK  ]"
fi
 
# Check if command (file) NOT exist OR IS empty.
if [ ! -s "$CHOWN_COMMAND" ]; then
        log "Check if command '$CHOWN_COMMAND' was found....................[FAILED]"
        sendmail ERROR
	movelog
        exit 18
else
        log "Check if command '$CHOWN_COMMAND' was found....................[  OK  ]"
fi
 
# Check if command (file) NOT exist OR IS empty.
if [ ! -s "$CHMOD_COMMAND" ]; then
        log "Check if command '$CHMOD_COMMAND' was found....................[FAILED]"
        sendmail ERROR
	movelog
        exit 19
else
        log "Check if command '$CHMOD_COMMAND' was found....................[  OK  ]"
fi
 
# Check if command (file) NOT exist OR IS empty.
if [ ! -s "$GREP_COMMAND" ]; then
        log "Check if command '$GREP_COMMAND' was found.....................[FAILED]"
        sendmail ERROR
	movelog
        exit 20
else
        log "Check if command '$GREP_COMMAND' was found.....................[  OK  ]"
fi
 
# Check if command (file) NOT exist OR IS empty.
if [ ! -s "$PROG_SENDMAIL" ]; then
        log "Check if command '$PROG_SENDMAIL' was found................[FAILED]"
        sendmail ERROR
	movelog
        exit 21
else
        log "Check if command '$PROG_SENDMAIL' was found................[  OK  ]"
fi
 
# Check if LOCK file NOT exist.
if [ ! -e "$FILE_LOCK" ]; then
        log "Check if script is NOT already runnig .....................[  OK  ]"
 
        $TOUCH_COMMAND $FILE_LOCK
else
        log "Check if script is NOT already runnig .....................[FAILED]"
        log ""
        log "ERROR: The script was already running, or LOCK file already exists!"
        log ""
        sendmail ERROR
	movelog
        exit 30
fi
 
# Check if DIR_BACKUP Directory NOT exists.
if [ ! -d "$DIR_BACKUP" ]; then
        log "Check if DIR_BACKUP exists.................................[FAILED]"
	$MKDIR_COMMAND -p $DIR_BACKUP
        log "DIR_BACKUP was now created.................................[  OK  ]"
else
        log "Check if DIR_BACKUP exists.................................[  OK  ]"
fi
 
# Check if FILE_USERLIST NOT set OR IS empty.
log ""
if [ ! -n "$FILE_USERLIST"  ]; then
        log "Check if the variable FILE_USERLIST is set.................[  NO  ]"
        log "Mailboxes to backup will be determined by doveadm user \"*\"."
 
	for users in `doveadm user "*"`; do
		VAR_LISTED_USER+=($users);
	done
else
        log "Check if the variable FILE_USERLIST is set.................[  OK  ]"
        log "Mailboxes to backup will read from file."
        log ""
        log "- File: [$FILE_USERLIST]"
 
	# Check if file exists.
	if [ -f "$FILE_USERLIST" ]; then
        	log "- Check if FILE_USERLIST exists............................[  OK  ]"
	else
        	log "- Check if FILE_USERLIST exists............................[FAILED]"
        	log ""
	        sendmail ERROR
		movelog
        	exit 40
	fi
 
	# Check if file is readable.
	if [ -r "$FILE_USERLIST" ]; then
        	log "- Check if FILE_USERLIST is readable.......................[  OK  ]"
	else
        	log "- Check if FILE_USERLIST is readable.......................[FAILED]"
        	log ""
	        sendmail ERROR
		movelog
        	exit 41
	fi
 
	# Read file into variable.
	while IFS= read -r line
	do	
		# Check for valid e-mail address.
		if [ $FILE_USERLIST_VALIDATE_EMAIL = 'Y' ]; then
			# Check if basic email address syntax is valid.
			if echo "${line}" | $GREP_COMMAND '^[a-zA-Z0-9]*@[a-zA-Z0-9]*\.[a-zA-Z0-9]*$' >/dev/null; then
				VAR_LISTED_USER+=($line);
			else
        			log ""
		        	log "ERROR: The user: $line is NOT valid e-mail address!"
 
	                	((VAR_COUNT_FAIL++))
	                	VAR_FAILED_USER+=($line);
			fi
		else
			VAR_LISTED_USER+=($line);
		fi
	done <"$FILE_USERLIST"
 
	# Check if VAR_COUNT_FAIL is greater than zero. If YES, set VAR_COUNT_USER to VAR_COUNT_FAIL.
	if [ "$VAR_COUNT_FAIL" -ne "0" ]; then
		VAR_COUNT_USER=$VAR_COUNT_FAIL
	fi
fi
 
# Start backup.
log ""
log "+-----------------------------------------------------------------+"
log "| Run backup $SCRIPT_NAME ..................................... |"
log "+-----------------------------------------------------------------+"
log ""
 
# Start real backup process for all users.
for users in "${VAR_LISTED_USER[@]}"; do
	log "Start backup process for user: $users ..."
 
	((VAR_COUNT_USER++))
	DOMAINPART=${users#*@}
	LOCALPART=${users%%@*}
	LOCATION="$DIR_BACKUP/$DOMAINPART/$LOCALPART/$MAILDIR_NAME"
	USERPART="$DOMAINPART/$LOCALPART"
 
	log "Extract mailbox data for user: $users ..."
	$DSYNC_COMMAND -o plugin/quota= -f -u $users backup $MAILDIR_TYPE:$LOCATION
 
	# Check the status of dsync and continue the script depending on the result.
	if [ "$?" != "0" ]; then
		case "$?" in
		1)	log "Synchronization failed > user: $users !!!"
			;;
		2)	log "Synchronization was done without errors, but some changes couldn't be done, so the mailboxes aren't perfectly synchronized for user: $users !!!"
			;;
		esac
		if [ "$?" -gt "3" ]; then
			log "Synchronization failed > user: $users !!!"
		fi
 
		((VAR_COUNT_FAIL++))
		VAR_FAILED_USER+=($users);
	else
        	log "Synchronization done for user: $users ..."
 
		cd $DIR_BACKUP
 
		log "Packaging to archive for user: $users ..."
		$TAR_COMMAND -cvzf $users-$FILE_BACKUP $USERPART --atime-preserve --preserve-permissions
 
		log "Delete archive files for user: $users ..."
		(ls -t $users-$FILE_DELETE|head -n $BACKUPFILES_DELETE;ls $users-$FILE_DELETE)|sort|uniq -u|xargs -r rm
		if [ "$?" != "0" ]; then
        		log "Delete old archive files $DIR_BACKUP .....................[FAILED]"
		else
        		log "Delete old archive files $DIR_BACKUP .....................[  OK  ]"
		fi
 
		log "Delete mailbox files for user: $users ..."
		$RM_COMMAND "$DIR_BACKUP/$DOMAINPART" -rf
		if [ "$?" != "0" ]; then
        		log "Delete mailbox files at: $DIR_BACKUP .....................[FAILED]"
		else
        		log "Delete mailbox files at: $DIR_BACKUP .....................[  OK  ]"
		fi
	fi
 
	log "Ended backup process for user: $users ..."
        log ""
done
 
# Set owner and rights permissions to backup directory and backup files.
$CHOWN_COMMAND -R $MAILDIR_USER:$MAILDIR_GROUP $DIR_BACKUP
$CHMOD_COMMAND 700 $DIR_BACKUP
$CHMOD_COMMAND -R 600 $DIR_BACKUP/*
 
# Delete LOCK file.
if [ "$?" != "0" ]; then
        retval $?
        log ""
        $RM_COMMAND -f $FILE_LOCK
        sendmail ERROR
        movelog
        exit 99
else
        log "+-----------------------------------------------------------------+"
        log "| End backup $SCRIPT_NAME ..................................... |"
        log "+-----------------------------------------------------------------+"
        log ""
fi
 
# Finish syncing with runntime statistics.
log "+-----------------------------------------------------------------+"
log "| Runtime statistics............................................. |"
log "+-----------------------------------------------------------------+"
log ""
log "- Number of determined users: $VAR_COUNT_USER"
log "- ...Summary of failed users: $VAR_COUNT_FAIL"
 
if [ "$VAR_COUNT_FAIL" -gt "0" ]; then
	log "- ...Mailbox of failed users: "
	for i in "${VAR_FAILED_USER[@]}"
	do
		log "- ... $i"
	done
fi
 
log ""
END_TIMESTAMP=`$DATE_COMMAND '+%s'`
log "Runtime: `$DATE_COMMAND -u -d "0 $END_TIMESTAMP seconds - $RUN_TIMESTAMP seconds" +'%H:%M:%S'` time elapsed."
log ""
log "+-----------------------------------------------------------------+"
log "| Finished creating the backups [`$DATE_COMMAND '+%a, %d %b %Y %H:%M:%S (%Z)'`] |"
log "+-----------------------------------------------------------------+"
log ""
 
# If errors occurred on user backups, exit with return code 1 instead of 0.
if [ "$VAR_COUNT_FAIL" -gt "0" ]; then
        sendmail ERROR
	movelog
	exit 1
else
	# Status e-mail.
	if [ $MAIL_STATUS = 'Y' ]; then
        	sendmail STATUS
	fi
	movelog
	exit 0
fi

Beispieldatei: FILE_USERLIST

Nachfolgend eine Beispiel für den Inhalt einer Datei, welche unter der Variable:

# CUSTOM - Path and file name of a file with e-mail addresses to backup, if
#          SET. If NOT, the script will determine all mailboxes by default.
# FILE_USERLIST='/path/and/file/name/of/user/list/with/one/email/per/line'
# - OR -
# FILE_USERLIST=''
FILE_USERLIST='/srv/dovecot_backup.userlist'

definiert werden kann:

klaus@tachtler.net
petra@tachtler.net

Skript - Log

Nachfolgende Log-Datei entsteht im Verzeichnis

  • /var/log/ - hier z.B. /var/log/dovecot_backup.log

OHNE FILE_USERLIST:

2019/01/30 14:24:28  INFO: +-----------------------------------------------------------------+
2019/01/30 14:24:28  INFO: | Start backup of the mailboxes [Wed, 30 Jan 2019 14:24:28 (CET)] |
2019/01/30 14:24:28  INFO: +-----------------------------------------------------------------+
2019/01/30 14:24:28  INFO:
2019/01/30 14:24:28  INFO: Run script with following parameter:
2019/01/30 14:24:28  INFO:
2019/01/30 14:24:28  INFO: SCRIPT_NAME...: dovecot_backup
2019/01/30 14:24:28  INFO:
2019/01/30 14:24:28  INFO: DIR_BACKUP....: /srv/backup
2019/01/30 14:24:28  INFO:
2019/01/30 14:24:28  INFO: MAIL_RECIPIENT: you@example.com
2019/01/30 14:24:28  INFO: MAIL_STATUS...: N
2019/01/30 14:24:28  INFO:
2019/01/30 14:24:28  INFO: Check if command '/bin/dsync' was found....................[ OK ]
2019/01/30 14:24:28  INFO: Check if command '/bin/tar' was found......................[ OK ]
2019/01/30 14:24:28  INFO: Check if command '/bin/touch' was found....................[ OK ]
2019/01/30 14:24:28  INFO: Check if command '/bin/rm' was found.......................[ OK ]
2019/01/30 14:24:28  INFO: Check if command '/bin/cat' was found......................[ OK ]
2019/01/30 14:24:28  INFO: Check if command '/bin/date' was found.....................[ OK ]
2019/01/30 14:24:28  INFO: Check if command '/bin/mkdir' was found....................[ OK ]
2019/01/30 14:24:28  INFO: Check if command '/bin/chown' was found....................[ OK ]
2019/01/30 14:24:28  INFO: Check if command '/bin/chmod' was found....................[ OK ]
2019/01/30 14:24:28  INFO: Check if command '/bin/grep' was found.....................[ OK ]
2019/01/30 14:24:28  INFO: Check if command '/sbin/sendmail' was found................[ OK ]
2019/01/30 14:24:28  INFO: Check if script is NOT already runnig .....................[ OK ]
2019/01/30 14:24:28  INFO: Check if DIR_BACKUP exists.................................[ OK ]
2019/01/30 14:24:28  INFO:
2019/01/30 14:24:28  INFO: Check if the variable FILE_USERLIST is set.................[ NO ]
2019/01/30 14:24:28  INFO: Mailboxes to backup will be determined by doveadm user "*".
2019/01/30 14:24:28  INFO:
2019/01/30 14:24:28  INFO:
2019/01/30 14:24:28  INFO: +-----------------------------------------------------------------+
2019/01/30 14:24:28  INFO: | Run backup dovecot_backup ..................................... |
2019/01/30 14:24:28  INFO: +-----------------------------------------------------------------+
2019/01/30 14:24:28  INFO:
2019/01/30 14:24:29  INFO: Start backup process for user: klaus@tachtler.net ...
2019/01/30 14:24:29  INFO: Extract mailbox data for user: klaus@tachtler.net ...
2019/01/30 14:27:43  INFO: Synchronization done for user: klaus@tachtler.net ...
2019/01/30 14:27:43  INFO: Packaging to archive for user: klaus@tachtler.net ...
2019/01/30 14:27:48  INFO: Delete archive files for user: klaus@tachtler.net ...
2019/01/30 14:27:48  INFO: Delete old archive files /srv/backup .....................[ OK ]
2019/01/30 14:27:48  INFO: Delete mailbox files for user: klaus@tachtler.net ...
2019/01/30 14:27:48  INFO: Delete mailbox files at: /srv/backup .....................[ OK ]
2019/01/30 14:27:48  INFO: Ended backup process for user: klaus@tachtler.net ...
2019/01/30 14:27:48  INFO:
2019/01/30 14:27:48  INFO: Start backup process for user: petra@tachtler.net ...
2019/01/30 14:27:48  INFO: Extract mailbox data for user: petra@tachtler.net ...
2019/01/30 14:27:56  INFO: Synchronization done for user: petra@tachtler.net ...
2019/01/30 14:27:56  INFO: Packaging to archive for user: petra@tachtler.net ...
2019/01/30 14:27:57  INFO: Delete archive files for user: petra@tachtler.net ...
2019/01/30 14:27:57  INFO: Delete old archive files /srv/backup .....................[ OK ]
2019/01/30 14:27:57  INFO: Delete mailbox files for user: petra@tachtler.net ...
2019/01/30 14:27:57  INFO: Delete mailbox files at: /srv/backup .....................[ OK ]
2019/01/30 14:27:57  INFO: Ended backup process for user: petra@tachtler.net ...
2019/01/30 14:28:01  INFO:
2019/01/30 14:28:01  INFO: +-----------------------------------------------------------------+
2019/01/30 14:28:01  INFO: | End backup dovecot_backup ..................................... |
2019/01/30 14:28:01  INFO: +-----------------------------------------------------------------+
2019/01/30 14:28:01  INFO:
2019/01/30 14:28:01  INFO: +-----------------------------------------------------------------+
2019/01/30 14:28:01  INFO: | Runtime statistics............................................. |
2019/01/30 14:28:01  INFO: +-----------------------------------------------------------------+
2019/01/30 14:28:01  INFO:
2019/01/30 14:28:01  INFO: - Number of determined users: 2
2019/01/30 14:28:01  INFO: - ...Summary of failed users: 0
2019/01/30 14:28:01  INFO:
2019/01/30 14:28:01  INFO: Runtime: 00:03:33 time elapsed.
2019/01/30 14:28:01  INFO:
2019/01/30 14:28:01  INFO: +-----------------------------------------------------------------+
2019/01/30 14:28:01  INFO: | Finished creating the backups [Wed, 30 Jan 2019 14:28:01 (CET)] |
2019/01/30 14:28:01  INFO: +-----------------------------------------------------------------+
2019/01/30 14:28:01  INFO:

MIT FILE_USERLIST:

2019/01/30 15:07:51  INFO: +-----------------------------------------------------------------+
2019/01/30 15:07:51  INFO: | Start backup of the mailboxes [Wed, 30 Jan 2019 15:07:51 (CET)] |
2019/01/30 15:07:51  INFO: +-----------------------------------------------------------------+
2019/01/30 15:07:51  INFO:
2019/01/30 15:07:51  INFO: Run script with following parameter:
2019/01/30 15:07:51  INFO:
2019/01/30 15:07:51  INFO: SCRIPT_NAME...: dovecot_backup
2019/01/30 15:07:51  INFO:
2019/01/30 15:07:51  INFO: DIR_BACKUP....: /srv/backup
2019/01/30 15:07:51  INFO:
2019/01/30 15:07:51  INFO: MAIL_RECIPIENT: you@example.com
2019/01/30 15:07:51  INFO: MAIL_STATUS...: N
2019/01/30 15:07:51  INFO:
2019/01/30 15:07:51  INFO: Check if command '/bin/dsync' was found....................[ OK ]
2019/01/30 15:07:51  INFO: Check if command '/bin/tar' was found......................[ OK ]
2019/01/30 15:07:51  INFO: Check if command '/bin/touch' was found....................[ OK ]
2019/01/30 15:07:51  INFO: Check if command '/bin/rm' was found.......................[ OK ]
2019/01/30 15:07:51  INFO: Check if command '/bin/cat' was found......................[ OK ]
2019/01/30 15:07:51  INFO: Check if command '/bin/date' was found.....................[ OK ]
2019/01/30 15:07:51  INFO: Check if command '/bin/mkdir' was found....................[ OK ]
2019/01/30 15:07:51  INFO: Check if command '/bin/chown' was found....................[ OK ]
2019/01/30 15:07:51  INFO: Check if command '/bin/chmod' was found....................[ OK ]
2019/01/30 15:07:51  INFO: Check if command '/bin/grep' was found.....................[ OK ]
2019/01/30 15:07:51  INFO: Check if command '/sbin/sendmail' was found................[ OK ]
2019/01/30 15:07:51  INFO: Check if script is NOT already runnig .....................[ OK ]
2019/01/30 15:07:51  INFO: Check if DIR_BACKUP exists.................................[ OK ]
2019/01/30 15:07:51  INFO:
2019/01/30 15:07:51  INFO: Check if the variable FILE_USERLIST is set.................[ OK ]
2019/01/30 15:07:51  INFO: Mailboxes to backup will read from file.
2019/01/30 15:07:51  INFO:
2019/01/30 15:07:51  INFO: - File: [/home/klaus/dovecot_backup.userlist]
2019/01/30 15:07:51  INFO: - Check if FILE_USERLIST exists............................[ OK ]
2019/01/30 15:07:51  INFO: - Check if FILE_USERLIST is readable.......................[ OK ]
2019/01/30 15:07:51  INFO:
2019/01/30 15:07:51  INFO: ERROR: The email address: notvaild_email.net is not valid!
2019/01/30 15:07:51  INFO:
2019/01/30 15:07:51  INFO: +-----------------------------------------------------------------+
2019/01/30 15:07:51  INFO: | Run backup dovecot_backup ..................................... |
2019/01/30 15:07:51  INFO: +-----------------------------------------------------------------+
2019/01/30 15:07:51  INFO:
2019/01/30 15:07:51  INFO: Start backup process for user: klaus@tachtler.net ...
2019/01/30 15:07:51  INFO: Extract mailbox data for user: klaus@tachtler.net ...
2019/01/30 15:07:54  INFO: Synchronization done for user: klaus@tachtler.net ...
2019/01/30 15:07:54  INFO: Packaging to archive for user: klaus@tachtler.net ...
2019/01/30 15:07:54  INFO: Delete archive files for user: klaus@tachtler.net ...
2019/01/30 15:07:54  INFO: Delete old archive files /srv/backup .....................[ OK ]
2019/01/30 15:07:54  INFO: Delete mailbox files for user: klaus@tachtler.net ...
2019/01/30 15:07:54  INFO: Delete mailbox files at: /srv/backup .....................[ OK ]
2019/01/30 15:07:54  INFO: Ended backup process for user: klaus@tachtler.net ...
2019/01/30 15:07:54  INFO:
2019/01/30 15:07:54  INFO: Start backup process for user: petra@tachtler.net ...
2019/01/30 15:07:54  INFO: Extract mailbox data for user: petra@tachtler.net ...
2019/01/30 15:07:56  INFO: Synchronization done for user: petra@tachtler.net ...
2019/01/30 15:07:56  INFO: Packaging to archive for user: petra@tachtler.net ...
2019/01/30 15:07:56  INFO: Delete archive files for user: petra@tachtler.net ...
2019/01/30 15:07:56  INFO: Delete old archive files /srv/backup .....................[ OK ]
2019/01/30 15:07:56  INFO: Delete mailbox files for user: petra@tachtler.net ...
2019/01/30 15:07:56  INFO: Delete mailbox files at: /srv/backup .....................[ OK ]
2019/01/30 15:07:56  INFO: Ended backup process for user: petra@tachtler.net ...
2019/01/30 15:07:56  INFO:
2019/01/30 15:07:56  INFO: +-----------------------------------------------------------------+
2019/01/30 15:07:56  INFO: | End backup dovecot_backup ..................................... |
2019/01/30 15:07:56  INFO: +-----------------------------------------------------------------+
2019/01/30 15:07:56  INFO:
2019/01/30 15:07:56  INFO: +-----------------------------------------------------------------+
2019/01/30 15:07:56  INFO: | Runtime statistics............................................. |
2019/01/30 15:07:56  INFO: +-----------------------------------------------------------------+
2019/01/30 15:07:56  INFO:
2019/01/30 15:07:56  INFO: - Number of determined users: 2
2019/01/30 15:07:56  INFO: - ...Summary of failed users: 1
2019/01/30 15:07:56  INFO: - ...Mailbox of failed users:
2019/01/30 15:07:56  INFO: - ... notvaild_email.net
2019/01/30 15:07:56  INFO:
2019/01/30 15:07:56  INFO: Runtime: 00:00:05 time elapsed.
2019/01/30 15:07:56  INFO:
2019/01/30 15:07:56  INFO: +-----------------------------------------------------------------+
2019/01/30 15:07:56  INFO: | Finished creating the backups [Wed, 30 Jan 2019 15:07:56 (CET)] |
2019/01/30 15:07:56  INFO: +-----------------------------------------------------------------+
2019/01/30 15:07:56  INFO:

Anmerkung zur Ausführung:

:!: HINWEIS - Bis Version 1.05 !

:!: HINWEIS - Falls nachfolgende Fehlermeldung auftreten sollte:

...  INFO: Delete old archive files /srv/backup ......................[FAILED]

bedeutet dies nur, dass noch nicht genug alte Archivdateien vorhanden sind, damit diese gelöscht werden können!

Skript - Logrotate

Damit die LOG-Datei des Skriptes nicht ins unendliche wächst, sollte diese ebenfalls, wie auch die Log-Dateien von Dovecot selbst, rotiert werden.

Um die LOG-Dateien des Skriptes ebenfalls wie die LOG-Dateien von Dovecot selbst zu rotieren ist nachfolgende Ergänzung in der Kofigurationsdatei

  • /etc/logrotate.d/dovecot

erforderlich:

VORHER: (Komplette Konfigurationsdatei)

# dovecot SIGUSR1: Re-opens the log files.
/var/log/dovecot.log {
  missingok
  notifempty
  delaycompress
  sharedscripts
  postrotate
    /bin/kill -USR1 `cat /var/run/dovecot/master.pid 2>/dev/null` 2> /dev/null || true
  endscript
}

NACHHER: (Komplette Konfigurationsdatei)

# dovecot SIGUSR1: Re-opens the log files.
/var/log/dovecot.log /var/log/dovecot_backup.log {
  missingok
  notifempty
  delaycompress
  sharedscripts
  postrotate
    /bin/kill -USR1 `cat /var/run/dovecot/master.pid 2>/dev/null` 2> /dev/null || true
  endscript
}

Nachfolgend die geänderte Zeile (Nur relevanter Ausschnitt):

...
/var/log/dovecot.log /var/log/dovecot_backup.log {
...

Skript - cron-Job

Nachfolgend kann auch ein cron-Job zur z.B. nächtlichen Ausführung eingerichtet werden. Dazu können nachfolgende zwei Konfigurationszeilen an die bestehende Konfigurationsdatei

  • /etc/crontab

angehängt werden:

# Backup dovecot mailboxes
5 03 * * * root /usr/local/bin/dovecot_backup.sh > /dev/null 2>&1

* Ausführung nächtlich um 03:05 Uhr

Skript - Dateien

Nachfolgend sollten nachfolgende Dateien im Backup-Verzeichnis, welches im Skript definiert ist, erstellt worden sein, nachdem das Skript zur Ausführung gekommen ist. Hier z.B. /srv/backup/, was mit nachfolgendem Befehl überprüft werden kann:

# ls -la /srv/backup/
total 50108
drwx------  2 vmail vmail     4096 Apr 29 15:11 .
drwxr-xr-x. 4 root  root      4096 Apr 29 13:03 ..
-rw-------  1 vmail vmail 51290558 Apr 29 15:11 klaus@tachtler.net-dovecot_backup_20140429_151044.tar.gz
-rw-------  1 vmail vmail 21230432 Apr 29 15:12 petra@tachtler.net-dovecot_backup_20140429_151044.tar.gz

Recovery

Die Erstellung eines Backups (Sicherung) ist eine Sache, jedoch wie können im Fall eines Datenverlusts, die Daten wiederhergestellt werden.

Entpacken

Nachfolgendes Beispiel zeigt, wie zuerst die im Backup enthaltenen Daten in eine Verzeichnis unterhalb von

  • /tmp

wiederhergestellt werden können.

Dazu kann mit nachfolgendem Befehl ein Verzeichnis mit dem Namen recovery unterhalb des Verzeichnisses /tmp angelegt werden:

# mkdir /tmp/recovery

Anschließend kann dann mit nachfolgendem Befehl das komplette Maildir-Verzeichnis aller Benutzer unterhalb einer ganzen Domäne wiederhergestellt werden:

Als Beispiel sind hier nachfolgende Gegebenheiten angenommen:

  1. Das Backup befindet sich unter /srv/backup
  2. Der Benutzer lautet klaus@tachtler.net
# tar -xvzf /srv/backup/klaus@tachtler.net-dovecot_backup_20140429_151044.tar.gz -C /tmp/recovery --atime-preserve --preserve-permissions

Nach erfolgreicher Ausführung des oben gezeigten Befehls, kann mit nachfolgendem Befehl überprüft werden, ob alle Daten aus der Backup-Datei erfolgreich extrahiert werden konnten:

# ls -la /tmp/recovery/tachtler.net/klaus/Maildir
total 464
drwx------ 30 vmail vmail   4096 Apr 29 15:11 .
drwx------  3 vmail vmail   4096 Apr 29 15:10 ..
drwx------  2 vmail vmail  36864 Apr 29 15:11 cur
-rw-------  1 vmail vmail      0 Apr 29 15:10 dovecot-acl-list
-rw-------  1 vmail vmail 260484 Apr 29 15:11 dovecot.index.cache
-rw-------  1 vmail vmail   8640 Apr 29 15:11 dovecot.index.log
-rw-------  1 vmail vmail     24 Apr 29 15:11 dovecot-keywords
-rw-------  1 vmail vmail    648 Apr 29 15:10 dovecot.mailbox.log
-rw-------  1 vmail vmail  20649 Apr 29 15:11 dovecot-uidlist
-rw-------  1 vmail vmail      8 Apr 29 15:10 dovecot-uidvalidity
-r--r--r--  1 vmail vmail      0 Apr 29 15:10 dovecot-uidvalidity.535fa4ee
drwx------  5 vmail vmail   4096 Apr 29 15:11 .Drafts
drwx------  5 vmail vmail   4096 Apr 29 15:11 .Junk
-rw-------  1 vmail vmail      0 Apr 29 15:10 maildirfolder
-rw-------  1 vmail vmail     81 Apr 29 15:11 maildirsize
drwx------  2 vmail vmail   4096 Apr 29 15:10 new
drwx------  5 vmail vmail   4096 Apr 29 15:11 .Sent
-rw-------  1 vmail vmail    574 Apr 29 15:10 subscriptions
drwx------  2 vmail vmail   4096 Apr 29 15:11 tmp
drwx------  5 vmail vmail   4096 Apr 29 15:11 .Trash

dsync-Befehl

Nachfolgender Befehl kopiert dann im laufenden Betrieb, die Daten in das Maildir-Verzeichnis von Dovecot zurück.

Als Beispiel sind hier nachfolgende Gegebenheiten angenommen:

  1. Das Backup befindet sich unter /tmp/recovery/tachtler.net/klaus/Maildir/
  2. Der Benutzer lautet klaus@tachtler.net
# dsync -R -f -u klaus@tachtler.net backup maildir:/tmp/recovery/tachtler.net/klaus/Maildir

Mit nachfolgendem Befehl kann nun überprüft werden, ob das recovery (zurück kopieren) erfolgreich war.

Als Beispiel sind hier nachfolgende Gegebenheiten angenommen:

  1. Das Backup befindet sich unter /tmp/recovery/tachtler.net/klaus/Maildir/
  2. Der Benutzer lautet klaus@tachtler.net
  3. Das Maildir-Verzeichnis unter Dovecot befindet sich unter /var/spool/vmail/tachtler.net/klaus/Maildir
# ls -la /var/spool/vmail/tachtler.net/klaus/Maildir
total 480
drwx------ 30 vmail vmail   4096 Apr 29 16:27 .
drwx------  4 vmail vmail   4096 Apr 29 12:27 ..
drwx------  2 vmail vmail  36864 Apr 29 16:27 cur
-rw-------  1 vmail vmail      0 Apr 29 16:26 dovecot-acl-list
-rw-------  1 vmail vmail 260484 Apr 29 16:27 dovecot.index.cache
-rw-------  1 vmail vmail   8556 Apr 29 16:27 dovecot.index.log
-rw-------  1 vmail vmail    648 Apr 29 16:26 dovecot.mailbox.log
-rw-------  1 vmail vmail  20649 Apr 29 16:27 dovecot-uidlist
-rw-------  1 vmail vmail      8 Apr 29 16:26 dovecot-uidvalidity
-r--r--r--  1 vmail vmail      0 Apr 29 16:26 dovecot-uidvalidity.535fb6a3
drwx------  5 vmail vmail   4096 Apr 29 16:27 .Drafts
drwx------  6 vmail vmail   4096 Apr 29 16:27 .Junk
-rw-------  1 vmail vmail      0 Apr 29 16:26 maildirfolder
-rw-------  1 vmail vmail     25 Apr 29 16:27 maildirsize
drwx------  2 vmail vmail   4096 Apr 29 16:26 new
drwx------  5 vmail vmail   4096 Apr 29 16:27 .Sent
-rw-------  1 vmail vmail    574 Apr 29 16:26 subscriptions
drwx------  2 vmail vmail  24576 Apr 29 16:27 tmp
drwx------  5 vmail vmail   4096 Apr 29 16:27 .Trash

Login-Test mit telnet

Um zu Überprüfen, ob eine Anmeldung als Benutzer von einem entfernten Rechner möglich ist, kann nachfolgender Befehl genutzt werden:

# telnet 192.168.0.80 143
Trying 192.168.0.80...
Connected to 192.168.0.80.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE STARTTLS AUTH=PLAIN AUTH=DIGEST-MD5
AUTH=CRAM-MD5 AUTH=LOGIN] Dovecot ready.
a1 login klaus@tachtler.net geheim
a1 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY
THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN
NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH
LIST-STATUS SPECIAL-USE BINARY MOVE COMPRESS=DEFLATE QUOTA ACL RIGHTS=texk] Logged in
a2 list "" "*"
* LIST (\HasChildren) "/" INBOX
* LIST (\HasNoChildren \Junk) "/" INBOX/Junk
* LIST (\HasNoChildren \Sent) "/" INBOX/Sent
* LIST (\HasNoChildren \Trash) "/" INBOX/Trash
* LIST (\HasNoChildren \Drafts) "/" INBOX/Drafts
a2 OK List completed.
a3 logout
* BYE Logging out
a3 OK Logout completed.
Connection closed by foreign host.

Erforderliche Benutzereingaben:

  1. telnet 192.168.0.80 143
  2. a1 login klaus@tachtler.net geheim
  3. a2 list "" "*"
  4. a3 logout
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
tachtler/dovecot_backup_-_skript.1548880999.txt.gz · Zuletzt geändert: 2019/01/30 21:43 von klaus