Files
monasca-agent/monasca_setup/detection/plugins/postfix.py
Michał Piotrowski 538aec2e1b Update log level classification info
It is possible monasca-setup configuration process informs user about
errors related to setting up other services, but system is working
correctly. It is expected to change some log level classification for
INFO or WARNING depends on type of message.

Story: 2004970
Task: 29425

Change-Id: Idb8101fea6e7c5c357d72d77b3b264db4cce8527
2019-02-15 08:36:17 +01:00

94 lines
3.6 KiB
Python

# (c) Copyright 2015-2016 Hewlett Packard Enterprise Development LP
# Copyright 2017 Fujitsu LIMITED
# Copyright 2017 SUSE Linux GmbH
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import logging
import os
import yaml
from monasca_setup import agent_config
from monasca_setup.detection import plugin
from monasca_setup.detection import utils
log = logging.getLogger(__name__)
_POSTFIX_PROC_NAME = 'postfix'
_POSTFIX_DIRECTORY = """/var/spool/postfix"""
_POSTFIX_CHECK_COMMAND = ('sudo -l -U {0} find %s/incoming '
'-type f > /dev/null' % _POSTFIX_DIRECTORY)
"""Command to verify if user running monasca-agent
has sudo permission to access postfix directory"""
class Postfix(plugin.Plugin):
"""If postfix is running install the default config.
"""
ERROR_MSG = 'postfix plugin will not be configured.'
def _detect(self):
"""Run detection, set self.available True if the service is detected.
"""
try:
has_process = (utils.find_process_cmdline(_POSTFIX_PROC_NAME)
is not None)
agent_user = utils.get_agent_username() if has_process else None
has_user = agent_user is not None
has_sudoers = (self._has_sudoers(agent_user)
if agent_user else False)
except Exception:
self.available = False
detailed_msg = ('Unexpected exception while '
'running postfix detection.')
log.exception('%s\n%s' % (detailed_msg, self.ERROR_MSG))
else:
self.available = has_process and has_sudoers
if not self.available:
if not has_process:
detailed_msg = ('%s process was not found.'
% _POSTFIX_PROC_NAME)
log.info('%s\n%s' % (detailed_msg, self.ERROR_MSG))
elif not has_user:
detailed_msg = 'Did not locate agent\'s username.'
log.error('%s\n%s' % (detailed_msg, self.ERROR_MSG))
elif not has_sudoers:
detailed_msg = ('%s cannot access %s directory. '
'\n Refer to postfix plugin documentation '
'for more details.'
% (agent_user, _POSTFIX_DIRECTORY))
log.warning('%s\n%s' % (detailed_msg, self.ERROR_MSG))
def build_config(self):
"""Build the config as a Plugins object and return.
"""
# A bit silly to parse the yaml only for it to be converted back but this
# plugin is the exception not the rule
with open(os.path.join(self.template_dir, 'conf.d/postfix.yaml.example'),
'r') as postfix_template:
default_net_config = yaml.safe_load(postfix_template.read())
config = agent_config.Plugins()
config['postfix'] = default_net_config
return config
def dependencies_installed(self):
return True
@staticmethod
def _has_sudoers(agent_user):
test_sudo = os.system(_POSTFIX_CHECK_COMMAND.format(agent_user))
return test_sudo == 0