ok

Mini Shell

Direktori : /lib/fm-agent/library/
Upload File :
Current File : //lib/fm-agent/library/plugin_driver.py

import os
import sys
import time
import logging
import optparse
from plugin_manager import PluginManager
from schedule import Schedule
import container_discovery


class PluginDriver(object):
    def __init__(self, brand, pkg_dir, base_config_dir, base_custom_plugin_dir):
        self.config_file = os.path.join(
            base_config_dir, pkg_dir, "%s_agent.cfg" % brand
        )
        self.custom_plugin_dir = os.path.join(base_custom_plugin_dir, pkg_dir)

    def set_up_logging(self, verbose):
        LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"

        handler = logging.StreamHandler()
        handler.setFormatter(logging.Formatter(LOG_FORMAT))

        root_logger = logging.getLogger()
        root_logger.addHandler(handler)

        self.log = logging.getLogger(self.__class__.__name__)

        if verbose:
            root_logger.setLevel(logging.DEBUG)
        else:
            root_logger.setLevel(logging.WARN)
            self.log.setLevel(logging.INFO)

    def parse_arguments(self):
        parser = optparse.OptionParser()
        parser.add_option(
            "-p", "--plugin-textkey", action="store", dest="plugin_textkey"
        )
        parser.add_option(
            "-r", "--resource-textkey", action="store", dest="resource_textkey"
        )
        parser.add_option("-o", "--option", action="store", dest="option")
        parser.add_option(
            "-d",
            "--plugin-directory",
            action="store",
            dest="plugin_directory",
            default=self.custom_plugin_dir,
            help="default %s" % self.custom_plugin_dir,
        )
        parser.add_option(
            "-c",
            "--config-file",
            action="store",
            dest="config_file",
            default=self.config_file,
            help="default %s" % self.config_file,
        )
        parser.add_option(
            "--container-id",
            action="store",
            dest="container_id",
            help="docker container id to check",
        )
        parser.add_option(
            "--count",
            action="store",
            dest="count",
            type="int",
            default=1,
            help="number of checks run, default 1",
        )
        parser.add_option(
            "--interval",
            action="store",
            dest="interval",
            type="int",
            default=1,
            help="interval between checks, default 1 second",
        )
        parser.add_option("-v", "--verbose", action="store_true", dest="verbose")

        options, args = parser.parse_args()

        # validate required arguments
        if not options.plugin_textkey or not options.resource_textkey:
            print("Specify plugin-textkey and resource-textkey\n")
            parser.print_help()
            sys.exit(1)

        return options

    def get_container(self, container_id):
        can_access_docker = container_discovery.check_access()
        if can_access_docker != "success":
            self.log.error("cannot access to docker: %s" % can_access_docker)
            return None

        found_container = container_discovery.find_docker_container(container_id)
        if not found_container:
            self.log.error("container %s not found" % container_id)
            return None

        return found_container

    def main(self):
        # parse arguments
        options = self.parse_arguments()

        # set up logging
        self.set_up_logging(options.verbose)

        # check config file
        if not os.path.exists(options.config_file):
            self.log.warn("config file '%s' not exist" % options.config_file)

        # convert option to '"option"' format, so that schedule can do json.loads()
        if options.option:
            options.option = '"%s"' % options.option

        db = {}
        server_key = None

        # docker container
        if options.container_id:
            container = self.get_container(options.container_id)
            if not container:
                return

            db["docker_containers"] = {options.container_id: container}
            server_key = ":" + options.container_id

        # load plugins
        plugin_manager = PluginManager(
            db, options.config_file, options.plugin_directory
        )
        if options.plugin_textkey not in plugin_manager.plugins:
            self.log.error("Plugin %s not found" % options.plugin_textkey)
            return

        # create schedule to call check
        schedule = Schedule(
            {
                "id": 1,
                "plugin_textkey": options.plugin_textkey,
                "resource_textkey": options.resource_textkey,
                "option": options.option,
                "server_key": server_key,
                "frequency": 60,
                "thresholds": [],
            }
        )

        for i in range(options.count):
            # run plugin
            value, _ = schedule.check(plugin_manager, {})

            self.log.info(
                "%s.%s returned %s"
                % (schedule.plugin_textkey, schedule.resource_textkey, value)
            )
            if schedule.cached_results:
                self.log.info("  cached_results: %s" % schedule.cached_results)

            # if this is not the last turn, sleep options.interval seconds
            if i < options.count - 1:
                time.sleep(options.interval)

Zerion Mini Shell 1.0