]> Frank Brehm's Git Trees - pixelpark/pp-admin-tools.git/commitdiff
Starting with bin/mirror-ldap-instance
authorFrank Brehm <frank@brehm-online.com>
Tue, 18 Oct 2022 16:15:09 +0000 (18:15 +0200)
committerFrank Brehm <frank@brehm-online.com>
Tue, 18 Oct 2022 16:15:09 +0000 (18:15 +0200)
bin/mirror-ldap-instance [new file with mode: 0755]
lib/pp_admintools/app/ldap.py
lib/pp_admintools/app/mirror_ldap.py [new file with mode: 0644]
lib/pp_admintools/app/set_ldap_password.py
lib/pp_admintools/argparse_actions.py
lib/pp_admintools/config/ldap.py
locale/de_DE/LC_MESSAGES/pp_admintools.po
locale/en_US/LC_MESSAGES/pp_admintools.po
locale/pp_admintools.pot

diff --git a/bin/mirror-ldap-instance b/bin/mirror-ldap-instance
new file mode 100755 (executable)
index 0000000..7cc5ac0
--- /dev/null
@@ -0,0 +1,65 @@
+#!/usr/bin/env python3
+
+from __future__ import print_function
+
+# Standard modules
+import sys
+
+__exp_py_version_major__ = 3
+__min_py_version_minor__ = 6
+
+if sys.version_info[0] != __exp_py_version_major__:
+    print("This script is intended to use with Python {}.".format(
+        __exp_py_version_major__), file=sys.stderr)
+    print("You are using Python: {0}.{1}.{2}-{3}-{4}.".format(
+        *sys.version_info) + "\n", file=sys.stderr)
+    sys.exit(1)
+
+if sys.version_info[1] < __min_py_version_minor__:
+    print("A minimal Python version of {maj}.{min} is necessary to execute this script.".format(
+        maj=__exp_py_version_major__, min=__min_py_version_minor__), file=sys.stderr)
+    print("You are using Python: {0}.{1}.{2}-{3}-{4}.".format(
+        *sys.version_info) + "\n", file=sys.stderr)
+    sys.exit(1)
+
+# Standard modules
+import os
+import locale
+
+try:
+    from pathlib import Path
+except ImportError:
+    from pathlib2 import Path
+
+__author__ = 'Frank Brehm <frank.brehm@pixelpark.com>'
+__copyright__ = '(C) 2022 by Frank Brehm, Digitas Pixelpark GmbH, Berlin'
+
+# own modules:
+
+my_path = Path(__file__)
+my_real_path = my_path.resolve()
+bin_path = my_real_path.parent
+base_dir = bin_path.parent
+lib_dir = base_dir.joinpath('lib')
+module_dir = lib_dir.joinpath('pp_admintools')
+
+if module_dir.exists():
+    sys.path.insert(0, str(lib_dir))
+
+from pp_admintools.app.mirror_ldap import MirrorLdapApplication
+
+appname = os.path.basename(sys.argv[0])
+
+locale.setlocale(locale.LC_ALL, '')
+
+app = MirrorLdapApplication(appname=appname, base_dir=base_dir)
+app.initialized = True
+
+if app.verbose > 2:
+    print("{c}-Object:\n{a}".format(c=app.__class__.__name__, a=app))
+
+app()
+
+sys.exit(0)
+
+# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
index 470cbb5faa760b2b63441bbb7d18bf06bcc923a0..60dd375abed10121d0d4246579eebda8581fd8b0 100644 (file)
@@ -51,7 +51,7 @@ from ..config.ldap import LdapConnectionInfo, LdapConfiguration
 # rom ..config.ldap import DEFAULT_PORT_LDAP, DEFAULT_PORT_LDAPS
 from ..config.ldap import DEFAULT_TIMEOUT
 
-__version__ = '0.7.4'
+__version__ = '0.8.1'
 LOG = logging.getLogger(__name__)
 
 _ = XLATOR.gettext
@@ -162,6 +162,7 @@ class BaseLdapApplication(BaseDPXApplication):
     use_default_ldap_connection = True
     use_multiple_ldap_connections = False
     show_cmdline_ldap_timeout = True
+    apply_default_ldap_instance_if_not_given = True
 
     # pattern_re_ldap_dn = (
     # '^([a-z][a-z0-9-]*)=(?![ #])(((?![\\="+,;<>]).)|(\\[ \\#="+,;<>])|(\\[a-f0-9][a-f0-9]))*'
@@ -334,23 +335,34 @@ class BaseLdapApplication(BaseDPXApplication):
                 'metavar': _('INSTANCE'),
             }
 
+            help_default_inst = _(
+                    "If not given, then the instance {!r} will be used.").format('default')
+
             help_single = _(
-                "The LDAP instance (LDAP cluster) from configuration, where to execute this "
-                "script. If not given, then the instance {!r} will be used.").format('default')
+                "The LDAP instance (LDAP cluster) from configuration, "
+                "where to execute this script.")
+
             help_multi = _(
                 "The LDAP instance (LDAP cluster) from configuration, where to execute "
                 "this script. It is possible to give here the value {val_all!r}, "
                 "then all found LDAP instances except {default!r} are used. "
                 "It is alo possible to give the value {val_list!r}, then all configured "
-                "LDAP instances are shown, and the application is exiting. "
-                "If not given, then the instance {default!r} will be used.").format(
-                    val_all='all', val_list='list', default='default')
+                "LDAP instances are shown, and the application is exiting.").format(
+                        val_all='all', val_list='list', default='default')
 
             if self.use_multiple_ldap_connections:
-                arg_params['nargs'] = '*'
-                arg_params['help'] = help_multi
+                if self.apply_default_ldap_instance_if_not_given:
+                    arg_params['nargs'] = '*'
+                    arg_params['help'] = help_multi + ' ' + help_default_inst
+                else:
+                    arg_params['nargs'] = '+'
+                    arg_params['help'] = help_multi
             else:
-                arg_params['help'] = help_single
+                if self.apply_default_ldap_instance_if_not_given:
+                    arg_params['help'] = help_single + ' ' + help_default_inst
+                else:
+                    arg_params['help'] = help_single
+                    arg_params['required'] = True
 
             ldap_group.add_argument('-I', '--instance', **arg_params)
 
@@ -461,7 +473,7 @@ class BaseLdapApplication(BaseDPXApplication):
         print()
 
     # -------------------------------------------------------------------------
-    def _verify_instances(self, is_admin=None, readonly=None, tier=None):
+    def _verify_instances(self, is_admin=None, readonly=None, tier=None, has_sync_source=False):
 
         if self.verbose > 1:
             LOG.debug(_("Verifying given instances ..."))
@@ -475,6 +487,8 @@ class BaseLdapApplication(BaseDPXApplication):
                 show_filter.append('readonly = {!r}'.format(readonly))
             if tier is not None:
                 show_filter.append('tier = {!r}'.format(tier))
+            if has_sync_source:
+                show_filter.append('sync_source = *')
             msg = _("Used filter:") + ' ' + format_list(show_filter)
             LOG.debug(msg)
 
@@ -492,6 +506,9 @@ class BaseLdapApplication(BaseDPXApplication):
             if tier is not None:
                 if tier.strip().lower() != instance.tier:
                     continue
+            if has_sync_source:
+                if instance.sync_source is None:
+                    continue
             instances.append(inst.lower())
 
         if len(self.ldap_instances) == 1 and self.ldap_instances[0].lower() == 'all':
@@ -500,13 +517,16 @@ class BaseLdapApplication(BaseDPXApplication):
         else:
 
             if 'default' in self.cfg.ldap_connection:
-                instances.insert(0, 'default')
+                if self.apply_default_ldap_instance_if_not_given:
+                    instances.insert(0, 'default')
 
             all_ok = True
             for given_inst in self.ldap_instances:
                 if given_inst not in instances:
-                    LOG.error(_("LDAP instance {!r} not found in configuration.").format(
-                        given_inst))
+                    msg = _(
+                        "LDAP instance {!r} not found in configuration or is not usable.").format(
+                            given_inst)
+                    LOG.error(msg)
                     all_ok = False
 
             if not all_ok:
diff --git a/lib/pp_admintools/app/mirror_ldap.py b/lib/pp_admintools/app/mirror_ldap.py
new file mode 100644 (file)
index 0000000..86d2d02
--- /dev/null
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+"""
+@summary: An application module for mirroring one LDAP instance to another
+
+@author: Frank Brehm
+@contact: frank.brehm@pixelpark.com
+@copyright: © 2022 by Frank Brehm, Berlin
+"""
+from __future__ import absolute_import
+
+# Standard modules
+import logging
+
+# Third party modules
+# from ldap3 import MODIFY_REPLACE, MODIFY_ADD, MODIFY_DELETE
+
+# Own modules
+# from fb_tools.common import to_bool, is_sequence, pp
+
+from ..xlate import XLATOR
+
+# from .ldap import LdapAppError, FatalLDAPError
+from .ldap import LdapAppError
+from .ldap import BaseLdapApplication
+
+from ..argparse_actions import NonNegativeItegerOptionAction
+from ..argparse_actions import LimitedFloatOptionAction
+
+__version__ = '0.1.0'
+LOG = logging.getLogger(__name__)
+
+_ = XLATOR.gettext
+ngettext = XLATOR.ngettext
+
+
+# =============================================================================
+class MirrorLdapError(LdapAppError):
+    """Special exception class for exceptions inside this module."""
+
+    pass
+
+
+# =============================================================================
+class MirrorLdapApplication(BaseLdapApplication):
+    """Application class for mirroring one LDAP instance to another."""
+
+    show_simulate_option = True
+
+    use_default_ldap_connection = False
+    use_multiple_ldap_connections = False
+    show_cmdline_ldap_timeout = True
+    apply_default_ldap_instance_if_not_given = False
+
+    default_wait_after_write = 0.05
+
+    # -------------------------------------------------------------------------
+    def __init__(self, appname=None, base_dir=None):
+
+        self.src = None
+        self.tgt = None
+
+        self.limit = 0
+        self.wait_after_write = self.default_wait_after_write
+        self.only_struct = False
+
+        self.structural_entr_dns = []
+        self.non_structural_entr_dns = []
+        self.keep_entry_dns = []
+
+        desc = _(
+            "Mirror the content of a complete LDAP instance (server or cluster) to "
+            "another instance. This will be done first by clearing the target instance, "
+            "then copying structural entries from the source to the target instance and "
+            "then copying all other entries. During this some transformations are done, like "
+            "substituting the content of some entry attributes by another values."
+        )
+
+        super(MirrorLdapApplication, self).__init__(
+            appname=appname, description=desc, base_dir=base_dir, initialized=False)
+
+        self.initialized = True
+
+    # -------------------------------------------------------------------------
+    def init_arg_parser(self):
+
+        app_group = self.arg_parser.add_argument_group(_("Miroring options"))
+
+        app_group.add_argument(
+            '-W', '--wait', '--wait-after-write', dest='wait', type=float, metavar=_('SECONDS'),
+            action=LimitedFloatOptionAction, min_val=0,
+            help=_(
+                "Number of seconds to wait after each write operation. Given as a "
+                "float value, and if set to zero, there is no waiting after a write. "
+                "(default: {:.1f})").format(self.default_wait_after_write),
+        )
+
+        app_group.add_argument(
+            '-L', '--limit', dest='limit', type=int, metavar=_('NUMBER'),
+            action=NonNegativeItegerOptionAction,
+            help=_(
+                "Limiting the mirroring to the first NUMBER entries. "
+                "This option is valid only in simulation mode."),
+        )
+
+        app_group.add_argument(
+            '-S', '--struct', '--only-struct', action="store_true", dest="struct",
+            help=_("Mirror only structural entries (entries with childs)."),
+        )
+
+        super(MirrorLdapApplication, self).init_arg_parser()
+
+    # -------------------------------------------------------------------------
+    def _verify_instances(self):
+
+        super(MirrorLdapApplication, self)._verify_instances(
+            is_admin=True, readonly=False, has_sync_source=True)
+
+    # -------------------------------------------------------------------------
+    def _run(self):
+
+        LOG.info("I'm walking, yes indeed I'm walking ...")
+
+
+# =============================================================================
+if __name__ == "__main__":
+
+    pass
+
+# =============================================================================
+
+# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 list
index dec44c2cf77b9b7d0f783b74cab96fdbf799ea50..d7a089df98ab70440e57fcdde80997784a205452 100644 (file)
@@ -36,7 +36,7 @@ from .ldap import LdapAppError, FatalLDAPError
 from .ldap import BaseLdapApplication
 from .ldap import PasswordFileOptionAction
 
-__version__ = '0.6.4'
+__version__ = '0.6.5'
 LOG = logging.getLogger(__name__)
 
 _ = XLATOR.gettext
@@ -56,6 +56,10 @@ class SetLdapPasswordApplication(BaseLdapApplication):
 
     show_simulate_option = True
 
+    use_default_ldap_connection = False
+    use_multiple_ldap_connections = False
+    show_cmdline_ldap_timeout = True
+
     current_userid = os.getuid()
     current_user = None
     try:
@@ -136,10 +140,6 @@ class SetLdapPasswordApplication(BaseLdapApplication):
     # -------------------------------------------------------------------------
     def __init__(self, appname=None, base_dir=None):
 
-        self.use_default_ldap_connection = False
-        self.use_multiple_ldap_connections = False
-        self.show_cmdline_ldap_timeout = True
-
         self.init_pass_schemes()
 
         self.current_password = None
index 260432409fa08f4ff6cbac7e60eaa687142b2458..2a2fe1a56702428457f88f8b750f8bc6335a3fab 100644 (file)
@@ -16,7 +16,7 @@ from . import MAX_PORT_NUMBER
 
 from .xlate import XLATOR
 
-__version__ = '0.2.2'
+__version__ = '0.3.1'
 LOG = logging.getLogger(__name__)
 
 _ = XLATOR.gettext
@@ -53,6 +53,99 @@ class PortOptionAction(argparse.Action):
 
         setattr(namespace, self.dest, port)
 
+# =============================================================================
+class NonNegativeItegerOptionAction(argparse.Action):
+
+    # -------------------------------------------------------------------------
+    def __call__(self, parser, namespace, value, option_string=None):
+
+        try:
+            val = int(value)
+        except Exception as e:
+            msg = _("Got a {c} for converting {v!r} into an integer value: {e}").format(
+                c=e.__class__.__name__, v=value, e=e)
+            raise argparse.ArgumentError(self, msg)
+
+        if val < 0:
+            msg = _("The option must not be negative (given: {}).").format(value)
+            raise argparse.ArgumentError(self, msg)
+
+        setattr(namespace, self.dest, val)
+
+
+# =============================================================================
+class LimitedIntegerOptionAction(argparse.Action):
+
+    # -------------------------------------------------------------------------
+    def __init__(self, option_strings, min_val=None, max_val=None, *args, **kwargs):
+
+        self._min_val = min_val
+        self._max_val = max_val
+
+        super(LimitedIntegerOptionAction, self).__init__(
+            option_strings=option_strings, *args, **kwargs)
+
+    # -------------------------------------------------------------------------
+    def __call__(self, parser, namespace, value, option_string=None):
+
+        val = 0
+        try:
+            val = int(value)
+        except Exception as e:
+            msg = _("Got a {c} for converting {v!r} into an integer value: {e}").format(
+                c=e.__class__.__name__, v=value, e=e)
+            raise argparse.ArgumentError(self, msg)
+
+        if self._min_val is not None:
+            if val < self._min_val:
+                msg = _("The option must be greater or equal to {m} (given: {v}).").format(
+                    m=self._min_val, v=val)
+                raise argparse.ArgumentError(self, msg)
+
+        if self._max_val is not None:
+            if val > self._max_val:
+                msg = _("The option must be less or equal to {m} (given: {v}).").format(
+                    m=self._max_val, v=val)
+                raise argparse.ArgumentError(self, msg)
+
+        setattr(namespace, self.dest, val)
+
+
+# =============================================================================
+class LimitedFloatOptionAction(argparse.Action):
+
+    # -------------------------------------------------------------------------
+    def __init__(self, option_strings, min_val=None, max_val=None, *args, **kwargs):
+
+        self._min_val = min_val
+        self._max_val = max_val
+
+        super(LimitedFloatOptionAction, self).__init__(
+            option_strings=option_strings, *args, **kwargs)
+
+    # -------------------------------------------------------------------------
+    def __call__(self, parser, namespace, value, option_string=None):
+
+        val = 0
+        try:
+            val = float(value)
+        except Exception as e:
+            msg = _("Got a {c} for converting {v!r} into a float value: {e}").format(
+                c=e.__class__.__name__, v=value, e=e)
+            raise argparse.ArgumentError(self, msg)
+
+        if self._min_val is not None and val < self._min_val:
+            msg = _("The option must be greater or equal to {m} (given: {v}).").format(
+                m=self._min_val, v=val)
+            raise argparse.ArgumentError(self, msg)
+
+        if self._max_val is not None and val > self._max_val:
+            msg = _("The option must be less or equal to {m} (given: {v}).").format(
+                m=self._max_val, v=val)
+            raise argparse.ArgumentError(self, msg)
+
+        setattr(namespace, self.dest, val)
+
 
 # =============================================================================
 if __name__ == "__main__":
index 3e09977ab332f2624036ddc0ab4492bb9e34e592..4a27f5606f527f5ad654ddbdcd71c457a1aa7288 100644 (file)
@@ -32,7 +32,7 @@ from . import VALID_TIERS, DEFAULT_TIER
 
 from ..xlate import XLATOR
 
-__version__ = '0.6.0'
+__version__ = '0.6.1'
 LOG = logging.getLogger(__name__)
 
 _ = XLATOR.gettext
@@ -396,6 +396,7 @@ class LdapConnectionInfo(FbBaseObject):
 
             if cls.re_ldap_sync_source_key.match(key):
                 new.sync_source = value
+                continue
 
             msg = _("Unknown LDAP configuration key {key} found in section {sec!r}.").format(
                 key=key, sec=section_name)
index d47cb1441f7c998f38a7b85f4cc5a5e41c8160b3..a16d0035fdffa5af55b917378d64996441ad1473 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pp_admintools 0.9.1\n"
 "Report-Msgid-Bugs-To: frank.brehm@pixelpark.com\n"
-"POT-Creation-Date: 2022-10-17 17:45+0200\n"
+"POT-Creation-Date: 2022-10-18 18:12+0200\n"
 "PO-Revision-Date: 2022-09-30 16:55+0200\n"
 "Last-Translator: Frank Brehm <frank.brehm@pixelpark.com>\n"
 "Language: de_DE\n"
@@ -26,188 +26,188 @@ msgstr "Generierung der BIND9-Konfigurationsdatei für Slave-Zonen."
 msgid "Options for {}"
 msgstr "Optionen für {}"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:267
+#: lib/pp_admintools/app/dns_deploy_zones.py:266
 msgid "Keep a backup file for each changed configuration file."
 msgstr "Eine Backup-Datei für jede geänderte Konfigurationsdatei aufbewahren."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:272
+#: lib/pp_admintools/app/dns_deploy_zones.py:271
 msgid "Keeping the temporary directory instead of removing it at the end (e.g. for debugging purposes)"
 msgstr "Aufbewahren des temporären Verzeichnisses, anstatt es am Ende zu löschen (z.Bsp. zum Debuggen)"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:300
+#: lib/pp_admintools/app/dns_deploy_zones.py:299
 msgid "Post init phase."
 msgstr "Nach-Init-Phase."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:304
+#: lib/pp_admintools/app/dns_deploy_zones.py:303
 msgid "My own post init phase."
 msgstr "Die eigene Nach-Init-Phase."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:320
+#: lib/pp_admintools/app/dns_deploy_zones.py:319
 msgid "Unknown time zone: {!r}."
 msgstr "Unbekannte Zeitzone: {!r}."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:340
+#: lib/pp_admintools/app/dns_deploy_zones.py:339
 msgid "You must be root to execute this script."
 msgstr "Du musst root sein, um dieses Skript ausführen zu können."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:342
+#: lib/pp_admintools/app/dns_deploy_zones.py:341
 msgid "But in simulation mode we are continuing nevertheless."
 msgstr "Aber im Simulationsmodus machen wir trotzdem weiter."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:352
+#: lib/pp_admintools/app/dns_deploy_zones.py:351
 msgid "Using the global DNS master is not supported, please use 'local' or 'public'"
 msgstr "Die Verwendung des glovalen Masters wird nicht unterstützt, bitte 'local' oder 'public' verwenden"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:360
+#: lib/pp_admintools/app/dns_deploy_zones.py:359
 msgid "Starting: {}"
 msgstr "Starte: {}"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:367
+#: lib/pp_admintools/app/dns_deploy_zones.py:366
 msgid "Could not occupy pidfile: {}"
 msgstr "Konnte PID-Datei nicht vereinnahmen."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:392
+#: lib/pp_admintools/app/dns_deploy_zones.py:391
 msgid "Ending: {}"
 msgstr "Beendet: {}"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:397
+#: lib/pp_admintools/app/dns_deploy_zones.py:396
 msgid "Cleaning up ..."
 msgstr "Aufräumen …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:401
+#: lib/pp_admintools/app/dns_deploy_zones.py:400
 msgid "Searching for {!r}."
 msgstr "Suche nach {!r}."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:404
+#: lib/pp_admintools/app/dns_deploy_zones.py:403
 msgid "Keep existing backup file {!r}."
 msgstr "Behalte existierende Backup-Datei {!r}."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:406
+#: lib/pp_admintools/app/dns_deploy_zones.py:405
 msgid "Removing {!r} ..."
 msgstr "Lösche {!r} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:412
+#: lib/pp_admintools/app/dns_deploy_zones.py:411
 msgid "Error removing {p!r} - {c}: {e}"
 msgstr "Fehler beim Löschen {p!r} - {c}: {e}"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:417
+#: lib/pp_admintools/app/dns_deploy_zones.py:416
 msgid "Temporary directory {!r} will not be removed. It's on yours to remove it manually."
 msgstr ""
 "Das temporäre Verzeichnis {!r} wird nicht gelöscht. Du musst Dich selbst darum kümmern, es "
 "manuell zu löschen."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:422
+#: lib/pp_admintools/app/dns_deploy_zones.py:421
 msgid "Destroying temporary directory {!r} ..."
 msgstr "Zerstöre temporäres Verzeichnis {!r} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:431
+#: lib/pp_admintools/app/dns_deploy_zones.py:430
 msgid "Temporary directory: {!r}."
 msgstr "Temporäres Verzeichnis: {!r}."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:436
+#: lib/pp_admintools/app/dns_deploy_zones.py:435
 msgid "Temporary zones conf: {!r}"
 msgstr "Temporäre Zonenkonfiguration: {!r}"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:441
+#: lib/pp_admintools/app/dns_deploy_zones.py:440
 msgid "Trying to get all keys from named.conf ..."
 msgstr "Versuche alle Schlüssel der named.conf zu ermitteln …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:447 lib/pp_admintools/app/dns_deploy_zones.py:801
-#: lib/pp_admintools/app/dns_deploy_zones.py:837 lib/pp_admintools/app/dns_deploy_zones.py:869
-#: lib/pp_admintools/app/dns_deploy_zones.py:904 lib/pp_admintools/app/dns_deploy_zones.py:939
+#: lib/pp_admintools/app/dns_deploy_zones.py:446 lib/pp_admintools/app/dns_deploy_zones.py:800
+#: lib/pp_admintools/app/dns_deploy_zones.py:836 lib/pp_admintools/app/dns_deploy_zones.py:868
+#: lib/pp_admintools/app/dns_deploy_zones.py:903 lib/pp_admintools/app/dns_deploy_zones.py:938
 #: lib/pp_admintools/app/mail.py:326
 msgid "Executing: {}"
 msgstr "Führe aus: {}"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:453 lib/pp_admintools/app/dns_deploy_zones.py:807
-#: lib/pp_admintools/app/ldap.py:766 lib/pp_admintools/app/ldap.py:819
-#: lib/pp_admintools/app/ldap.py:872 lib/pp_admintools/app/ldap.py:1103
-#: lib/pp_admintools/app/ldap.py:1137 lib/pp_admintools/app/ldap.py:1171
-#: lib/pp_admintools/app/ldap.py:1205
+#: lib/pp_admintools/app/dns_deploy_zones.py:452 lib/pp_admintools/app/dns_deploy_zones.py:806
+#: lib/pp_admintools/app/ldap.py:787 lib/pp_admintools/app/ldap.py:840
+#: lib/pp_admintools/app/ldap.py:893 lib/pp_admintools/app/ldap.py:1124
+#: lib/pp_admintools/app/ldap.py:1158 lib/pp_admintools/app/ldap.py:1192
+#: lib/pp_admintools/app/ldap.py:1226
 msgid "Result:"
 msgstr "Ergebnis:"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:494 lib/pp_admintools/app/dns_deploy_zones.py:496
+#: lib/pp_admintools/app/dns_deploy_zones.py:493 lib/pp_admintools/app/dns_deploy_zones.py:495
 msgid "Found named keys:"
 msgstr "iGefundene Schlüssel von named:"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:496 lib/pp_admintools/app/dns_deploy_zones.py:527
+#: lib/pp_admintools/app/dns_deploy_zones.py:495 lib/pp_admintools/app/dns_deploy_zones.py:526
 msgid "None"
 msgstr "Keine"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:501
+#: lib/pp_admintools/app/dns_deploy_zones.py:500
 msgid "Generating {} ..."
 msgstr "Generiere {} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:525 lib/pp_admintools/app/dns_deploy_zones.py:527
+#: lib/pp_admintools/app/dns_deploy_zones.py:524 lib/pp_admintools/app/dns_deploy_zones.py:526
 msgid "Collected server configuration:"
 msgstr "Ermittelte Servers-Konfiguration:"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:548
+#: lib/pp_admintools/app/dns_deploy_zones.py:547
 msgid "Generated file {!r}:"
 msgstr "Generierte Datei {!r}:"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:564
+#: lib/pp_admintools/app/dns_deploy_zones.py:563
 msgid "Pure local zone {!r} will not be considered."
 msgstr "Die rein lokale Zone {!r} wird nich mit beachtet."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:596
+#: lib/pp_admintools/app/dns_deploy_zones.py:595
 msgid "Key {k!r} for zone {z!r} not found in named configuration."
 msgstr "Der Schlüssel {k!r} für die Zone {z!r} wurde in der named-Konfiguration nicht gefunden."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:626
+#: lib/pp_admintools/app/dns_deploy_zones.py:625
 msgid "Got IPv4 tuples: {}"
 msgstr "Habe IPv4-Tupels erhalten: {}"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:650
+#: lib/pp_admintools/app/dns_deploy_zones.py:649
 msgid "Got IPv6 tokens: {}"
 msgstr "Habe IPv6-Tupels erhalten: {}"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:657
+#: lib/pp_admintools/app/dns_deploy_zones.py:656
 msgid "Comparing generated files with existing ones."
 msgstr "Vergleiche die generierten Dateien mit den existierenden."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:664
+#: lib/pp_admintools/app/dns_deploy_zones.py:663
 msgid "Files to replace:"
 msgstr "Dateien, die ersetzt werden:"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:670
+#: lib/pp_admintools/app/dns_deploy_zones.py:669
 msgid "Source file not defined."
 msgstr "Die Quell-Datei ist nicht definiert."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:672
+#: lib/pp_admintools/app/dns_deploy_zones.py:671
 msgid "Target file not defined."
 msgstr "Die Ziel-Datei ist nicht definiert."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:674
+#: lib/pp_admintools/app/dns_deploy_zones.py:673
 msgid "Comparing {one!r} with {two!r} ..."
 msgstr "Vergleiche {one!r} mit {two!r} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:678 lib/pp_admintools/app/dns_deploy_zones.py:687
+#: lib/pp_admintools/app/dns_deploy_zones.py:677 lib/pp_admintools/app/dns_deploy_zones.py:686
 msgid "{what} {f!r} does not exists."
 msgstr "Die {what} {f!r} existiert nicht."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:679 lib/pp_admintools/app/dns_deploy_zones.py:683
+#: lib/pp_admintools/app/dns_deploy_zones.py:678 lib/pp_admintools/app/dns_deploy_zones.py:682
 msgid "Source file"
 msgstr "Quell-Datei"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:682 lib/pp_admintools/app/dns_deploy_zones.py:692
+#: lib/pp_admintools/app/dns_deploy_zones.py:681 lib/pp_admintools/app/dns_deploy_zones.py:691
 msgid "{what} {f!r} is not a regular file."
 msgstr "Die {what} {f!r} ist keine reguläre Datei."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:688 lib/pp_admintools/app/dns_deploy_zones.py:693
+#: lib/pp_admintools/app/dns_deploy_zones.py:687 lib/pp_admintools/app/dns_deploy_zones.py:692
 msgid "Target file"
 msgstr "Ziel-Datei"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:699 lib/pp_admintools/app/dns_deploy_zones.py:716
+#: lib/pp_admintools/app/dns_deploy_zones.py:698 lib/pp_admintools/app/dns_deploy_zones.py:715
 msgid "Reading {!r} ..."
 msgstr "Lese {!r} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:709 lib/pp_admintools/app/dns_deploy_zones.py:726
+#: lib/pp_admintools/app/dns_deploy_zones.py:708 lib/pp_admintools/app/dns_deploy_zones.py:725
 msgid "Cleaned version of {!r}:"
 msgstr "Bereinigte Version von {!r}:"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:731
+#: lib/pp_admintools/app/dns_deploy_zones.py:730
 msgid ""
 "Source file {sf!r} has different number essential lines ({sl}) than the target file {tf!r} ({tl}"
 " lines)."
@@ -215,166 +215,166 @@ msgstr ""
 "Die Quelldatei {sf!r} besitzt eine andere Anzahl essentieller Zeilen ({sl}) als die Zieldatei "
 "{tf!r} ({tl} lines)."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:740
+#: lib/pp_admintools/app/dns_deploy_zones.py:739
 msgid "Source file {sf!r} has a different content than the target file {tf!r}."
 msgstr "Die Quelldate {sf!r} hat einen anderen Inhalt als die Zielfatei {tf!r}."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:752
+#: lib/pp_admintools/app/dns_deploy_zones.py:751
 msgid "No replacement of any config files necessary."
 msgstr "Es muss keine Datei ersetzt werden."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:755
+#: lib/pp_admintools/app/dns_deploy_zones.py:754
 msgid "Start replacing of config files ..."
 msgstr "Starting Ersatz von Konfigurations-Dateien …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:763 lib/pp_admintools/app/dns_deploy_zones.py:773
+#: lib/pp_admintools/app/dns_deploy_zones.py:762 lib/pp_admintools/app/dns_deploy_zones.py:772
 msgid "Copying {frm!r} => {to!r} ..."
 msgstr "Kopieren {frm!r} => {to!r} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:769
+#: lib/pp_admintools/app/dns_deploy_zones.py:768
 msgid "All backuped config files:"
 msgstr "Alle gesicherten Konfigurations-Dateien:"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:781
+#: lib/pp_admintools/app/dns_deploy_zones.py:780
 msgid "Restoring of original config files because of an exception."
 msgstr "Wiederherstellung der Original-Konfigurations-Dateien wegen eines Fehlers."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:785
+#: lib/pp_admintools/app/dns_deploy_zones.py:784
 msgid "Moving {frm!r} => {to!r} ..."
 msgstr "Verschieben {frm!r} => {to!r} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:791
+#: lib/pp_admintools/app/dns_deploy_zones.py:790
 msgid "Could not find backup file {!r}."
 msgstr "Konnte Backup-Datei {!r} nicht finden."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:796
+#: lib/pp_admintools/app/dns_deploy_zones.py:795
 msgid "Checking syntax correctness of named.conf ..."
 msgstr "Überprüfe synaktische Richtigkeit der named.conf …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:817
+#: lib/pp_admintools/app/dns_deploy_zones.py:816
 msgid "Reload or restart of named is not necessary."
 msgstr "Ein Reload oder Neustart von named ist nicht notwendig."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:822
+#: lib/pp_admintools/app/dns_deploy_zones.py:821
 msgid "Named is not running, please start it manually."
 msgstr "Named läuft nicht, bitte manuell starten."
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:833
+#: lib/pp_admintools/app/dns_deploy_zones.py:832
 msgid "Checking, whether named is running ..."
 msgstr "Überprüfen, ob named läuft …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:851 lib/pp_admintools/app/dns_deploy_zones.py:886
-#: lib/pp_admintools/app/dns_deploy_zones.py:921 lib/pp_admintools/app/dns_deploy_zones.py:956
+#: lib/pp_admintools/app/dns_deploy_zones.py:850 lib/pp_admintools/app/dns_deploy_zones.py:885
+#: lib/pp_admintools/app/dns_deploy_zones.py:920 lib/pp_admintools/app/dns_deploy_zones.py:955
 msgid "Return value: {!r}"
 msgstr "Rückgabewert: {!r}"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:853 lib/pp_admintools/app/dns_deploy_zones.py:855
-#: lib/pp_admintools/app/dns_deploy_zones.py:888 lib/pp_admintools/app/dns_deploy_zones.py:890
-#: lib/pp_admintools/app/dns_deploy_zones.py:923 lib/pp_admintools/app/dns_deploy_zones.py:925
-#: lib/pp_admintools/app/dns_deploy_zones.py:958 lib/pp_admintools/app/dns_deploy_zones.py:960
+#: lib/pp_admintools/app/dns_deploy_zones.py:852 lib/pp_admintools/app/dns_deploy_zones.py:854
+#: lib/pp_admintools/app/dns_deploy_zones.py:887 lib/pp_admintools/app/dns_deploy_zones.py:889
+#: lib/pp_admintools/app/dns_deploy_zones.py:922 lib/pp_admintools/app/dns_deploy_zones.py:924
+#: lib/pp_admintools/app/dns_deploy_zones.py:957 lib/pp_admintools/app/dns_deploy_zones.py:959
 msgid "Output on {}"
 msgstr "Ausgabe an {}"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:865
+#: lib/pp_admintools/app/dns_deploy_zones.py:864
 msgid "Starting {} ..."
 msgstr "Starten {} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:900
+#: lib/pp_admintools/app/dns_deploy_zones.py:899
 msgid "Restarting {} ..."
 msgstr "Neu starten {} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:935
+#: lib/pp_admintools/app/dns_deploy_zones.py:934
 msgid "Reloading {} ..."
 msgstr "Reload {} …"
 
-#: lib/pp_admintools/app/ldap.py:108 lib/pp_admintools/app/ldap.py:211
+#: lib/pp_admintools/app/ldap.py:109 lib/pp_admintools/app/ldap.py:213
 msgid "The path {!r} must be an absolute path."
 msgstr "Der Pfad {!r} muss ein absoluter Pfad sein."
 
-#: lib/pp_admintools/app/ldap.py:114 lib/pp_admintools/app/ldap.py:215
-#: lib/pp_admintools/app/ldap.py:1219
+#: lib/pp_admintools/app/ldap.py:115 lib/pp_admintools/app/ldap.py:217
+#: lib/pp_admintools/app/ldap.py:1240
 msgid "The file {!r} does not exists."
 msgstr "Die Datei {!r} existiert nicht."
 
-#: lib/pp_admintools/app/ldap.py:118 lib/pp_admintools/app/ldap.py:219
-#: lib/pp_admintools/app/ldap.py:1224
+#: lib/pp_admintools/app/ldap.py:119 lib/pp_admintools/app/ldap.py:221
+#: lib/pp_admintools/app/ldap.py:1245
 msgid "The given path {!r} exists, but is not a regular file."
 msgstr "Der angegebene Pfad {!r} existiert, ist aber keine reguläre Datei."
 
-#: lib/pp_admintools/app/ldap.py:122 lib/pp_admintools/app/ldap.py:223
-#: lib/pp_admintools/app/ldap.py:1229
+#: lib/pp_admintools/app/ldap.py:123 lib/pp_admintools/app/ldap.py:225
+#: lib/pp_admintools/app/ldap.py:1250
 msgid "The given file {!r} is not readable."
 msgstr "Die angegebene Datei {} ist nicht lesbar."
 
-#: lib/pp_admintools/app/ldap.py:143
+#: lib/pp_admintools/app/ldap.py:144
 msgid "a port number must be greater than zero and less or equal to {}."
 msgstr "ein Port muss größer als Null und kleiner oder gleich {} sein."
 
-#: lib/pp_admintools/app/ldap.py:148
+#: lib/pp_admintools/app/ldap.py:149
 msgid "Wrong port number {!r}:"
 msgstr "Ungültige Portnummer {!r}."
 
-#: lib/pp_admintools/app/ldap.py:256
+#: lib/pp_admintools/app/ldap.py:258
 msgid "LDAP options"
 msgstr "LDAP-Optionen"
 
-#: lib/pp_admintools/app/ldap.py:258
+#: lib/pp_admintools/app/ldap.py:260
 msgid "Options for the default LDAP connection"
 msgstr "Optionen für die Vorgabe-LDAP-Verbindung"
 
-#: lib/pp_admintools/app/ldap.py:260
+#: lib/pp_admintools/app/ldap.py:262
 msgid "Options fo LDAP connections"
 msgstr "Optionen für die LDAP-Verbindungen"
 
-#: lib/pp_admintools/app/ldap.py:267 lib/pp_admintools/app/remove_ldap_user.py:280
-#: lib/pp_admintools/app/set_ldap_password.py:579
+#: lib/pp_admintools/app/ldap.py:269 lib/pp_admintools/app/remove_ldap_user.py:279
+#: lib/pp_admintools/app/set_ldap_password.py:583
 msgid "No"
 msgstr "Nein"
 
-#: lib/pp_admintools/app/ldap.py:269
+#: lib/pp_admintools/app/ldap.py:271
 msgid "Yes"
 msgstr "Ja"
 
-#: lib/pp_admintools/app/ldap.py:275
+#: lib/pp_admintools/app/ldap.py:277
 msgid "HOST"
 msgstr "HOST"
 
-#: lib/pp_admintools/app/ldap.py:276
+#: lib/pp_admintools/app/ldap.py:278
 msgid "Hostname or address of the LDAP server to use. Default: {!r}"
 msgstr "Der Hostname oder die Adresse des zu verwendenden LDAP-Servers. Vorgabe: {!r}"
 
-#: lib/pp_admintools/app/ldap.py:283
+#: lib/pp_admintools/app/ldap.py:285
 msgid "Use ldaps to connect to the LDAP server. Default: {}"
 msgstr "Soll ldaps zum Verbinden mit dem LDAP-Server verwendet werden? Vorgabe: {}."
 
-#: lib/pp_admintools/app/ldap.py:288 lib/pp_admintools/app/mail.py:261
-#: lib/pp_admintools/app/pdns.py:274
+#: lib/pp_admintools/app/ldap.py:290 lib/pp_admintools/app/mail.py:261
+#: lib/pp_admintools/app/pdns.py:272
 msgid "PORT"
 msgstr "PORT"
 
-#: lib/pp_admintools/app/ldap.py:290
+#: lib/pp_admintools/app/ldap.py:292
 msgid "The port number to connect to the LDAP server. Default: {}"
 msgstr "Welcher Port soll verwendet werden, um sich mit dem LDAP-Server zu verbinden? Vorgabe: {}."
 
-#: lib/pp_admintools/app/ldap.py:296
+#: lib/pp_admintools/app/ldap.py:298
 msgid "The base DN used as the root for the LDAP searches. Default: {!r}"
 msgstr "Die Basis-DN, die als Ausgangspunt bei LDAP-Suchen verwendet werden soll. Vorgabe: {!r}"
 
-#: lib/pp_admintools/app/ldap.py:303
+#: lib/pp_admintools/app/ldap.py:305
 msgid "The Bind DN to use to connect to the LDAP server. Default: {!r}"
 msgstr "Die Bind-DN, die zur Verbindung mit dem LDAP-Server verwendet werden soll. Vorgabe: {!r}"
 
-#: lib/pp_admintools/app/ldap.py:311 lib/pp_admintools/app/set_ldap_password.py:204
+#: lib/pp_admintools/app/ldap.py:313 lib/pp_admintools/app/set_ldap_password.py:204
 #: lib/pp_admintools/app/set_ldap_password.py:205 lib/pp_admintools/app/set_ldap_password.py:222
 #: lib/pp_admintools/app/set_ldap_password.py:225
 msgid "PASSWORD"
 msgstr "PASSWORT"
 
-#: lib/pp_admintools/app/ldap.py:312
+#: lib/pp_admintools/app/ldap.py:314
 msgid "Use PASSWORD as the password for simple LDAP authentication."
 msgstr "Verwende PASSWORT als Passwort für die einfache Authentifizierung."
 
-#: lib/pp_admintools/app/ldap.py:317
+#: lib/pp_admintools/app/ldap.py:319
 msgid ""
 "Prompt for simple LDAP authentication. This is used instead of specifying the password on the "
 "command line."
@@ -382,275 +382,275 @@ msgstr ""
 "Nachfrage nach dem Passwort für eine einfache LDAP-Authentifizierung. Dies wird anstelle der "
 "Angabe des Passwortes an der Kommandozeile verwendet."
 
-#: lib/pp_admintools/app/ldap.py:323 lib/pp_admintools/app/set_ldap_password.py:216
+#: lib/pp_admintools/app/ldap.py:325 lib/pp_admintools/app/set_ldap_password.py:216
 #: lib/pp_admintools/app/set_ldap_password.py:218
 msgid "PASSWORD_FILE"
 msgstr "PASSWORT_DATEI"
 
-#: lib/pp_admintools/app/ldap.py:325
+#: lib/pp_admintools/app/ldap.py:327
 msgid "Use contents of PASSWORD_FILE as the password for simple authentication."
 msgstr "Verwende den Inhalt der PASSWORT_DATEI als das Passort für eine einfache LDAP-Authentifizierung."
 
-#: lib/pp_admintools/app/ldap.py:333 lib/pp_admintools/app/pdns.py:248
+#: lib/pp_admintools/app/ldap.py:335 lib/pp_admintools/app/pdns.py:246
 msgid "INSTANCE"
 msgstr "INSTANZ"
 
-#: lib/pp_admintools/app/ldap.py:336
-msgid ""
-"The LDAP instance (LDAP cluster) from configuration, where to execute this script. If not given,"
-" then the instance {!r} will be used."
+#: lib/pp_admintools/app/ldap.py:338
+msgid "If not given, then the instance {!r} will be used."
+msgstr "Wenn nicht angegeben, dann wird die Instanz {!r} verwendet."
+
+#: lib/pp_admintools/app/ldap.py:341
+msgid "The LDAP instance (LDAP cluster) from configuration, where to execute this script."
 msgstr ""
 "Die LDAP-Instanz (das LDAP-Cluster) aus der Konfiguration, in welcher das Skript ausgeführt "
-"werden soll. Wenn nicht angegeben, wird die Instanz {!r} verwendet."
+"werden soll."
 
-#: lib/pp_admintools/app/ldap.py:339
+#: lib/pp_admintools/app/ldap.py:345
 msgid ""
 "The LDAP instance (LDAP cluster) from configuration, where to execute this script. It is "
 "possible to give here the value {val_all!r}, then all found LDAP instances except {default!r} "
 "are used. It is alo possible to give the value {val_list!r}, then all configured LDAP instances "
-"are shown, and the application is exiting. If not given, then the instance {default!r} will be "
-"used."
+"are shown, and the application is exiting."
 msgstr ""
 "Die LDAP-Instanz (das LDAP-Cluster) aus der Konfiguration, für das das Skript ausgeführt werden "
 "soll.Es ist möglich, hier den Wert {val_all!r} anzugeben, in dem Fall werden alle LDAP-Instanzen"
 " außer {default!r} verwendet. Es ist ebenfalls möglich, den Wert {val_list!r} anzugeben, in "
-"diesem Fall werden alle LDAP-Instanzen ausgegeben, und das Skript beendet sich. Wenn nichts "
-"angegeben wird, wird die Instanz {default!r} verwendet."
+"diesem Fall werden alle LDAP-Instanzen ausgegeben, und das Skript beendet sich."
 
-#: lib/pp_admintools/app/ldap.py:358
+#: lib/pp_admintools/app/ldap.py:371 lib/pp_admintools/app/mirror_ldap.py:89
 msgid "SECONDS"
 msgstr "SEKUNDEN"
 
-#: lib/pp_admintools/app/ldap.py:360
+#: lib/pp_admintools/app/ldap.py:373
 msgid "Using the given timeout in seconds for all LDAP operations. Default: {}"
 msgstr "Der Timeout in Sekunden für alle LDAP-Operationen. Vorgabe: {}."
 
-#: lib/pp_admintools/app/ldap.py:394
+#: lib/pp_admintools/app/ldap.py:407
 msgid "Checking given instances."
 msgstr "Überprüfe die übergebenen Instanzen."
 
-#: lib/pp_admintools/app/ldap.py:398
+#: lib/pp_admintools/app/ldap.py:411
 msgid "Given insts:"
 msgstr "Übergebene Instanzen:"
 
-#: lib/pp_admintools/app/ldap.py:449
+#: lib/pp_admintools/app/ldap.py:462
 msgid "Configured LDAP instances:"
 msgstr "Konfigurierte LDAP-Instanzen:"
 
-#: lib/pp_admintools/app/ldap.py:466
+#: lib/pp_admintools/app/ldap.py:479
 msgid "Verifying given instances ..."
 msgstr "Überprüfene Instanzen …"
 
-#: lib/pp_admintools/app/ldap.py:477
+#: lib/pp_admintools/app/ldap.py:492
 msgid "Used filter:"
 msgstr "Verwendeter Filter:"
 
-#: lib/pp_admintools/app/ldap.py:507 lib/pp_admintools/app/remove_ldap_user.py:181
-msgid "LDAP instance {!r} not found in configuration."
-msgstr "Die LDAP-Instanz {!r} wurde nicht in der Konfiguration gefunden."
+#: lib/pp_admintools/app/ldap.py:526
+msgid "LDAP instance {!r} not found in configuration or is not usable."
+msgstr "Die LDAP-Instanz {!r} wurde nicht in der Konfiguration gefunden oder ist nicht verwendbar."
 
-#: lib/pp_admintools/app/ldap.py:515
+#: lib/pp_admintools/app/ldap.py:536
 msgid "LDAP instances to use:"
 msgstr "Verwendete LDAP-Instanzen:"
 
-#: lib/pp_admintools/app/ldap.py:564
+#: lib/pp_admintools/app/ldap.py:585
 msgid "Preparations ..."
 msgstr "Vorbereitungen …"
 
-#: lib/pp_admintools/app/ldap.py:567
+#: lib/pp_admintools/app/ldap.py:588
 msgid "Open all necessary LDAP connections ..."
 msgstr "Öffne alle notwendigen LDAP-Verbindungen …"
 
-#: lib/pp_admintools/app/ldap.py:581
+#: lib/pp_admintools/app/ldap.py:602
 msgid "Password of user {usr} on LDAP instance {inst}:"
 msgstr "Passwort des Nutzers {usr} der LDAP-Instanz {inst}:"
 
-#: lib/pp_admintools/app/ldap.py:590
+#: lib/pp_admintools/app/ldap.py:611
 msgid "Info about LDAP server {}:"
 msgstr "Informationen zu LDAP-Server {}:"
 
-#: lib/pp_admintools/app/ldap.py:600
+#: lib/pp_admintools/app/ldap.py:621
 msgid "Trying to get LDAP server object for {} ..."
 msgstr "Versuche ein LDAP-Server-Objekt für {} zu bekommen …"
 
-#: lib/pp_admintools/app/ldap.py:616
+#: lib/pp_admintools/app/ldap.py:637
 msgid "Connect options to server {!r}:"
 msgstr "Verbindungs-Optionen zu Server {!r}:"
 
-#: lib/pp_admintools/app/ldap.py:623
+#: lib/pp_admintools/app/ldap.py:644
 msgid "LDAP server {s}: {re}"
 msgstr "LDAP-Server {s}: {re}"
 
-#: lib/pp_admintools/app/ldap.py:637
+#: lib/pp_admintools/app/ldap.py:658
 msgid "Connecting to LDAP server {url} as {dn!r} ..."
 msgstr "Verbinde mit LDAP-Server {url} als {dn!r} …"
 
-#: lib/pp_admintools/app/ldap.py:649
+#: lib/pp_admintools/app/ldap.py:670
 msgid "Finishing ..."
 msgstr "Beende …"
 
-#: lib/pp_admintools/app/ldap.py:658
+#: lib/pp_admintools/app/ldap.py:679
 msgid "Disconnecting from all remaining LDAP instances ..."
 msgstr "Trenne Verbindung zu allen verbleibenden LDAP-Instanzen …"
 
-#: lib/pp_admintools/app/ldap.py:671
+#: lib/pp_admintools/app/ldap.py:692
 msgid "Unbinding from LDAP server {!r} ..."
 msgstr "Trenne Bindung zu LDAP-Server {!r} …"
 
-#: lib/pp_admintools/app/ldap.py:678
+#: lib/pp_admintools/app/ldap.py:699
 msgid "Disconnecting from LDAP server {!r} ..."
 msgstr "Trenne Verbindung zu LDAP-Server {!r} …"
 
-#: lib/pp_admintools/app/ldap.py:687
+#: lib/pp_admintools/app/ldap.py:708
 msgid "Trying to evaluate DN of user {user!r} in LDAP instance {inst} ..."
 msgstr "Versuche den DN des Nutzer {user!r} auf der LDAP-Instanz {inst} zu ermitteln …"
 
-#: lib/pp_admintools/app/ldap.py:692
+#: lib/pp_admintools/app/ldap.py:713
 msgid "Trying to evaluate DN of user {u!r} as a mail address ..."
 msgstr "Versuche den DN des Nutzer {u!r} als Mailadresse zu ermitteln …"
 
-#: lib/pp_admintools/app/ldap.py:699
+#: lib/pp_admintools/app/ldap.py:720
 msgid "Trying to evaluate DN of user {u!r} as a LDAP DN ..."
 msgstr "Versuche den DN des Nutzer {u!r} als LDAP DN zu ermitteln …"
 
-#: lib/pp_admintools/app/ldap.py:706
+#: lib/pp_admintools/app/ldap.py:727
 msgid "Trying to evaluate DN of user {u!r} as a UID (Posix user name) ..."
 msgstr "Versuche den DN des Nutzer {u!r} als UID (POSIX Benutzername) zu ermitteln …"
 
-#: lib/pp_admintools/app/ldap.py:715 lib/pp_admintools/app/remove_ldap_user.py:300
+#: lib/pp_admintools/app/ldap.py:736 lib/pp_admintools/app/remove_ldap_user.py:299
 msgid "Empty user given."
 msgstr "Leere Nutzername übergeben."
 
-#: lib/pp_admintools/app/ldap.py:718
+#: lib/pp_admintools/app/ldap.py:739
 msgid "Trying to evaluate DN of user {u!r} as a CN ({c}) ..."
 msgstr "Versuche den DN des Nutzer {u!r} als CN ({c}) zu ermitteln …"
 
-#: lib/pp_admintools/app/ldap.py:748 lib/pp_admintools/app/ldap.py:801
-#: lib/pp_admintools/app/ldap.py:854 lib/pp_admintools/app/ldap.py:1088
-#: lib/pp_admintools/app/ldap.py:1122 lib/pp_admintools/app/ldap.py:1156
-#: lib/pp_admintools/app/ldap.py:1190
+#: lib/pp_admintools/app/ldap.py:769 lib/pp_admintools/app/ldap.py:822
+#: lib/pp_admintools/app/ldap.py:875 lib/pp_admintools/app/ldap.py:1109
+#: lib/pp_admintools/app/ldap.py:1143 lib/pp_admintools/app/ldap.py:1177
+#: lib/pp_admintools/app/ldap.py:1211
 msgid "Searching in {uri}/{bdn} with filter: {fltr}"
 msgstr "Suche in {uri}/{bdn} mit dem Filter: {fltr}"
 
-#: lib/pp_admintools/app/ldap.py:759
+#: lib/pp_admintools/app/ldap.py:780
 msgid "Result of searching for mail address {m!r}:"
 msgstr "Ergebnis der Suche nach der Mailadresse {m!r}:"
 
-#: lib/pp_admintools/app/ldap.py:763 lib/pp_admintools/app/ldap.py:816
-#: lib/pp_admintools/app/ldap.py:869 lib/pp_admintools/app/ldap.py:957
-#: lib/pp_admintools/app/ldap.py:1100 lib/pp_admintools/app/ldap.py:1134
-#: lib/pp_admintools/app/ldap.py:1168 lib/pp_admintools/app/ldap.py:1202
+#: lib/pp_admintools/app/ldap.py:784 lib/pp_admintools/app/ldap.py:837
+#: lib/pp_admintools/app/ldap.py:890 lib/pp_admintools/app/ldap.py:978
+#: lib/pp_admintools/app/ldap.py:1121 lib/pp_admintools/app/ldap.py:1155
+#: lib/pp_admintools/app/ldap.py:1189 lib/pp_admintools/app/ldap.py:1223
 msgid "Got a response entry:"
 msgstr "Erhaltener Antwort-Eintrag:"
 
-#: lib/pp_admintools/app/ldap.py:770
+#: lib/pp_admintools/app/ldap.py:791
 msgid "User with mail address {m!r} not found in {uri}/{bdn}."
 msgstr "Ein Nutzer mit der Mailadresse {m!r} wurde nicht in {uri}/{bdn} gefunden."
 
-#: lib/pp_admintools/app/ldap.py:812
+#: lib/pp_admintools/app/ldap.py:833
 msgid "Result of searching for uid {u!r}:"
 msgstr "Ergebnis der Suche nach UID {u!r}:"
 
-#: lib/pp_admintools/app/ldap.py:823
+#: lib/pp_admintools/app/ldap.py:844
 msgid "User with uid {u!r} not found in {uri}/{bdn}."
 msgstr "Ein Nutzer mit der UID {u!r} wurde nicht in {uri}/{bdn} gefunden."
 
-#: lib/pp_admintools/app/ldap.py:865
+#: lib/pp_admintools/app/ldap.py:886
 msgid "Result of searching for CN {cn!r}:"
 msgstr "Ergebnis der Suche nach CN {cn!r}:"
 
-#: lib/pp_admintools/app/ldap.py:876
+#: lib/pp_admintools/app/ldap.py:897
 msgid "User with cn {cn!r} not found in {uri}/{bdn}."
 msgstr "Ein Nutzer mit dem CN {cn!r} wurde nicht in {uri}/{bdn} gefunden."
 
-#: lib/pp_admintools/app/ldap.py:893 lib/pp_admintools/app/set_ldap_password.py:504
+#: lib/pp_admintools/app/ldap.py:914 lib/pp_admintools/app/set_ldap_password.py:508
 msgid "User with DN {dn!r} not found in {uri}."
 msgstr "Ein Nutzer mit dem DN {dn!r} wurde nicht in {uri} gefunden."
 
-#: lib/pp_admintools/app/ldap.py:911
+#: lib/pp_admintools/app/ldap.py:932
 msgid "ObjectClasses of {dn!r}:"
 msgstr "ObjectClasses von {dn!r}:"
 
-#: lib/pp_admintools/app/ldap.py:921
+#: lib/pp_admintools/app/ldap.py:942
 msgid "Entry {dn!r} in {uri} seems not to be an account."
 msgstr "Der Eintrag {dn!r} in {uri} scheint kein Nutzerkonto zu sein."
 
-#: lib/pp_admintools/app/ldap.py:943
+#: lib/pp_admintools/app/ldap.py:964
 msgid "Searching DN {dn!r} in {uri}."
 msgstr "Suche DN {dn!r} in {uri}."
 
-#: lib/pp_admintools/app/ldap.py:953
+#: lib/pp_admintools/app/ldap.py:974
 msgid "Result of searching for DN {dn!r}:"
 msgstr "Ergebnis der Suche nach dem DN {dn!r}:"
 
-#: lib/pp_admintools/app/ldap.py:961
+#: lib/pp_admintools/app/ldap.py:982
 msgid "Entry with DN {dn!r} not found in {uri}."
 msgstr "Ein Eintrag bit dem DN {dn!r} wurde nicht in {uri} gefunden."
 
-#: lib/pp_admintools/app/ldap.py:1002
+#: lib/pp_admintools/app/ldap.py:1023
 msgid "Applying changes on {uri} to DN {dn!r}:"
 msgstr "Wende Änderungen in {uri} an DN {dn!r} an:"
 
-#: lib/pp_admintools/app/ldap.py:1007
+#: lib/pp_admintools/app/ldap.py:1028
 msgid "Simulation mode - changes are not applied."
 msgstr "Simulationsmodus - hier wird jetzt nichts geändert."
 
-#: lib/pp_admintools/app/ldap.py:1013
+#: lib/pp_admintools/app/ldap.py:1034
 msgid "Modification NOT successfull - {c}: {e}"
 msgstr "Die Änderung war NICHT erfolgreich - {c}: {e}"
 
-#: lib/pp_admintools/app/ldap.py:1014 lib/pp_admintools/app/remove_ldap_user.py:427
-#: lib/pp_admintools/app/remove_ldap_user.py:454 lib/pp_admintools/app/remove_ldap_user.py:481
-#: lib/pp_admintools/app/remove_ldap_user.py:512 lib/pp_admintools/app/remove_ldap_user.py:543
+#: lib/pp_admintools/app/ldap.py:1035 lib/pp_admintools/app/remove_ldap_user.py:426
+#: lib/pp_admintools/app/remove_ldap_user.py:453 lib/pp_admintools/app/remove_ldap_user.py:480
+#: lib/pp_admintools/app/remove_ldap_user.py:511 lib/pp_admintools/app/remove_ldap_user.py:542
 #: lib/pp_admintools/app/set_ldap_password.py:612
 msgid "Changes:"
 msgstr "Änderungen:"
 
-#: lib/pp_admintools/app/ldap.py:1026
+#: lib/pp_admintools/app/ldap.py:1047
 msgid "Modification status: {!r}."
 msgstr "Änderungsstatus: {!r}."
 
-#: lib/pp_admintools/app/ldap.py:1028
+#: lib/pp_admintools/app/ldap.py:1049
 msgid "Result of modifying:"
 msgstr "Ergebnis der Änderung:"
 
-#: lib/pp_admintools/app/ldap.py:1031
+#: lib/pp_admintools/app/ldap.py:1052
 msgid "Modification NOT successful: {desc} - {msg}"
 msgstr "Die Änderung war NICHT erfolgreich - {desc}: {msg}"
 
-#: lib/pp_admintools/app/ldap.py:1035
+#: lib/pp_admintools/app/ldap.py:1056
 msgid "Modification successful."
 msgstr "Die Änderung war erfolgreich."
 
-#: lib/pp_admintools/app/ldap.py:1045
+#: lib/pp_admintools/app/ldap.py:1066
 msgid "Deleting LDAP entry {dn!r} on {uri} ..."
 msgstr "Lösche LDAP-Eintrag {dn!r} in {uri} …"
 
-#: lib/pp_admintools/app/ldap.py:1050
+#: lib/pp_admintools/app/ldap.py:1071
 msgid "Simulation mode - deletion will not be executed."
 msgstr "Simulationsmodus - hier wird jetzt nichts gelöscht."
 
-#: lib/pp_admintools/app/ldap.py:1056
+#: lib/pp_admintools/app/ldap.py:1077
 msgid "Deletion NOT successfull - {c}: {e}"
 msgstr "Die Löschung war NICHT erfolgreich - {c}: {e}"
 
-#: lib/pp_admintools/app/ldap.py:1060
+#: lib/pp_admintools/app/ldap.py:1081
 msgid "Deletion status: {!r}."
 msgstr "Löschstatus: {!r}"
 
-#: lib/pp_admintools/app/ldap.py:1062
+#: lib/pp_admintools/app/ldap.py:1083
 msgid "Result of deletion:"
 msgstr "Ergebnis der Löschung:"
 
-#: lib/pp_admintools/app/ldap.py:1065
+#: lib/pp_admintools/app/ldap.py:1086
 msgid "Deletion NOT successful: {desc} - {msg}"
 msgstr "Die Löschung war NICHT erfolgreich - {desc}: {msg}"
 
-#: lib/pp_admintools/app/ldap.py:1069
+#: lib/pp_admintools/app/ldap.py:1090
 msgid "Deletion successful."
 msgstr "Die Löschung war erfolgreich."
 
-#: lib/pp_admintools/app/ldap.py:1216
+#: lib/pp_admintools/app/ldap.py:1237
 msgid "Reading password file {!r} ..."
 msgstr "Lese Passwortdatei {!r} …"
 
@@ -741,103 +741,144 @@ msgstr "Die zu sendende Mail:"
 msgid "Did not found sendmail executable."
 msgstr "Kein ausführbares Programm 'sendmail' gefunden."
 
-#: lib/pp_admintools/app/pdns.py:100 lib/pp_admintools/app/pdns.py:184
+#: lib/pp_admintools/app/mirror_ldap.py:70
+msgid ""
+"Mirror the content of a complete LDAP instance (server or cluster) to another instance. This "
+"will be done first by clearing the target instance, then copying structural entries from the "
+"source to the target instance and then copying all other entries. During this some "
+"transformations are done, like substituting the content of some entry attributes by another "
+"values."
+msgstr ""
+"Spiegelt den kompletten Inhalt einer LDAP-Instanz (Server oder Cluster) in eine andere Instanz. "
+"Das wird getan, indem zuerst die Zileinstanz komplett geleert wird, dann alle strukturellen "
+"Einträge von der Quell- in die Zielinstanz kopiert werden, und danach alle anderen. Während "
+"dessen werden einige Transformationen ausgeführt, wie die Erssetzung der Inhalte bestimmter "
+"Attribute durch andere Werte."
+
+#: lib/pp_admintools/app/mirror_ldap.py:86
+msgid "Miroring options"
+msgstr "Spiegelungs--Optionen"
+
+#: lib/pp_admintools/app/mirror_ldap.py:91
+msgid ""
+"Number of seconds to wait after each write operation. Given as a float value, and if set to "
+"zero, there is no waiting after a write. (default: {:.1f})"
+msgstr ""
+"Anzahl der Sekunden, die nach jeder Schreiboperation gewartet wertden. Wird als Float-Wert "
+"angegeben, und wenn sie auf Null gesetzt werden, erfolgt kein Warten nach dem Schreiben. "
+"(Vorgabe: {:.1f})"
+
+#: lib/pp_admintools/app/mirror_ldap.py:98
+msgid "NUMBER"
+msgstr "ANZAHL"
+
+#: lib/pp_admintools/app/mirror_ldap.py:100
+msgid "Limiting the mirroring to the first NUMBER entries. This option is valid only in simulation mode."
+msgstr ""
+"Begrenzung der Spiegelung auf die erste ANZAHL Einträge. Diese Option ist nur im Simulations-"
+"Modus gültig."
+
+#: lib/pp_admintools/app/mirror_ldap.py:107
+msgid "Mirror only structural entries (entries with childs)."
+msgstr "Nur strukturelle Einträge (Einträge mit Child-Einträgen) spiegeln."
+
+#: lib/pp_admintools/app/pdns.py:99 lib/pp_admintools/app/pdns.py:183
 msgid "Configuration not available."
 msgstr "Die Konfiguration ist nicht verfügbar."
 
-#: lib/pp_admintools/app/pdns.py:114
+#: lib/pp_admintools/app/pdns.py:113
 msgid "Invalid API key {!r} given."
 msgstr "Ungültiger API-Schlüssel {!r} angegeben."
 
-#: lib/pp_admintools/app/pdns.py:126
+#: lib/pp_admintools/app/pdns.py:125
 msgid "Invalid API host {!r} given."
 msgstr "Ungültiger API-Host {!r} angegeben."
 
-#: lib/pp_admintools/app/pdns.py:139
+#: lib/pp_admintools/app/pdns.py:138
 msgid "Invalid API port {!r} given."
 msgstr "Ungültiger API-Port {!r} angegeben."
 
-#: lib/pp_admintools/app/pdns.py:151
+#: lib/pp_admintools/app/pdns.py:150
 msgid "Invalid API server name {!r} given."
 msgstr "Ungültiger API-Servername {!r} angegeben."
 
-#: lib/pp_admintools/app/pdns.py:169 lib/pp_admintools/app/pdns.py:172
+#: lib/pp_admintools/app/pdns.py:168 lib/pp_admintools/app/pdns.py:171
 msgid "Invalid instance {!r} given."
 msgstr "Ungültige Instanz {!r} angegeben."
 
-#: lib/pp_admintools/app/pdns.py:180
+#: lib/pp_admintools/app/pdns.py:179
 msgid "Evaluating instance {!r} ..."
 msgstr "Ermittle Instanz {!r} …"
 
-#: lib/pp_admintools/app/pdns.py:188
+#: lib/pp_admintools/app/pdns.py:187
 msgid "PDNS instance {!r} is not configured."
 msgstr "Die PDNS Instanz {!r} ist nicht konfiguriert."
 
-#: lib/pp_admintools/app/pdns.py:239
+#: lib/pp_admintools/app/pdns.py:238
 msgid "PowerDNS API options"
 msgstr "PowerDNS API-Optionen"
 
-#: lib/pp_admintools/app/pdns.py:249
+#: lib/pp_admintools/app/pdns.py:247
 msgid "Select, which PowerDNS instance to use. Valid values: {v}, default: {d!r}."
 msgstr "Auswahl der zu verwendenden PowerDNS-Instanz. Gültige Werte: {v}, Vorgaben: {d!r}."
 
-#: lib/pp_admintools/app/pdns.py:257 lib/pp_admintools/app/pdns.py:263
-#: lib/pp_admintools/app/pdns.py:269
+#: lib/pp_admintools/app/pdns.py:255 lib/pp_admintools/app/pdns.py:261
+#: lib/pp_admintools/app/pdns.py:267
 msgid "Using the {!r} PowerDNS instance."
 msgstr "Verwenden der {!r}-PowerDNS-Instanz."
 
-#: lib/pp_admintools/app/pdns.py:277
+#: lib/pp_admintools/app/pdns.py:275
 msgid "Which port to connect to PowerDNS API, default: {}."
 msgstr "Welcher Port soll verwendet werden, um sich mit der PowerDNS-API zu verbinden, Vorgabe: {}."
 
-#: lib/pp_admintools/app/pdns.py:302
+#: lib/pp_admintools/app/pdns.py:300
 msgid "No path given for{d} [{s}]/{k} in configuration."
 msgstr "Kein Pfad für{d} [{s}]/{k} in der Konfiguration angegegben."
 
-#: lib/pp_admintools/app/pdns.py:309
+#: lib/pp_admintools/app/pdns.py:307
 msgid "Path {p!r} for{d} [{s}]/{k} in configuration must be an absolute path."
 msgstr "Der Pfad {p!r} für{d} [{s}]/{k} in der Konfiguration muss ein absoluter sein."
 
-#: lib/pp_admintools/app/pdns.py:332 lib/pp_admintools/app/pdns.py:368
-#: lib/pp_admintools/app/pdns.py:395
+#: lib/pp_admintools/app/pdns.py:330 lib/pp_admintools/app/pdns.py:366
+#: lib/pp_admintools/app/pdns.py:393
 msgid "Executing {} ..."
 msgstr "Ausführung von {} …"
 
-#: lib/pp_admintools/app/pdns.py:370
+#: lib/pp_admintools/app/pdns.py:368
 msgid "Setting Loglevel of the requests module to {}."
 msgstr "Setze das Loglevel des Requests-Moduls auf {}."
 
-#: lib/pp_admintools/app/pdns.py:384
+#: lib/pp_admintools/app/pdns.py:382
 msgid "Executing nothing ..."
 msgstr "Führe nicht aus …"
 
-#: lib/pp_admintools/app/pdns.py:404 lib/pp_admintools/app/pdns.py:426
-#: lib/pp_admintools/app/pdns.py:437 lib/pp_admintools/app/pdns.py:447
+#: lib/pp_admintools/app/pdns.py:402 lib/pp_admintools/app/pdns.py:424
+#: lib/pp_admintools/app/pdns.py:435 lib/pp_admintools/app/pdns.py:445
 msgid "The PDNS server object does not exists."
 msgstr "Das PDNS-Server-Objekt existiert nicht."
 
-#: lib/pp_admintools/app/pdns.py:406 lib/pp_admintools/app/pdns.py:428
-#: lib/pp_admintools/app/pdns.py:439 lib/pp_admintools/app/pdns.py:449
+#: lib/pp_admintools/app/pdns.py:404 lib/pp_admintools/app/pdns.py:426
+#: lib/pp_admintools/app/pdns.py:437 lib/pp_admintools/app/pdns.py:447
 msgid "The PDNS server object is not initialized."
 msgstr "Das PDNS-Server-Objekt ist nicht initialisiert."
 
-#: lib/pp_admintools/app/pdns.py:457
+#: lib/pp_admintools/app/pdns.py:455
 msgid "Trying to get complete information about zone {!r} ..."
 msgstr "Versuch die kompletten Informationen über die Zone {!r} zu bekommen …"
 
-#: lib/pp_admintools/app/pdns.py:463
+#: lib/pp_admintools/app/pdns.py:461
 msgid "The given zone {} was not found."
 msgstr "Die angegebene Zone {} wurde nicht gefunden."
 
-#: lib/pp_admintools/app/pdns.py:466
+#: lib/pp_admintools/app/pdns.py:464
 msgid "Got a response:"
 msgstr "Erhaltene Antwort:"
 
-#: lib/pp_admintools/app/pdns.py:471
+#: lib/pp_admintools/app/pdns.py:469
 msgid "Zone object:"
 msgstr "Zonen-Objekt:"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:70
+#: lib/pp_admintools/app/remove_ldap_user.py:69
 msgid ""
 "Disables or removes the given users from LDAP. If disabling, then the user will not be really "
 "removed, but disabled by locking the password, setting all status flags to {inact!r}, assigning "
@@ -849,32 +890,32 @@ msgstr ""
 "auf {inact!r}, Zuweisen von {shell!r} als Login-Shell und Löschen des Nutzers aus allen Gruppen "
 "deaktiviert. Beim Löschen wird der Nutzer tatsächlich im LDAP gelöscht."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:115
+#: lib/pp_admintools/app/remove_ldap_user.py:114
 msgid "Removing options"
 msgstr "Lösch-Optionen"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:118
+#: lib/pp_admintools/app/remove_ldap_user.py:117
 msgid "This is the default."
 msgstr "Dieses ist die Vorgabe."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:119
+#: lib/pp_admintools/app/remove_ldap_user.py:118
 msgid "This is mutually exclusive to {!r}."
 msgstr "Das schließt sich mit {!r} gegenseitig aus."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:121
+#: lib/pp_admintools/app/remove_ldap_user.py:120
 msgid "Deactivating the user instead of removing it."
 msgstr "Deaktivieren der Nutzer anstatt Löschung."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:128
+#: lib/pp_admintools/app/remove_ldap_user.py:127
 msgid "Removing the user from LDAP."
 msgstr "Löschen der übergebenen Nutzer im LDAP."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:136 lib/pp_admintools/app/set_ldap_password.py:269
-#: lib/pp_admintools/app/set_ldap_password.py:272
+#: lib/pp_admintools/app/remove_ldap_user.py:135 lib/pp_admintools/app/set_ldap_password.py:273
+#: lib/pp_admintools/app/set_ldap_password.py:276
 msgid "USER"
 msgstr "NUTZER"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:137
+#: lib/pp_admintools/app/remove_ldap_user.py:136
 msgid ""
 "The user, which should be deactivated or removed. They may be given by their Uid (the "
 "alphanumeric POSIX name), their mail address or their LDAP DN (be aware, that this may be "
@@ -885,183 +926,187 @@ msgstr ""
 "angegeben werden. Bitte beachten, dass sich letzterer bei den verschiedenen LDAP-Instanzen "
 "unterscheiden kann."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:161
+#: lib/pp_admintools/app/remove_ldap_user.py:160
 msgid "No users to remove given."
 msgstr "Kein Nutzername zum Löschen angegeben."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:174
+#: lib/pp_admintools/app/remove_ldap_user.py:173
 msgid "Checking given instances for admin and read/write access."
 msgstr "Überprüfe die gegebenen Instanzen nach Admin- und Schreib-/Lesezugriffsrechten."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:189
+#: lib/pp_admintools/app/remove_ldap_user.py:180
+msgid "LDAP instance {!r} not found in configuration."
+msgstr "Die LDAP-Instanz {!r} wurde nicht in der Konfiguration gefunden."
+
+#: lib/pp_admintools/app/remove_ldap_user.py:188
 msgid "LDAP instance {!r} has only readonly access."
 msgstr "Die LDAP-Instanz {!r} besitzt nur Lesezugriffsrechte."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:194
+#: lib/pp_admintools/app/remove_ldap_user.py:193
 msgid "No admin access to LDAP instance {!r}."
 msgstr "Keine Admin-Zugriffsrechte bei LDAP-Instanz {!r}."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:211
+#: lib/pp_admintools/app/remove_ldap_user.py:210
 msgid "All given users were not found in any LDAP instance."
 msgstr "Alle übergebenen Nutzer wurden in keiner der LDAP-Instanzen gefunden."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:216
+#: lib/pp_admintools/app/remove_ldap_user.py:215
 msgid "Evaluated DNs to remove:"
 msgstr "Zum Löschen ermittelte DNs:"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:225
+#: lib/pp_admintools/app/remove_ldap_user.py:224
 msgid "Start disabling user entries in:"
 msgstr "Beginne Deaktivierung der Nutzereinträge in:"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:227
+#: lib/pp_admintools/app/remove_ldap_user.py:226
 msgid "Start removing user entries in:"
 msgstr "Beginne Löschung der Nutzereinträge in:"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:231
+#: lib/pp_admintools/app/remove_ldap_user.py:230
 msgid "Start disabling user entries ..."
 msgstr "Beginne Deaktivierung der Nutzereinträge …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:233
+#: lib/pp_admintools/app/remove_ldap_user.py:232
 msgid "Start removing user entries ..."
 msgstr "Beginne Löschung der Nutzereinträge …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:248
+#: lib/pp_admintools/app/remove_ldap_user.py:247
 msgid "Do you really want to deactivate the following users?"
 msgstr "Möchten Sie die folgenden Nutzer wirklich deaktivieren?"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:250
+#: lib/pp_admintools/app/remove_ldap_user.py:249
 msgid "Do you really want to remove the following users?"
 msgstr "Möchten Sie die folgenden Nutzer wirklich löschen?"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:276
+#: lib/pp_admintools/app/remove_ldap_user.py:275
 msgid "Deactivate [{yes}/{no}]?"
 msgstr "Deaktivieren [{yes}/{no}]?"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:278
+#: lib/pp_admintools/app/remove_ldap_user.py:277
 msgid "Remove [{yes}/{no}]?"
 msgstr "Löschen [{yes}/{no}]?"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:280 lib/pp_admintools/app/set_ldap_password.py:579
+#: lib/pp_admintools/app/remove_ldap_user.py:279 lib/pp_admintools/app/set_ldap_password.py:583
 msgid "yes"
 msgstr "ja"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:285
+#: lib/pp_admintools/app/remove_ldap_user.py:284
 msgid "Abort deactivating by {cls}: {e}"
 msgstr "Abbruch der Deaktivierung durch {cls}: {e}"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:287
+#: lib/pp_admintools/app/remove_ldap_user.py:286
 msgid "Abort removing by {cls}: {e}"
 msgstr "Abbruch des Löschens durch {cls}: {e}"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:296
+#: lib/pp_admintools/app/remove_ldap_user.py:295
 msgid "Evaluating DNs of the user {!r} to remove ..."
 msgstr "Ermitteln der DNs des Nutzers {!r} zum Löschen …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:310 lib/pp_admintools/app/set_ldap_password.py:527
+#: lib/pp_admintools/app/remove_ldap_user.py:309 lib/pp_admintools/app/set_ldap_password.py:531
 msgid "Got DN {dn!r} for user {user!r} in LDAP instance {inst}."
 msgstr "Habe DN {dn!r} für den Nutzer {user!r} in der LDAP-Instanz {inst} ermittelt."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:317 lib/pp_admintools/app/set_ldap_password.py:532
+#: lib/pp_admintools/app/remove_ldap_user.py:316 lib/pp_admintools/app/set_ldap_password.py:536
 msgid "Found {nr} entries for user {u!r} in LDAP instance {i}."
 msgstr "Fand {nr} Einträge für den Nutzer {u!r} in der LDAP-Instanz {i}."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:329 lib/pp_admintools/app/set_ldap_password.py:546
+#: lib/pp_admintools/app/remove_ldap_user.py:328 lib/pp_admintools/app/set_ldap_password.py:550
 msgid "Did not found user {user!r} in LDAP instance {inst}."
 msgstr "Der Nutzer {user!r} wurde nicht in der LDAP-Instanz {inst} gefunden."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:338
+#: lib/pp_admintools/app/remove_ldap_user.py:337
 msgid "Deactivating all given users from {} ..."
 msgstr "Deaktivieren aller übergebenen Nutzer in {} …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:340
+#: lib/pp_admintools/app/remove_ldap_user.py:339
 msgid "Removing all given users from {} ..."
 msgstr "Lösche alle übergebenen Nutzer in {} …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:355
+#: lib/pp_admintools/app/remove_ldap_user.py:354
 msgid "Deactivating user {dn!r} from {inst} ..."
 msgstr "Deaktivieren von Nutzer {dn!r} in {inst} …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:358
+#: lib/pp_admintools/app/remove_ldap_user.py:357
 msgid "Removing user {dn!r} from {inst} ..."
 msgstr "Lösche Nutzer {dn!r} in {inst} …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:364
+#: lib/pp_admintools/app/remove_ldap_user.py:363
 msgid "Attributes of {!r}:"
 msgstr "Attribute von {!r}:"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:385
+#: lib/pp_admintools/app/remove_ldap_user.py:384
 msgid "{c} on removing user {dn!r}: {e}"
 msgstr "{c} beim Löschen des Nutzers {dn!r}: {e}"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:391
+#: lib/pp_admintools/app/remove_ldap_user.py:390
 msgid "User {dn!r} successful deactivated on {inst}."
 msgstr "Der Nutzer {dn!r} wurde erfolgreich auf {inst} deaktiviert."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:394
+#: lib/pp_admintools/app/remove_ldap_user.py:393
 msgid "User {dn!r} successful removed from {inst}."
 msgstr "Der Nutzer {dn!r} wurde erfolgreich von {inst} gelöscht."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:420
+#: lib/pp_admintools/app/remove_ldap_user.py:419
 msgid "Updating user info for {dn!r} on {inst} ..."
 msgstr "Aktualisiere die Nutzerinformationenn für {dn!r} in {inst} …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:425 lib/pp_admintools/app/set_ldap_password.py:610
+#: lib/pp_admintools/app/remove_ldap_user.py:424 lib/pp_admintools/app/set_ldap_password.py:610
 msgid "{c} on deactivating user {dn!r}: {e}"
 msgstr "{c} beim Deaktivieren des Nutzers {dn!r}: {e}"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:441
+#: lib/pp_admintools/app/remove_ldap_user.py:440
 msgid "Did not found any group memberships of {dn!r} in {inst}."
 msgstr "Keine Gruppenmitgliedschaften von {dn!r} in {inst} gefunden."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:447 lib/pp_admintools/app/remove_ldap_user.py:474
-#: lib/pp_admintools/app/remove_ldap_user.py:505 lib/pp_admintools/app/remove_ldap_user.py:536
+#: lib/pp_admintools/app/remove_ldap_user.py:446 lib/pp_admintools/app/remove_ldap_user.py:473
+#: lib/pp_admintools/app/remove_ldap_user.py:504 lib/pp_admintools/app/remove_ldap_user.py:535
 msgid "Removing user {u!r} from group {g!r} ..."
 msgstr "Lösche Nutzer {u!r} aus der Gruppe {g!r} …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:452 lib/pp_admintools/app/remove_ldap_user.py:479
-#: lib/pp_admintools/app/remove_ldap_user.py:510 lib/pp_admintools/app/remove_ldap_user.py:541
+#: lib/pp_admintools/app/remove_ldap_user.py:451 lib/pp_admintools/app/remove_ldap_user.py:478
+#: lib/pp_admintools/app/remove_ldap_user.py:509 lib/pp_admintools/app/remove_ldap_user.py:540
 msgid "{c} on removing user {dn!r} from group {g!r}: {e}"
 msgstr "{c} beim Löschen des Nutzers {dn!r} von der Gruppe {g!r}: {e}"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:468
+#: lib/pp_admintools/app/remove_ldap_user.py:467
 msgid "Did not found any unique group memberships of {dn!r} in {inst}."
 msgstr "Keine eindeutigen Gruppenmitgliedschaften von {dn!r} in {inst} gefunden."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:492
+#: lib/pp_admintools/app/remove_ldap_user.py:491
 msgid "Deleting user {uid!r} from all POSIX groups in {inst}."
 msgstr "Lösche Nutzer {uid!r} aus allen POSIX-Gruppen in {inst} …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:499
+#: lib/pp_admintools/app/remove_ldap_user.py:498
 msgid "Did not found any POSIX group memberships of {uid!r} in {inst}."
 msgstr "Keine POSIX-Gruppenmitgliedschaften von {uid!r} in {inst} gefunden."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:523
+#: lib/pp_admintools/app/remove_ldap_user.py:522
 msgid "Deleting user {uid!r} from all sudo groups in {inst}."
 msgstr "Lösche Nutzer {uid!r} aus allen sudo-Gruppen in {inst}."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:530
+#: lib/pp_admintools/app/remove_ldap_user.py:529
 msgid "Did not found any sudo group memberships of {uid!r} in {inst}."
 msgstr "Keine sudo-Gruppenmitgliedschaften von {uid!r} in {inst} gefunden."
 
-#: lib/pp_admintools/app/set_ldap_password.py:100
+#: lib/pp_admintools/app/set_ldap_password.py:104
 msgid "The ancient and notorious 3 DES crypt method."
 msgstr "Die antike und berüchtigte 3 DES Verschlüsselungsmethode."
 
-#: lib/pp_admintools/app/set_ldap_password.py:101 lib/pp_admintools/app/set_ldap_password.py:104
+#: lib/pp_admintools/app/set_ldap_password.py:105 lib/pp_admintools/app/set_ldap_password.py:108
 msgid "Pure {} hashing method."
 msgstr "Reine {}-hashing Methode."
 
-#: lib/pp_admintools/app/set_ldap_password.py:102 lib/pp_admintools/app/set_ldap_password.py:105
-#: lib/pp_admintools/app/set_ldap_password.py:107 lib/pp_admintools/app/set_ldap_password.py:109
+#: lib/pp_admintools/app/set_ldap_password.py:106 lib/pp_admintools/app/set_ldap_password.py:109
+#: lib/pp_admintools/app/set_ldap_password.py:111 lib/pp_admintools/app/set_ldap_password.py:113
 msgid "A {} based hashing algorithm."
 msgstr "Ein {}-basierter Hashing-Algorithmus"
 
-#: lib/pp_admintools/app/set_ldap_password.py:103 lib/pp_admintools/app/set_ldap_password.py:106
-#: lib/pp_admintools/app/set_ldap_password.py:108 lib/pp_admintools/app/set_ldap_password.py:110
+#: lib/pp_admintools/app/set_ldap_password.py:107 lib/pp_admintools/app/set_ldap_password.py:110
+#: lib/pp_admintools/app/set_ldap_password.py:112 lib/pp_admintools/app/set_ldap_password.py:114
 msgid "Salted {} hashing method."
 msgstr "Gesalzene {}-hashing Methode."
 
-#: lib/pp_admintools/app/set_ldap_password.py:111
+#: lib/pp_admintools/app/set_ldap_password.py:115
 msgid "A hashing method derived from {} with additional computing rounds."
 msgstr "Eine von {} abgeleitete Hashing-Methode mit zusätzlichen Berechnungsrunden."
 
@@ -1097,11 +1142,7 @@ msgstr "Verwende {} als das neue Nutzerpasswort. Wenn nicht angegeben, wird dana
 msgid "Do not check the quality of the new password with the {} library."
 msgstr "Keine Überprüfung der Qualität des neuen Passwortes mit der {}-Bibliothek."
 
-#: lib/pp_admintools/app/set_ldap_password.py:246
-msgid "SCHEMA"
-msgstr "SCHEMA"
-
-#: lib/pp_admintools/app/set_ldap_password.py:247
+#: lib/pp_admintools/app/set_ldap_password.py:245
 msgid ""
 "The schema (hashing method) to use to hash the new password. It is possible to give here the "
 "value {val_list!r}, then all possible schemes are shown and exit. Default: {default!r}."
@@ -1110,13 +1151,17 @@ msgstr ""
 "möglich, hier den Wert {val_list!r} anzugeben, dann werden alle verfügbaren Schemen aufgelistet."
 " Vorgabe: {default!r}."
 
-#: lib/pp_admintools/app/set_ldap_password.py:251
+#: lib/pp_admintools/app/set_ldap_password.py:250
 msgid "If you are not using an admin account, then the password will hashed only by the default schema."
 msgstr ""
 "Wenn kein Admin-Account verwendet wird, dann wird das Passwort ausschließlich mit dem Vorgabe-"
 "Schema gehasht."
 
 #: lib/pp_admintools/app/set_ldap_password.py:255
+msgid "SCHEMA"
+msgstr "SCHEMA"
+
+#: lib/pp_admintools/app/set_ldap_password.py:259
 msgid ""
 "The user, which password in the given LDAP instance should be changed. It may be given by its "
 "Uid (the alphanumeric POSIX name), its mail address or its LDAP DN."
@@ -1125,11 +1170,11 @@ msgstr ""
 "seine Uid (der alphanumerische POSIX-Nutzername), als seine Mailadresse oder als seine LDAP-DN "
 "angegeben werden."
 
-#: lib/pp_admintools/app/set_ldap_password.py:260
+#: lib/pp_admintools/app/set_ldap_password.py:264
 msgid "If not given, then your current user name {!r} will be used."
 msgstr "Wenn nicht angegeben, dann wird der aktuelle Nutzername {!r} verwendet."
 
-#: lib/pp_admintools/app/set_ldap_password.py:263
+#: lib/pp_admintools/app/set_ldap_password.py:267
 msgid ""
 "If you are using a readonly LDAP instance or an instance w/o admin access, then you must provide"
 " somehow the current password of the user to change."
@@ -1137,87 +1182,87 @@ msgstr ""
 "Wenn eine LDAP-Instanz verwendet wird, die nur Leserechte oder keinen Admin-Zugriff hat, dann "
 "muss irgendwie das neue Passwort des Nutzer zum Ändern angegeben werden."
 
-#: lib/pp_admintools/app/set_ldap_password.py:316
+#: lib/pp_admintools/app/set_ldap_password.py:320
 msgid "Could not detect your current login name."
 msgstr "Konnte den aktuellen Anmeldenamen nicht ermitteln."
 
-#: lib/pp_admintools/app/set_ldap_password.py:321
+#: lib/pp_admintools/app/set_ldap_password.py:325
 msgid "The user {!r} will never be managed by LDAP."
 msgstr "Der Nutzer {!r} wird niemals nimmer nicht von LDAP gemanagt."
 
-#: lib/pp_admintools/app/set_ldap_password.py:357
+#: lib/pp_admintools/app/set_ldap_password.py:361
 msgid "Usable Hashing schemes:"
 msgstr "Verfügbare Hashing-Schemen:"
 
-#: lib/pp_admintools/app/set_ldap_password.py:366
+#: lib/pp_admintools/app/set_ldap_password.py:370
 msgid "This schema cannot be used for authentication on a current freeradius server."
 msgstr ""
 "Dieses Schema kann nicht zur Authentifizierung an einem aktuellen Freeradius-Server verwendet "
 "werden."
 
-#: lib/pp_admintools/app/set_ldap_password.py:370
+#: lib/pp_admintools/app/set_ldap_password.py:374
 msgid "This is the default schema."
 msgstr "Das ist das Vorgabe-Schema."
 
-#: lib/pp_admintools/app/set_ldap_password.py:385
+#: lib/pp_admintools/app/set_ldap_password.py:389
 msgid "Using LDAP instance {inst!r} - {url}."
 msgstr "Verwende LDAP-Instanz {inst!r} - {url}."
 
-#: lib/pp_admintools/app/set_ldap_password.py:389
+#: lib/pp_admintools/app/set_ldap_password.py:393
 msgid "Current password of user {!r}:"
 msgstr "Aktuelles Passwort des Nutzers {!r}:"
 
-#: lib/pp_admintools/app/set_ldap_password.py:390 lib/pp_admintools/app/set_ldap_password.py:410
+#: lib/pp_admintools/app/set_ldap_password.py:394 lib/pp_admintools/app/set_ldap_password.py:414
 msgid "Repeat password:"
 msgstr "Passwort-Wiederholung:"
 
-#: lib/pp_admintools/app/set_ldap_password.py:403
+#: lib/pp_admintools/app/set_ldap_password.py:407
 msgid "Non admin users must use the default schema {!r} for hashing their password."
 msgstr "Nicht-Admin-Nutzer müssen das Vorgabeschema {!r} für das Hashen des Passwortes verwenden."
 
-#: lib/pp_admintools/app/set_ldap_password.py:409
+#: lib/pp_admintools/app/set_ldap_password.py:413
 msgid "New password of user {!r}:"
 msgstr "Neues Passwort für Nutzer {!r}:"
 
-#: lib/pp_admintools/app/set_ldap_password.py:416
+#: lib/pp_admintools/app/set_ldap_password.py:420
 msgid "Checking the quality of the new password was disabled."
 msgstr "Die Überprüfung der Qualität des neuen Passwortes wurde deaktiviert."
 
-#: lib/pp_admintools/app/set_ldap_password.py:419
+#: lib/pp_admintools/app/set_ldap_password.py:423
 msgid "Testing quality of new password ..."
 msgstr "Teste Qualität des neuen Passwortes …"
 
-#: lib/pp_admintools/app/set_ldap_password.py:423
+#: lib/pp_admintools/app/set_ldap_password.py:427
 msgid "Quality of the new password is not sufficient:"
 msgstr "Die Qualität des neuen Passwortes ist nicht ausreichend:"
 
-#: lib/pp_admintools/app/set_ldap_password.py:428
+#: lib/pp_admintools/app/set_ldap_password.py:432
 msgid "Cannot testing the quality of the new password, because the Python module {!r} is not installed."
 msgstr ""
 "Kann die Qualität des neuen Passwortes nicht überprüfen, da das Pythod-Modul {!r} nicht "
 "installiert ist."
 
-#: lib/pp_admintools/app/set_ldap_password.py:455
+#: lib/pp_admintools/app/set_ldap_password.py:459
 msgid "Unbinding user connection from LDAP server {} ..."
 msgstr "Trenne Verbindung des Nutzers zu LDAP-Server {} …"
 
-#: lib/pp_admintools/app/set_ldap_password.py:466
+#: lib/pp_admintools/app/set_ldap_password.py:470
 msgid "Testing connect to LDAP-Server {url} with current user {dn!r} and password ..."
 msgstr "Teste eine Anmeldung am LDAP-Server {url} als aktueller Nutzer {dn!r} mit Passwort …"
 
-#: lib/pp_admintools/app/set_ldap_password.py:478
+#: lib/pp_admintools/app/set_ldap_password.py:482
 msgid "Successful connected as {dn!r} to {url}."
 msgstr "Erfolgreich als {dn!r} an {url} angemeldet."
 
-#: lib/pp_admintools/app/set_ldap_password.py:484
+#: lib/pp_admintools/app/set_ldap_password.py:488
 msgid "Could not connect to {url} as {dn!r}: {e}"
 msgstr "Nutzer {dn!r} konnte nicht an {url} angemeldet werden: {e}"
 
-#: lib/pp_admintools/app/set_ldap_password.py:495
+#: lib/pp_admintools/app/set_ldap_password.py:499
 msgid "Trying to get current password hash of user {!r} ..."
 msgstr "Versuche den aktuellen Passwort-Hash des Nutzers {!r} zu holen …"
 
-#: lib/pp_admintools/app/set_ldap_password.py:534
+#: lib/pp_admintools/app/set_ldap_password.py:538
 msgid ""
 "Please use another username, or use the correct DN from the following list as a parameter for "
 "this script instead of the username:"
@@ -1225,35 +1270,35 @@ msgstr ""
 "Bitte einen anderen Nutzernamen oder den richtigen DN aus der folgenden Liste als Parameter für "
 "dieses Skript als Nutzername angeben:"
 
-#: lib/pp_admintools/app/set_ldap_password.py:551
+#: lib/pp_admintools/app/set_ldap_password.py:555
 msgid "Changing the password of user {dn!r} in LDAP instance {inst}."
 msgstr "Ändern des Passwortes des Nutzers {dn!r} in der LDAP-Instanz {inst}."
 
-#: lib/pp_admintools/app/set_ldap_password.py:558
+#: lib/pp_admintools/app/set_ldap_password.py:562
 msgid "Setting password of {dn!r} with hashing schema {schema!r}."
 msgstr "Setze das Passwort von {dn!r} mit dem Hashing-Schema {schema!r}."
 
-#: lib/pp_admintools/app/set_ldap_password.py:560
+#: lib/pp_admintools/app/set_ldap_password.py:564
 msgid "Setting password of '{dn}' with hashing schema '{schema}' ..."
 msgstr "Setze das Passwort von '{dn}' mit dem Hashing-Schema '{schema}'."
 
-#: lib/pp_admintools/app/set_ldap_password.py:565
+#: lib/pp_admintools/app/set_ldap_password.py:569
 msgid "Current password hash: '{}'."
 msgstr "Aktueller Passwort-Hash: '{}'"
 
-#: lib/pp_admintools/app/set_ldap_password.py:568
+#: lib/pp_admintools/app/set_ldap_password.py:572
 msgid "The user '{}' has currently no password."
 msgstr "Der Nutzer '{}' hat aktuell kein Passwort."
 
-#: lib/pp_admintools/app/set_ldap_password.py:572
+#: lib/pp_admintools/app/set_ldap_password.py:576
 msgid "Used schema: {!r}."
 msgstr "Verwendetes Schama : {!r}."
 
-#: lib/pp_admintools/app/set_ldap_password.py:574
+#: lib/pp_admintools/app/set_ldap_password.py:578
 msgid "New password hash: '{}'."
 msgstr "Neuer Passwort-Hash: '{}'."
 
-#: lib/pp_admintools/app/set_ldap_password.py:578
+#: lib/pp_admintools/app/set_ldap_password.py:582
 msgid "Apply new password? [{yes}/{no}]?"
 msgstr "Neues Passwort setzen [{yes}/{no}]?"
 
@@ -1273,6 +1318,26 @@ msgstr "Der Wert {v!r} für ein {what}-Port ist ungültig."
 msgid "Value {v!r} for a {what} port must be greater than 0 and less than {max}."
 msgstr "Der Wert {v!r} für ein {what}-Port muss größer als 0 und kleiner als {max} sein."
 
+#: lib/pp_admintools/argparse_actions.py:65 lib/pp_admintools/argparse_actions.py:95
+msgid "Got a {c} for converting {v!r} into an integer value: {e}"
+msgstr "Habe ein {c} bei der Konvertierung von {v!r} in einen Integer-Wert erhalten: {e}"
+
+#: lib/pp_admintools/argparse_actions.py:70
+msgid "The option must not be negative (given: {})."
+msgstr "Die Option darf nich negativ sein (gegeben: {})."
+
+#: lib/pp_admintools/argparse_actions.py:101 lib/pp_admintools/argparse_actions.py:138
+msgid "The option must be greater or equal to {m} (given: {v})."
+msgstr "Die Option muss größer oder gleich {m} sein (gegeben: {v})."
+
+#: lib/pp_admintools/argparse_actions.py:107 lib/pp_admintools/argparse_actions.py:143
+msgid "The option must be less or equal to {m} (given: {v})."
+msgstr "Die Option muss kleiner oder gleich {m} sein (gegeben: {v})."
+
+#: lib/pp_admintools/argparse_actions.py:133
+msgid "Got a {c} for converting {v!r} into a float value: {e}"
+msgstr "Habe ein {c} bei der Konvertierung von {v!r} in einen Float-Wert erhalten: {e}"
+
 #: lib/pp_admintools/config/dns_deploy_zones.py:202 lib/pp_admintools/config/dns_deploy_zones.py:515
 #: lib/pp_admintools/config/mail.py:149 lib/pp_admintools/config/pdns.py:187
 msgid "Evaluating config section {!r}:"
@@ -1343,42 +1408,42 @@ msgstr "Keine gültigen Master in der Konfiguration gefunden."
 msgid "Evaluated configuration:"
 msgstr "Evaluierte Konfiguration:"
 
-#: lib/pp_admintools/config/ldap.py:162
+#: lib/pp_admintools/config/ldap.py:174
 msgid "Invalid port {!r} for LDAP server given."
 msgstr "Ungültiger Port {!r} für den LDAP-Server angegeben."
 
-#: lib/pp_admintools/config/ldap.py:175
+#: lib/pp_admintools/config/ldap.py:187
 msgid "An empty Base DN for LDAP searches is not allowed."
 msgstr "Eine leere Basis-DN für LDAP-Suchen ist nicht erlaubt."
 
-#: lib/pp_admintools/config/ldap.py:265
+#: lib/pp_admintools/config/ldap.py:277
 msgid "Invalid production tier {!r} given."
 msgstr "Ungültige Produktionsstufe {!r} angegeben."
 
-#: lib/pp_admintools/config/ldap.py:408
+#: lib/pp_admintools/config/ldap.py:332
+msgid "Invalid value {val!r} in section {sec!r} for a LDAP {what}."
+msgstr "Ungültiger Wert {val!r} in Abschnitt {sec!r} für ein LDAP-{what}."
+
+#: lib/pp_admintools/config/ldap.py:401
+msgid "Unknown LDAP configuration key {key} found in section {sec!r}."
+msgstr "Unbekannten Konfigurationsschlüssel {key} in Abschnitt {sec!r} gefunden."
+
+#: lib/pp_admintools/config/ldap.py:505
 msgid "Evaluating LDAP config ..."
 msgstr "Ermittle LDAP-Konfiguration …"
 
-#: lib/pp_admintools/config/ldap.py:412
+#: lib/pp_admintools/config/ldap.py:509
 msgid "Evaluating LDAP section {!r} ..."
 msgstr "Evaluiere LDAP-Abschnitt {!r} …"
 
-#: lib/pp_admintools/config/ldap.py:429
+#: lib/pp_admintools/config/ldap.py:526
 msgid "Value {!r} for a timeout is invalid."
 msgstr "Der Wert {!r} für einen Timeout ist ungültig."
 
-#: lib/pp_admintools/config/ldap.py:449
+#: lib/pp_admintools/config/ldap.py:546
 msgid "Reading configuration of LDAP instance {!r} ..."
 msgstr "Lese Konfiguration der LDAP-Instanz {!r} …"
 
-#: lib/pp_admintools/config/ldap.py:457
-msgid "Invalid value {val!r} in section {sec!r} for a LDAP {what}."
-msgstr "Ungültiger Wert {val!r} in Abschnitt {sec!r} für ein LDAP-{what}."
-
-#: lib/pp_admintools/config/ldap.py:519
-msgid "Unknown LDAP configuration key {key} found in section {sec!r}."
-msgstr "Unbekannten Konfigurationsschlüssel {key} in Abschnitt {sec!r} gefunden."
-
 #: lib/pp_admintools/config/mail.py:170 lib/pp_admintools/config/mail.py:194
 #: lib/pp_admintools/config/mail.py:262
 msgid "Found invalid {what} {addr!r} in configuration."
index 4507acfb544e62b5781a2fad2b775cfad5ddb44f..2dc421c03c0d8ed0ac98773ea0decfb703e85f08 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pp_admintools 0.9.1\n"
 "Report-Msgid-Bugs-To: frank.brehm@pixelpark.com\n"
-"POT-Creation-Date: 2022-10-17 17:45+0200\n"
+"POT-Creation-Date: 2022-10-18 18:12+0200\n"
 "PO-Revision-Date: 2022-09-30 16:50+0200\n"
 "Last-Translator: Frank Brehm <frank.brehm@pixelpark.com>\n"
 "Language: en_US\n"
@@ -26,618 +26,619 @@ msgstr ""
 msgid "Options for {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:267
+#: lib/pp_admintools/app/dns_deploy_zones.py:266
 msgid "Keep a backup file for each changed configuration file."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:272
+#: lib/pp_admintools/app/dns_deploy_zones.py:271
 msgid "Keeping the temporary directory instead of removing it at the end (e.g. for debugging purposes)"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:300
+#: lib/pp_admintools/app/dns_deploy_zones.py:299
 msgid "Post init phase."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:304
+#: lib/pp_admintools/app/dns_deploy_zones.py:303
 msgid "My own post init phase."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:320
+#: lib/pp_admintools/app/dns_deploy_zones.py:319
 msgid "Unknown time zone: {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:340
+#: lib/pp_admintools/app/dns_deploy_zones.py:339
 msgid "You must be root to execute this script."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:342
+#: lib/pp_admintools/app/dns_deploy_zones.py:341
 msgid "But in simulation mode we are continuing nevertheless."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:352
+#: lib/pp_admintools/app/dns_deploy_zones.py:351
 msgid "Using the global DNS master is not supported, please use 'local' or 'public'"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:360
+#: lib/pp_admintools/app/dns_deploy_zones.py:359
 msgid "Starting: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:367
+#: lib/pp_admintools/app/dns_deploy_zones.py:366
 msgid "Could not occupy pidfile: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:392
+#: lib/pp_admintools/app/dns_deploy_zones.py:391
 msgid "Ending: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:397
+#: lib/pp_admintools/app/dns_deploy_zones.py:396
 msgid "Cleaning up ..."
 msgstr "Cleaning up …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:401
+#: lib/pp_admintools/app/dns_deploy_zones.py:400
 msgid "Searching for {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:404
+#: lib/pp_admintools/app/dns_deploy_zones.py:403
 msgid "Keep existing backup file {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:406
+#: lib/pp_admintools/app/dns_deploy_zones.py:405
 msgid "Removing {!r} ..."
 msgstr "Removing {!r} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:412
+#: lib/pp_admintools/app/dns_deploy_zones.py:411
 msgid "Error removing {p!r} - {c}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:417
+#: lib/pp_admintools/app/dns_deploy_zones.py:416
 msgid "Temporary directory {!r} will not be removed. It's on yours to remove it manually."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:422
+#: lib/pp_admintools/app/dns_deploy_zones.py:421
 msgid "Destroying temporary directory {!r} ..."
 msgstr "Destroying temporary directory {!r} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:431
+#: lib/pp_admintools/app/dns_deploy_zones.py:430
 msgid "Temporary directory: {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:436
+#: lib/pp_admintools/app/dns_deploy_zones.py:435
 msgid "Temporary zones conf: {!r}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:441
+#: lib/pp_admintools/app/dns_deploy_zones.py:440
 msgid "Trying to get all keys from named.conf ..."
 msgstr "Trying to get all keys from named.conf …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:447 lib/pp_admintools/app/dns_deploy_zones.py:801
-#: lib/pp_admintools/app/dns_deploy_zones.py:837 lib/pp_admintools/app/dns_deploy_zones.py:869
-#: lib/pp_admintools/app/dns_deploy_zones.py:904 lib/pp_admintools/app/dns_deploy_zones.py:939
+#: lib/pp_admintools/app/dns_deploy_zones.py:446 lib/pp_admintools/app/dns_deploy_zones.py:800
+#: lib/pp_admintools/app/dns_deploy_zones.py:836 lib/pp_admintools/app/dns_deploy_zones.py:868
+#: lib/pp_admintools/app/dns_deploy_zones.py:903 lib/pp_admintools/app/dns_deploy_zones.py:938
 #: lib/pp_admintools/app/mail.py:326
 msgid "Executing: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:453 lib/pp_admintools/app/dns_deploy_zones.py:807
-#: lib/pp_admintools/app/ldap.py:766 lib/pp_admintools/app/ldap.py:819
-#: lib/pp_admintools/app/ldap.py:872 lib/pp_admintools/app/ldap.py:1103
-#: lib/pp_admintools/app/ldap.py:1137 lib/pp_admintools/app/ldap.py:1171
-#: lib/pp_admintools/app/ldap.py:1205
+#: lib/pp_admintools/app/dns_deploy_zones.py:452 lib/pp_admintools/app/dns_deploy_zones.py:806
+#: lib/pp_admintools/app/ldap.py:787 lib/pp_admintools/app/ldap.py:840
+#: lib/pp_admintools/app/ldap.py:893 lib/pp_admintools/app/ldap.py:1124
+#: lib/pp_admintools/app/ldap.py:1158 lib/pp_admintools/app/ldap.py:1192
+#: lib/pp_admintools/app/ldap.py:1226
 msgid "Result:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:494 lib/pp_admintools/app/dns_deploy_zones.py:496
+#: lib/pp_admintools/app/dns_deploy_zones.py:493 lib/pp_admintools/app/dns_deploy_zones.py:495
 msgid "Found named keys:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:496 lib/pp_admintools/app/dns_deploy_zones.py:527
+#: lib/pp_admintools/app/dns_deploy_zones.py:495 lib/pp_admintools/app/dns_deploy_zones.py:526
 msgid "None"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:501
+#: lib/pp_admintools/app/dns_deploy_zones.py:500
 msgid "Generating {} ..."
 msgstr "Generating {} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:525 lib/pp_admintools/app/dns_deploy_zones.py:527
+#: lib/pp_admintools/app/dns_deploy_zones.py:524 lib/pp_admintools/app/dns_deploy_zones.py:526
 msgid "Collected server configuration:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:548
+#: lib/pp_admintools/app/dns_deploy_zones.py:547
 msgid "Generated file {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:564
+#: lib/pp_admintools/app/dns_deploy_zones.py:563
 msgid "Pure local zone {!r} will not be considered."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:596
+#: lib/pp_admintools/app/dns_deploy_zones.py:595
 msgid "Key {k!r} for zone {z!r} not found in named configuration."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:626
+#: lib/pp_admintools/app/dns_deploy_zones.py:625
 msgid "Got IPv4 tuples: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:650
+#: lib/pp_admintools/app/dns_deploy_zones.py:649
 msgid "Got IPv6 tokens: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:657
+#: lib/pp_admintools/app/dns_deploy_zones.py:656
 msgid "Comparing generated files with existing ones."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:664
+#: lib/pp_admintools/app/dns_deploy_zones.py:663
 msgid "Files to replace:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:670
+#: lib/pp_admintools/app/dns_deploy_zones.py:669
 msgid "Source file not defined."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:672
+#: lib/pp_admintools/app/dns_deploy_zones.py:671
 msgid "Target file not defined."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:674
+#: lib/pp_admintools/app/dns_deploy_zones.py:673
 msgid "Comparing {one!r} with {two!r} ..."
 msgstr "Comparing {one!r} with {two!r} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:678 lib/pp_admintools/app/dns_deploy_zones.py:687
+#: lib/pp_admintools/app/dns_deploy_zones.py:677 lib/pp_admintools/app/dns_deploy_zones.py:686
 msgid "{what} {f!r} does not exists."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:679 lib/pp_admintools/app/dns_deploy_zones.py:683
+#: lib/pp_admintools/app/dns_deploy_zones.py:678 lib/pp_admintools/app/dns_deploy_zones.py:682
 msgid "Source file"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:682 lib/pp_admintools/app/dns_deploy_zones.py:692
+#: lib/pp_admintools/app/dns_deploy_zones.py:681 lib/pp_admintools/app/dns_deploy_zones.py:691
 msgid "{what} {f!r} is not a regular file."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:688 lib/pp_admintools/app/dns_deploy_zones.py:693
+#: lib/pp_admintools/app/dns_deploy_zones.py:687 lib/pp_admintools/app/dns_deploy_zones.py:692
 msgid "Target file"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:699 lib/pp_admintools/app/dns_deploy_zones.py:716
+#: lib/pp_admintools/app/dns_deploy_zones.py:698 lib/pp_admintools/app/dns_deploy_zones.py:715
 msgid "Reading {!r} ..."
 msgstr "Reading {!r} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:709 lib/pp_admintools/app/dns_deploy_zones.py:726
+#: lib/pp_admintools/app/dns_deploy_zones.py:708 lib/pp_admintools/app/dns_deploy_zones.py:725
 msgid "Cleaned version of {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:731
+#: lib/pp_admintools/app/dns_deploy_zones.py:730
 msgid ""
 "Source file {sf!r} has different number essential lines ({sl}) than the target file {tf!r} ({tl}"
 " lines)."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:740
+#: lib/pp_admintools/app/dns_deploy_zones.py:739
 msgid "Source file {sf!r} has a different content than the target file {tf!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:752
+#: lib/pp_admintools/app/dns_deploy_zones.py:751
 msgid "No replacement of any config files necessary."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:755
+#: lib/pp_admintools/app/dns_deploy_zones.py:754
 msgid "Start replacing of config files ..."
 msgstr "Start replacing of config files …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:763 lib/pp_admintools/app/dns_deploy_zones.py:773
+#: lib/pp_admintools/app/dns_deploy_zones.py:762 lib/pp_admintools/app/dns_deploy_zones.py:772
 msgid "Copying {frm!r} => {to!r} ..."
 msgstr "Copying {frm!r} => {to!r} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:769
+#: lib/pp_admintools/app/dns_deploy_zones.py:768
 msgid "All backuped config files:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:781
+#: lib/pp_admintools/app/dns_deploy_zones.py:780
 msgid "Restoring of original config files because of an exception."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:785
+#: lib/pp_admintools/app/dns_deploy_zones.py:784
 msgid "Moving {frm!r} => {to!r} ..."
 msgstr "Moving {frm!r} => {to!r} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:791
+#: lib/pp_admintools/app/dns_deploy_zones.py:790
 msgid "Could not find backup file {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:796
+#: lib/pp_admintools/app/dns_deploy_zones.py:795
 msgid "Checking syntax correctness of named.conf ..."
 msgstr "Checking syntax correctness of named.conf …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:817
+#: lib/pp_admintools/app/dns_deploy_zones.py:816
 msgid "Reload or restart of named is not necessary."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:822
+#: lib/pp_admintools/app/dns_deploy_zones.py:821
 msgid "Named is not running, please start it manually."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:833
+#: lib/pp_admintools/app/dns_deploy_zones.py:832
 msgid "Checking, whether named is running ..."
 msgstr "Checking, whether named is running …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:851 lib/pp_admintools/app/dns_deploy_zones.py:886
-#: lib/pp_admintools/app/dns_deploy_zones.py:921 lib/pp_admintools/app/dns_deploy_zones.py:956
+#: lib/pp_admintools/app/dns_deploy_zones.py:850 lib/pp_admintools/app/dns_deploy_zones.py:885
+#: lib/pp_admintools/app/dns_deploy_zones.py:920 lib/pp_admintools/app/dns_deploy_zones.py:955
 msgid "Return value: {!r}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:853 lib/pp_admintools/app/dns_deploy_zones.py:855
-#: lib/pp_admintools/app/dns_deploy_zones.py:888 lib/pp_admintools/app/dns_deploy_zones.py:890
-#: lib/pp_admintools/app/dns_deploy_zones.py:923 lib/pp_admintools/app/dns_deploy_zones.py:925
-#: lib/pp_admintools/app/dns_deploy_zones.py:958 lib/pp_admintools/app/dns_deploy_zones.py:960
+#: lib/pp_admintools/app/dns_deploy_zones.py:852 lib/pp_admintools/app/dns_deploy_zones.py:854
+#: lib/pp_admintools/app/dns_deploy_zones.py:887 lib/pp_admintools/app/dns_deploy_zones.py:889
+#: lib/pp_admintools/app/dns_deploy_zones.py:922 lib/pp_admintools/app/dns_deploy_zones.py:924
+#: lib/pp_admintools/app/dns_deploy_zones.py:957 lib/pp_admintools/app/dns_deploy_zones.py:959
 msgid "Output on {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:865
+#: lib/pp_admintools/app/dns_deploy_zones.py:864
 msgid "Starting {} ..."
 msgstr "Starting {} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:900
+#: lib/pp_admintools/app/dns_deploy_zones.py:899
 msgid "Restarting {} ..."
 msgstr "Restarting {} …"
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:935
+#: lib/pp_admintools/app/dns_deploy_zones.py:934
 msgid "Reloading {} ..."
 msgstr "Reloading {} …"
 
-#: lib/pp_admintools/app/ldap.py:108 lib/pp_admintools/app/ldap.py:211
+#: lib/pp_admintools/app/ldap.py:109 lib/pp_admintools/app/ldap.py:213
 msgid "The path {!r} must be an absolute path."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:114 lib/pp_admintools/app/ldap.py:215
-#: lib/pp_admintools/app/ldap.py:1219
+#: lib/pp_admintools/app/ldap.py:115 lib/pp_admintools/app/ldap.py:217
+#: lib/pp_admintools/app/ldap.py:1240
 msgid "The file {!r} does not exists."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:118 lib/pp_admintools/app/ldap.py:219
-#: lib/pp_admintools/app/ldap.py:1224
+#: lib/pp_admintools/app/ldap.py:119 lib/pp_admintools/app/ldap.py:221
+#: lib/pp_admintools/app/ldap.py:1245
 msgid "The given path {!r} exists, but is not a regular file."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:122 lib/pp_admintools/app/ldap.py:223
-#: lib/pp_admintools/app/ldap.py:1229
+#: lib/pp_admintools/app/ldap.py:123 lib/pp_admintools/app/ldap.py:225
+#: lib/pp_admintools/app/ldap.py:1250
 msgid "The given file {!r} is not readable."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:143
+#: lib/pp_admintools/app/ldap.py:144
 msgid "a port number must be greater than zero and less or equal to {}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:148
+#: lib/pp_admintools/app/ldap.py:149
 msgid "Wrong port number {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:256
+#: lib/pp_admintools/app/ldap.py:258
 msgid "LDAP options"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:258
+#: lib/pp_admintools/app/ldap.py:260
 msgid "Options for the default LDAP connection"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:260
+#: lib/pp_admintools/app/ldap.py:262
 msgid "Options fo LDAP connections"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:267 lib/pp_admintools/app/remove_ldap_user.py:280
-#: lib/pp_admintools/app/set_ldap_password.py:579
+#: lib/pp_admintools/app/ldap.py:269 lib/pp_admintools/app/remove_ldap_user.py:279
+#: lib/pp_admintools/app/set_ldap_password.py:583
 msgid "No"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:269
+#: lib/pp_admintools/app/ldap.py:271
 msgid "Yes"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:275
+#: lib/pp_admintools/app/ldap.py:277
 msgid "HOST"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:276
+#: lib/pp_admintools/app/ldap.py:278
 msgid "Hostname or address of the LDAP server to use. Default: {!r}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:283
+#: lib/pp_admintools/app/ldap.py:285
 msgid "Use ldaps to connect to the LDAP server. Default: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:288 lib/pp_admintools/app/mail.py:261
-#: lib/pp_admintools/app/pdns.py:274
+#: lib/pp_admintools/app/ldap.py:290 lib/pp_admintools/app/mail.py:261
+#: lib/pp_admintools/app/pdns.py:272
 msgid "PORT"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:290
+#: lib/pp_admintools/app/ldap.py:292
 msgid "The port number to connect to the LDAP server. Default: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:296
+#: lib/pp_admintools/app/ldap.py:298
 msgid "The base DN used as the root for the LDAP searches. Default: {!r}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:303
+#: lib/pp_admintools/app/ldap.py:305
 msgid "The Bind DN to use to connect to the LDAP server. Default: {!r}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:311 lib/pp_admintools/app/set_ldap_password.py:204
+#: lib/pp_admintools/app/ldap.py:313 lib/pp_admintools/app/set_ldap_password.py:204
 #: lib/pp_admintools/app/set_ldap_password.py:205 lib/pp_admintools/app/set_ldap_password.py:222
 #: lib/pp_admintools/app/set_ldap_password.py:225
 msgid "PASSWORD"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:312
+#: lib/pp_admintools/app/ldap.py:314
 msgid "Use PASSWORD as the password for simple LDAP authentication."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:317
+#: lib/pp_admintools/app/ldap.py:319
 msgid ""
 "Prompt for simple LDAP authentication. This is used instead of specifying the password on the "
 "command line."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:323 lib/pp_admintools/app/set_ldap_password.py:216
+#: lib/pp_admintools/app/ldap.py:325 lib/pp_admintools/app/set_ldap_password.py:216
 #: lib/pp_admintools/app/set_ldap_password.py:218
 msgid "PASSWORD_FILE"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:325
+#: lib/pp_admintools/app/ldap.py:327
 msgid "Use contents of PASSWORD_FILE as the password for simple authentication."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:333 lib/pp_admintools/app/pdns.py:248
+#: lib/pp_admintools/app/ldap.py:335 lib/pp_admintools/app/pdns.py:246
 msgid "INSTANCE"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:336
-msgid ""
-"The LDAP instance (LDAP cluster) from configuration, where to execute this script. If not given,"
-" then the instance {!r} will be used."
+#: lib/pp_admintools/app/ldap.py:338
+msgid "If not given, then the instance {!r} will be used."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:339
+#: lib/pp_admintools/app/ldap.py:341
+msgid "The LDAP instance (LDAP cluster) from configuration, where to execute this script."
+msgstr ""
+
+#: lib/pp_admintools/app/ldap.py:345
 msgid ""
 "The LDAP instance (LDAP cluster) from configuration, where to execute this script. It is "
 "possible to give here the value {val_all!r}, then all found LDAP instances except {default!r} "
 "are used. It is alo possible to give the value {val_list!r}, then all configured LDAP instances "
-"are shown, and the application is exiting. If not given, then the instance {default!r} will be "
-"used."
+"are shown, and the application is exiting."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:358
+#: lib/pp_admintools/app/ldap.py:371 lib/pp_admintools/app/mirror_ldap.py:89
 msgid "SECONDS"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:360
+#: lib/pp_admintools/app/ldap.py:373
 msgid "Using the given timeout in seconds for all LDAP operations. Default: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:394
+#: lib/pp_admintools/app/ldap.py:407
 msgid "Checking given instances."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:398
+#: lib/pp_admintools/app/ldap.py:411
 msgid "Given insts:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:449
+#: lib/pp_admintools/app/ldap.py:462
 msgid "Configured LDAP instances:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:466
+#: lib/pp_admintools/app/ldap.py:479
 msgid "Verifying given instances ..."
 msgstr "Verifying given instances …"
 
-#: lib/pp_admintools/app/ldap.py:477
+#: lib/pp_admintools/app/ldap.py:492
 msgid "Used filter:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:507 lib/pp_admintools/app/remove_ldap_user.py:181
-msgid "LDAP instance {!r} not found in configuration."
+#: lib/pp_admintools/app/ldap.py:526
+msgid "LDAP instance {!r} not found in configuration or is not usable."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:515
+#: lib/pp_admintools/app/ldap.py:536
 msgid "LDAP instances to use:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:564
+#: lib/pp_admintools/app/ldap.py:585
 msgid "Preparations ..."
 msgstr "Preparations …"
 
-#: lib/pp_admintools/app/ldap.py:567
+#: lib/pp_admintools/app/ldap.py:588
 msgid "Open all necessary LDAP connections ..."
 msgstr "Open all necessary LDAP connections …"
 
-#: lib/pp_admintools/app/ldap.py:581
+#: lib/pp_admintools/app/ldap.py:602
 msgid "Password of user {usr} on LDAP instance {inst}:"
 msgstr "Password of user {usr} on LDAP instance {inst}:"
 
-#: lib/pp_admintools/app/ldap.py:590
+#: lib/pp_admintools/app/ldap.py:611
 msgid "Info about LDAP server {}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:600
+#: lib/pp_admintools/app/ldap.py:621
 msgid "Trying to get LDAP server object for {} ..."
 msgstr "Trying to get LDAP server object for {} …"
 
-#: lib/pp_admintools/app/ldap.py:616
+#: lib/pp_admintools/app/ldap.py:637
 msgid "Connect options to server {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:623
+#: lib/pp_admintools/app/ldap.py:644
 msgid "LDAP server {s}: {re}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:637
+#: lib/pp_admintools/app/ldap.py:658
 msgid "Connecting to LDAP server {url} as {dn!r} ..."
 msgstr "Connecting to LDAP server {url} as {dn!r} …"
 
-#: lib/pp_admintools/app/ldap.py:649
+#: lib/pp_admintools/app/ldap.py:670
 msgid "Finishing ..."
 msgstr "Finishing …"
 
-#: lib/pp_admintools/app/ldap.py:658
+#: lib/pp_admintools/app/ldap.py:679
 msgid "Disconnecting from all remaining LDAP instances ..."
 msgstr "Disconnecting from all remaining LDAP instances …"
 
-#: lib/pp_admintools/app/ldap.py:671
+#: lib/pp_admintools/app/ldap.py:692
 msgid "Unbinding from LDAP server {!r} ..."
 msgstr "Unbinding from LDAP server {!r} …"
 
-#: lib/pp_admintools/app/ldap.py:678
+#: lib/pp_admintools/app/ldap.py:699
 msgid "Disconnecting from LDAP server {!r} ..."
 msgstr "Disconnecting from LDAP server {!r} …"
 
-#: lib/pp_admintools/app/ldap.py:687
+#: lib/pp_admintools/app/ldap.py:708
 msgid "Trying to evaluate DN of user {user!r} in LDAP instance {inst} ..."
 msgstr "Trying to evaluate DN of user {user!r} in LDAP instance {inst} …"
 
-#: lib/pp_admintools/app/ldap.py:692
+#: lib/pp_admintools/app/ldap.py:713
 msgid "Trying to evaluate DN of user {u!r} as a mail address ..."
 msgstr "Trying to evaluate DN of user {u!r} as a mail address …"
 
-#: lib/pp_admintools/app/ldap.py:699
+#: lib/pp_admintools/app/ldap.py:720
 msgid "Trying to evaluate DN of user {u!r} as a LDAP DN ..."
 msgstr "Trying to evaluate DN of user {u!r} as a LDAP DN …"
 
-#: lib/pp_admintools/app/ldap.py:706
+#: lib/pp_admintools/app/ldap.py:727
 msgid "Trying to evaluate DN of user {u!r} as a UID (Posix user name) ..."
 msgstr "Trying to evaluate DN of user {u!r} as a UID (Posix user name) …"
 
-#: lib/pp_admintools/app/ldap.py:715 lib/pp_admintools/app/remove_ldap_user.py:300
+#: lib/pp_admintools/app/ldap.py:736 lib/pp_admintools/app/remove_ldap_user.py:299
 msgid "Empty user given."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:718
+#: lib/pp_admintools/app/ldap.py:739
 msgid "Trying to evaluate DN of user {u!r} as a CN ({c}) ..."
 msgstr "Trying to evaluate DN of user {u!r} as a CN ({c}) …"
 
-#: lib/pp_admintools/app/ldap.py:748 lib/pp_admintools/app/ldap.py:801
-#: lib/pp_admintools/app/ldap.py:854 lib/pp_admintools/app/ldap.py:1088
-#: lib/pp_admintools/app/ldap.py:1122 lib/pp_admintools/app/ldap.py:1156
-#: lib/pp_admintools/app/ldap.py:1190
+#: lib/pp_admintools/app/ldap.py:769 lib/pp_admintools/app/ldap.py:822
+#: lib/pp_admintools/app/ldap.py:875 lib/pp_admintools/app/ldap.py:1109
+#: lib/pp_admintools/app/ldap.py:1143 lib/pp_admintools/app/ldap.py:1177
+#: lib/pp_admintools/app/ldap.py:1211
 msgid "Searching in {uri}/{bdn} with filter: {fltr}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:759
+#: lib/pp_admintools/app/ldap.py:780
 msgid "Result of searching for mail address {m!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:763 lib/pp_admintools/app/ldap.py:816
-#: lib/pp_admintools/app/ldap.py:869 lib/pp_admintools/app/ldap.py:957
-#: lib/pp_admintools/app/ldap.py:1100 lib/pp_admintools/app/ldap.py:1134
-#: lib/pp_admintools/app/ldap.py:1168 lib/pp_admintools/app/ldap.py:1202
+#: lib/pp_admintools/app/ldap.py:784 lib/pp_admintools/app/ldap.py:837
+#: lib/pp_admintools/app/ldap.py:890 lib/pp_admintools/app/ldap.py:978
+#: lib/pp_admintools/app/ldap.py:1121 lib/pp_admintools/app/ldap.py:1155
+#: lib/pp_admintools/app/ldap.py:1189 lib/pp_admintools/app/ldap.py:1223
 msgid "Got a response entry:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:770
+#: lib/pp_admintools/app/ldap.py:791
 msgid "User with mail address {m!r} not found in {uri}/{bdn}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:812
+#: lib/pp_admintools/app/ldap.py:833
 msgid "Result of searching for uid {u!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:823
+#: lib/pp_admintools/app/ldap.py:844
 msgid "User with uid {u!r} not found in {uri}/{bdn}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:865
+#: lib/pp_admintools/app/ldap.py:886
 msgid "Result of searching for CN {cn!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:876
+#: lib/pp_admintools/app/ldap.py:897
 msgid "User with cn {cn!r} not found in {uri}/{bdn}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:893 lib/pp_admintools/app/set_ldap_password.py:504
+#: lib/pp_admintools/app/ldap.py:914 lib/pp_admintools/app/set_ldap_password.py:508
 msgid "User with DN {dn!r} not found in {uri}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:911
+#: lib/pp_admintools/app/ldap.py:932
 msgid "ObjectClasses of {dn!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:921
+#: lib/pp_admintools/app/ldap.py:942
 msgid "Entry {dn!r} in {uri} seems not to be an account."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:943
+#: lib/pp_admintools/app/ldap.py:964
 msgid "Searching DN {dn!r} in {uri}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:953
+#: lib/pp_admintools/app/ldap.py:974
 msgid "Result of searching for DN {dn!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:961
+#: lib/pp_admintools/app/ldap.py:982
 msgid "Entry with DN {dn!r} not found in {uri}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1002
+#: lib/pp_admintools/app/ldap.py:1023
 msgid "Applying changes on {uri} to DN {dn!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1007
+#: lib/pp_admintools/app/ldap.py:1028
 msgid "Simulation mode - changes are not applied."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1013
+#: lib/pp_admintools/app/ldap.py:1034
 msgid "Modification NOT successfull - {c}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1014 lib/pp_admintools/app/remove_ldap_user.py:427
-#: lib/pp_admintools/app/remove_ldap_user.py:454 lib/pp_admintools/app/remove_ldap_user.py:481
-#: lib/pp_admintools/app/remove_ldap_user.py:512 lib/pp_admintools/app/remove_ldap_user.py:543
+#: lib/pp_admintools/app/ldap.py:1035 lib/pp_admintools/app/remove_ldap_user.py:426
+#: lib/pp_admintools/app/remove_ldap_user.py:453 lib/pp_admintools/app/remove_ldap_user.py:480
+#: lib/pp_admintools/app/remove_ldap_user.py:511 lib/pp_admintools/app/remove_ldap_user.py:542
 #: lib/pp_admintools/app/set_ldap_password.py:612
 msgid "Changes:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1026
+#: lib/pp_admintools/app/ldap.py:1047
 msgid "Modification status: {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1028
+#: lib/pp_admintools/app/ldap.py:1049
 msgid "Result of modifying:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1031
+#: lib/pp_admintools/app/ldap.py:1052
 msgid "Modification NOT successful: {desc} - {msg}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1035
+#: lib/pp_admintools/app/ldap.py:1056
 msgid "Modification successful."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1045
+#: lib/pp_admintools/app/ldap.py:1066
 msgid "Deleting LDAP entry {dn!r} on {uri} ..."
 msgstr "Deleting LDAP entry {dn!r} on {uri} …"
 
-#: lib/pp_admintools/app/ldap.py:1050
+#: lib/pp_admintools/app/ldap.py:1071
 msgid "Simulation mode - deletion will not be executed."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1056
+#: lib/pp_admintools/app/ldap.py:1077
 msgid "Deletion NOT successfull - {c}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1060
+#: lib/pp_admintools/app/ldap.py:1081
 msgid "Deletion status: {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1062
+#: lib/pp_admintools/app/ldap.py:1083
 msgid "Result of deletion:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1065
+#: lib/pp_admintools/app/ldap.py:1086
 msgid "Deletion NOT successful: {desc} - {msg}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1069
+#: lib/pp_admintools/app/ldap.py:1090
 msgid "Deletion successful."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1216
+#: lib/pp_admintools/app/ldap.py:1237
 msgid "Reading password file {!r} ..."
 msgstr "Reading password file {!r} …"
 
@@ -722,103 +723,134 @@ msgstr ""
 msgid "Did not found sendmail executable."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:100 lib/pp_admintools/app/pdns.py:184
+#: lib/pp_admintools/app/mirror_ldap.py:70
+msgid ""
+"Mirror the content of a complete LDAP instance (server or cluster) to another instance. This "
+"will be done first by clearing the target instance, then copying structural entries from the "
+"source to the target instance and then copying all other entries. During this some "
+"transformations are done, like substituting the content of some entry attributes by another "
+"values."
+msgstr ""
+
+#: lib/pp_admintools/app/mirror_ldap.py:86
+msgid "Miroring options"
+msgstr ""
+
+#: lib/pp_admintools/app/mirror_ldap.py:91
+msgid ""
+"Number of seconds to wait after each write operation. Given as a float value, and if set to "
+"zero, there is no waiting after a write. (default: {:.1f})"
+msgstr ""
+
+#: lib/pp_admintools/app/mirror_ldap.py:98
+msgid "NUMBER"
+msgstr ""
+
+#: lib/pp_admintools/app/mirror_ldap.py:100
+msgid "Limiting the mirroring to the first NUMBER entries. This option is valid only in simulation mode."
+msgstr ""
+
+#: lib/pp_admintools/app/mirror_ldap.py:107
+msgid "Mirror only structural entries (entries with childs)."
+msgstr ""
+
+#: lib/pp_admintools/app/pdns.py:99 lib/pp_admintools/app/pdns.py:183
 msgid "Configuration not available."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:114
+#: lib/pp_admintools/app/pdns.py:113
 msgid "Invalid API key {!r} given."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:126
+#: lib/pp_admintools/app/pdns.py:125
 msgid "Invalid API host {!r} given."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:139
+#: lib/pp_admintools/app/pdns.py:138
 msgid "Invalid API port {!r} given."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:151
+#: lib/pp_admintools/app/pdns.py:150
 msgid "Invalid API server name {!r} given."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:169 lib/pp_admintools/app/pdns.py:172
+#: lib/pp_admintools/app/pdns.py:168 lib/pp_admintools/app/pdns.py:171
 msgid "Invalid instance {!r} given."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:180
+#: lib/pp_admintools/app/pdns.py:179
 msgid "Evaluating instance {!r} ..."
 msgstr "Evaluating instance {!r} …"
 
-#: lib/pp_admintools/app/pdns.py:188
+#: lib/pp_admintools/app/pdns.py:187
 msgid "PDNS instance {!r} is not configured."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:239
+#: lib/pp_admintools/app/pdns.py:238
 msgid "PowerDNS API options"
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:249
+#: lib/pp_admintools/app/pdns.py:247
 msgid "Select, which PowerDNS instance to use. Valid values: {v}, default: {d!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:257 lib/pp_admintools/app/pdns.py:263
-#: lib/pp_admintools/app/pdns.py:269
+#: lib/pp_admintools/app/pdns.py:255 lib/pp_admintools/app/pdns.py:261
+#: lib/pp_admintools/app/pdns.py:267
 msgid "Using the {!r} PowerDNS instance."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:277
+#: lib/pp_admintools/app/pdns.py:275
 msgid "Which port to connect to PowerDNS API, default: {}."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:302
+#: lib/pp_admintools/app/pdns.py:300
 msgid "No path given for{d} [{s}]/{k} in configuration."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:309
+#: lib/pp_admintools/app/pdns.py:307
 msgid "Path {p!r} for{d} [{s}]/{k} in configuration must be an absolute path."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:332 lib/pp_admintools/app/pdns.py:368
-#: lib/pp_admintools/app/pdns.py:395
+#: lib/pp_admintools/app/pdns.py:330 lib/pp_admintools/app/pdns.py:366
+#: lib/pp_admintools/app/pdns.py:393
 msgid "Executing {} ..."
 msgstr "Executing {} …"
 
-#: lib/pp_admintools/app/pdns.py:370
+#: lib/pp_admintools/app/pdns.py:368
 msgid "Setting Loglevel of the requests module to {}."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:384
+#: lib/pp_admintools/app/pdns.py:382
 msgid "Executing nothing ..."
 msgstr "Executing nothing …"
 
-#: lib/pp_admintools/app/pdns.py:404 lib/pp_admintools/app/pdns.py:426
-#: lib/pp_admintools/app/pdns.py:437 lib/pp_admintools/app/pdns.py:447
+#: lib/pp_admintools/app/pdns.py:402 lib/pp_admintools/app/pdns.py:424
+#: lib/pp_admintools/app/pdns.py:435 lib/pp_admintools/app/pdns.py:445
 msgid "The PDNS server object does not exists."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:406 lib/pp_admintools/app/pdns.py:428
-#: lib/pp_admintools/app/pdns.py:439 lib/pp_admintools/app/pdns.py:449
+#: lib/pp_admintools/app/pdns.py:404 lib/pp_admintools/app/pdns.py:426
+#: lib/pp_admintools/app/pdns.py:437 lib/pp_admintools/app/pdns.py:447
 msgid "The PDNS server object is not initialized."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:457
+#: lib/pp_admintools/app/pdns.py:455
 msgid "Trying to get complete information about zone {!r} ..."
 msgstr "Trying to get complete information about zone {!r} …"
 
-#: lib/pp_admintools/app/pdns.py:463
+#: lib/pp_admintools/app/pdns.py:461
 msgid "The given zone {} was not found."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:466
+#: lib/pp_admintools/app/pdns.py:464
 msgid "Got a response:"
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:471
+#: lib/pp_admintools/app/pdns.py:469
 msgid "Zone object:"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:70
+#: lib/pp_admintools/app/remove_ldap_user.py:69
 msgid ""
 "Disables or removes the given users from LDAP. If disabling, then the user will not be really "
 "removed, but disabled by locking the password, setting all status flags to {inact!r}, assigning "
@@ -826,215 +858,219 @@ msgid ""
 "user will be really removed from LDAP."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:115
+#: lib/pp_admintools/app/remove_ldap_user.py:114
 msgid "Removing options"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:118
+#: lib/pp_admintools/app/remove_ldap_user.py:117
 msgid "This is the default."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:119
+#: lib/pp_admintools/app/remove_ldap_user.py:118
 msgid "This is mutually exclusive to {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:121
+#: lib/pp_admintools/app/remove_ldap_user.py:120
 msgid "Deactivating the user instead of removing it."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:128
+#: lib/pp_admintools/app/remove_ldap_user.py:127
 msgid "Removing the user from LDAP."
 msgstr "Removing the user from LDAP."
 
-#: lib/pp_admintools/app/remove_ldap_user.py:136 lib/pp_admintools/app/set_ldap_password.py:269
-#: lib/pp_admintools/app/set_ldap_password.py:272
+#: lib/pp_admintools/app/remove_ldap_user.py:135 lib/pp_admintools/app/set_ldap_password.py:273
+#: lib/pp_admintools/app/set_ldap_password.py:276
 msgid "USER"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:137
+#: lib/pp_admintools/app/remove_ldap_user.py:136
 msgid ""
 "The user, which should be deactivated or removed. They may be given by their Uid (the "
 "alphanumeric POSIX name), their mail address or their LDAP DN (be aware, that this may be "
 "different in the particular LDAP instances)."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:161
+#: lib/pp_admintools/app/remove_ldap_user.py:160
 msgid "No users to remove given."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:174
+#: lib/pp_admintools/app/remove_ldap_user.py:173
 msgid "Checking given instances for admin and read/write access."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:189
+#: lib/pp_admintools/app/remove_ldap_user.py:180
+msgid "LDAP instance {!r} not found in configuration."
+msgstr ""
+
+#: lib/pp_admintools/app/remove_ldap_user.py:188
 msgid "LDAP instance {!r} has only readonly access."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:194
+#: lib/pp_admintools/app/remove_ldap_user.py:193
 msgid "No admin access to LDAP instance {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:211
+#: lib/pp_admintools/app/remove_ldap_user.py:210
 msgid "All given users were not found in any LDAP instance."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:216
+#: lib/pp_admintools/app/remove_ldap_user.py:215
 msgid "Evaluated DNs to remove:"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:225
+#: lib/pp_admintools/app/remove_ldap_user.py:224
 msgid "Start disabling user entries in:"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:227
+#: lib/pp_admintools/app/remove_ldap_user.py:226
 msgid "Start removing user entries in:"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:231
+#: lib/pp_admintools/app/remove_ldap_user.py:230
 msgid "Start disabling user entries ..."
 msgstr "Start disabling user entries …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:233
+#: lib/pp_admintools/app/remove_ldap_user.py:232
 msgid "Start removing user entries ..."
 msgstr "Start removing user entries …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:248
+#: lib/pp_admintools/app/remove_ldap_user.py:247
 msgid "Do you really want to deactivate the following users?"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:250
+#: lib/pp_admintools/app/remove_ldap_user.py:249
 msgid "Do you really want to remove the following users?"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:276
+#: lib/pp_admintools/app/remove_ldap_user.py:275
 msgid "Deactivate [{yes}/{no}]?"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:278
+#: lib/pp_admintools/app/remove_ldap_user.py:277
 msgid "Remove [{yes}/{no}]?"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:280 lib/pp_admintools/app/set_ldap_password.py:579
+#: lib/pp_admintools/app/remove_ldap_user.py:279 lib/pp_admintools/app/set_ldap_password.py:583
 msgid "yes"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:285
+#: lib/pp_admintools/app/remove_ldap_user.py:284
 msgid "Abort deactivating by {cls}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:287
+#: lib/pp_admintools/app/remove_ldap_user.py:286
 msgid "Abort removing by {cls}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:296
+#: lib/pp_admintools/app/remove_ldap_user.py:295
 msgid "Evaluating DNs of the user {!r} to remove ..."
 msgstr "Evaluating DNs of the user {!r} to remove …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:310 lib/pp_admintools/app/set_ldap_password.py:527
+#: lib/pp_admintools/app/remove_ldap_user.py:309 lib/pp_admintools/app/set_ldap_password.py:531
 msgid "Got DN {dn!r} for user {user!r} in LDAP instance {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:317 lib/pp_admintools/app/set_ldap_password.py:532
+#: lib/pp_admintools/app/remove_ldap_user.py:316 lib/pp_admintools/app/set_ldap_password.py:536
 msgid "Found {nr} entries for user {u!r} in LDAP instance {i}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:329 lib/pp_admintools/app/set_ldap_password.py:546
+#: lib/pp_admintools/app/remove_ldap_user.py:328 lib/pp_admintools/app/set_ldap_password.py:550
 msgid "Did not found user {user!r} in LDAP instance {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:338
+#: lib/pp_admintools/app/remove_ldap_user.py:337
 msgid "Deactivating all given users from {} ..."
 msgstr "Deactivating all given users from {} …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:340
+#: lib/pp_admintools/app/remove_ldap_user.py:339
 msgid "Removing all given users from {} ..."
 msgstr "Removing all given users from {} …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:355
+#: lib/pp_admintools/app/remove_ldap_user.py:354
 msgid "Deactivating user {dn!r} from {inst} ..."
 msgstr "Deactivating user {dn!r} from {inst} …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:358
+#: lib/pp_admintools/app/remove_ldap_user.py:357
 msgid "Removing user {dn!r} from {inst} ..."
 msgstr "Removing user {dn!r} from {inst} …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:364
+#: lib/pp_admintools/app/remove_ldap_user.py:363
 msgid "Attributes of {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:385
+#: lib/pp_admintools/app/remove_ldap_user.py:384
 msgid "{c} on removing user {dn!r}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:391
+#: lib/pp_admintools/app/remove_ldap_user.py:390
 msgid "User {dn!r} successful deactivated on {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:394
+#: lib/pp_admintools/app/remove_ldap_user.py:393
 msgid "User {dn!r} successful removed from {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:420
+#: lib/pp_admintools/app/remove_ldap_user.py:419
 msgid "Updating user info for {dn!r} on {inst} ..."
 msgstr "Updating user info for {dn!r} on {inst} …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:425 lib/pp_admintools/app/set_ldap_password.py:610
+#: lib/pp_admintools/app/remove_ldap_user.py:424 lib/pp_admintools/app/set_ldap_password.py:610
 msgid "{c} on deactivating user {dn!r}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:441
+#: lib/pp_admintools/app/remove_ldap_user.py:440
 msgid "Did not found any group memberships of {dn!r} in {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:447 lib/pp_admintools/app/remove_ldap_user.py:474
-#: lib/pp_admintools/app/remove_ldap_user.py:505 lib/pp_admintools/app/remove_ldap_user.py:536
+#: lib/pp_admintools/app/remove_ldap_user.py:446 lib/pp_admintools/app/remove_ldap_user.py:473
+#: lib/pp_admintools/app/remove_ldap_user.py:504 lib/pp_admintools/app/remove_ldap_user.py:535
 msgid "Removing user {u!r} from group {g!r} ..."
 msgstr "Removing user {u!r} from group {g!r} …"
 
-#: lib/pp_admintools/app/remove_ldap_user.py:452 lib/pp_admintools/app/remove_ldap_user.py:479
-#: lib/pp_admintools/app/remove_ldap_user.py:510 lib/pp_admintools/app/remove_ldap_user.py:541
+#: lib/pp_admintools/app/remove_ldap_user.py:451 lib/pp_admintools/app/remove_ldap_user.py:478
+#: lib/pp_admintools/app/remove_ldap_user.py:509 lib/pp_admintools/app/remove_ldap_user.py:540
 msgid "{c} on removing user {dn!r} from group {g!r}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:468
+#: lib/pp_admintools/app/remove_ldap_user.py:467
 msgid "Did not found any unique group memberships of {dn!r} in {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:492
+#: lib/pp_admintools/app/remove_ldap_user.py:491
 msgid "Deleting user {uid!r} from all POSIX groups in {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:499
+#: lib/pp_admintools/app/remove_ldap_user.py:498
 msgid "Did not found any POSIX group memberships of {uid!r} in {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:523
+#: lib/pp_admintools/app/remove_ldap_user.py:522
 msgid "Deleting user {uid!r} from all sudo groups in {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:530
+#: lib/pp_admintools/app/remove_ldap_user.py:529
 msgid "Did not found any sudo group memberships of {uid!r} in {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:100
+#: lib/pp_admintools/app/set_ldap_password.py:104
 msgid "The ancient and notorious 3 DES crypt method."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:101 lib/pp_admintools/app/set_ldap_password.py:104
+#: lib/pp_admintools/app/set_ldap_password.py:105 lib/pp_admintools/app/set_ldap_password.py:108
 msgid "Pure {} hashing method."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:102 lib/pp_admintools/app/set_ldap_password.py:105
-#: lib/pp_admintools/app/set_ldap_password.py:107 lib/pp_admintools/app/set_ldap_password.py:109
+#: lib/pp_admintools/app/set_ldap_password.py:106 lib/pp_admintools/app/set_ldap_password.py:109
+#: lib/pp_admintools/app/set_ldap_password.py:111 lib/pp_admintools/app/set_ldap_password.py:113
 msgid "A {} based hashing algorithm."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:103 lib/pp_admintools/app/set_ldap_password.py:106
-#: lib/pp_admintools/app/set_ldap_password.py:108 lib/pp_admintools/app/set_ldap_password.py:110
+#: lib/pp_admintools/app/set_ldap_password.py:107 lib/pp_admintools/app/set_ldap_password.py:110
+#: lib/pp_admintools/app/set_ldap_password.py:112 lib/pp_admintools/app/set_ldap_password.py:114
 msgid "Salted {} hashing method."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:111
+#: lib/pp_admintools/app/set_ldap_password.py:115
 msgid "A hashing method derived from {} with additional computing rounds."
 msgstr ""
 
@@ -1066,147 +1102,147 @@ msgstr ""
 msgid "Do not check the quality of the new password with the {} library."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:246
-msgid "SCHEMA"
-msgstr ""
-
-#: lib/pp_admintools/app/set_ldap_password.py:247
+#: lib/pp_admintools/app/set_ldap_password.py:245
 msgid ""
 "The schema (hashing method) to use to hash the new password. It is possible to give here the "
 "value {val_list!r}, then all possible schemes are shown and exit. Default: {default!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:251
+#: lib/pp_admintools/app/set_ldap_password.py:250
 msgid "If you are not using an admin account, then the password will hashed only by the default schema."
 msgstr ""
 
 #: lib/pp_admintools/app/set_ldap_password.py:255
+msgid "SCHEMA"
+msgstr ""
+
+#: lib/pp_admintools/app/set_ldap_password.py:259
 msgid ""
 "The user, which password in the given LDAP instance should be changed. It may be given by its "
 "Uid (the alphanumeric POSIX name), its mail address or its LDAP DN."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:260
+#: lib/pp_admintools/app/set_ldap_password.py:264
 msgid "If not given, then your current user name {!r} will be used."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:263
+#: lib/pp_admintools/app/set_ldap_password.py:267
 msgid ""
 "If you are using a readonly LDAP instance or an instance w/o admin access, then you must provide"
 " somehow the current password of the user to change."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:316
+#: lib/pp_admintools/app/set_ldap_password.py:320
 msgid "Could not detect your current login name."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:321
+#: lib/pp_admintools/app/set_ldap_password.py:325
 msgid "The user {!r} will never be managed by LDAP."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:357
+#: lib/pp_admintools/app/set_ldap_password.py:361
 msgid "Usable Hashing schemes:"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:366
+#: lib/pp_admintools/app/set_ldap_password.py:370
 msgid "This schema cannot be used for authentication on a current freeradius server."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:370
+#: lib/pp_admintools/app/set_ldap_password.py:374
 msgid "This is the default schema."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:385
+#: lib/pp_admintools/app/set_ldap_password.py:389
 msgid "Using LDAP instance {inst!r} - {url}."
 msgstr "Using LDAP instance {inst!r} - {url}."
 
-#: lib/pp_admintools/app/set_ldap_password.py:389
+#: lib/pp_admintools/app/set_ldap_password.py:393
 msgid "Current password of user {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:390 lib/pp_admintools/app/set_ldap_password.py:410
+#: lib/pp_admintools/app/set_ldap_password.py:394 lib/pp_admintools/app/set_ldap_password.py:414
 msgid "Repeat password:"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:403
+#: lib/pp_admintools/app/set_ldap_password.py:407
 msgid "Non admin users must use the default schema {!r} for hashing their password."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:409
+#: lib/pp_admintools/app/set_ldap_password.py:413
 msgid "New password of user {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:416
+#: lib/pp_admintools/app/set_ldap_password.py:420
 msgid "Checking the quality of the new password was disabled."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:419
+#: lib/pp_admintools/app/set_ldap_password.py:423
 msgid "Testing quality of new password ..."
 msgstr "Testing quality of new password …"
 
-#: lib/pp_admintools/app/set_ldap_password.py:423
+#: lib/pp_admintools/app/set_ldap_password.py:427
 msgid "Quality of the new password is not sufficient:"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:428
+#: lib/pp_admintools/app/set_ldap_password.py:432
 msgid "Cannot testing the quality of the new password, because the Python module {!r} is not installed."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:455
+#: lib/pp_admintools/app/set_ldap_password.py:459
 msgid "Unbinding user connection from LDAP server {} ..."
 msgstr "Unbinding user connection from LDAP server {} …"
 
-#: lib/pp_admintools/app/set_ldap_password.py:466
+#: lib/pp_admintools/app/set_ldap_password.py:470
 msgid "Testing connect to LDAP-Server {url} with current user {dn!r} and password ..."
 msgstr "Testing connect to LDAP-Server {url} with current user {dn!r} and password …"
 
-#: lib/pp_admintools/app/set_ldap_password.py:478
+#: lib/pp_admintools/app/set_ldap_password.py:482
 msgid "Successful connected as {dn!r} to {url}."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:484
+#: lib/pp_admintools/app/set_ldap_password.py:488
 msgid "Could not connect to {url} as {dn!r}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:495
+#: lib/pp_admintools/app/set_ldap_password.py:499
 msgid "Trying to get current password hash of user {!r} ..."
 msgstr "Trying to get current password hash of user {!r} …"
 
-#: lib/pp_admintools/app/set_ldap_password.py:534
+#: lib/pp_admintools/app/set_ldap_password.py:538
 msgid ""
 "Please use another username, or use the correct DN from the following list as a parameter for "
 "this script instead of the username:"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:551
+#: lib/pp_admintools/app/set_ldap_password.py:555
 msgid "Changing the password of user {dn!r} in LDAP instance {inst}."
 msgstr "Changing the password of user {dn!r} in LDAP instance {inst}."
 
-#: lib/pp_admintools/app/set_ldap_password.py:558
+#: lib/pp_admintools/app/set_ldap_password.py:562
 msgid "Setting password of {dn!r} with hashing schema {schema!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:560
+#: lib/pp_admintools/app/set_ldap_password.py:564
 msgid "Setting password of '{dn}' with hashing schema '{schema}' ..."
 msgstr "Setting password of '{dn}' with hashing schema '{schema}' …"
 
-#: lib/pp_admintools/app/set_ldap_password.py:565
+#: lib/pp_admintools/app/set_ldap_password.py:569
 msgid "Current password hash: '{}'."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:568
+#: lib/pp_admintools/app/set_ldap_password.py:572
 msgid "The user '{}' has currently no password."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:572
+#: lib/pp_admintools/app/set_ldap_password.py:576
 msgid "Used schema: {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:574
+#: lib/pp_admintools/app/set_ldap_password.py:578
 msgid "New password hash: '{}'."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:578
+#: lib/pp_admintools/app/set_ldap_password.py:582
 msgid "Apply new password? [{yes}/{no}]?"
 msgstr ""
 
@@ -1226,6 +1262,26 @@ msgstr ""
 msgid "Value {v!r} for a {what} port must be greater than 0 and less than {max}."
 msgstr ""
 
+#: lib/pp_admintools/argparse_actions.py:65 lib/pp_admintools/argparse_actions.py:95
+msgid "Got a {c} for converting {v!r} into an integer value: {e}"
+msgstr ""
+
+#: lib/pp_admintools/argparse_actions.py:70
+msgid "The option must not be negative (given: {})."
+msgstr ""
+
+#: lib/pp_admintools/argparse_actions.py:101 lib/pp_admintools/argparse_actions.py:138
+msgid "The option must be greater or equal to {m} (given: {v})."
+msgstr ""
+
+#: lib/pp_admintools/argparse_actions.py:107 lib/pp_admintools/argparse_actions.py:143
+msgid "The option must be less or equal to {m} (given: {v})."
+msgstr ""
+
+#: lib/pp_admintools/argparse_actions.py:133
+msgid "Got a {c} for converting {v!r} into a float value: {e}"
+msgstr ""
+
 #: lib/pp_admintools/config/dns_deploy_zones.py:202 lib/pp_admintools/config/dns_deploy_zones.py:515
 #: lib/pp_admintools/config/mail.py:149 lib/pp_admintools/config/pdns.py:187
 msgid "Evaluating config section {!r}:"
@@ -1296,42 +1352,42 @@ msgstr ""
 msgid "Evaluated configuration:"
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:162
+#: lib/pp_admintools/config/ldap.py:174
 msgid "Invalid port {!r} for LDAP server given."
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:175
+#: lib/pp_admintools/config/ldap.py:187
 msgid "An empty Base DN for LDAP searches is not allowed."
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:265
+#: lib/pp_admintools/config/ldap.py:277
 msgid "Invalid production tier {!r} given."
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:408
+#: lib/pp_admintools/config/ldap.py:332
+msgid "Invalid value {val!r} in section {sec!r} for a LDAP {what}."
+msgstr ""
+
+#: lib/pp_admintools/config/ldap.py:401
+msgid "Unknown LDAP configuration key {key} found in section {sec!r}."
+msgstr ""
+
+#: lib/pp_admintools/config/ldap.py:505
 msgid "Evaluating LDAP config ..."
 msgstr "Evaluating LDAP config …"
 
-#: lib/pp_admintools/config/ldap.py:412
+#: lib/pp_admintools/config/ldap.py:509
 msgid "Evaluating LDAP section {!r} ..."
 msgstr "Evaluating LDAP section {!r} …"
 
-#: lib/pp_admintools/config/ldap.py:429
+#: lib/pp_admintools/config/ldap.py:526
 msgid "Value {!r} for a timeout is invalid."
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:449
+#: lib/pp_admintools/config/ldap.py:546
 msgid "Reading configuration of LDAP instance {!r} ..."
 msgstr "Reading configuration of LDAP instance {!r} …"
 
-#: lib/pp_admintools/config/ldap.py:457
-msgid "Invalid value {val!r} in section {sec!r} for a LDAP {what}."
-msgstr ""
-
-#: lib/pp_admintools/config/ldap.py:519
-msgid "Unknown LDAP configuration key {key} found in section {sec!r}."
-msgstr ""
-
 #: lib/pp_admintools/config/mail.py:170 lib/pp_admintools/config/mail.py:194
 #: lib/pp_admintools/config/mail.py:262
 msgid "Found invalid {what} {addr!r} in configuration."
index 4f4e2f577016d07613c1852ad320c880d3c8a0f9..fe015a56301fd77631e88b712e4a4095cc315936 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pp_admintools 0.9.1\n"
 "Report-Msgid-Bugs-To: frank.brehm@pixelpark.com\n"
-"POT-Creation-Date: 2022-10-17 17:45+0200\n"
+"POT-Creation-Date: 2022-10-18 18:12+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <frank.brehm@pixelpark.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -25,618 +25,619 @@ msgstr ""
 msgid "Options for {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:267
+#: lib/pp_admintools/app/dns_deploy_zones.py:266
 msgid "Keep a backup file for each changed configuration file."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:272
+#: lib/pp_admintools/app/dns_deploy_zones.py:271
 msgid "Keeping the temporary directory instead of removing it at the end (e.g. for debugging purposes)"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:300
+#: lib/pp_admintools/app/dns_deploy_zones.py:299
 msgid "Post init phase."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:304
+#: lib/pp_admintools/app/dns_deploy_zones.py:303
 msgid "My own post init phase."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:320
+#: lib/pp_admintools/app/dns_deploy_zones.py:319
 msgid "Unknown time zone: {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:340
+#: lib/pp_admintools/app/dns_deploy_zones.py:339
 msgid "You must be root to execute this script."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:342
+#: lib/pp_admintools/app/dns_deploy_zones.py:341
 msgid "But in simulation mode we are continuing nevertheless."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:352
+#: lib/pp_admintools/app/dns_deploy_zones.py:351
 msgid "Using the global DNS master is not supported, please use 'local' or 'public'"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:360
+#: lib/pp_admintools/app/dns_deploy_zones.py:359
 msgid "Starting: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:367
+#: lib/pp_admintools/app/dns_deploy_zones.py:366
 msgid "Could not occupy pidfile: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:392
+#: lib/pp_admintools/app/dns_deploy_zones.py:391
 msgid "Ending: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:397
+#: lib/pp_admintools/app/dns_deploy_zones.py:396
 msgid "Cleaning up ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:401
+#: lib/pp_admintools/app/dns_deploy_zones.py:400
 msgid "Searching for {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:404
+#: lib/pp_admintools/app/dns_deploy_zones.py:403
 msgid "Keep existing backup file {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:406
+#: lib/pp_admintools/app/dns_deploy_zones.py:405
 msgid "Removing {!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:412
+#: lib/pp_admintools/app/dns_deploy_zones.py:411
 msgid "Error removing {p!r} - {c}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:417
+#: lib/pp_admintools/app/dns_deploy_zones.py:416
 msgid "Temporary directory {!r} will not be removed. It's on yours to remove it manually."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:422
+#: lib/pp_admintools/app/dns_deploy_zones.py:421
 msgid "Destroying temporary directory {!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:431
+#: lib/pp_admintools/app/dns_deploy_zones.py:430
 msgid "Temporary directory: {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:436
+#: lib/pp_admintools/app/dns_deploy_zones.py:435
 msgid "Temporary zones conf: {!r}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:441
+#: lib/pp_admintools/app/dns_deploy_zones.py:440
 msgid "Trying to get all keys from named.conf ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:447 lib/pp_admintools/app/dns_deploy_zones.py:801
-#: lib/pp_admintools/app/dns_deploy_zones.py:837 lib/pp_admintools/app/dns_deploy_zones.py:869
-#: lib/pp_admintools/app/dns_deploy_zones.py:904 lib/pp_admintools/app/dns_deploy_zones.py:939
+#: lib/pp_admintools/app/dns_deploy_zones.py:446 lib/pp_admintools/app/dns_deploy_zones.py:800
+#: lib/pp_admintools/app/dns_deploy_zones.py:836 lib/pp_admintools/app/dns_deploy_zones.py:868
+#: lib/pp_admintools/app/dns_deploy_zones.py:903 lib/pp_admintools/app/dns_deploy_zones.py:938
 #: lib/pp_admintools/app/mail.py:326
 msgid "Executing: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:453 lib/pp_admintools/app/dns_deploy_zones.py:807
-#: lib/pp_admintools/app/ldap.py:766 lib/pp_admintools/app/ldap.py:819
-#: lib/pp_admintools/app/ldap.py:872 lib/pp_admintools/app/ldap.py:1103
-#: lib/pp_admintools/app/ldap.py:1137 lib/pp_admintools/app/ldap.py:1171
-#: lib/pp_admintools/app/ldap.py:1205
+#: lib/pp_admintools/app/dns_deploy_zones.py:452 lib/pp_admintools/app/dns_deploy_zones.py:806
+#: lib/pp_admintools/app/ldap.py:787 lib/pp_admintools/app/ldap.py:840
+#: lib/pp_admintools/app/ldap.py:893 lib/pp_admintools/app/ldap.py:1124
+#: lib/pp_admintools/app/ldap.py:1158 lib/pp_admintools/app/ldap.py:1192
+#: lib/pp_admintools/app/ldap.py:1226
 msgid "Result:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:494 lib/pp_admintools/app/dns_deploy_zones.py:496
+#: lib/pp_admintools/app/dns_deploy_zones.py:493 lib/pp_admintools/app/dns_deploy_zones.py:495
 msgid "Found named keys:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:496 lib/pp_admintools/app/dns_deploy_zones.py:527
+#: lib/pp_admintools/app/dns_deploy_zones.py:495 lib/pp_admintools/app/dns_deploy_zones.py:526
 msgid "None"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:501
+#: lib/pp_admintools/app/dns_deploy_zones.py:500
 msgid "Generating {} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:525 lib/pp_admintools/app/dns_deploy_zones.py:527
+#: lib/pp_admintools/app/dns_deploy_zones.py:524 lib/pp_admintools/app/dns_deploy_zones.py:526
 msgid "Collected server configuration:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:548
+#: lib/pp_admintools/app/dns_deploy_zones.py:547
 msgid "Generated file {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:564
+#: lib/pp_admintools/app/dns_deploy_zones.py:563
 msgid "Pure local zone {!r} will not be considered."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:596
+#: lib/pp_admintools/app/dns_deploy_zones.py:595
 msgid "Key {k!r} for zone {z!r} not found in named configuration."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:626
+#: lib/pp_admintools/app/dns_deploy_zones.py:625
 msgid "Got IPv4 tuples: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:650
+#: lib/pp_admintools/app/dns_deploy_zones.py:649
 msgid "Got IPv6 tokens: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:657
+#: lib/pp_admintools/app/dns_deploy_zones.py:656
 msgid "Comparing generated files with existing ones."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:664
+#: lib/pp_admintools/app/dns_deploy_zones.py:663
 msgid "Files to replace:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:670
+#: lib/pp_admintools/app/dns_deploy_zones.py:669
 msgid "Source file not defined."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:672
+#: lib/pp_admintools/app/dns_deploy_zones.py:671
 msgid "Target file not defined."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:674
+#: lib/pp_admintools/app/dns_deploy_zones.py:673
 msgid "Comparing {one!r} with {two!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:678 lib/pp_admintools/app/dns_deploy_zones.py:687
+#: lib/pp_admintools/app/dns_deploy_zones.py:677 lib/pp_admintools/app/dns_deploy_zones.py:686
 msgid "{what} {f!r} does not exists."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:679 lib/pp_admintools/app/dns_deploy_zones.py:683
+#: lib/pp_admintools/app/dns_deploy_zones.py:678 lib/pp_admintools/app/dns_deploy_zones.py:682
 msgid "Source file"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:682 lib/pp_admintools/app/dns_deploy_zones.py:692
+#: lib/pp_admintools/app/dns_deploy_zones.py:681 lib/pp_admintools/app/dns_deploy_zones.py:691
 msgid "{what} {f!r} is not a regular file."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:688 lib/pp_admintools/app/dns_deploy_zones.py:693
+#: lib/pp_admintools/app/dns_deploy_zones.py:687 lib/pp_admintools/app/dns_deploy_zones.py:692
 msgid "Target file"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:699 lib/pp_admintools/app/dns_deploy_zones.py:716
+#: lib/pp_admintools/app/dns_deploy_zones.py:698 lib/pp_admintools/app/dns_deploy_zones.py:715
 msgid "Reading {!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:709 lib/pp_admintools/app/dns_deploy_zones.py:726
+#: lib/pp_admintools/app/dns_deploy_zones.py:708 lib/pp_admintools/app/dns_deploy_zones.py:725
 msgid "Cleaned version of {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:731
+#: lib/pp_admintools/app/dns_deploy_zones.py:730
 msgid ""
 "Source file {sf!r} has different number essential lines ({sl}) than the target file {tf!r} ({tl}"
 " lines)."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:740
+#: lib/pp_admintools/app/dns_deploy_zones.py:739
 msgid "Source file {sf!r} has a different content than the target file {tf!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:752
+#: lib/pp_admintools/app/dns_deploy_zones.py:751
 msgid "No replacement of any config files necessary."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:755
+#: lib/pp_admintools/app/dns_deploy_zones.py:754
 msgid "Start replacing of config files ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:763 lib/pp_admintools/app/dns_deploy_zones.py:773
+#: lib/pp_admintools/app/dns_deploy_zones.py:762 lib/pp_admintools/app/dns_deploy_zones.py:772
 msgid "Copying {frm!r} => {to!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:769
+#: lib/pp_admintools/app/dns_deploy_zones.py:768
 msgid "All backuped config files:"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:781
+#: lib/pp_admintools/app/dns_deploy_zones.py:780
 msgid "Restoring of original config files because of an exception."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:785
+#: lib/pp_admintools/app/dns_deploy_zones.py:784
 msgid "Moving {frm!r} => {to!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:791
+#: lib/pp_admintools/app/dns_deploy_zones.py:790
 msgid "Could not find backup file {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:796
+#: lib/pp_admintools/app/dns_deploy_zones.py:795
 msgid "Checking syntax correctness of named.conf ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:817
+#: lib/pp_admintools/app/dns_deploy_zones.py:816
 msgid "Reload or restart of named is not necessary."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:822
+#: lib/pp_admintools/app/dns_deploy_zones.py:821
 msgid "Named is not running, please start it manually."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:833
+#: lib/pp_admintools/app/dns_deploy_zones.py:832
 msgid "Checking, whether named is running ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:851 lib/pp_admintools/app/dns_deploy_zones.py:886
-#: lib/pp_admintools/app/dns_deploy_zones.py:921 lib/pp_admintools/app/dns_deploy_zones.py:956
+#: lib/pp_admintools/app/dns_deploy_zones.py:850 lib/pp_admintools/app/dns_deploy_zones.py:885
+#: lib/pp_admintools/app/dns_deploy_zones.py:920 lib/pp_admintools/app/dns_deploy_zones.py:955
 msgid "Return value: {!r}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:853 lib/pp_admintools/app/dns_deploy_zones.py:855
-#: lib/pp_admintools/app/dns_deploy_zones.py:888 lib/pp_admintools/app/dns_deploy_zones.py:890
-#: lib/pp_admintools/app/dns_deploy_zones.py:923 lib/pp_admintools/app/dns_deploy_zones.py:925
-#: lib/pp_admintools/app/dns_deploy_zones.py:958 lib/pp_admintools/app/dns_deploy_zones.py:960
+#: lib/pp_admintools/app/dns_deploy_zones.py:852 lib/pp_admintools/app/dns_deploy_zones.py:854
+#: lib/pp_admintools/app/dns_deploy_zones.py:887 lib/pp_admintools/app/dns_deploy_zones.py:889
+#: lib/pp_admintools/app/dns_deploy_zones.py:922 lib/pp_admintools/app/dns_deploy_zones.py:924
+#: lib/pp_admintools/app/dns_deploy_zones.py:957 lib/pp_admintools/app/dns_deploy_zones.py:959
 msgid "Output on {}"
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:865
+#: lib/pp_admintools/app/dns_deploy_zones.py:864
 msgid "Starting {} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:900
+#: lib/pp_admintools/app/dns_deploy_zones.py:899
 msgid "Restarting {} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/dns_deploy_zones.py:935
+#: lib/pp_admintools/app/dns_deploy_zones.py:934
 msgid "Reloading {} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:108 lib/pp_admintools/app/ldap.py:211
+#: lib/pp_admintools/app/ldap.py:109 lib/pp_admintools/app/ldap.py:213
 msgid "The path {!r} must be an absolute path."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:114 lib/pp_admintools/app/ldap.py:215
-#: lib/pp_admintools/app/ldap.py:1219
+#: lib/pp_admintools/app/ldap.py:115 lib/pp_admintools/app/ldap.py:217
+#: lib/pp_admintools/app/ldap.py:1240
 msgid "The file {!r} does not exists."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:118 lib/pp_admintools/app/ldap.py:219
-#: lib/pp_admintools/app/ldap.py:1224
+#: lib/pp_admintools/app/ldap.py:119 lib/pp_admintools/app/ldap.py:221
+#: lib/pp_admintools/app/ldap.py:1245
 msgid "The given path {!r} exists, but is not a regular file."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:122 lib/pp_admintools/app/ldap.py:223
-#: lib/pp_admintools/app/ldap.py:1229
+#: lib/pp_admintools/app/ldap.py:123 lib/pp_admintools/app/ldap.py:225
+#: lib/pp_admintools/app/ldap.py:1250
 msgid "The given file {!r} is not readable."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:143
+#: lib/pp_admintools/app/ldap.py:144
 msgid "a port number must be greater than zero and less or equal to {}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:148
+#: lib/pp_admintools/app/ldap.py:149
 msgid "Wrong port number {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:256
+#: lib/pp_admintools/app/ldap.py:258
 msgid "LDAP options"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:258
+#: lib/pp_admintools/app/ldap.py:260
 msgid "Options for the default LDAP connection"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:260
+#: lib/pp_admintools/app/ldap.py:262
 msgid "Options fo LDAP connections"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:267 lib/pp_admintools/app/remove_ldap_user.py:280
-#: lib/pp_admintools/app/set_ldap_password.py:579
+#: lib/pp_admintools/app/ldap.py:269 lib/pp_admintools/app/remove_ldap_user.py:279
+#: lib/pp_admintools/app/set_ldap_password.py:583
 msgid "No"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:269
+#: lib/pp_admintools/app/ldap.py:271
 msgid "Yes"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:275
+#: lib/pp_admintools/app/ldap.py:277
 msgid "HOST"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:276
+#: lib/pp_admintools/app/ldap.py:278
 msgid "Hostname or address of the LDAP server to use. Default: {!r}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:283
+#: lib/pp_admintools/app/ldap.py:285
 msgid "Use ldaps to connect to the LDAP server. Default: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:288 lib/pp_admintools/app/mail.py:261
-#: lib/pp_admintools/app/pdns.py:274
+#: lib/pp_admintools/app/ldap.py:290 lib/pp_admintools/app/mail.py:261
+#: lib/pp_admintools/app/pdns.py:272
 msgid "PORT"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:290
+#: lib/pp_admintools/app/ldap.py:292
 msgid "The port number to connect to the LDAP server. Default: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:296
+#: lib/pp_admintools/app/ldap.py:298
 msgid "The base DN used as the root for the LDAP searches. Default: {!r}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:303
+#: lib/pp_admintools/app/ldap.py:305
 msgid "The Bind DN to use to connect to the LDAP server. Default: {!r}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:311 lib/pp_admintools/app/set_ldap_password.py:204
+#: lib/pp_admintools/app/ldap.py:313 lib/pp_admintools/app/set_ldap_password.py:204
 #: lib/pp_admintools/app/set_ldap_password.py:205 lib/pp_admintools/app/set_ldap_password.py:222
 #: lib/pp_admintools/app/set_ldap_password.py:225
 msgid "PASSWORD"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:312
+#: lib/pp_admintools/app/ldap.py:314
 msgid "Use PASSWORD as the password for simple LDAP authentication."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:317
+#: lib/pp_admintools/app/ldap.py:319
 msgid ""
 "Prompt for simple LDAP authentication. This is used instead of specifying the password on the "
 "command line."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:323 lib/pp_admintools/app/set_ldap_password.py:216
+#: lib/pp_admintools/app/ldap.py:325 lib/pp_admintools/app/set_ldap_password.py:216
 #: lib/pp_admintools/app/set_ldap_password.py:218
 msgid "PASSWORD_FILE"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:325
+#: lib/pp_admintools/app/ldap.py:327
 msgid "Use contents of PASSWORD_FILE as the password for simple authentication."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:333 lib/pp_admintools/app/pdns.py:248
+#: lib/pp_admintools/app/ldap.py:335 lib/pp_admintools/app/pdns.py:246
 msgid "INSTANCE"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:336
-msgid ""
-"The LDAP instance (LDAP cluster) from configuration, where to execute this script. If not given,"
-" then the instance {!r} will be used."
+#: lib/pp_admintools/app/ldap.py:338
+msgid "If not given, then the instance {!r} will be used."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:339
+#: lib/pp_admintools/app/ldap.py:341
+msgid "The LDAP instance (LDAP cluster) from configuration, where to execute this script."
+msgstr ""
+
+#: lib/pp_admintools/app/ldap.py:345
 msgid ""
 "The LDAP instance (LDAP cluster) from configuration, where to execute this script. It is "
 "possible to give here the value {val_all!r}, then all found LDAP instances except {default!r} "
 "are used. It is alo possible to give the value {val_list!r}, then all configured LDAP instances "
-"are shown, and the application is exiting. If not given, then the instance {default!r} will be "
-"used."
+"are shown, and the application is exiting."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:358
+#: lib/pp_admintools/app/ldap.py:371 lib/pp_admintools/app/mirror_ldap.py:89
 msgid "SECONDS"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:360
+#: lib/pp_admintools/app/ldap.py:373
 msgid "Using the given timeout in seconds for all LDAP operations. Default: {}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:394
+#: lib/pp_admintools/app/ldap.py:407
 msgid "Checking given instances."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:398
+#: lib/pp_admintools/app/ldap.py:411
 msgid "Given insts:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:449
+#: lib/pp_admintools/app/ldap.py:462
 msgid "Configured LDAP instances:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:466
+#: lib/pp_admintools/app/ldap.py:479
 msgid "Verifying given instances ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:477
+#: lib/pp_admintools/app/ldap.py:492
 msgid "Used filter:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:507 lib/pp_admintools/app/remove_ldap_user.py:181
-msgid "LDAP instance {!r} not found in configuration."
+#: lib/pp_admintools/app/ldap.py:526
+msgid "LDAP instance {!r} not found in configuration or is not usable."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:515
+#: lib/pp_admintools/app/ldap.py:536
 msgid "LDAP instances to use:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:564
+#: lib/pp_admintools/app/ldap.py:585
 msgid "Preparations ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:567
+#: lib/pp_admintools/app/ldap.py:588
 msgid "Open all necessary LDAP connections ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:581
+#: lib/pp_admintools/app/ldap.py:602
 msgid "Password of user {usr} on LDAP instance {inst}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:590
+#: lib/pp_admintools/app/ldap.py:611
 msgid "Info about LDAP server {}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:600
+#: lib/pp_admintools/app/ldap.py:621
 msgid "Trying to get LDAP server object for {} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:616
+#: lib/pp_admintools/app/ldap.py:637
 msgid "Connect options to server {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:623
+#: lib/pp_admintools/app/ldap.py:644
 msgid "LDAP server {s}: {re}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:637
+#: lib/pp_admintools/app/ldap.py:658
 msgid "Connecting to LDAP server {url} as {dn!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:649
+#: lib/pp_admintools/app/ldap.py:670
 msgid "Finishing ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:658
+#: lib/pp_admintools/app/ldap.py:679
 msgid "Disconnecting from all remaining LDAP instances ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:671
+#: lib/pp_admintools/app/ldap.py:692
 msgid "Unbinding from LDAP server {!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:678
+#: lib/pp_admintools/app/ldap.py:699
 msgid "Disconnecting from LDAP server {!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:687
+#: lib/pp_admintools/app/ldap.py:708
 msgid "Trying to evaluate DN of user {user!r} in LDAP instance {inst} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:692
+#: lib/pp_admintools/app/ldap.py:713
 msgid "Trying to evaluate DN of user {u!r} as a mail address ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:699
+#: lib/pp_admintools/app/ldap.py:720
 msgid "Trying to evaluate DN of user {u!r} as a LDAP DN ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:706
+#: lib/pp_admintools/app/ldap.py:727
 msgid "Trying to evaluate DN of user {u!r} as a UID (Posix user name) ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:715 lib/pp_admintools/app/remove_ldap_user.py:300
+#: lib/pp_admintools/app/ldap.py:736 lib/pp_admintools/app/remove_ldap_user.py:299
 msgid "Empty user given."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:718
+#: lib/pp_admintools/app/ldap.py:739
 msgid "Trying to evaluate DN of user {u!r} as a CN ({c}) ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:748 lib/pp_admintools/app/ldap.py:801
-#: lib/pp_admintools/app/ldap.py:854 lib/pp_admintools/app/ldap.py:1088
-#: lib/pp_admintools/app/ldap.py:1122 lib/pp_admintools/app/ldap.py:1156
-#: lib/pp_admintools/app/ldap.py:1190
+#: lib/pp_admintools/app/ldap.py:769 lib/pp_admintools/app/ldap.py:822
+#: lib/pp_admintools/app/ldap.py:875 lib/pp_admintools/app/ldap.py:1109
+#: lib/pp_admintools/app/ldap.py:1143 lib/pp_admintools/app/ldap.py:1177
+#: lib/pp_admintools/app/ldap.py:1211
 msgid "Searching in {uri}/{bdn} with filter: {fltr}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:759
+#: lib/pp_admintools/app/ldap.py:780
 msgid "Result of searching for mail address {m!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:763 lib/pp_admintools/app/ldap.py:816
-#: lib/pp_admintools/app/ldap.py:869 lib/pp_admintools/app/ldap.py:957
-#: lib/pp_admintools/app/ldap.py:1100 lib/pp_admintools/app/ldap.py:1134
-#: lib/pp_admintools/app/ldap.py:1168 lib/pp_admintools/app/ldap.py:1202
+#: lib/pp_admintools/app/ldap.py:784 lib/pp_admintools/app/ldap.py:837
+#: lib/pp_admintools/app/ldap.py:890 lib/pp_admintools/app/ldap.py:978
+#: lib/pp_admintools/app/ldap.py:1121 lib/pp_admintools/app/ldap.py:1155
+#: lib/pp_admintools/app/ldap.py:1189 lib/pp_admintools/app/ldap.py:1223
 msgid "Got a response entry:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:770
+#: lib/pp_admintools/app/ldap.py:791
 msgid "User with mail address {m!r} not found in {uri}/{bdn}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:812
+#: lib/pp_admintools/app/ldap.py:833
 msgid "Result of searching for uid {u!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:823
+#: lib/pp_admintools/app/ldap.py:844
 msgid "User with uid {u!r} not found in {uri}/{bdn}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:865
+#: lib/pp_admintools/app/ldap.py:886
 msgid "Result of searching for CN {cn!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:876
+#: lib/pp_admintools/app/ldap.py:897
 msgid "User with cn {cn!r} not found in {uri}/{bdn}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:893 lib/pp_admintools/app/set_ldap_password.py:504
+#: lib/pp_admintools/app/ldap.py:914 lib/pp_admintools/app/set_ldap_password.py:508
 msgid "User with DN {dn!r} not found in {uri}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:911
+#: lib/pp_admintools/app/ldap.py:932
 msgid "ObjectClasses of {dn!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:921
+#: lib/pp_admintools/app/ldap.py:942
 msgid "Entry {dn!r} in {uri} seems not to be an account."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:943
+#: lib/pp_admintools/app/ldap.py:964
 msgid "Searching DN {dn!r} in {uri}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:953
+#: lib/pp_admintools/app/ldap.py:974
 msgid "Result of searching for DN {dn!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:961
+#: lib/pp_admintools/app/ldap.py:982
 msgid "Entry with DN {dn!r} not found in {uri}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1002
+#: lib/pp_admintools/app/ldap.py:1023
 msgid "Applying changes on {uri} to DN {dn!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1007
+#: lib/pp_admintools/app/ldap.py:1028
 msgid "Simulation mode - changes are not applied."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1013
+#: lib/pp_admintools/app/ldap.py:1034
 msgid "Modification NOT successfull - {c}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1014 lib/pp_admintools/app/remove_ldap_user.py:427
-#: lib/pp_admintools/app/remove_ldap_user.py:454 lib/pp_admintools/app/remove_ldap_user.py:481
-#: lib/pp_admintools/app/remove_ldap_user.py:512 lib/pp_admintools/app/remove_ldap_user.py:543
+#: lib/pp_admintools/app/ldap.py:1035 lib/pp_admintools/app/remove_ldap_user.py:426
+#: lib/pp_admintools/app/remove_ldap_user.py:453 lib/pp_admintools/app/remove_ldap_user.py:480
+#: lib/pp_admintools/app/remove_ldap_user.py:511 lib/pp_admintools/app/remove_ldap_user.py:542
 #: lib/pp_admintools/app/set_ldap_password.py:612
 msgid "Changes:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1026
+#: lib/pp_admintools/app/ldap.py:1047
 msgid "Modification status: {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1028
+#: lib/pp_admintools/app/ldap.py:1049
 msgid "Result of modifying:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1031
+#: lib/pp_admintools/app/ldap.py:1052
 msgid "Modification NOT successful: {desc} - {msg}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1035
+#: lib/pp_admintools/app/ldap.py:1056
 msgid "Modification successful."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1045
+#: lib/pp_admintools/app/ldap.py:1066
 msgid "Deleting LDAP entry {dn!r} on {uri} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1050
+#: lib/pp_admintools/app/ldap.py:1071
 msgid "Simulation mode - deletion will not be executed."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1056
+#: lib/pp_admintools/app/ldap.py:1077
 msgid "Deletion NOT successfull - {c}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1060
+#: lib/pp_admintools/app/ldap.py:1081
 msgid "Deletion status: {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1062
+#: lib/pp_admintools/app/ldap.py:1083
 msgid "Result of deletion:"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1065
+#: lib/pp_admintools/app/ldap.py:1086
 msgid "Deletion NOT successful: {desc} - {msg}"
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1069
+#: lib/pp_admintools/app/ldap.py:1090
 msgid "Deletion successful."
 msgstr ""
 
-#: lib/pp_admintools/app/ldap.py:1216
+#: lib/pp_admintools/app/ldap.py:1237
 msgid "Reading password file {!r} ..."
 msgstr ""
 
@@ -721,103 +722,134 @@ msgstr ""
 msgid "Did not found sendmail executable."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:100 lib/pp_admintools/app/pdns.py:184
+#: lib/pp_admintools/app/mirror_ldap.py:70
+msgid ""
+"Mirror the content of a complete LDAP instance (server or cluster) to another instance. This "
+"will be done first by clearing the target instance, then copying structural entries from the "
+"source to the target instance and then copying all other entries. During this some "
+"transformations are done, like substituting the content of some entry attributes by another "
+"values."
+msgstr ""
+
+#: lib/pp_admintools/app/mirror_ldap.py:86
+msgid "Miroring options"
+msgstr ""
+
+#: lib/pp_admintools/app/mirror_ldap.py:91
+msgid ""
+"Number of seconds to wait after each write operation. Given as a float value, and if set to "
+"zero, there is no waiting after a write. (default: {:.1f})"
+msgstr ""
+
+#: lib/pp_admintools/app/mirror_ldap.py:98
+msgid "NUMBER"
+msgstr ""
+
+#: lib/pp_admintools/app/mirror_ldap.py:100
+msgid "Limiting the mirroring to the first NUMBER entries. This option is valid only in simulation mode."
+msgstr ""
+
+#: lib/pp_admintools/app/mirror_ldap.py:107
+msgid "Mirror only structural entries (entries with childs)."
+msgstr ""
+
+#: lib/pp_admintools/app/pdns.py:99 lib/pp_admintools/app/pdns.py:183
 msgid "Configuration not available."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:114
+#: lib/pp_admintools/app/pdns.py:113
 msgid "Invalid API key {!r} given."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:126
+#: lib/pp_admintools/app/pdns.py:125
 msgid "Invalid API host {!r} given."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:139
+#: lib/pp_admintools/app/pdns.py:138
 msgid "Invalid API port {!r} given."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:151
+#: lib/pp_admintools/app/pdns.py:150
 msgid "Invalid API server name {!r} given."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:169 lib/pp_admintools/app/pdns.py:172
+#: lib/pp_admintools/app/pdns.py:168 lib/pp_admintools/app/pdns.py:171
 msgid "Invalid instance {!r} given."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:180
+#: lib/pp_admintools/app/pdns.py:179
 msgid "Evaluating instance {!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:188
+#: lib/pp_admintools/app/pdns.py:187
 msgid "PDNS instance {!r} is not configured."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:239
+#: lib/pp_admintools/app/pdns.py:238
 msgid "PowerDNS API options"
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:249
+#: lib/pp_admintools/app/pdns.py:247
 msgid "Select, which PowerDNS instance to use. Valid values: {v}, default: {d!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:257 lib/pp_admintools/app/pdns.py:263
-#: lib/pp_admintools/app/pdns.py:269
+#: lib/pp_admintools/app/pdns.py:255 lib/pp_admintools/app/pdns.py:261
+#: lib/pp_admintools/app/pdns.py:267
 msgid "Using the {!r} PowerDNS instance."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:277
+#: lib/pp_admintools/app/pdns.py:275
 msgid "Which port to connect to PowerDNS API, default: {}."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:302
+#: lib/pp_admintools/app/pdns.py:300
 msgid "No path given for{d} [{s}]/{k} in configuration."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:309
+#: lib/pp_admintools/app/pdns.py:307
 msgid "Path {p!r} for{d} [{s}]/{k} in configuration must be an absolute path."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:332 lib/pp_admintools/app/pdns.py:368
-#: lib/pp_admintools/app/pdns.py:395
+#: lib/pp_admintools/app/pdns.py:330 lib/pp_admintools/app/pdns.py:366
+#: lib/pp_admintools/app/pdns.py:393
 msgid "Executing {} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:370
+#: lib/pp_admintools/app/pdns.py:368
 msgid "Setting Loglevel of the requests module to {}."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:384
+#: lib/pp_admintools/app/pdns.py:382
 msgid "Executing nothing ..."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:404 lib/pp_admintools/app/pdns.py:426
-#: lib/pp_admintools/app/pdns.py:437 lib/pp_admintools/app/pdns.py:447
+#: lib/pp_admintools/app/pdns.py:402 lib/pp_admintools/app/pdns.py:424
+#: lib/pp_admintools/app/pdns.py:435 lib/pp_admintools/app/pdns.py:445
 msgid "The PDNS server object does not exists."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:406 lib/pp_admintools/app/pdns.py:428
-#: lib/pp_admintools/app/pdns.py:439 lib/pp_admintools/app/pdns.py:449
+#: lib/pp_admintools/app/pdns.py:404 lib/pp_admintools/app/pdns.py:426
+#: lib/pp_admintools/app/pdns.py:437 lib/pp_admintools/app/pdns.py:447
 msgid "The PDNS server object is not initialized."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:457
+#: lib/pp_admintools/app/pdns.py:455
 msgid "Trying to get complete information about zone {!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:463
+#: lib/pp_admintools/app/pdns.py:461
 msgid "The given zone {} was not found."
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:466
+#: lib/pp_admintools/app/pdns.py:464
 msgid "Got a response:"
 msgstr ""
 
-#: lib/pp_admintools/app/pdns.py:471
+#: lib/pp_admintools/app/pdns.py:469
 msgid "Zone object:"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:70
+#: lib/pp_admintools/app/remove_ldap_user.py:69
 msgid ""
 "Disables or removes the given users from LDAP. If disabling, then the user will not be really "
 "removed, but disabled by locking the password, setting all status flags to {inact!r}, assigning "
@@ -825,215 +857,219 @@ msgid ""
 "user will be really removed from LDAP."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:115
+#: lib/pp_admintools/app/remove_ldap_user.py:114
 msgid "Removing options"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:118
+#: lib/pp_admintools/app/remove_ldap_user.py:117
 msgid "This is the default."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:119
+#: lib/pp_admintools/app/remove_ldap_user.py:118
 msgid "This is mutually exclusive to {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:121
+#: lib/pp_admintools/app/remove_ldap_user.py:120
 msgid "Deactivating the user instead of removing it."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:128
+#: lib/pp_admintools/app/remove_ldap_user.py:127
 msgid "Removing the user from LDAP."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:136 lib/pp_admintools/app/set_ldap_password.py:269
-#: lib/pp_admintools/app/set_ldap_password.py:272
+#: lib/pp_admintools/app/remove_ldap_user.py:135 lib/pp_admintools/app/set_ldap_password.py:273
+#: lib/pp_admintools/app/set_ldap_password.py:276
 msgid "USER"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:137
+#: lib/pp_admintools/app/remove_ldap_user.py:136
 msgid ""
 "The user, which should be deactivated or removed. They may be given by their Uid (the "
 "alphanumeric POSIX name), their mail address or their LDAP DN (be aware, that this may be "
 "different in the particular LDAP instances)."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:161
+#: lib/pp_admintools/app/remove_ldap_user.py:160
 msgid "No users to remove given."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:174
+#: lib/pp_admintools/app/remove_ldap_user.py:173
 msgid "Checking given instances for admin and read/write access."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:189
+#: lib/pp_admintools/app/remove_ldap_user.py:180
+msgid "LDAP instance {!r} not found in configuration."
+msgstr ""
+
+#: lib/pp_admintools/app/remove_ldap_user.py:188
 msgid "LDAP instance {!r} has only readonly access."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:194
+#: lib/pp_admintools/app/remove_ldap_user.py:193
 msgid "No admin access to LDAP instance {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:211
+#: lib/pp_admintools/app/remove_ldap_user.py:210
 msgid "All given users were not found in any LDAP instance."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:216
+#: lib/pp_admintools/app/remove_ldap_user.py:215
 msgid "Evaluated DNs to remove:"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:225
+#: lib/pp_admintools/app/remove_ldap_user.py:224
 msgid "Start disabling user entries in:"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:227
+#: lib/pp_admintools/app/remove_ldap_user.py:226
 msgid "Start removing user entries in:"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:231
+#: lib/pp_admintools/app/remove_ldap_user.py:230
 msgid "Start disabling user entries ..."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:233
+#: lib/pp_admintools/app/remove_ldap_user.py:232
 msgid "Start removing user entries ..."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:248
+#: lib/pp_admintools/app/remove_ldap_user.py:247
 msgid "Do you really want to deactivate the following users?"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:250
+#: lib/pp_admintools/app/remove_ldap_user.py:249
 msgid "Do you really want to remove the following users?"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:276
+#: lib/pp_admintools/app/remove_ldap_user.py:275
 msgid "Deactivate [{yes}/{no}]?"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:278
+#: lib/pp_admintools/app/remove_ldap_user.py:277
 msgid "Remove [{yes}/{no}]?"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:280 lib/pp_admintools/app/set_ldap_password.py:579
+#: lib/pp_admintools/app/remove_ldap_user.py:279 lib/pp_admintools/app/set_ldap_password.py:583
 msgid "yes"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:285
+#: lib/pp_admintools/app/remove_ldap_user.py:284
 msgid "Abort deactivating by {cls}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:287
+#: lib/pp_admintools/app/remove_ldap_user.py:286
 msgid "Abort removing by {cls}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:296
+#: lib/pp_admintools/app/remove_ldap_user.py:295
 msgid "Evaluating DNs of the user {!r} to remove ..."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:310 lib/pp_admintools/app/set_ldap_password.py:527
+#: lib/pp_admintools/app/remove_ldap_user.py:309 lib/pp_admintools/app/set_ldap_password.py:531
 msgid "Got DN {dn!r} for user {user!r} in LDAP instance {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:317 lib/pp_admintools/app/set_ldap_password.py:532
+#: lib/pp_admintools/app/remove_ldap_user.py:316 lib/pp_admintools/app/set_ldap_password.py:536
 msgid "Found {nr} entries for user {u!r} in LDAP instance {i}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:329 lib/pp_admintools/app/set_ldap_password.py:546
+#: lib/pp_admintools/app/remove_ldap_user.py:328 lib/pp_admintools/app/set_ldap_password.py:550
 msgid "Did not found user {user!r} in LDAP instance {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:338
+#: lib/pp_admintools/app/remove_ldap_user.py:337
 msgid "Deactivating all given users from {} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:340
+#: lib/pp_admintools/app/remove_ldap_user.py:339
 msgid "Removing all given users from {} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:355
+#: lib/pp_admintools/app/remove_ldap_user.py:354
 msgid "Deactivating user {dn!r} from {inst} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:358
+#: lib/pp_admintools/app/remove_ldap_user.py:357
 msgid "Removing user {dn!r} from {inst} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:364
+#: lib/pp_admintools/app/remove_ldap_user.py:363
 msgid "Attributes of {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:385
+#: lib/pp_admintools/app/remove_ldap_user.py:384
 msgid "{c} on removing user {dn!r}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:391
+#: lib/pp_admintools/app/remove_ldap_user.py:390
 msgid "User {dn!r} successful deactivated on {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:394
+#: lib/pp_admintools/app/remove_ldap_user.py:393
 msgid "User {dn!r} successful removed from {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:420
+#: lib/pp_admintools/app/remove_ldap_user.py:419
 msgid "Updating user info for {dn!r} on {inst} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:425 lib/pp_admintools/app/set_ldap_password.py:610
+#: lib/pp_admintools/app/remove_ldap_user.py:424 lib/pp_admintools/app/set_ldap_password.py:610
 msgid "{c} on deactivating user {dn!r}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:441
+#: lib/pp_admintools/app/remove_ldap_user.py:440
 msgid "Did not found any group memberships of {dn!r} in {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:447 lib/pp_admintools/app/remove_ldap_user.py:474
-#: lib/pp_admintools/app/remove_ldap_user.py:505 lib/pp_admintools/app/remove_ldap_user.py:536
+#: lib/pp_admintools/app/remove_ldap_user.py:446 lib/pp_admintools/app/remove_ldap_user.py:473
+#: lib/pp_admintools/app/remove_ldap_user.py:504 lib/pp_admintools/app/remove_ldap_user.py:535
 msgid "Removing user {u!r} from group {g!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:452 lib/pp_admintools/app/remove_ldap_user.py:479
-#: lib/pp_admintools/app/remove_ldap_user.py:510 lib/pp_admintools/app/remove_ldap_user.py:541
+#: lib/pp_admintools/app/remove_ldap_user.py:451 lib/pp_admintools/app/remove_ldap_user.py:478
+#: lib/pp_admintools/app/remove_ldap_user.py:509 lib/pp_admintools/app/remove_ldap_user.py:540
 msgid "{c} on removing user {dn!r} from group {g!r}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:468
+#: lib/pp_admintools/app/remove_ldap_user.py:467
 msgid "Did not found any unique group memberships of {dn!r} in {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:492
+#: lib/pp_admintools/app/remove_ldap_user.py:491
 msgid "Deleting user {uid!r} from all POSIX groups in {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:499
+#: lib/pp_admintools/app/remove_ldap_user.py:498
 msgid "Did not found any POSIX group memberships of {uid!r} in {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:523
+#: lib/pp_admintools/app/remove_ldap_user.py:522
 msgid "Deleting user {uid!r} from all sudo groups in {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/remove_ldap_user.py:530
+#: lib/pp_admintools/app/remove_ldap_user.py:529
 msgid "Did not found any sudo group memberships of {uid!r} in {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:100
+#: lib/pp_admintools/app/set_ldap_password.py:104
 msgid "The ancient and notorious 3 DES crypt method."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:101 lib/pp_admintools/app/set_ldap_password.py:104
+#: lib/pp_admintools/app/set_ldap_password.py:105 lib/pp_admintools/app/set_ldap_password.py:108
 msgid "Pure {} hashing method."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:102 lib/pp_admintools/app/set_ldap_password.py:105
-#: lib/pp_admintools/app/set_ldap_password.py:107 lib/pp_admintools/app/set_ldap_password.py:109
+#: lib/pp_admintools/app/set_ldap_password.py:106 lib/pp_admintools/app/set_ldap_password.py:109
+#: lib/pp_admintools/app/set_ldap_password.py:111 lib/pp_admintools/app/set_ldap_password.py:113
 msgid "A {} based hashing algorithm."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:103 lib/pp_admintools/app/set_ldap_password.py:106
-#: lib/pp_admintools/app/set_ldap_password.py:108 lib/pp_admintools/app/set_ldap_password.py:110
+#: lib/pp_admintools/app/set_ldap_password.py:107 lib/pp_admintools/app/set_ldap_password.py:110
+#: lib/pp_admintools/app/set_ldap_password.py:112 lib/pp_admintools/app/set_ldap_password.py:114
 msgid "Salted {} hashing method."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:111
+#: lib/pp_admintools/app/set_ldap_password.py:115
 msgid "A hashing method derived from {} with additional computing rounds."
 msgstr ""
 
@@ -1065,147 +1101,147 @@ msgstr ""
 msgid "Do not check the quality of the new password with the {} library."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:246
-msgid "SCHEMA"
-msgstr ""
-
-#: lib/pp_admintools/app/set_ldap_password.py:247
+#: lib/pp_admintools/app/set_ldap_password.py:245
 msgid ""
 "The schema (hashing method) to use to hash the new password. It is possible to give here the "
 "value {val_list!r}, then all possible schemes are shown and exit. Default: {default!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:251
+#: lib/pp_admintools/app/set_ldap_password.py:250
 msgid "If you are not using an admin account, then the password will hashed only by the default schema."
 msgstr ""
 
 #: lib/pp_admintools/app/set_ldap_password.py:255
+msgid "SCHEMA"
+msgstr ""
+
+#: lib/pp_admintools/app/set_ldap_password.py:259
 msgid ""
 "The user, which password in the given LDAP instance should be changed. It may be given by its "
 "Uid (the alphanumeric POSIX name), its mail address or its LDAP DN."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:260
+#: lib/pp_admintools/app/set_ldap_password.py:264
 msgid "If not given, then your current user name {!r} will be used."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:263
+#: lib/pp_admintools/app/set_ldap_password.py:267
 msgid ""
 "If you are using a readonly LDAP instance or an instance w/o admin access, then you must provide"
 " somehow the current password of the user to change."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:316
+#: lib/pp_admintools/app/set_ldap_password.py:320
 msgid "Could not detect your current login name."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:321
+#: lib/pp_admintools/app/set_ldap_password.py:325
 msgid "The user {!r} will never be managed by LDAP."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:357
+#: lib/pp_admintools/app/set_ldap_password.py:361
 msgid "Usable Hashing schemes:"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:366
+#: lib/pp_admintools/app/set_ldap_password.py:370
 msgid "This schema cannot be used for authentication on a current freeradius server."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:370
+#: lib/pp_admintools/app/set_ldap_password.py:374
 msgid "This is the default schema."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:385
+#: lib/pp_admintools/app/set_ldap_password.py:389
 msgid "Using LDAP instance {inst!r} - {url}."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:389
+#: lib/pp_admintools/app/set_ldap_password.py:393
 msgid "Current password of user {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:390 lib/pp_admintools/app/set_ldap_password.py:410
+#: lib/pp_admintools/app/set_ldap_password.py:394 lib/pp_admintools/app/set_ldap_password.py:414
 msgid "Repeat password:"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:403
+#: lib/pp_admintools/app/set_ldap_password.py:407
 msgid "Non admin users must use the default schema {!r} for hashing their password."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:409
+#: lib/pp_admintools/app/set_ldap_password.py:413
 msgid "New password of user {!r}:"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:416
+#: lib/pp_admintools/app/set_ldap_password.py:420
 msgid "Checking the quality of the new password was disabled."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:419
+#: lib/pp_admintools/app/set_ldap_password.py:423
 msgid "Testing quality of new password ..."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:423
+#: lib/pp_admintools/app/set_ldap_password.py:427
 msgid "Quality of the new password is not sufficient:"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:428
+#: lib/pp_admintools/app/set_ldap_password.py:432
 msgid "Cannot testing the quality of the new password, because the Python module {!r} is not installed."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:455
+#: lib/pp_admintools/app/set_ldap_password.py:459
 msgid "Unbinding user connection from LDAP server {} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:466
+#: lib/pp_admintools/app/set_ldap_password.py:470
 msgid "Testing connect to LDAP-Server {url} with current user {dn!r} and password ..."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:478
+#: lib/pp_admintools/app/set_ldap_password.py:482
 msgid "Successful connected as {dn!r} to {url}."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:484
+#: lib/pp_admintools/app/set_ldap_password.py:488
 msgid "Could not connect to {url} as {dn!r}: {e}"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:495
+#: lib/pp_admintools/app/set_ldap_password.py:499
 msgid "Trying to get current password hash of user {!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:534
+#: lib/pp_admintools/app/set_ldap_password.py:538
 msgid ""
 "Please use another username, or use the correct DN from the following list as a parameter for "
 "this script instead of the username:"
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:551
+#: lib/pp_admintools/app/set_ldap_password.py:555
 msgid "Changing the password of user {dn!r} in LDAP instance {inst}."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:558
+#: lib/pp_admintools/app/set_ldap_password.py:562
 msgid "Setting password of {dn!r} with hashing schema {schema!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:560
+#: lib/pp_admintools/app/set_ldap_password.py:564
 msgid "Setting password of '{dn}' with hashing schema '{schema}' ..."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:565
+#: lib/pp_admintools/app/set_ldap_password.py:569
 msgid "Current password hash: '{}'."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:568
+#: lib/pp_admintools/app/set_ldap_password.py:572
 msgid "The user '{}' has currently no password."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:572
+#: lib/pp_admintools/app/set_ldap_password.py:576
 msgid "Used schema: {!r}."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:574
+#: lib/pp_admintools/app/set_ldap_password.py:578
 msgid "New password hash: '{}'."
 msgstr ""
 
-#: lib/pp_admintools/app/set_ldap_password.py:578
+#: lib/pp_admintools/app/set_ldap_password.py:582
 msgid "Apply new password? [{yes}/{no}]?"
 msgstr ""
 
@@ -1225,6 +1261,26 @@ msgstr ""
 msgid "Value {v!r} for a {what} port must be greater than 0 and less than {max}."
 msgstr ""
 
+#: lib/pp_admintools/argparse_actions.py:65 lib/pp_admintools/argparse_actions.py:95
+msgid "Got a {c} for converting {v!r} into an integer value: {e}"
+msgstr ""
+
+#: lib/pp_admintools/argparse_actions.py:70
+msgid "The option must not be negative (given: {})."
+msgstr ""
+
+#: lib/pp_admintools/argparse_actions.py:101 lib/pp_admintools/argparse_actions.py:138
+msgid "The option must be greater or equal to {m} (given: {v})."
+msgstr ""
+
+#: lib/pp_admintools/argparse_actions.py:107 lib/pp_admintools/argparse_actions.py:143
+msgid "The option must be less or equal to {m} (given: {v})."
+msgstr ""
+
+#: lib/pp_admintools/argparse_actions.py:133
+msgid "Got a {c} for converting {v!r} into a float value: {e}"
+msgstr ""
+
 #: lib/pp_admintools/config/dns_deploy_zones.py:202 lib/pp_admintools/config/dns_deploy_zones.py:515
 #: lib/pp_admintools/config/mail.py:149 lib/pp_admintools/config/pdns.py:187
 msgid "Evaluating config section {!r}:"
@@ -1295,40 +1351,40 @@ msgstr ""
 msgid "Evaluated configuration:"
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:162
+#: lib/pp_admintools/config/ldap.py:174
 msgid "Invalid port {!r} for LDAP server given."
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:175
+#: lib/pp_admintools/config/ldap.py:187
 msgid "An empty Base DN for LDAP searches is not allowed."
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:265
+#: lib/pp_admintools/config/ldap.py:277
 msgid "Invalid production tier {!r} given."
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:408
-msgid "Evaluating LDAP config ..."
+#: lib/pp_admintools/config/ldap.py:332
+msgid "Invalid value {val!r} in section {sec!r} for a LDAP {what}."
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:412
-msgid "Evaluating LDAP section {!r} ..."
+#: lib/pp_admintools/config/ldap.py:401
+msgid "Unknown LDAP configuration key {key} found in section {sec!r}."
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:429
-msgid "Value {!r} for a timeout is invalid."
+#: lib/pp_admintools/config/ldap.py:505
+msgid "Evaluating LDAP config ..."
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:449
-msgid "Reading configuration of LDAP instance {!r} ..."
+#: lib/pp_admintools/config/ldap.py:509
+msgid "Evaluating LDAP section {!r} ..."
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:457
-msgid "Invalid value {val!r} in section {sec!r} for a LDAP {what}."
+#: lib/pp_admintools/config/ldap.py:526
+msgid "Value {!r} for a timeout is invalid."
 msgstr ""
 
-#: lib/pp_admintools/config/ldap.py:519
-msgid "Unknown LDAP configuration key {key} found in section {sec!r}."
+#: lib/pp_admintools/config/ldap.py:546
+msgid "Reading configuration of LDAP instance {!r} ..."
 msgstr ""
 
 #: lib/pp_admintools/config/mail.py:170 lib/pp_admintools/config/mail.py:194