logparse / parsers / load_parsers.pyon commit fix logrotate functionality (6fc6399)
   1#
   2#   load_parsers.py
   3#   
   4#   Search for and load files which parse logs for particular services
   5#
   6
   7import imp
   8import importlib
   9import os
  10import glob
  11from pathlib import Path
  12from sys import path
  13from typing import NamedTuple
  14
  15parser_dir = "/usr/share/logparse/"
  16main_module = "__init__"
  17default_parsers = ["cron-journald", "httpd", "mem", "postfix", "smbd", "sshd-journald", "sudo", "sysinfo", "temperature", "zfs"]
  18deprecated_parsers = ["sshd", "cron"]
  19
  20import logging
  21logger = logging.getLogger(__name__)
  22
  23class Parser():
  24    def __init__(self, name, path=None, info=None):
  25        self.name = str(name)
  26        self.path = Path(path) if path else None
  27        self.info = dict(info) if info else None
  28
  29def findall():
  30    logger.debug("Searching for parsers in {0}".format(parser_dir))
  31    path.append(os.path.abspath(parser_dir))
  32    parsers = []
  33    parser_candidates = os.listdir(parser_dir)
  34    for parser_name in parser_candidates:
  35        location = os.path.join(parser_dir, parser_name)
  36        if not os.path.isdir(location) or not main_module + '.py' in os.listdir(location):
  37            logger.warning("Rejecting parser {0} due to invalid structure".format(location))
  38            continue
  39        info = imp.find_module(main_module, [location])
  40        parser_obj = Parser(parser_name, location, info)
  41        parsers.append(parser_obj)
  42        logger.debug("Added parser {0}".format(parser_obj.name))
  43    return parsers
  44
  45def search(name):
  46    logger.debug("Searching for parser {0}".format(name))
  47    if name in default_parsers:
  48        logger.debug("Found parser {0} in default modules".format(name))
  49        return Parser('.'.join(__name__.split('.')[:-1] + [name]))
  50    elif name in deprecated_parsers:
  51        logger.debug("Found parser {0} in deprecated modules".format(name))
  52        return Parser('.'.join(__name__.split('.')[:-1] + [name]))
  53    else:
  54        return None
  55
  56def load(parser):
  57    logger.debug("Loading parser {0} from {1}".format(parser.name, parser.path if parser.path != None else "defaults"))
  58    return importlib.import_module(parser.name)