Source code for duct.sources.postfix

"""
.. module:: postfix
   :platform: Unix
   :synopsis: A source module for postfix stats

.. moduleauthor:: Colin Alston <colin@tamvera.com>
"""

import logging
import os

from zope.interface import implementer

from duct.aggregators import Counter
from duct.interfaces import IDuctSource
from duct.objects import Source

log = logging.getLogger(__name__)


[docs] @implementer(IDuctSource) class Postfix(Source): """Postfix checks :param spool: Postfix spool directory (default: /var/spool/postfix) :type spool: str. **Metrics:** :(service_name).active: :(service_name).deferred: :(service_name).maildrop: :(service_name).incoming: :(service_name).corrupt: :(service_name).hold: :(service_name).bounce: """ ssh = True def __init__(self, *a, **kw): Source.__init__(self, *a, **kw) self.spool = self.config.get('spool', '/var/spool/postfix') self.paths = ['active', 'deferred', 'maildrop', 'incoming', 'corrupt', 'hold', 'bounce']
[docs] async def get(self): events = [] for queue in self.paths: abspath = os.path.join(self.spool, queue) out, err, code = await self.fork( '/bin/sh', args=('-c', f'"/bin/find {abspath} -type f | /usr/bin/wc -l"',) ) if code == 0: val = int(out.strip('\n')) events.extend([ self.createEvent('ok', f'{queue} queue length', val, prefix=f'{queue}.value'), self.createEvent('ok', 'Queue rate', val, prefix=f'{queue}.rate', aggregation=Counter) ]) else: log.warning('Error running %s', repr(err)) return events