]> Frank Brehm's Git Trees - pixelpark/pp-admin-tools.git/commitdiff
Removing lib/pp_admintools/cfg_app.py
authorFrank Brehm <frank@brehm-online.com>
Thu, 31 Mar 2022 16:13:34 +0000 (18:13 +0200)
committerFrank Brehm <frank@brehm-online.com>
Thu, 31 Mar 2022 16:13:34 +0000 (18:13 +0200)
lib/pp_admintools/cfg_app.py [deleted file]
lib/pp_admintools/global_version.py
locale/de_DE/LC_MESSAGES/pp_admintools.po
locale/en_US/LC_MESSAGES/pp_admintools.po
locale/pp_admintools.pot

diff --git a/lib/pp_admintools/cfg_app.py b/lib/pp_admintools/cfg_app.py
deleted file mode 100644 (file)
index 0e22d73..0000000
+++ /dev/null
@@ -1,945 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-@author: Frank Brehm
-@contact: frank.brehm@pixelpark.com
-@copyright: © 2021 by Frank Brehm, Berlin
-@summary: The module for the application object with support
-          for configuration files.
-"""
-from __future__ import absolute_import
-
-# Standard modules
-import os
-import logging
-import logging.config
-import re
-import copy
-import json
-import socket
-import pwd
-import pipes
-import codecs
-import ipaddress
-
-from subprocess import Popen, PIPE
-
-from email.mime.text import MIMEText
-from email import charset
-
-import smtplib
-
-# Third party modules
-import six
-
-from six import StringIO
-from six.moves import configparser
-
-from configparser import Error as ConfigParseError
-
-# Own modules
-from fb_tools.app import BaseApplication
-from fb_tools.common import pp, to_bool, RE_DOT_AT_END
-
-from .global_version import __version__ as __global_version__
-
-from .errors import PpAppError
-
-from .merge import merge_structure
-
-from .mailaddress import MailAddress
-
-from .xlate import XLATOR
-
-__version__ = '0.9.1'
-LOG = logging.getLogger(__name__)
-
-VALID_MAIL_METHODS = ('smtp', 'sendmail')
-
-_ = XLATOR.gettext
-
-
-# =============================================================================
-class PpCfgAppError(PpAppError):
-    """Base error class for all exceptions happened during
-    execution this configured application"""
-
-    pass
-
-
-# =============================================================================
-class PpConfigApplication(BaseApplication):
-    """
-    Class for configured application objects.
-    """
-
-    default_mail_recipients = [
-        'frank.brehm@pixelpark.com'
-    ]
-    default_mail_cc = [
-        'thomas.dalichow@pixelpark.com',
-    ]
-
-    default_reply_to = 'solution@pixelpark.com'
-
-    default_mail_server = 'mx.pixelpark.com'
-
-    current_user_name = pwd.getpwuid(os.getuid()).pw_name
-    current_user_gecos = pwd.getpwuid(os.getuid()).pw_gecos
-    default_mail_from = MailAddress(current_user_name, socket.getfqdn())
-
-    whitespace_re = re.compile(r'(?:[,;]+|\s*[,;]*\s+)+')
-
-    charset.add_charset('utf-8', charset.SHORTEST, charset.QP)
-
-    # -------------------------------------------------------------------------
-    def __init__(
-        self, appname=None, verbose=0, version=__version__, base_dir=None,
-            initialized=None, usage=None, description=None,
-            argparse_epilog=None, argparse_prefix_chars='-', env_prefix=None,
-            cfg_dir=None, cfg_stems=None, cfg_encoding='utf-8', need_config_file=False):
-
-        self.cfg_encoding = cfg_encoding
-        self._need_config_file = bool(need_config_file)
-
-        self.cfg = {}
-
-        self._cfg_dir = None
-        self.cfg_stems = []
-        self.cfg_files = []
-        self.log_cfg_files = []
-
-        self.mail_recipients = copy.copy(self.default_mail_recipients)
-        self.mail_from = '{n} <{m}>'.format(
-            n=self.current_user_gecos, m=self.default_mail_from)
-        self.mail_cc = copy.copy(self.default_mail_cc)
-        self.reply_to = self.default_reply_to
-        self.mail_method = 'smtp'
-        self.mail_server = self.default_mail_server
-        self.smtp_port = 25
-        self._config_has_errors = None
-
-        super(PpConfigApplication, self).__init__(
-            appname=appname, verbose=verbose, version=version, base_dir=base_dir,
-            initialized=False, usage=usage, description=description,
-            argparse_epilog=argparse_epilog, argparse_prefix_chars=argparse_prefix_chars,
-            env_prefix=env_prefix,
-        )
-
-        if cfg_dir is None:
-            self._cfg_dir = 'pixelpark'
-        else:
-            d = str(cfg_dir).strip()
-            if d == '':
-                self._cfg_dir = None
-            else:
-                self._cfg_dir = d
-
-        if cfg_stems:
-            if isinstance(cfg_stems, list):
-                for stem in cfg_stems:
-                    s = str(stem).strip()
-                    if not s:
-                        msg = _("Invalid configuration stem {!r} given.").format(stem)
-                        raise PpCfgAppError(msg)
-                    self.cfg_stems.append(s)
-            else:
-                s = str(cfg_stems).strip()
-                if not s:
-                    msg = _("Invalid configuration stem {!r} given.").format(cfg_stems)
-                    raise PpCfgAppError(msg)
-                self.cfg_stems.append(s)
-        else:
-            self.cfg_stems = self.appname
-
-        self._init_cfgfiles()
-
-        enc = getattr(self.args, 'cfg_encoding', None)
-        if enc:
-            self.cfg_encoding = enc
-
-        self.perform_arg_parser()
-        self.init_logging()
-
-        self._read_config()
-        self._perform_config()
-
-        self._init_log_cfgfiles()
-        self.reinit_logging()
-
-    # -----------------------------------------------------------
-    @property
-    def need_config_file(self):
-        """
-        hide command line parameter --default-config and
-        don't execute generation of default config
-        """
-        return getattr(self, '_need_config_file', False)
-
-    # -----------------------------------------------------------
-    @property
-    def cfg_encoding(self):
-        """The encoding character set of the configuration files."""
-        return self._cfg_encoding
-
-    @cfg_encoding.setter
-    def cfg_encoding(self, value):
-        try:
-            codec = codecs.lookup(value)
-        except Exception as e:
-            msg = _("{c} on setting encoding {v!r}: {e}").format(
-                c=e.__class__.__name__, v=value, e=e)
-            LOG.error(msg)
-        else:
-            self._cfg_encoding = codec.name
-
-    # -----------------------------------------------------------
-    @property
-    def config_has_errors(self):
-        """A flag, showing, that there are errors in configuration."""
-        return self._config_has_errors
-
-    @config_has_errors.setter
-    def config_has_errors(self, value):
-        if value is None:
-            self._config_has_errors = None
-        else:
-            self._config_has_errors = to_bool(value)
-
-    # -----------------------------------------------------------
-    @property
-    def cfg_dir(self):
-        """The directory containing the configuration files."""
-        return self._cfg_dir
-
-    # -------------------------------------------------------------------------
-    def as_dict(self, short=True):
-        """
-        Transforms the elements of the object into a dict
-
-        @param short: don't include local properties in resulting dict.
-        @type short: bool
-
-        @return: structure as dict
-        @rtype:  dict
-        """
-
-        res = super(PpConfigApplication, self).as_dict(short=short)
-        res['need_config_file'] = self.need_config_file
-        res['cfg_encoding'] = self.cfg_encoding
-        res['cfg_dir'] = self.cfg_dir
-        res['config_has_errors'] = self.config_has_errors
-
-        return res
-
-    # -------------------------------------------------------------------------
-    def init_arg_parser(self):
-        """
-        Method to initiate the argument parser.
-
-        This method should be explicitely called by all init_arg_parser()
-        methods in descendant classes.
-        """
-
-        mail_group = self.arg_parser.add_argument_group(_('Mailing options'))
-
-        mail_group.add_argument(
-            '--recipients', '--mail-recipients',
-            metavar=_("ADDRESS"), nargs='+', dest="mail_recipients",
-            help=_("Mail addresses of all recipients for mails generated by this script.")
-        )
-
-        mail_group.add_argument(
-            '--cc', '--mail-cc',
-            metavar=_("ADDRESS"), nargs='*', dest="mail_cc",
-            help=_("Mail addresses of all CC recipients for mails generated by this script.")
-        )
-
-        mail_group.add_argument(
-            '--reply-to', '--mail-reply-to',
-            metavar=_("ADDRESS"), dest="mail_reply_to",
-            help=_("Reply mail address for mails generated by this script.")
-        )
-
-        mail_group.add_argument(
-            '--mail-method',
-            metavar=_("METHOD"), choices=VALID_MAIL_METHODS, dest="mail_method",
-            help=_(
-                "Method for sending the mails generated by this script. "
-                "Valid values: {v}, default: {d!r}.").format(
-                    v=', '.join(map(lambda x: repr(x), VALID_MAIL_METHODS)),
-                    d=self.mail_method)
-        )
-
-        mail_group.add_argument(
-            '--mail-server',
-            metavar=_("SERVER"), dest="mail_server",
-            help=_(
-                "Mail server for submitting generated by this script if "
-                "the mail method of this script is 'smtp'. Default: {!r}.").format(
-                self.mail_server)
-        )
-
-        mail_group.add_argument(
-            '--smtp-port',
-            metavar=_("PORT"), type=int, dest='smtp_port',
-            help=_(
-                "The port to use for submitting generated by this script if "
-                "the mail method of this script is 'smtp'. Default: {}.").format(self.smtp_port)
-        )
-
-        cfgfile_group = self.arg_parser.add_argument_group(_('Config file options'))
-
-        cfgfile_group.add_argument(
-            "-C", "--cfgfile", "--cfg-file", "--config",
-            metavar=_("FILE"), nargs='+', dest="cfg_file",
-            help=_("Configuration files to use additional to the standard configuration files."),
-        )
-
-        reference = (
-            'https://docs.python.org/3/library/logging.config.html#logging-config-dictschema')
-        cfgfile_group.add_argument(
-            "--log-cfgfile",
-            metavar=_("FILE"), dest="log_cfgfile",
-            help=_(
-                "Configuration file for logging in JSON format. "
-                "See {!r} how the structures has to be defined.").format(reference),
-        )
-
-        cfgfile_group.add_argument(
-            "--cfg-encoding",
-            metavar=_("ENCODING"), dest="cfg_encoding", default=self.cfg_encoding,
-            help=_(
-                "The encoding character set of the configuration files "
-                "(default: %(default)r)."),
-        )
-
-    # -------------------------------------------------------------------------
-    def _init_cfgfiles(self):
-        """Method to generate the self.cfg_files list."""
-
-        self.cfg_files = []
-
-        cfg_basenames = []
-        for stem in self.cfg_stems:
-            cfg_basename = '{}.ini'.format(stem)
-            cfg_basenames.append(cfg_basename)
-
-        # add /etc/app/app.ini or $VIRTUAL_ENV/etc/app/app.ini
-        etc_dir = os.sep + 'etc'
-        if 'VIRTUAL_ENV' in os.environ:
-            etc_dir = os.path.join(os.environ['VIRTUAL_ENV'], 'etc')
-        for cfg_basename in cfg_basenames:
-            syscfg_fn = None
-            if self.cfg_dir:
-                syscfg_fn = os.path.join(etc_dir, self.cfg_dir, cfg_basename)
-            else:
-                syscfg_fn = os.path.join(etc_dir, cfg_basename)
-            self.cfg_files.append(syscfg_fn)
-
-        # add <WORKDIR>/etc/app.ini
-        mod_dir = os.path.dirname(__file__)
-        work_dir = os.path.abspath(os.path.join(mod_dir, '..'))
-        work_etc_dir = os.path.join(work_dir, 'etc')
-        if self.verbose > 1:
-            LOG.debug(_("Searching for {!r} ...").format(work_etc_dir))
-        for cfg_basename in cfg_basenames:
-            self.cfg_files.append(os.path.join(work_etc_dir, cfg_basename))
-
-        # add $HOME/.config/app.ini
-        usercfg_fn = None
-        user_cfg_dir = os.path.expanduser('~/.config')
-        if user_cfg_dir:
-            if self.cfg_dir:
-                user_cfg_dir = os.path.join(user_cfg_dir, self.cfg_dir)
-            if self.verbose > 1:
-                LOG.debug("user_cfg_dir: {!r}".format(user_cfg_dir))
-            for cfg_basename in cfg_basenames:
-                usercfg_fn = os.path.join(user_cfg_dir, cfg_basename)
-                self.cfg_files.append(usercfg_fn)
-
-        # add a configfile given on command line with --cfg-file
-        cmdline_cfg = getattr(self.args, 'cfg_file', None)
-        if cmdline_cfg:
-            for usercfg_fn in cmdline_cfg:
-                self.cfg_files.append(usercfg_fn)
-
-    # -------------------------------------------------------------------------
-    def _init_log_cfgfiles(self):
-        """Method to generate the self.log_cfg_files list."""
-
-        self.log_cfg_files = []
-
-        cfg_basename = 'logging.json'
-
-        # add /etc/app/logging.json or $VIRTUAL_ENV/etc/app/logging.json
-        etc_dir = os.sep + 'etc'
-        if 'VIRTUAL_ENV' in os.environ:
-            etc_dir = os.path.join(os.environ['VIRTUAL_ENV'], 'etc')
-        syscfg_fn = None
-        if self.cfg_dir:
-            syscfg_fn = os.path.join(etc_dir, self.cfg_dir, cfg_basename)
-        else:
-            syscfg_fn = os.path.join(etc_dir, cfg_basename)
-        self.log_cfg_files.append(syscfg_fn)
-
-        # add <WORKDIR>/etc/app.ini
-        mod_dir = os.path.dirname(__file__)
-        work_dir = os.path.abspath(os.path.join(mod_dir, '..'))
-        work_etc_dir = os.path.join(work_dir, 'etc')
-        if self.verbose > 1:
-            LOG.debug(_("Searching for {!r} ...").format(work_etc_dir))
-        self.log_cfg_files.append(os.path.join(work_etc_dir, cfg_basename))
-
-        # add $HOME/.config/app.ini
-        usercfg_fn = None
-        user_cfg_dir = os.path.expanduser('~/.config')
-        if user_cfg_dir:
-            if self.cfg_dir:
-                user_cfg_dir = os.path.join(user_cfg_dir, self.cfg_dir)
-            if self.verbose > 1:
-                LOG.debug("user_cfg_dir: {!r}".format(user_cfg_dir))
-            usercfg_fn = os.path.join(user_cfg_dir, cfg_basename)
-            self.log_cfg_files.append(usercfg_fn)
-
-        # add a configfile given on command line with --log-cfgfile
-        cmdline_cfg = getattr(self.args, 'log_cfgfile', None)
-        if cmdline_cfg:
-            self.log_cfg_files.append(cmdline_cfg)
-
-        if self.verbose > 1:
-            LOG.debug(_("Log config files:") + '\n' + pp(self.log_cfg_files))
-
-    # -------------------------------------------------------------------------
-    def _init_logging_from_jsonfile(self):
-
-        open_opts = {}
-        if six.PY3:
-            open_opts['encoding'] = 'utf-8'
-            open_opts['errors'] = 'surrogateescape'
-
-        found = False
-        for cfg_file in reversed(self.log_cfg_files):
-
-            if self.verbose > 1:
-                LOG.debug(_("Searching for {!r} ...").format(cfg_file))
-
-            if not os.path.exists(cfg_file):
-                continue
-            if not os.path.isfile(cfg_file):
-                continue
-            if not os.access(cfg_file, os.R_OK):
-                msg = _("No read access to {!r}.").format(cfg_file)
-                self.handle_error(msg, "File error")
-                continue
-
-            log_cfg = None
-            if self.verbose > 1:
-                LOG.debug(_("Reading and evaluating {!r} ...").format(cfg_file))
-            with open(cfg_file, 'r', **open_opts) as fh:
-                try:
-                    log_cfg = json.load(fh)
-                except (ValueError, TypeError) as e:
-                    msg = "Wrong file {!r} - ".format(cfg_file) + str(e)
-                    self.handle_error(msg, e.__class__.__name__)
-                    continue
-            if self.verbose:
-                if 'root' in log_cfg:
-                    log_cfg['root']['level'] = 'DEBUG'
-                if 'handlers' in log_cfg:
-                    for handler_name in log_cfg['handlers'].keys():
-                        handler = log_cfg['handlers'][handler_name]
-                        handler['level'] = 'DEBUG'
-            if self.verbose > 1:
-                LOG.debug(_("Evaluated configuration from JSON:") + '\n' + pp(log_cfg))
-            try:
-                logging.config.dictConfig(log_cfg)
-            except Exception as e:
-                msg = _("Wrong file {!r} - ").format(cfg_file) + str(e)
-                self.handle_error(msg, e.__class__.__name__)
-                continue
-            found = True
-            break
-
-        return found
-
-    # -------------------------------------------------------------------------
-    def reinit_logging(self):
-        """
-        Re-Initialize the logger object.
-        It creates a colored loghandler with all output to STDERR.
-        Maybe overridden in descendant classes.
-
-        @return: None
-        """
-
-        root_logger = logging.getLogger()
-
-        if self._init_logging_from_jsonfile():
-            if self.verbose:
-                root_logger.setLevel(logging.DEBUG)
-            return
-
-        return
-
-    # -------------------------------------------------------------------------
-    def _read_config(self):
-
-        if self.verbose > 2:
-            LOG.debug("Reading config files with character set {!r} ...".format(
-                self.cfg_encoding))
-        self._config_has_errors = None
-
-        open_opts = {}
-        if six.PY3 and self.cfg_encoding:
-            open_opts['encoding'] = self.cfg_encoding
-            open_opts['errors'] = 'surrogateescape'
-
-        for cfg_file in self.cfg_files:
-            if self.verbose > 2:
-                LOG.debug(_("Searching for {!r} ...").format(cfg_file))
-            if not os.path.isfile(cfg_file):
-                if self.verbose > 3:
-                    LOG.debug(_("Config file {!r} not found.").format(cfg_file))
-                continue
-            if self.verbose > 1:
-                LOG.debug(_("Reading {!r} ...").format(cfg_file))
-
-            config = configparser.ConfigParser()
-            try:
-                with open(cfg_file, 'r', **open_opts) as fh:
-                    stream = StringIO("[default]\n" + fh.read())
-                    if six.PY2:
-                        config.readfp(stream)
-                    else:
-                        config.read_file(stream)
-            except ConfigParseError as e:
-                msg = _("Wrong configuration in {!r} found: ").format(cfg_file)
-                msg += str(e)
-                self.handle_error(msg, _("Configuration error"))
-                continue
-
-            cfg = {}
-            for section in config.sections():
-                if section not in cfg:
-                    cfg[section] = {}
-                for (key, value) in config.items(section):
-                    k = key.lower()
-                    cfg[section][k] = value
-            if self.verbose > 2:
-                LOG.debug(_("Evaluated config from {!r}:").format(cfg_file) + '\n' + pp(cfg))
-            self.cfg = merge_structure(self.cfg, cfg)
-
-        if self.verbose > 1:
-            LOG.debug(_("Evaluated config total:") + '\n' + pp(self.cfg))
-
-    # -------------------------------------------------------------------------
-    def _perform_config(self):
-        """Execute some actions after reading the configuration."""
-
-        for section_name in self.cfg.keys():
-
-            section = self.cfg[section_name]
-
-            if section_name.lower() == 'general':
-                self._perform_config_general(section, section_name)
-                continue
-
-            if section_name.lower() == 'mail':
-                self._perform_config_mail(section, section_name)
-                continue
-
-        self.perform_config()
-
-        self._perform_mail_cmdline_options()
-
-        if self.config_has_errors:
-            LOG.error(_("There are errors in configuration."))
-            self.exit(1)
-        else:
-            LOG.debug(_("There are no errors in configuration."))
-            self.config_has_errors = False
-
-    # -------------------------------------------------------------------------
-    def _perform_config_general(self, section, section_name):
-
-        if self.verbose > 2:
-            LOG.debug(
-                _("Evaluating config section {!r}:").format(section_name) + '\n' + pp(section))
-
-        if 'verbose' in section:
-            v = section['verbose']
-            if to_bool(v):
-                try:
-                    v = int(v)
-                except ValueError:
-                    v = 1
-                    pass
-                except TypeError:
-                    v = 1
-                    pass
-                if v > self.verbose:
-                    self.verbose = v
-                root_logger = logging.getLogger()
-                root_logger.setLevel(logging.DEBUG)
-
-    # -------------------------------------------------------------------------
-    def _perform_config_mail(self, section, section_name):
-
-        if self.verbose > 2:
-            LOG.debug(
-                _("Evaluating config section {!r}:").format(section_name) + '\n' + pp(section))
-
-        self._perform_config_mail_rcpt(section, section_name)
-        self._perform_config_mail_cc(section, section_name)
-        self._perform_config_mail_reply_to(section, section_name)
-        self._perform_config_mail_method(section, section_name)
-        self._perform_config_mail_server(section, section_name)
-        self._perform_config_smtp_port(section, section_name)
-
-    # -------------------------------------------------------------------------
-    def _perform_config_mail_rcpt(self, section, section_name):
-
-        if 'mail_recipients' not in section:
-            return
-
-        v = section['mail_recipients'].strip()
-        self.mail_recipients = []
-        if v:
-            tokens = self.whitespace_re.split(v)
-            for token in tokens:
-                if MailAddress.valid_address(token):
-                    if token not in self.mail_recipients:
-                        self.mail_recipients.append(token)
-                else:
-                    msg = _(
-                        "Found invalid recipient mail address {!r} "
-                        "in configuration.").format(token)
-                    LOG.error(msg)
-
-    # -------------------------------------------------------------------------
-    def _perform_config_mail_cc(self, section, section_name):
-
-        if 'mail_cc' not in section:
-            return
-
-        v = section['mail_cc'].strip()
-        self.mail_cc = []
-        if v:
-            tokens = self.whitespace_re.split(v)
-            if self.verbose > 1:
-                LOG.debug(_("CC addresses:") + '\n' + pp(tokens))
-            for token in tokens:
-                if MailAddress.valid_address(token):
-                    if token not in self.mail_cc:
-                        self.mail_cc.append(token)
-                else:
-                    msg = _("Found invalid cc mail address {!r} in configuration.").format(
-                        token)
-                    LOG.error(msg)
-
-    # -------------------------------------------------------------------------
-    def _perform_config_mail_reply_to(self, section, section_name):
-
-        if 'reply_to' not in section:
-            return
-
-        v = section['reply_to'].strip()
-        self.reply_to = None
-        if v:
-            tokens = self.whitespace_re.split(v)
-            if len(tokens):
-                if MailAddress.valid_address(tokens[0]):
-                    self.reply_to = tokens[0]
-                else:
-                    msg = _("Found invalid reply mail address {!r} in configuration.").format(
-                        tokens[0])
-                    LOG.error(msg)
-
-    # -------------------------------------------------------------------------
-    def _perform_config_mail_method(self, section, section_name):
-
-        if 'mail_method' not in section:
-            return
-
-        v = section['mail_method'].strip().lower()
-        if v:
-            if v in VALID_MAIL_METHODS:
-                self.mail_method = v
-            else:
-                msg = _("Found invalid mail method {!r} in configuration.").format(
-                    section['mail_method'])
-                LOG.error(msg)
-
-    # -------------------------------------------------------------------------
-    def _perform_config_mail_server(self, section, section_name):
-
-        if 'mail_server' not in section:
-            return
-
-        v = section['reply_to'].strip()
-        if v:
-            self.mail_server = v
-
-    # -------------------------------------------------------------------------
-    def _perform_config_smtp_port(self, section, section_name):
-
-        if 'smtp_port' not in section:
-            return
-
-        v = section['smtp_port']
-        port = self.smtp_port
-        try:
-            port = int(v)
-        except (ValueError, TypeError):
-            msg = _("Found invalid SMTP port number {!r} in configuration.").format(v)
-            LOG.error(msg)
-        else:
-            if port <= 0:
-                msg = _("Found invalid SMTP port number {!r} in configuration.").format(port)
-                LOG.error(msg)
-            else:
-                self.smtp_port = port
-
-    # -------------------------------------------------------------------------
-    def _perform_mail_cmdline_options(self):
-
-        self._perform_cmdline_mail_rcpt()
-        self._perform_cmdline_mail_cc()
-        self._perform_cmdline_reply_to()
-
-        v = getattr(self.args, 'mail_method', None)
-        if v:
-            self.mail_method = v
-
-        v = getattr(self.args, 'mail_server', None)
-        if v:
-            self.mail_server = v
-
-        v = getattr(self.args, 'smtp_port', None)
-        if v is not None:
-            if v <= 0:
-                msg = _("Got invalid SMTP port number {!r}.").format(v)
-                LOG.error(msg)
-            else:
-                self.smtp_port = v
-
-    # -------------------------------------------------------------------------
-    def _perform_cmdline_mail_rcpt(self):
-
-        v = getattr(self.args, 'mail_recipients', None)
-        if v is not None:
-            self.mail_recipients = []
-            for addr in v:
-                tokens = self.whitespace_re.split(addr)
-                for token in tokens:
-                    if MailAddress.valid_address(token):
-                        if token not in self.mail_recipients:
-                            self.mail_recipients.append(token)
-                    else:
-                        msg = _("Got invalid recipient mail address {!r}.").format(token)
-                        LOG.error(msg)
-        if not self.mail_recipients:
-            msg = ("Did not found any valid recipient mail addresses.")
-            LOG.error(msg)
-
-    # -------------------------------------------------------------------------
-    def _perform_cmdline_mail_cc(self):
-
-        v = getattr(self.args, 'mail_cc', None)
-        if v is None:
-            return
-
-        self.mail_cc = []
-        for addr in v:
-            tokens = self.whitespace_re.split(addr)
-            for token in tokens:
-                if MailAddress.valid_address(token):
-                    if token not in self.mail_cc:
-                        self.mail_cc.append(token)
-                else:
-                    msg = _("Got invalid CC mail address {!r}.").format(token)
-                    LOG.error(msg)
-
-    # -------------------------------------------------------------------------
-    def _perform_cmdline_reply_to(self):
-
-        v = getattr(self.args, 'mail_reply_to', None)
-        if not v:
-            return
-
-        tokens = self.whitespace_re.split(v)
-        if len(tokens):
-            if MailAddress.valid_address(tokens[0]):
-                self.reply_to = tokens[0]
-            else:
-                msg = _("Got invalid reply mail address {!r}.").format(
-                    tokens[0])
-                LOG.error(msg)
-
-    # -------------------------------------------------------------------------
-    def perform_config(self):
-        """
-        Execute some actions after reading the configuration.
-
-        This method should be explicitely called by all perform_config()
-        methods in descendant classes.
-        """
-
-        pass
-
-    # -------------------------------------------------------------------------
-    def send_mail(self, subject, body):
-
-        xmailer = "{a} (Admin Tools version {v})".format(
-            a=self.appname, v=__global_version__)
-
-        mail = MIMEText(body, 'plain', 'utf-8')
-        mail['Subject'] = subject
-        mail['From'] = self.mail_from
-        mail['To'] = ', '.join(self.mail_recipients)
-        mail['Reply-To'] = self.reply_to
-        mail['X-Mailer'] = xmailer
-        if self.mail_cc:
-            mail['Cc'] = ', '.join(self.mail_cc)
-
-        if self.verbose > 1:
-            LOG.debug(_("Mail to send:") + '\n' + mail.as_string(unixfrom=True))
-
-        if self.mail_method == 'smtp':
-            self._send_mail_smtp(mail)
-        else:
-            self._send_mail_sendmail(mail)
-
-    # -------------------------------------------------------------------------
-    def _send_mail_smtp(self, mail):
-
-        with smtplib.SMTP(self.mail_server, self.smtp_port) as smtp:
-            if self.verbose > 2:
-                smtp.set_debuglevel(2)
-            elif self.verbose > 1:
-                smtp.set_debuglevel(1)
-
-            smtp.send_message(mail)
-
-    # -------------------------------------------------------------------------
-    def _send_mail_sendmail(self, mail):
-
-        # Searching for the location of sendmail ...
-        paths = (
-            '/usr/sbin/sendmail',
-            '/usr/lib/sendmail',
-        )
-        sendmail = None
-        for path in paths:
-            if os.path.isfile(path) and os.access(path, os.X_OK):
-                sendmail = path
-                break
-
-        if not sendmail:
-            msg = _("Did not found sendmail executable.")
-            LOG.error(msg)
-            return
-
-        cmd = [sendmail, "-t", "-oi"]
-        cmd_str = ' '.join(map(lambda x: pipes.quote(x), cmd))
-        LOG.debug(_("Executing: {}").format(cmd_str))
-
-        p = Popen(cmd, stdin=PIPE, universal_newlines=True)
-        p.communicate(mail.as_string())
-
-    # -------------------------------------------------------------------------
-    def post_init(self):
-        """
-        Method to execute before calling run(). Here could be done some
-        finishing actions after reading in commandline parameters,
-        configuration a.s.o.
-
-        This method could be overwritten by descendant classes, these
-        methhods should allways include a call to post_init() of the
-        parent class.
-
-        """
-
-        self.initialized = True
-
-    # -------------------------------------------------------------------------
-    def is_local_domain(self, domain):
-
-        zone_name = RE_DOT_AT_END.sub('', domain)
-
-        if self.verbose > 1:
-            LOG.debug(_("Checking, whether {!r} is a local zone.").format(zone_name))
-
-        tld = zone_name.split('.')[-1]
-        if tld in ('intern', 'internal', 'local', 'localdomain', 'lokal'):
-            LOG.debug(_("Zone {zone!r} has the local TLD {tld!r}.").format(
-                zone=zone_name, tld=tld))
-            return True
-
-        zone_base = zone_name.split('.')[0]
-        if zone_base in ('intern', 'internal', 'local', 'localdomain', 'lokal'):
-            LOG.debug(_("Zone {zone!r} has the local base name {n!r}.").format(
-                zone=zone_name, n=zone_base))
-            return True
-
-        if tld != 'arpa':
-            if self.verbose > 2:
-                LOG.debug(_("Zone {zone!r} has the public TLD {tld!r}.").format(
-                    zone=zone_name, tld=tld))
-                return False
-
-        if zone_name.endswith('.in-addr.arpa'):
-            tupels = []
-            for tupel in reversed(zone_name.replace('.in-addr.arpa', '').split('.')):
-                tupels.append(tupel)
-            if self.verbose > 2:
-                LOG.debug(
-                    _("Got IPv4 tupels from zone {!r}:").format(zone_name) + ' ' + pp(tupels))
-            bitmask = None
-            if len(tupels) == 1:
-                bitmask = 8
-                tupels.append('0')
-                tupels.append('0')
-                tupels.append('0')
-            elif len(tupels) == 2:
-                tupels.append('0')
-                tupels.append('0')
-                bitmask = 16
-            elif len(tupels) == 3:
-                bitmask = 24
-                tupels.append('0')
-            else:
-                LOG.warn(_("Could not interprete reverse IPv4 zone {!r}.").format(zone_name))
-                return False
-            net_address = '.'.join(tupels) + '/{}'.format(bitmask)
-            if self.verbose > 2:
-                LOG.debug(_("Got IPv4 network address of zone {zone!r}: {nw!r}.").format(
-                    zone=zone_name, nw=net_address))
-            network = ipaddress.ip_network(net_address)
-            if network.is_global:
-                if self.verbose > 1:
-                    LOG.debug(
-                        _("The network {nw!r} of zone {zone!r} is allocated for public "
-                            "networks.").format(nw=net_address, zone=zone_name))
-                return False
-            LOG.debug(_(
-                "The network {nw!r} of zone {zone!r} is allocated for local networks.").format(
-                    nw=net_address, zone=zone_name))
-            return True
-
-        if self.verbose > 2:
-            LOG.debug(_("Zone {!r} seems to be a reverse zone for a public network.").format(
-                zone_name))
-        return False
-
-
-# =============================================================================
-
-if __name__ == "__main__":
-
-    pass
-
-# =============================================================================
-
-# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 list
index 9c28c1fbdf3146362d47d075bfdb999e7a9e4f5f..2ae4f071d75899cf57e860c54ab1e1fb38b64cd9 100644 (file)
@@ -9,7 +9,7 @@
 
 __author__ = 'Frank Brehm <frank.brehm@pixelpark.com>'
 __contact__ = 'frank.brehm@pixelpark.com'
-__version__ = '0.9.0'
+__version__ = '0.9.1'
 __license__ = 'LGPL3+'
 
 # vim: fileencoding=utf-8 filetype=python ts=4
index b4dd342202e627085460f3ec9b9f9f572d76d4d1..d29c792a22c6979e9de10a342ee9ce99e05846f3 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pp_admintools 0.9.0\n"
 "Report-Msgid-Bugs-To: frank.brehm@pixelpark.com\n"
-"POT-Creation-Date: 2022-03-31 17:40+0200\n"
+"POT-Creation-Date: 2022-03-31 18:12+0200\n"
 "PO-Revision-Date: 2022-03-31 18:00+0100\n"
 "Last-Translator: Frank Brehm <frank.brehm@pixelpark.com>\n"
 "Language: de_DE\n"
@@ -34,257 +34,6 @@ msgstr "Der Wert {v!r} für einen Timeout von {what} ist ungültig."
 msgid "Value {v!r} for a timeout of {what} must be greater than 0 and less than {max}."
 msgstr "Der Wert {v!r} für einen Timeout von {what} muss größer als 0 und kleiner als {max} sein."
 
-#: lib/pp_admintools/cfg_app.py:143 lib/pp_admintools/cfg_app.py:149
-msgid "Invalid configuration stem {!r} given."
-msgstr "Ungültiger Konfigurations-Stammname {!r} angegeben."
-
-#: lib/pp_admintools/cfg_app.py:190
-msgid "{c} on setting encoding {v!r}: {e}"
-msgstr "{c} beim Setzen der Kodierung {v!r}: {e}"
-
-#: lib/pp_admintools/cfg_app.py:244 lib/pp_admintools/mail_app.py:204
-msgid "Mailing options"
-msgstr "E-Mail-Optionen"
-
-#: lib/pp_admintools/cfg_app.py:248 lib/pp_admintools/cfg_app.py:254 lib/pp_admintools/cfg_app.py:260
-#: lib/pp_admintools/mail_app.py:219 lib/pp_admintools/mail_app.py:227
-#: lib/pp_admintools/mail_app.py:233 lib/pp_admintools/mail_app.py:239
-msgid "ADDRESS"
-msgstr "ADRESSE"
-
-#: lib/pp_admintools/cfg_app.py:249 lib/pp_admintools/mail_app.py:228
-msgid "Mail addresses of all recipients for mails generated by this script."
-msgstr "Mailadressen aller Empfänger von Mails, die von diesem Skript generiert werden."
-
-#: lib/pp_admintools/cfg_app.py:255 lib/pp_admintools/mail_app.py:234
-msgid "Mail addresses of all CC recipients for mails generated by this script."
-msgstr "Mailadressen aller CC-Empfänger von Mails, die von diesem Skript generiert werden."
-
-#: lib/pp_admintools/cfg_app.py:261 lib/pp_admintools/mail_app.py:240
-msgid "Reply mail address for mails generated by this script."
-msgstr "Antwort-Mailadresse von Mails, die von diesem Skript generiert werden."
-
-#: lib/pp_admintools/cfg_app.py:266 lib/pp_admintools/mail_app.py:246
-msgid "METHOD"
-msgstr "METHODE"
-
-#: lib/pp_admintools/cfg_app.py:267 lib/pp_admintools/mail_app.py:247
-msgid "Method for sending the mails generated by this script. Valid values: {v}, default: {d!r}."
-msgstr ""
-"Methode zum Senden von Mails, die von diesem Skript generiert werden. Gültige Werte: {v}, "
-"Vorgabe: {d!r}."
-
-#: lib/pp_admintools/cfg_app.py:276 lib/pp_admintools/mail_app.py:255
-msgid "SERVER"
-msgstr "SERVER"
-
-#: lib/pp_admintools/cfg_app.py:277 lib/pp_admintools/mail_app.py:256
-msgid ""
-"Mail server for submitting generated by this script if the mail method of this script is 'smtp'."
-" Default: {!r}."
-msgstr ""
-"Der Mailserver zur Übermittlung der von diesem Skript generierten Mails, wenn die Mail-Methode "
-"'smtp' ist. Vorgabe: {!r}."
-
-#: lib/pp_admintools/cfg_app.py:285 lib/pp_admintools/mail_app.py:263
-#: lib/pp_admintools/pdns_app.py:275
-msgid "PORT"
-msgstr "PORT"
-
-#: lib/pp_admintools/cfg_app.py:286 lib/pp_admintools/mail_app.py:265
-msgid ""
-"The port to use for submitting generated by this script if the mail method of this script is "
-"'smtp'. Default: {}."
-msgstr ""
-"Der zu verwendende Port zur Übermittlung der von diesem Skript generierten Mails, wenn die Mail-"
-"Methode 'smtp' ist. Vorgabe: {}."
-
-#: lib/pp_admintools/cfg_app.py:291
-msgid "Config file options"
-msgstr "Konfigurationsdatei-Optionen"
-
-#: lib/pp_admintools/cfg_app.py:295 lib/pp_admintools/cfg_app.py:303
-msgid "FILE"
-msgstr "DATEI"
-
-#: lib/pp_admintools/cfg_app.py:296
-msgid "Configuration files to use additional to the standard configuration files."
-msgstr "Zusätzlich zu den Standard-Konfigurationsdateien zu verwendende Konfigurationsdateien."
-
-#: lib/pp_admintools/cfg_app.py:304
-msgid "Configuration file for logging in JSON format. See {!r} how the structures has to be defined."
-msgstr ""
-"Konfigurationsdatei zum Loggen im JSON format. Siehe {!r}, wie die Struktur definiert werden "
-"muss."
-
-#: lib/pp_admintools/cfg_app.py:311
-msgid "ENCODING"
-msgstr "KODIERUNG"
-
-#: lib/pp_admintools/cfg_app.py:312
-#, python-format
-msgid "The encoding character set of the configuration files (default: %(default)r)."
-msgstr "Der Kodierungs-Zeichensatz der Konfigurationsdateien (Vorgabe: %(default)r)."
-
-#: lib/pp_admintools/cfg_app.py:345 lib/pp_admintools/cfg_app.py:391 lib/pp_admintools/cfg_app.py:425
-#: lib/pp_admintools/cfg_app.py:500
-msgid "Searching for {!r} ..."
-msgstr "Suche nach {!r} …"
-
-#: lib/pp_admintools/cfg_app.py:411
-msgid "Log config files:"
-msgstr "Log-Konfigurationsdateien:"
-
-#: lib/pp_admintools/cfg_app.py:432
-msgid "No read access to {!r}."
-msgstr "Kein Lesezugriff auf {!r}."
-
-#: lib/pp_admintools/cfg_app.py:438
-msgid "Reading and evaluating {!r} ..."
-msgstr "Lese und evaluiere {!r} …"
-
-#: lib/pp_admintools/cfg_app.py:454
-msgid "Evaluated configuration from JSON:"
-msgstr "Evaluierte Konfiguration aus JSON:"
-
-#: lib/pp_admintools/cfg_app.py:458
-msgid "Wrong file {!r} - "
-msgstr "Falsche Datei {!r} - "
-
-#: lib/pp_admintools/cfg_app.py:503
-msgid "Config file {!r} not found."
-msgstr "Die Konfigurationsdatei {!r} wurde nicht gefunden."
-
-#: lib/pp_admintools/cfg_app.py:506 lib/pp_admintools/dns_deploy_zones_app.py:693
-#: lib/pp_admintools/dns_deploy_zones_app.py:710
-msgid "Reading {!r} ..."
-msgstr "Lese {!r} …"
-
-#: lib/pp_admintools/cfg_app.py:517
-msgid "Wrong configuration in {!r} found: "
-msgstr "Falsche Konfiguration in {!r} gefunden: "
-
-#: lib/pp_admintools/cfg_app.py:519
-msgid "Configuration error"
-msgstr "Konfigurationsfehler"
-
-#: lib/pp_admintools/cfg_app.py:530
-msgid "Evaluated config from {!r}:"
-msgstr "Evaluierte Konfiguration aus {!r}:"
-
-#: lib/pp_admintools/cfg_app.py:534
-msgid "Evaluated config total:"
-msgstr "Evaluierte Gesamtkonfiguration:"
-
-#: lib/pp_admintools/cfg_app.py:557
-msgid "There are errors in configuration."
-msgstr "Es gibt Fehler in der Konfiguration."
-
-#: lib/pp_admintools/cfg_app.py:560
-msgid "There are no errors in configuration."
-msgstr "In der Konfiguration gibt es keine Fehler."
-
-#: lib/pp_admintools/cfg_app.py:568 lib/pp_admintools/cfg_app.py:591
-#: lib/pp_admintools/dns_deploy_zones_config.py:202 lib/pp_admintools/dns_deploy_zones_config.py:515
-#: lib/pp_admintools/mail_config.py:178 lib/pp_admintools/pdns_config.py:187
-msgid "Evaluating config section {!r}:"
-msgstr "Evaluiere Konfigurations-Abschnitt {!r}:"
-
-#: lib/pp_admintools/cfg_app.py:615
-msgid "Found invalid recipient mail address {!r} in configuration."
-msgstr "Ungültige Empfänger-Mailadresse {!r} in der Konfiguration gefunden."
-
-#: lib/pp_admintools/cfg_app.py:631
-msgid "CC addresses:"
-msgstr "CC-Adressen:"
-
-#: lib/pp_admintools/cfg_app.py:637
-msgid "Found invalid cc mail address {!r} in configuration."
-msgstr "Ungültige CC-Mailadresse {!r} in der Konfiguration gefunden."
-
-#: lib/pp_admintools/cfg_app.py:655
-msgid "Found invalid reply mail address {!r} in configuration."
-msgstr "Ungültige Antwort-Mailadresse {!r} in der Konfiguration gefunden."
-
-#: lib/pp_admintools/cfg_app.py:670 lib/pp_admintools/mail_config.py:308
-msgid "Found invalid mail method {!r} in configuration."
-msgstr "Ungültige Mail-Methode {!r} in der Konfiguration gefunden."
-
-#: lib/pp_admintools/cfg_app.py:695 lib/pp_admintools/cfg_app.py:699
-msgid "Found invalid SMTP port number {!r} in configuration."
-msgstr "Ungültige SMTP-Port-Nummer {!r} in der Konfiguration gefunden."
-
-#: lib/pp_admintools/cfg_app.py:722 lib/pp_admintools/mail_app.py:106
-msgid "Got invalid SMTP port number {!r}."
-msgstr "Ungültige SMTP-Port-Nummer {!r} erhalten."
-
-#: lib/pp_admintools/cfg_app.py:740
-msgid "Got invalid recipient mail address {!r}."
-msgstr "Ungültige Empfänger-Mailadresse {!r} erhalten."
-
-#: lib/pp_admintools/cfg_app.py:761
-msgid "Got invalid CC mail address {!r}."
-msgstr "Ungültige CC-Mailadresse {!r} erhalten."
-
-#: lib/pp_admintools/cfg_app.py:776 lib/pp_admintools/mail_app.py:190
-msgid "Got invalid reply mail address {!r}."
-msgstr "Ungültige CC-Mailadresse {!r} erhalten."
-
-#: lib/pp_admintools/cfg_app.py:807 lib/pp_admintools/mail_app.py:289
-msgid "Mail to send:"
-msgstr "Die zu sendende Mail:"
-
-#: lib/pp_admintools/cfg_app.py:840 lib/pp_admintools/mail_app.py:322
-msgid "Did not found sendmail executable."
-msgstr "Kein ausführbares Programm 'sendmail' gefunden."
-
-#: lib/pp_admintools/cfg_app.py:846 lib/pp_admintools/dns_deploy_zones_app.py:441
-#: lib/pp_admintools/dns_deploy_zones_app.py:795 lib/pp_admintools/dns_deploy_zones_app.py:831
-#: lib/pp_admintools/dns_deploy_zones_app.py:863 lib/pp_admintools/dns_deploy_zones_app.py:898
-#: lib/pp_admintools/dns_deploy_zones_app.py:933 lib/pp_admintools/mail_app.py:328
-msgid "Executing: {}"
-msgstr "Führe aus: {}"
-
-#: lib/pp_admintools/cfg_app.py:872
-msgid "Checking, whether {!r} is a local zone."
-msgstr "Überprüfe, ob {!r} eine lokale Zune ist."
-
-#: lib/pp_admintools/cfg_app.py:876
-msgid "Zone {zone!r} has the local TLD {tld!r}."
-msgstr "Die Zone {zone!r} hat eine lokale TLD {tld!r}."
-
-#: lib/pp_admintools/cfg_app.py:882
-msgid "Zone {zone!r} has the local base name {n!r}."
-msgstr "Die Zone {zone!r} hat einen lokalen Basisnamen: {n!r}."
-
-#: lib/pp_admintools/cfg_app.py:888
-msgid "Zone {zone!r} has the public TLD {tld!r}."
-msgstr "Die Zone {zone!r} hat eine öffentliche TLD {tld!r}."
-
-#: lib/pp_admintools/cfg_app.py:898
-msgid "Got IPv4 tupels from zone {!r}:"
-msgstr "Habe IPv4 Tupels von Zone {!r} erhalten:"
-
-#: lib/pp_admintools/cfg_app.py:913
-msgid "Could not interprete reverse IPv4 zone {!r}."
-msgstr "Konnte Revers-IPv4-Zone {!r} nicht interpretieren."
-
-#: lib/pp_admintools/cfg_app.py:917
-msgid "Got IPv4 network address of zone {zone!r}: {nw!r}."
-msgstr "Habe IPv4-Netzwerkadresse von Zone {zone!r} erhalten: {nw!r}."
-
-#: lib/pp_admintools/cfg_app.py:923
-msgid "The network {nw!r} of zone {zone!r} is allocated for public networks."
-msgstr "Die Netzwerkadresse {nw!r} von Zone {zone!r} ist für öffentliche Netze bestimmt."
-
-#: lib/pp_admintools/cfg_app.py:926
-msgid "The network {nw!r} of zone {zone!r} is allocated for local networks."
-msgstr "Die Netzwerkadresse {nw!r} von Zone {zone!r} ist für lokale Netze bestimmt."
-
-#: lib/pp_admintools/cfg_app.py:932
-msgid "Zone {!r} seems to be a reverse zone for a public network."
-msgstr "Die Zone {!r} scheint eine Reverse-Zone eines öffentlichen Netzwerks zu sein."
-
 #: lib/pp_admintools/dns_deploy_zones_app.py:121
 msgid "Generation of the BIND9 configuration file for slave zones."
 msgstr "Generierung der BIND9-Konfigurationsdatei für Slave-Zonen."
@@ -375,6 +124,13 @@ msgstr "Temporäre Zonenkonfiguration: {!r}"
 msgid "Trying to get all keys from named.conf ..."
 msgstr "Versuche alle Schlüssel der named.conf zu ermitteln …"
 
+#: lib/pp_admintools/dns_deploy_zones_app.py:441 lib/pp_admintools/dns_deploy_zones_app.py:795
+#: lib/pp_admintools/dns_deploy_zones_app.py:831 lib/pp_admintools/dns_deploy_zones_app.py:863
+#: lib/pp_admintools/dns_deploy_zones_app.py:898 lib/pp_admintools/dns_deploy_zones_app.py:933
+#: lib/pp_admintools/mail_app.py:328
+msgid "Executing: {}"
+msgstr "Führe aus: {}"
+
 #: lib/pp_admintools/dns_deploy_zones_app.py:447 lib/pp_admintools/dns_deploy_zones_app.py:801
 msgid "Result:"
 msgstr "Ergebnis:"
@@ -451,6 +207,10 @@ msgstr "Die {what} {f!r} ist keine reguläre Datei."
 msgid "Target file"
 msgstr "Ziel-Datei"
 
+#: lib/pp_admintools/dns_deploy_zones_app.py:693 lib/pp_admintools/dns_deploy_zones_app.py:710
+msgid "Reading {!r} ..."
+msgstr "Lese {!r} …"
+
 #: lib/pp_admintools/dns_deploy_zones_app.py:703 lib/pp_admintools/dns_deploy_zones_app.py:720
 msgid "Cleaned version of {!r}:"
 msgstr "Bereinigte Version von {!r}:"
@@ -535,6 +295,11 @@ msgstr "Neu starten {} …"
 msgid "Reloading {} ..."
 msgstr "Reload {} …"
 
+#: lib/pp_admintools/dns_deploy_zones_config.py:202 lib/pp_admintools/dns_deploy_zones_config.py:515
+#: lib/pp_admintools/mail_config.py:178 lib/pp_admintools/pdns_config.py:187
+msgid "Evaluating config section {!r}:"
+msgstr "Evaluiere Konfigurations-Abschnitt {!r}:"
+
 #: lib/pp_admintools/dns_deploy_zones_config.py:290
 msgid "Checking given master address {!r} ..."
 msgstr "Überprüfe die übergebene Master-Adresse {!r} …"
@@ -600,6 +365,10 @@ msgstr "Keine gültigen Master in der Konfiguration gefunden."
 msgid "Evaluated configuration:"
 msgstr "Evaluierte Konfiguration:"
 
+#: lib/pp_admintools/mail_app.py:106
+msgid "Got invalid SMTP port number {!r}."
+msgstr "Ungültige SMTP-Port-Nummer {!r} erhalten."
+
 #: lib/pp_admintools/mail_app.py:124
 msgid "Got invalid mail from address {!r}."
 msgstr "Ungültige Absender-Mailadresse {!r} erhalten."
@@ -612,14 +381,81 @@ msgstr "Ungültige Empfänger-Mailadressen erhalten:"
 msgid "Got invalid cc mail addresses:"
 msgstr "Ungültige CC-Mailadressen erhalten:"
 
+#: lib/pp_admintools/mail_app.py:190
+msgid "Got invalid reply mail address {!r}."
+msgstr "Ungültige CC-Mailadresse {!r} erhalten."
+
+#: lib/pp_admintools/mail_app.py:204
+msgid "Mailing options"
+msgstr "E-Mail-Optionen"
+
+#: lib/pp_admintools/mail_app.py:219 lib/pp_admintools/mail_app.py:227
+#: lib/pp_admintools/mail_app.py:233 lib/pp_admintools/mail_app.py:239
+msgid "ADDRESS"
+msgstr "ADRESSE"
+
 #: lib/pp_admintools/mail_app.py:220
 msgid "Sender mail address for mails generated by this script. Default: {!r}"
 msgstr "Absender-Mailadresse von Mails, die von diesem Skript generiert werden. Vorgabe: {!r}"
 
+#: lib/pp_admintools/mail_app.py:228
+msgid "Mail addresses of all recipients for mails generated by this script."
+msgstr "Mailadressen aller Empfänger von Mails, die von diesem Skript generiert werden."
+
+#: lib/pp_admintools/mail_app.py:234
+msgid "Mail addresses of all CC recipients for mails generated by this script."
+msgstr "Mailadressen aller CC-Empfänger von Mails, die von diesem Skript generiert werden."
+
+#: lib/pp_admintools/mail_app.py:240
+msgid "Reply mail address for mails generated by this script."
+msgstr "Antwort-Mailadresse von Mails, die von diesem Skript generiert werden."
+
+#: lib/pp_admintools/mail_app.py:246
+msgid "METHOD"
+msgstr "METHODE"
+
+#: lib/pp_admintools/mail_app.py:247
+msgid "Method for sending the mails generated by this script. Valid values: {v}, default: {d!r}."
+msgstr ""
+"Methode zum Senden von Mails, die von diesem Skript generiert werden. Gültige Werte: {v}, "
+"Vorgabe: {d!r}."
+
+#: lib/pp_admintools/mail_app.py:255
+msgid "SERVER"
+msgstr "SERVER"
+
+#: lib/pp_admintools/mail_app.py:256
+msgid ""
+"Mail server for submitting generated by this script if the mail method of this script is 'smtp'."
+" Default: {!r}."
+msgstr ""
+"Der Mailserver zur Übermittlung der von diesem Skript generierten Mails, wenn die Mail-Methode "
+"'smtp' ist. Vorgabe: {!r}."
+
+#: lib/pp_admintools/mail_app.py:263 lib/pp_admintools/pdns_app.py:275
+msgid "PORT"
+msgstr "PORT"
+
+#: lib/pp_admintools/mail_app.py:265
+msgid ""
+"The port to use for submitting generated by this script if the mail method of this script is "
+"'smtp'. Default: {}."
+msgstr ""
+"Der zu verwendende Port zur Übermittlung der von diesem Skript generierten Mails, wenn die Mail-"
+"Methode 'smtp' ist. Vorgabe: {}."
+
 #: lib/pp_admintools/mail_app.py:274
 msgid "Got command line arguments:"
 msgstr "Kommandozeilen-Argumente erhalten:"
 
+#: lib/pp_admintools/mail_app.py:289
+msgid "Mail to send:"
+msgstr "Die zu sendende Mail:"
+
+#: lib/pp_admintools/mail_app.py:322
+msgid "Did not found sendmail executable."
+msgstr "Kein ausführbares Programm 'sendmail' gefunden."
+
 #: lib/pp_admintools/mail_config.py:199 lib/pp_admintools/mail_config.py:223
 #: lib/pp_admintools/mail_config.py:291
 msgid "Found invalid {what} {addr!r} in configuration."
@@ -641,6 +477,10 @@ msgstr "CC-Mail-Adresse."
 msgid "reply to address"
 msgstr "Reply-To-Adresse"
 
+#: lib/pp_admintools/mail_config.py:308
+msgid "Found invalid mail method {!r} in configuration."
+msgstr "Ungültige Mail-Methode {!r} in der Konfiguration gefunden."
+
 #: lib/pp_admintools/mail_config.py:342
 msgid "Value {!r} for SMTP port is invalid:"
 msgstr "Der Wert {!r} für einen SMTP-Port ist ungültig:"
index 9f854842fa8ed6f09b6c700a9440ea3f17524e8c..376a12ceac880280002d1ea2c50c4c828aaad747 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pp_admintools 0.9.0\n"
 "Report-Msgid-Bugs-To: frank.brehm@pixelpark.com\n"
-"POT-Creation-Date: 2022-03-31 17:40+0200\n"
+"POT-Creation-Date: 2022-03-31 18:12+0200\n"
 "PO-Revision-Date: 2022-03-31 17:45+0100\n"
 "Last-Translator: Frank Brehm <frank.brehm@pixelpark.com>\n"
 "Language: en_US\n"
@@ -34,249 +34,6 @@ msgstr ""
 msgid "Value {v!r} for a timeout of {what} must be greater than 0 and less than {max}."
 msgstr ""
 
-#: lib/pp_admintools/cfg_app.py:143 lib/pp_admintools/cfg_app.py:149
-msgid "Invalid configuration stem {!r} given."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:190
-msgid "{c} on setting encoding {v!r}: {e}"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:244 lib/pp_admintools/mail_app.py:204
-msgid "Mailing options"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:248 lib/pp_admintools/cfg_app.py:254 lib/pp_admintools/cfg_app.py:260
-#: lib/pp_admintools/mail_app.py:219 lib/pp_admintools/mail_app.py:227
-#: lib/pp_admintools/mail_app.py:233 lib/pp_admintools/mail_app.py:239
-msgid "ADDRESS"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:249 lib/pp_admintools/mail_app.py:228
-msgid "Mail addresses of all recipients for mails generated by this script."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:255 lib/pp_admintools/mail_app.py:234
-msgid "Mail addresses of all CC recipients for mails generated by this script."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:261 lib/pp_admintools/mail_app.py:240
-msgid "Reply mail address for mails generated by this script."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:266 lib/pp_admintools/mail_app.py:246
-msgid "METHOD"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:267 lib/pp_admintools/mail_app.py:247
-msgid "Method for sending the mails generated by this script. Valid values: {v}, default: {d!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:276 lib/pp_admintools/mail_app.py:255
-msgid "SERVER"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:277 lib/pp_admintools/mail_app.py:256
-msgid ""
-"Mail server for submitting generated by this script if the mail method of this script is 'smtp'."
-" Default: {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:285 lib/pp_admintools/mail_app.py:263
-#: lib/pp_admintools/pdns_app.py:275
-msgid "PORT"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:286 lib/pp_admintools/mail_app.py:265
-msgid ""
-"The port to use for submitting generated by this script if the mail method of this script is "
-"'smtp'. Default: {}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:291
-msgid "Config file options"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:295 lib/pp_admintools/cfg_app.py:303
-msgid "FILE"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:296
-msgid "Configuration files to use additional to the standard configuration files."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:304
-msgid "Configuration file for logging in JSON format. See {!r} how the structures has to be defined."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:311
-msgid "ENCODING"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:312
-#, python-format
-msgid "The encoding character set of the configuration files (default: %(default)r)."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:345 lib/pp_admintools/cfg_app.py:391 lib/pp_admintools/cfg_app.py:425
-#: lib/pp_admintools/cfg_app.py:500
-msgid "Searching for {!r} ..."
-msgstr "Searching for {!r} …"
-
-#: lib/pp_admintools/cfg_app.py:411
-msgid "Log config files:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:432
-msgid "No read access to {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:438
-msgid "Reading and evaluating {!r} ..."
-msgstr "Reading and evaluating {!r} …"
-
-#: lib/pp_admintools/cfg_app.py:454
-msgid "Evaluated configuration from JSON:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:458
-msgid "Wrong file {!r} - "
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:503
-msgid "Config file {!r} not found."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:506 lib/pp_admintools/dns_deploy_zones_app.py:693
-#: lib/pp_admintools/dns_deploy_zones_app.py:710
-msgid "Reading {!r} ..."
-msgstr "Reading {!r} …"
-
-#: lib/pp_admintools/cfg_app.py:517
-msgid "Wrong configuration in {!r} found: "
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:519
-msgid "Configuration error"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:530
-msgid "Evaluated config from {!r}:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:534
-msgid "Evaluated config total:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:557
-msgid "There are errors in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:560
-msgid "There are no errors in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:568 lib/pp_admintools/cfg_app.py:591
-#: lib/pp_admintools/dns_deploy_zones_config.py:202 lib/pp_admintools/dns_deploy_zones_config.py:515
-#: lib/pp_admintools/mail_config.py:178 lib/pp_admintools/pdns_config.py:187
-msgid "Evaluating config section {!r}:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:615
-msgid "Found invalid recipient mail address {!r} in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:631
-msgid "CC addresses:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:637
-msgid "Found invalid cc mail address {!r} in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:655
-msgid "Found invalid reply mail address {!r} in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:670 lib/pp_admintools/mail_config.py:308
-msgid "Found invalid mail method {!r} in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:695 lib/pp_admintools/cfg_app.py:699
-msgid "Found invalid SMTP port number {!r} in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:722 lib/pp_admintools/mail_app.py:106
-msgid "Got invalid SMTP port number {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:740
-msgid "Got invalid recipient mail address {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:761
-msgid "Got invalid CC mail address {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:776 lib/pp_admintools/mail_app.py:190
-msgid "Got invalid reply mail address {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:807 lib/pp_admintools/mail_app.py:289
-msgid "Mail to send:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:840 lib/pp_admintools/mail_app.py:322
-msgid "Did not found sendmail executable."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:846 lib/pp_admintools/dns_deploy_zones_app.py:441
-#: lib/pp_admintools/dns_deploy_zones_app.py:795 lib/pp_admintools/dns_deploy_zones_app.py:831
-#: lib/pp_admintools/dns_deploy_zones_app.py:863 lib/pp_admintools/dns_deploy_zones_app.py:898
-#: lib/pp_admintools/dns_deploy_zones_app.py:933 lib/pp_admintools/mail_app.py:328
-msgid "Executing: {}"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:872
-msgid "Checking, whether {!r} is a local zone."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:876
-msgid "Zone {zone!r} has the local TLD {tld!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:882
-msgid "Zone {zone!r} has the local base name {n!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:888
-msgid "Zone {zone!r} has the public TLD {tld!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:898
-msgid "Got IPv4 tupels from zone {!r}:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:913
-msgid "Could not interprete reverse IPv4 zone {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:917
-msgid "Got IPv4 network address of zone {zone!r}: {nw!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:923
-msgid "The network {nw!r} of zone {zone!r} is allocated for public networks."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:926
-msgid "The network {nw!r} of zone {zone!r} is allocated for local networks."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:932
-msgid "Zone {!r} seems to be a reverse zone for a public network."
-msgstr ""
-
 #: lib/pp_admintools/dns_deploy_zones_app.py:121
 msgid "Generation of the BIND9 configuration file for slave zones."
 msgstr ""
@@ -365,6 +122,13 @@ msgstr ""
 msgid "Trying to get all keys from named.conf ..."
 msgstr "Trying to get all keys from named.conf …"
 
+#: lib/pp_admintools/dns_deploy_zones_app.py:441 lib/pp_admintools/dns_deploy_zones_app.py:795
+#: lib/pp_admintools/dns_deploy_zones_app.py:831 lib/pp_admintools/dns_deploy_zones_app.py:863
+#: lib/pp_admintools/dns_deploy_zones_app.py:898 lib/pp_admintools/dns_deploy_zones_app.py:933
+#: lib/pp_admintools/mail_app.py:328
+msgid "Executing: {}"
+msgstr ""
+
 #: lib/pp_admintools/dns_deploy_zones_app.py:447 lib/pp_admintools/dns_deploy_zones_app.py:801
 msgid "Result:"
 msgstr ""
@@ -441,6 +205,10 @@ msgstr ""
 msgid "Target file"
 msgstr ""
 
+#: lib/pp_admintools/dns_deploy_zones_app.py:693 lib/pp_admintools/dns_deploy_zones_app.py:710
+msgid "Reading {!r} ..."
+msgstr "Reading {!r} …"
+
 #: lib/pp_admintools/dns_deploy_zones_app.py:703 lib/pp_admintools/dns_deploy_zones_app.py:720
 msgid "Cleaned version of {!r}:"
 msgstr ""
@@ -523,6 +291,11 @@ msgstr "Restarting {} …"
 msgid "Reloading {} ..."
 msgstr "Reloading {} …"
 
+#: lib/pp_admintools/dns_deploy_zones_config.py:202 lib/pp_admintools/dns_deploy_zones_config.py:515
+#: lib/pp_admintools/mail_config.py:178 lib/pp_admintools/pdns_config.py:187
+msgid "Evaluating config section {!r}:"
+msgstr ""
+
 #: lib/pp_admintools/dns_deploy_zones_config.py:290
 msgid "Checking given master address {!r} ..."
 msgstr "Checking given master address {!r} …"
@@ -589,6 +362,10 @@ msgstr ""
 msgid "Evaluated configuration:"
 msgstr ""
 
+#: lib/pp_admintools/mail_app.py:106
+msgid "Got invalid SMTP port number {!r}."
+msgstr ""
+
 #: lib/pp_admintools/mail_app.py:124
 msgid "Got invalid mail from address {!r}."
 msgstr ""
@@ -601,14 +378,75 @@ msgstr ""
 msgid "Got invalid cc mail addresses:"
 msgstr ""
 
+#: lib/pp_admintools/mail_app.py:190
+msgid "Got invalid reply mail address {!r}."
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:204
+msgid "Mailing options"
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:219 lib/pp_admintools/mail_app.py:227
+#: lib/pp_admintools/mail_app.py:233 lib/pp_admintools/mail_app.py:239
+msgid "ADDRESS"
+msgstr ""
+
 #: lib/pp_admintools/mail_app.py:220
 msgid "Sender mail address for mails generated by this script. Default: {!r}"
 msgstr ""
 
+#: lib/pp_admintools/mail_app.py:228
+msgid "Mail addresses of all recipients for mails generated by this script."
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:234
+msgid "Mail addresses of all CC recipients for mails generated by this script."
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:240
+msgid "Reply mail address for mails generated by this script."
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:246
+msgid "METHOD"
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:247
+msgid "Method for sending the mails generated by this script. Valid values: {v}, default: {d!r}."
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:255
+msgid "SERVER"
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:256
+msgid ""
+"Mail server for submitting generated by this script if the mail method of this script is 'smtp'."
+" Default: {!r}."
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:263 lib/pp_admintools/pdns_app.py:275
+msgid "PORT"
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:265
+msgid ""
+"The port to use for submitting generated by this script if the mail method of this script is "
+"'smtp'. Default: {}."
+msgstr ""
+
 #: lib/pp_admintools/mail_app.py:274
 msgid "Got command line arguments:"
 msgstr ""
 
+#: lib/pp_admintools/mail_app.py:289
+msgid "Mail to send:"
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:322
+msgid "Did not found sendmail executable."
+msgstr ""
+
 #: lib/pp_admintools/mail_config.py:199 lib/pp_admintools/mail_config.py:223
 #: lib/pp_admintools/mail_config.py:291
 msgid "Found invalid {what} {addr!r} in configuration."
@@ -630,6 +468,10 @@ msgstr ""
 msgid "reply to address"
 msgstr ""
 
+#: lib/pp_admintools/mail_config.py:308
+msgid "Found invalid mail method {!r} in configuration."
+msgstr ""
+
 #: lib/pp_admintools/mail_config.py:342
 msgid "Value {!r} for SMTP port is invalid:"
 msgstr ""
index 39e16dc31aae8257e434884c0013a75ae3cef131..7dc6354e30b6eb423066f63b9131c16105a220fe 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pp_admintools 0.9.0\n"
 "Report-Msgid-Bugs-To: frank.brehm@pixelpark.com\n"
-"POT-Creation-Date: 2022-03-31 17:40+0200\n"
+"POT-Creation-Date: 2022-03-31 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"
@@ -33,249 +33,6 @@ msgstr ""
 msgid "Value {v!r} for a timeout of {what} must be greater than 0 and less than {max}."
 msgstr ""
 
-#: lib/pp_admintools/cfg_app.py:143 lib/pp_admintools/cfg_app.py:149
-msgid "Invalid configuration stem {!r} given."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:190
-msgid "{c} on setting encoding {v!r}: {e}"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:244 lib/pp_admintools/mail_app.py:204
-msgid "Mailing options"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:248 lib/pp_admintools/cfg_app.py:254 lib/pp_admintools/cfg_app.py:260
-#: lib/pp_admintools/mail_app.py:219 lib/pp_admintools/mail_app.py:227
-#: lib/pp_admintools/mail_app.py:233 lib/pp_admintools/mail_app.py:239
-msgid "ADDRESS"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:249 lib/pp_admintools/mail_app.py:228
-msgid "Mail addresses of all recipients for mails generated by this script."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:255 lib/pp_admintools/mail_app.py:234
-msgid "Mail addresses of all CC recipients for mails generated by this script."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:261 lib/pp_admintools/mail_app.py:240
-msgid "Reply mail address for mails generated by this script."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:266 lib/pp_admintools/mail_app.py:246
-msgid "METHOD"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:267 lib/pp_admintools/mail_app.py:247
-msgid "Method for sending the mails generated by this script. Valid values: {v}, default: {d!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:276 lib/pp_admintools/mail_app.py:255
-msgid "SERVER"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:277 lib/pp_admintools/mail_app.py:256
-msgid ""
-"Mail server for submitting generated by this script if the mail method of this script is 'smtp'."
-" Default: {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:285 lib/pp_admintools/mail_app.py:263
-#: lib/pp_admintools/pdns_app.py:275
-msgid "PORT"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:286 lib/pp_admintools/mail_app.py:265
-msgid ""
-"The port to use for submitting generated by this script if the mail method of this script is "
-"'smtp'. Default: {}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:291
-msgid "Config file options"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:295 lib/pp_admintools/cfg_app.py:303
-msgid "FILE"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:296
-msgid "Configuration files to use additional to the standard configuration files."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:304
-msgid "Configuration file for logging in JSON format. See {!r} how the structures has to be defined."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:311
-msgid "ENCODING"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:312
-#, python-format
-msgid "The encoding character set of the configuration files (default: %(default)r)."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:345 lib/pp_admintools/cfg_app.py:391 lib/pp_admintools/cfg_app.py:425
-#: lib/pp_admintools/cfg_app.py:500
-msgid "Searching for {!r} ..."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:411
-msgid "Log config files:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:432
-msgid "No read access to {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:438
-msgid "Reading and evaluating {!r} ..."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:454
-msgid "Evaluated configuration from JSON:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:458
-msgid "Wrong file {!r} - "
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:503
-msgid "Config file {!r} not found."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:506 lib/pp_admintools/dns_deploy_zones_app.py:693
-#: lib/pp_admintools/dns_deploy_zones_app.py:710
-msgid "Reading {!r} ..."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:517
-msgid "Wrong configuration in {!r} found: "
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:519
-msgid "Configuration error"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:530
-msgid "Evaluated config from {!r}:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:534
-msgid "Evaluated config total:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:557
-msgid "There are errors in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:560
-msgid "There are no errors in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:568 lib/pp_admintools/cfg_app.py:591
-#: lib/pp_admintools/dns_deploy_zones_config.py:202 lib/pp_admintools/dns_deploy_zones_config.py:515
-#: lib/pp_admintools/mail_config.py:178 lib/pp_admintools/pdns_config.py:187
-msgid "Evaluating config section {!r}:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:615
-msgid "Found invalid recipient mail address {!r} in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:631
-msgid "CC addresses:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:637
-msgid "Found invalid cc mail address {!r} in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:655
-msgid "Found invalid reply mail address {!r} in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:670 lib/pp_admintools/mail_config.py:308
-msgid "Found invalid mail method {!r} in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:695 lib/pp_admintools/cfg_app.py:699
-msgid "Found invalid SMTP port number {!r} in configuration."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:722 lib/pp_admintools/mail_app.py:106
-msgid "Got invalid SMTP port number {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:740
-msgid "Got invalid recipient mail address {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:761
-msgid "Got invalid CC mail address {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:776 lib/pp_admintools/mail_app.py:190
-msgid "Got invalid reply mail address {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:807 lib/pp_admintools/mail_app.py:289
-msgid "Mail to send:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:840 lib/pp_admintools/mail_app.py:322
-msgid "Did not found sendmail executable."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:846 lib/pp_admintools/dns_deploy_zones_app.py:441
-#: lib/pp_admintools/dns_deploy_zones_app.py:795 lib/pp_admintools/dns_deploy_zones_app.py:831
-#: lib/pp_admintools/dns_deploy_zones_app.py:863 lib/pp_admintools/dns_deploy_zones_app.py:898
-#: lib/pp_admintools/dns_deploy_zones_app.py:933 lib/pp_admintools/mail_app.py:328
-msgid "Executing: {}"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:872
-msgid "Checking, whether {!r} is a local zone."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:876
-msgid "Zone {zone!r} has the local TLD {tld!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:882
-msgid "Zone {zone!r} has the local base name {n!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:888
-msgid "Zone {zone!r} has the public TLD {tld!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:898
-msgid "Got IPv4 tupels from zone {!r}:"
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:913
-msgid "Could not interprete reverse IPv4 zone {!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:917
-msgid "Got IPv4 network address of zone {zone!r}: {nw!r}."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:923
-msgid "The network {nw!r} of zone {zone!r} is allocated for public networks."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:926
-msgid "The network {nw!r} of zone {zone!r} is allocated for local networks."
-msgstr ""
-
-#: lib/pp_admintools/cfg_app.py:932
-msgid "Zone {!r} seems to be a reverse zone for a public network."
-msgstr ""
-
 #: lib/pp_admintools/dns_deploy_zones_app.py:121
 msgid "Generation of the BIND9 configuration file for slave zones."
 msgstr ""
@@ -364,6 +121,13 @@ msgstr ""
 msgid "Trying to get all keys from named.conf ..."
 msgstr ""
 
+#: lib/pp_admintools/dns_deploy_zones_app.py:441 lib/pp_admintools/dns_deploy_zones_app.py:795
+#: lib/pp_admintools/dns_deploy_zones_app.py:831 lib/pp_admintools/dns_deploy_zones_app.py:863
+#: lib/pp_admintools/dns_deploy_zones_app.py:898 lib/pp_admintools/dns_deploy_zones_app.py:933
+#: lib/pp_admintools/mail_app.py:328
+msgid "Executing: {}"
+msgstr ""
+
 #: lib/pp_admintools/dns_deploy_zones_app.py:447 lib/pp_admintools/dns_deploy_zones_app.py:801
 msgid "Result:"
 msgstr ""
@@ -440,6 +204,10 @@ msgstr ""
 msgid "Target file"
 msgstr ""
 
+#: lib/pp_admintools/dns_deploy_zones_app.py:693 lib/pp_admintools/dns_deploy_zones_app.py:710
+msgid "Reading {!r} ..."
+msgstr ""
+
 #: lib/pp_admintools/dns_deploy_zones_app.py:703 lib/pp_admintools/dns_deploy_zones_app.py:720
 msgid "Cleaned version of {!r}:"
 msgstr ""
@@ -522,6 +290,11 @@ msgstr ""
 msgid "Reloading {} ..."
 msgstr ""
 
+#: lib/pp_admintools/dns_deploy_zones_config.py:202 lib/pp_admintools/dns_deploy_zones_config.py:515
+#: lib/pp_admintools/mail_config.py:178 lib/pp_admintools/pdns_config.py:187
+msgid "Evaluating config section {!r}:"
+msgstr ""
+
 #: lib/pp_admintools/dns_deploy_zones_config.py:290
 msgid "Checking given master address {!r} ..."
 msgstr ""
@@ -587,6 +360,10 @@ msgstr ""
 msgid "Evaluated configuration:"
 msgstr ""
 
+#: lib/pp_admintools/mail_app.py:106
+msgid "Got invalid SMTP port number {!r}."
+msgstr ""
+
 #: lib/pp_admintools/mail_app.py:124
 msgid "Got invalid mail from address {!r}."
 msgstr ""
@@ -599,14 +376,75 @@ msgstr ""
 msgid "Got invalid cc mail addresses:"
 msgstr ""
 
+#: lib/pp_admintools/mail_app.py:190
+msgid "Got invalid reply mail address {!r}."
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:204
+msgid "Mailing options"
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:219 lib/pp_admintools/mail_app.py:227
+#: lib/pp_admintools/mail_app.py:233 lib/pp_admintools/mail_app.py:239
+msgid "ADDRESS"
+msgstr ""
+
 #: lib/pp_admintools/mail_app.py:220
 msgid "Sender mail address for mails generated by this script. Default: {!r}"
 msgstr ""
 
+#: lib/pp_admintools/mail_app.py:228
+msgid "Mail addresses of all recipients for mails generated by this script."
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:234
+msgid "Mail addresses of all CC recipients for mails generated by this script."
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:240
+msgid "Reply mail address for mails generated by this script."
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:246
+msgid "METHOD"
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:247
+msgid "Method for sending the mails generated by this script. Valid values: {v}, default: {d!r}."
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:255
+msgid "SERVER"
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:256
+msgid ""
+"Mail server for submitting generated by this script if the mail method of this script is 'smtp'."
+" Default: {!r}."
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:263 lib/pp_admintools/pdns_app.py:275
+msgid "PORT"
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:265
+msgid ""
+"The port to use for submitting generated by this script if the mail method of this script is "
+"'smtp'. Default: {}."
+msgstr ""
+
 #: lib/pp_admintools/mail_app.py:274
 msgid "Got command line arguments:"
 msgstr ""
 
+#: lib/pp_admintools/mail_app.py:289
+msgid "Mail to send:"
+msgstr ""
+
+#: lib/pp_admintools/mail_app.py:322
+msgid "Did not found sendmail executable."
+msgstr ""
+
 #: lib/pp_admintools/mail_config.py:199 lib/pp_admintools/mail_config.py:223
 #: lib/pp_admintools/mail_config.py:291
 msgid "Found invalid {what} {addr!r} in configuration."
@@ -628,6 +466,10 @@ msgstr ""
 msgid "reply to address"
 msgstr ""
 
+#: lib/pp_admintools/mail_config.py:308
+msgid "Found invalid mail method {!r} in configuration."
+msgstr ""
+
 #: lib/pp_admintools/mail_config.py:342
 msgid "Value {!r} for SMTP port is invalid:"
 msgstr ""