+++ /dev/null
-#!/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
__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
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"
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."
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:"
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}:"
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} …"
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."
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."
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:"
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"
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 ""
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 ""
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 ""
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} …"
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 ""
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."
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 ""
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"
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 ""
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 ""
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 ""
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 ""
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 ""
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."
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 ""