2021SC@SDUSC

(接上一篇文章:)

__daemonize__(self) : 守护进程方法

如果收到信号 signal.SIGTERM(终止进程),调用 self.stop
当用户输入 kill sigterm pid 。 对应的进程就会收到这个信号,这个信号进程是可以捕获并指定函数处理, 例如做一下程序清理等工作,也可以忽视这个信号

def __daemonize__(self):signal.signal(signal.SIGTERM, self.stop)

创建一个子进程

try: pid = os.fork()#如果是pid>0,表明当前处于父进程(pid的值为子进程的进程号)if pid > 0:#退出第一个父进程sys.exit(0)
#创建子进程失败,输出相应错误信息
except OSError, e:sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))sys.exit(1)

与父环境解耦

os.setsid() :当进程是会话的领头进程时setsid()调用失败并返回(-1)。
setsid()调用成功后,返回新的会话的ID,调用setsid函数的进程成为新的会话的领头进程,并与其父进程的会话组和进程组脱离。

# os.chdir() 方法用于改变当前工作目录到指定的路径。
os.chdir("/")
#调用系统调用 setsid()
os.setsid()
#设置当前的数值 umask 并返回之前的 umask
os.umask(0)

创建第二个子进程,过程与创建第一个子进程时相同

try:pid = os.fork()if pid > 0:#退出第二个父进程sys.exit(0)
except OSError, e:sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))sys.exit(1)

重定向标准文件描述符

sys.stdout.flush()、sys.stderr.flush():标准输出和标准出错流

sys.stdout.flush()
sys.stderr.flush()

file(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None):

r:以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

0:报错级别

si = file('/dev/null', 'r')
so = file('/dev/null', 'a+')
se = file('/dev/null', 'a+', 0)

os.dup2() :用于将一个文件描述符 fd 复制到另一个文件描述符 fd2。
fileno() :返回一个整型的文件描述符( file descriptor FD 整型),可用于底层操作系统的 I/O 操作。

将输入、输出、出错文件描述符复制到标准输入、标准输出、标准出错流

os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())

编写pid文件

atexit.register() :用于在 python 解释器中注册一个退出函数,这个函数在解释器正常终止时自动执行,一般用来做一些资源清理的操作(这里是删除 pid 文件)

atexit.register(self.delpid)
pid = str(os.getpid())
file(self.pidfile, 'w+').write("%s\n" % pid)
os.chmod(self.pidfile, 0644)

delpid(self) :删除pid文件

def delpid(self):Delete the pid fileos.remove(self.pidfile)

stop(self, sig, params) :终止 frameworkd 进程

def stop(self, sig, params):try:pf = file(self.pidfile, 'r')pid = int(pf.read().strip())pf.close()except IOError:pid = Noneif not pid:message = "pidfile %s does not exist. Daemon not running? or not in daemon mode?\n"sys.stderr.write(message % self.pidfile)return

终止守护进程

try:while 1:os.kill(pid, signal.SIGTERM)time.sleep(0.1)
except OSError, err:err = str(err)if err.find("No such process") > 0:if os.path.exists(self.pidfile):os.remove(self.pidfile)
else:print str(err)sys.exit(1)

waitforever(self) : 等待Control-C并终止所有线程

def waitforever(self):while 1:try:time.sleep(1)#isAlive方法是从threading继承而来, is_alive() 方法查询线程是否还在运行if not self.__listener.isAlive():logger.info("Listener in down... exiting...")pid = os.getpid()os.kill(pid, signal.SIGKILL)breakexcept KeyboardInterrupt:pid = os.getpid()os.kill(pid, signal.SIGKILL)

__init_log(self, daemon_mode)

def __init_log(self, daemon_mode):verbose = "info"Logger.add_file_handler('%s/frameworkd.log' % self.__conf[VAR_LOG_DIR])Logger.add_error_file_handler('%s/frameworkd_error.log' % self.__conf[VAR_LOG_DIR])if daemon_mode:Logger.remove_console_handler()

前面解析命令行函数 __parse_options(self) 中 -v参数
parser.add_option("-v", "--verbose", dest="verbose", action="count",help="make lots of noise")

命令行参数
-v -> self.options.verbose = 1
-vv -> self.options.verbose = 2

if self._options.verbose is not None:for i in range(self._options.verbose):verbose = Logger.next_verbose_level(verbose)Logger.set_verbose(verbose)
try:os.chmod('%s/frameworkd.log' % self.__conf[VAR_LOG_DIR], 0644)os.chmod('%s/frameworkd_error.log' % self.__conf[VAR_LOG_DIR], 0644)
except Exception, e:print str(e)

checkEncryptionKey(self) :检查加密密钥文件。

检查文件是否存在,key 是否存于数据库中

def checkEncryptionKey(self):mydb = OssimDB(self.__conf[VAR_DB_HOST], self.__conf[VAR_DB_SCHEMA],self.__conf[VAR_DB_USER], self.__conf[VAR_DB_PASSWORD])mydb.connect()select_query = "select value from config where conf=\"encryption_key\";"insert_query = "REPLACE INTO config VALUES ('encryption_key', '%s')"data = mydb.exec_query(select_query)
        keyFilePath = self.__conf[VAR_KEY_FILE]if keyFilePath == "" or keyFilePath is None:logger.error("Frameworkd can't start. Please check the value of %s in the config table" % VAR_KEY_FILE)sys.exit(2)if not os.path.isfile(self.__conf[VAR_KEY_FILE]) or data is None or data == "" or len(data) == 0:logger.info("Encryption key file doesn't exist... making it at .. %s and save it to db" % self.__conf[VAR_KEY_FILE])output = sub.Popen('/usr/bin/alienvault-system-id', stdout=sub.PIPE)s_uuid = output.stdout.read().upper()reg_str = "(?P<uuid>[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})"pt = re.compile(reg_str, re.M)match_data = pt.search(s_uuid)key = ""extra_data = ""d = datetime.today()if match_data is not None:key = match_data.group('uuid')extra_data = "#Generated using alienvault-system-id\n"else:logger.error("I can't obtain system uuid. Generating a random uuid. Please do backup your encrytion key file: %s" %self.__conf[VAR_KEY_FILE])extra_data = "#Generated using random uuid on %s\n" % d.isoformat(' ')key = uuid.uuid4()newfile = open(self.__conf[VAR_KEY_FILE], 'w')mydb.exec_query(insert_query % key)key = "key=%s\n" % keynewfile.write("#This file is generated automatically by ossim. Please don't modify it!\n")newfile.write(extra_data)newfile.write("[key-value]\n")newfile.write(key)newfile.close()# insert the key in db..pw = pwd.getpwnam('www-data')os.chown(self.__conf[VAR_KEY_FILE], pw.pw_uid, pw.pw_gid)os.chmod(self.__conf[VAR_KEY_FILE], stat.S_IRUSR)

__check_pid(self) :检查 pid 文件是否存在

def __check_pid(self):try:pf = file(self.pidfile, 'r')pid = int(pf.read().strip())pf.close()except IOError:pid = Noneif pid:message = "pidfile %s already exist. Daemon already running?\n"sys.stderr.write(message % self.pidfile)sys.exit(1)

本篇文章部分内容参考或转载自下列文章及书籍。侵权即删。

参考书籍:

  • 《开源安全运维平台OSSIM疑难解析(入门篇)》——李晨光著
  • 《开源安全运维平台OSSIM疑难解析(提高篇)》——李晨光著
  • 《开源安全运维平台:OSSIM最佳实践》——李晨光著

参考文章:

  • https://blog.51cto.com/chenguang/2426473
  • https://blog.csdn.net/lcgweb/article/details/101284949
  • https://blog.51cto.com/chenguang/1665012
  • https://www.cnblogs.com/lsdb/p/10000061.html
  • https://blog.51cto.com/chenguang/1691090
  • https://blog.51cto.com/chenguang/category10.html
  • https://blog.51cto.com/topic/ossim.html
  • https://blog.csdn.net/isinstance/article/details/53694361
  • https://blog.51cto.com/chenguang/1332329
  • https://www.cnblogs.com/airoot/p/8072727.html
  • https://blog.51cto.com/chenguang/1738731
  • https://blog.csdn.net/security_yj/article/details/120153992

上一篇(Framework 源码分析(一)):OSSIM开源安全信息管理系统(五)
下一篇(Framework 源码分析(三)):

OSSIM开源安全信息管理系统(六)相关推荐

  1. OSSIM开源安全信息管理系统(十六)

    2021SC@SDUSC 本周继续对OSSIM系统中,关联分析部分进行源码分析. 关联分析部分源码目录:\ossim\alienvault-ossim\src\alienvault-ossim\os- ...

  2. OSSIM开源安全信息管理系统(一)

    2021SC@SDUSC 一.项目综述 项目背景: 本项目为山东大学软件学院2021-2022学年秋季学期 "软件工程应用与实践" 课程项目 小组成员: 网安工学 李宏伟.网安工学 ...

  3. OSSIM开源安全信息管理系统(十二)

    2021SC@SDUSC 本周主要分析的内容为 Framework 模块中,Listener.py 文件.然后衔接上周内容,继续对 OSSIM 系统的日志分析部分进行简单分析. 1.Listener. ...

  4. OSSIM开源安全信息管理系统(十五)

    2021SC@SDUSC 目录 五.OSSIM关联分析的部分源代码分析 1.sim-directive.c 1.1.初识 glib 1.2.glib 基本类型定义 1.3.glib 函数 1.4.源码 ...

  5. OSSIM开源安全信息管理系统(二)

    2021SC@SDUSC 一.OSSIM功能分析(Web UI) OSSIM系统功能较多,界面较为复杂,而web端界面为全英文,中文汉化包并不完善,所以仔细研究一下各个模块对应的功能是非常有利于后续的 ...

  6. OSSIM开源安全信息管理系统(十四)

    2021SC@SDUSC 从本周开始,进入一个全新的模块,开始对 OSSIM 的关联分析机制进行分析.首先对管理分析机制进行简介. 关联分析 在 OSSIM 中,关联分析这部分应该算是这个系统的较为关 ...

  7. OSSIM开源安全信息管理系统(九)

    2021SC@SDUSC 本周继续分析 OSSIM 系统 Framework 部分的源代码,对 Framework.py 所引用的其他类进行进一步分析. 同时,会对 OSSIM 的可疑流量检测技术进行 ...

  8. OSSIM开源安全信息管理系统(十)

    2021SC@SDUSC 一.Framework 部分源码分析 (接上一篇文章) def __shouldRunBackup(self) : 该函数的主要功能为检查是否开始运行备份操作 备份时间:默认 ...

  9. OSSIM开源安全信息管理系统(十七)

    2021SC@SDUSC 七.Agent部分源代码分析 1.Agent 简介 OSSIM Agent中所有脚本采用 Python 编写,负责从安全设备采集相关信息(比如报警日志等),并将采集到的各类信 ...

最新文章

  1. 关于MYSQL日期 字符串 时间戳互转
  2. Easyui textbox 组件设置css样式
  3. python类中的函数_python类中的函数问题
  4. 扩展--使用队列来优化递归操作完成文件下载
  5. python对比图片
  6. Java关键字fymd,JAVA程式碼一直被foritfy檢出有path manipulation
  7. ssh登录失败处理步骤
  8. mysql的常用引擎
  9. 【OpenCV4 官方文档】机器学习概述
  10. 电机计算机仿真,电机调速系统的计算机仿真
  11. LiteIDE的sublime黑色 淡绿色 配色文件自定义版本
  12. php去掉工作日,2014年工作日计算(去除法定假日和周六日,但包括调休日)
  13. vs2017 c++工程编译解析
  14. 玩转B2B平台的商业模式你选对了吗?
  15. Grafana资料搜集
  16. SpringBoot+Maven 多模块项目的构建、运行、打包实战
  17. 记录 支付宝口碑--商户会员卡 开发历程
  18. 计科专业c语言重修,计算中心
  19. 无线AP打流-TX、RX环境部署
  20. 从 COM 组件调用 .NET 组件

热门文章

  1. 国际化翻译navigator.language与语种对照表
  2. 【python】 turtle实现汉诺塔游戏动画过程
  3. C++ 全局变量 静态全局变量 傻傻分不清
  4. python白_Python小白到底有多白?
  5. 一时语噻:二面鹅厂,面试官问出Nginx你了解吗?
  6. 玉伯:从前端到体验,如何把格局做大
  7. revit二开之过滤族(Family)
  8. 格式化数据#1:数据存储|Database
  9. 月考勤报表的TSQL查询
  10. CCF真题 工资计算