2021SC@SDUSC
从本周开始,我的主要任务是对 Framework 模块之一 Frameworkd 部分进行源代码分析。
Framework 可以分为两个部分:Frontend、Frameworkd
Frontend:(可视化管理前端)主要采用php语言编写,它是系统的一组web界面;
Frameworkd :是一个守护进程,采用python 编写,主要脚本文件在 /usr/share/ossim-framework/ossimframework/
目录下,它绑定 ossim 的知识库和事件库,监听端口为40003(在etc/ossim/ossim_setup.conf
配置文件以及 /etc/ossim/server/config.xml
中)可以查看到相关端口定义的信息,同样通过命令 lsof -Pnl + M -i4|grep ossim-fra
也可以进行查看,通过查看服务端口信息,对于我们了解他的工作原理有很大帮助。
本周主要对frameworkd 的源代码进行分析
Frameworkd 负责将 Frontend 收集到的用户指令和系统的其他组件相关联,并绘制 Web 图表供前端显示。在 ossim 系统中,Framework 安装了 Apache + Php + Adodb 来搭建支持 PHP 的 Web Server,安装 phpgacl 处理用户权限,安装 Mrtg、RRdtool 绘制监控图,安装 ACID/BASE 作为事件的前端控制台。
首先导入需要的模块
import os, sys, time, signal
from optparse import OptionParser
import subprocess as sub
import atexit
import re
import Queue
import uuid
import stat
import pwd
import ConfigParser
from datetime import datetime
然后导入自定义相关文件
from NagiosMkLiveManager import NagiosMkLiveManager
from OssimConf import OssimConf
from OssimDB import OssimDB
from DBConstantNames import *
from BackupManager import BackupManager
from Listener import Listener
from Logger import Logger
main方法
def main(self):
self.pidfile = '/var/run/ossim-framework.pid'
self._options = self.__parse_options()
self.__conf = OssimConf()
#检查 pid 文件,调用守护进程函数
if self._options.daemon is not None:
self.__check_pid()
self.__daemonize__()
self.__init_log(self._options.daemon)
logger.info("Frameworkd is starting up...")
logger.info("Start Listener...")
self.__listener = Listener()
self.__listener.start()
# BackupManager
#备份管理器:此模块旨在运行所有mysql备份操作
t = None
bkm = BackupManager()
bkm.start()
#遍历类数组,执行exec "from %s import %s" % (c, c)导入
for c in self.__classes:
conf_entry = "frameworkd_" + c.lower()
logger.debug("Conf entry:%s value: %s" % (conf_entry, self.__conf[conf_entry]))
if str(self.__conf[conf_entry]).lower() in ('1', 'yes', 'true'):
logger.info(c.upper() + " is enabled")
exec "from %s import %s" % (c, c)
exec "t = %s()" % (c)
t.start()
self.waitforever()
接下来就是具体的 Framework 类代码
构造器 __init__(self)
:
对类相关属性进行初始化
def __init__(self):
self.__classes = [
"Scheduler",
"DoNagios",
"NagiosMkLiveManager",
"BackupManager",
]
self.__encryptionKey = ''
self.__options = None
self.__conf = None
self.__listener = None
私有方法 __parse_options(self)
:
用于解析命令行选项
OptionParser 模块用于处理命令行参数,add_option 方法用来加入选项。
action :是 parse_args() 方法的参数之一,它指示 OptionParser 当解析到一个命令行参数时该如何处理。 可选值有 store、store_true、store_false 等,默认是’store ',表示将命令行参数值保存在 options 对象里。
dest 是存储的变量,default 是缺省值,help 是帮助提示
def __parse_options(self):
usage = "%prog [-d] [-v] [-s delay] [-c config_file]"
#OptionParser用于处理命令行参数
parser = OptionParser(usage=usage)
#add_option 用来加入选项,
#action是有store,store_true,store_false等,dest是存储的变量,default是缺省值,help是帮助提示
parser.add_option("-v", "--verbose", dest="verbose", action="count",
help="make lots of noise")
parser.add_option("-L", "--log", dest="log", action="store",
help="user FILE for logging purposes", metavar="FILE")
#在守护进程模式下运行脚本
parser.add_option("-d", "--daemon", dest="daemon", action="store_true",
help="Run script in daemon mode")
parser.add_option("-s", "--sleep", dest="sleep", action="store",
help="delay between iterations (seconds)", metavar="DELAY")
parser.add_option("-c", "--config", dest="config_file", action="store",
help="read config from FILE", metavar="FILE")
parser.add_option("-p", "--port", dest="listener_port", action="store",
help="use PORT as listener port", metavar="PORT")
parser.add_option("-l", "--listen-address",dest="listener_address",action="store"
,help="use ADDRESS as listener IP address", metavar="ADDRESS")
最后通过 parse_args() 函数进行解析,获得选项值,如获取 options.verbose、options.daemon 的值
(options, args) = parser.parse_args()
#两个选项不兼容
if options.verbose and options.daemon:
parser.error("incompatible options -v -d")
return options
未完~
上一篇():OSSIM开源安全信息管理系统(四)
下一篇( Framework 源码分析(二)):OSSIM开源安全信息管理系统(六)