2021SC@SDUSC
os-sim/frameworked源码分析之action
一、frameworked与action
下图在ossim项目中各个主要模块之间的数据流动示意。
关注framework与其他模块的交互,主要有:
-
Server至Frameworkd:发送请求命令,要求Frameworkd针对警告(Alarm)采取相应操作,例如执行外部程序或发出Email来通知管理员。
-
Framework至Server:发送请求命令至Server。要求Server通知Agent对插件(Plugins)进行启动、停止等操作。
-
Framework至Frameworkd:发送请求命令,要求Frameworkd启动OpenVas扫描进程。
-
Frameworkd至Framework: 传送OpenVas扫描结果在前端页面中显示。
-
Frameworkd至Database:在Frameworkd执行过程中将Openvas扫描结果存入数据库。
-
Database至Framework: PHP页面显示需要调用数据库的告警事件。
-
Framework至Database:用户参数设置信息需要存入数据库。
二、重点解析
2.1、action.py
代码整体结构如下
在这里插入代码片class Action(threading.Thread):
base64field = ["username", \
"password", "filename", \
"userdata1", "userdata2", "userdata3", \
"userdata4", "userdata5", "userdata6", \
"userdata7", "userdata8", "userdata9"]
def __init__(self, request):
def get_mail_server_data(self):
def parseRequest(self, request):
def getActions(self, id):
def requestRepr(self, request, email_to):
def getHostnameFromIP(self, hostip):
def doAction(self, action_id):
def mailNotify(self):
def run(self)
首先import了若干包
然后定义了一个类Action,
其数据结构中包含了用户名,密码,文件名,用户数据。
同时定义了9个函数,分别用于初始化,获取服务器数据,解析请求,获取动作,从Ip获取主机名等操作
2.2、部分函数
1. _init _
构造函数/初始化函数,将应答内容置空,邮件服务器的端口号,用户名密码等初始化。
def __init__(self, request):
self.__request = self.parseRequest(request)
self.__responses = {}
self.__conf = OssimConf()
self.__db = OssimDB(self.__conf[VAR_DB_HOST], \
self.__conf[VAR_DB_SCHEMA], \
self.__conf[VAR_DB_USER],
self.__conf[VAR_DB_PASSWORD]
)
self.__component_id = None
self.__email_server_relay_enabled = False
self.__email_server = ""
self.__email_server_port = 0
self.__email_server_user = ""
self.__email_server_passwd = ""
threading.Thread.__init__(self)
2. get_mail_server_data
获取邮件服务器数据。用异常捕获结构编写的,从数据库检索电子邮件服务器配置。
然后打印服务器、服务器密码、服务器端口、服务器用户。
如果服务器未打开成功,警告“电子邮件服务器中继未配置”
尝试赋值服务器端口, 如果值错误:警告“无效的服务器端口"
抛出其他异常,则导入回溯,警告“获取电子邮件服务器配置时出错”
def get_mail_server_data(self):
"""Retrieves the email server configuration from the database.
"""
try:
server = ossim_setup['mailserver_relay'] #data['mailserver_relay']
server_port = ossim_setup ['mailserver_relay_port'] #data['mailserver_relay_port']
server_user = ossim_setup['mailserver_relay_user'] #data['mailserver_relay_user']
server_passwd = ossim_setup['mailserver_relay_passwd'] #data['mailserver_relay_passwd']
print server,server_passwd,server_port,server_user
if server == "no":
logger.warning("Email server relay not configured -> mailserver_relay = no")
self.__email_server_relay_enabled = False
return
self.__email_server = server
try:
self.__email_server_port = int(server_port)
except ValueError:
logger.warning("Invalid server port: %s" % server_port)
self.__email_server_relay_enabled = False
return
self.__email_server_user = server_user
self.__email_server_passwd = server_passwd
self.__email_server_relay_enabled = True
except Exception, e:
self.__email_server_relay_enabled = False
import traceback
traceback.print_exc()
logger.error("Error getting the email server configuration: %s" % str(e))
三、总结
Action 定义了一个Server至Frameworkd的行为标准,要求Frameworkd对通信进行检查,针对警告采取相应操作,例如执行外部程序或发出Email来通知管理员。