2021SC@SDUSC
OSSIM-agent源代码分析(三)
OSSIM-agent-config.py
OSSIM Agent的主要职责是收集网络上存在的各种设备发送的所有数据,然后按照一种标准方式(standardized way)有序的发送给OSSIM Server,Agent收集到数据后在发送给Server之前要对这些数据进行标准化处理,这样Server就可以依一种统一的方式来处理这些信息,并且也简化了Server的处理过程
agent的配置文件是config.py,作为大量数据的标准化处理位置,配置文件的对各种数据、文件的处理方式的
导入相关引用文件
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