OSSIM-agent源代码分析(三)

2021SC@SDUSC

OSSIM-agent源代码分析(三)

OSSIM-agent-config.py

简述

OSSIM Agent的主要职责是收集网络上存在的各种设备发送的所有数据,然后按照一种标准方式(standardized way)有序的发送给OSSIM Server,Agent收集到数据后在发送给Server之前要对这些数据进行标准化处理,这样Server就可以依一种统一的方式来处理这些信息,并且也简化了Server的处理过程

agent的配置文件是config.py,作为大量数据的标准化处理位置,配置文件的对各种数据、文件的处理方式的

config配置类

导入相关引用文件

import os, sys, string, re
import codecs
from ConfigParser import ConfigParser
from optparse import OptionParser
from Exceptions import AgentCritical
from Logger import Logger
logger = Logger.logger
import ParserUtil

相关配置参数在config.cfg

    _NEEDED_CONFIG_ENTRIES = {
        'daemon': [],
        'log': [],
        'plugin-defaults': ['sensor', 'interface', 'tzone'],
        'watchdog': ['enable', 'interval'],
        'output-server': ['enable', 'ip', 'port'],
        'plugins': [],
    }

通过正则表达式,覆盖OPTCRE选项,使得允许在选项名称中使用:

    OPTCRE = re.compile(
        r'(?P<option>[^:=\s][^=]*)'          
        r'\s*(?P<vi>[:=])\s*'                                            
        r'(?P<value>.*)$'                    
        )

检查相关配置文件

 def read(self, filenames, encoding='latin1',check_neededEntries = True):
        self.__validConfig = True
        fp=None
        for filename in filenames:
            if not os.path.isfile(filename):
                AgentCritical("Configuration file (%s) does not exist!" % (filename))
            try:
                fp = codecs.open(filename, 'r', encoding=encoding)
                self.readfp(fp)
            except Exception,e:
                logger.error("Invalid plugin file:%s",str(e))
                self.__validConfig = False
            if check_neededEntries:
                self.check_needed_config_entries()

在.cfg文件中检查所需的文件,此函数使用变量_NEEDED_CONFIG_ENTRIES,如果没有所需文件,则退出

 def check_needed_config_entries(self):
        for section, values in self._NEEDED_CONFIG_ENTRIES.iteritems():
            if not self.has_section(section):
                logger.critical (
                    "Needed section [%s] not found!" % (section))
                self.__validConfig = False
                if self._EXIT_IF_MALFORMED_CONFIG:
                    sys.exit()
            for value in values:
                if not self.has_option(section, value):
                    self.__validConfig = False
                    logger.critical (
                        "Needed option [%s->%s] not found!" % (section, value))
                    if self._EXIT_IF_MALFORMED_CONFIG:
                        sys.exit()

避免配置值中的混淆

    def _strip_value(self, value):
        from string import strip
        return strip(strip(value, '"'), "'")

这个方法与RawConfigParser.items()相同,但返回哈希值而不是列表

    def hitems(self, section,braw=False):
        hash = {}
        for item in self.items(section,braw):
            hash[item[0]] = self._strip_value(item[1])
        return hash

这个方法与ConfigParser.get()相同,但使用and剥离值

    def get(self, section, option):
        try:
            value = ConfigParser.get(self, section, option)
            value = self._strip_value(value)
        except:
            value = ""
        return value

    def getboolean(self, section, option):
        try:
            value = ConfigParser.getboolean(self, section, option)
        except ValueError: # not a boolean
            logger.warning("Value %s->%s is not a boolean" % (section, option))
            return False
        return value

打印配置对象的表示形式,用于调试

    def __repr__(self):
        conf_str = '<sensor-config>\n'
        for section in sorted(self.sections()):
            conf_str += '  <section name="%s">\n' % (section)
            for i in self.items(section):
                conf_str += '    <item name="%s" value="%s" />\n' % (i[0], i[1])
            conf_str += '  </section>\n'
        conf_str += '</sensor-config>'
        return conf_str
上一篇:搬家第四天-85.Wincc V7.3 用户归档深入使用4-单选框结合c做列排序


下一篇:分享Grunt.js配置: watch + liveReload 实时监测文件变化自动刷新浏览器