介绍此功能是检测目录的操作的事件

1.安装

在百度云盘下载或者在gits上下载安装包

  链接:https://pan.baidu.com/s/1Lqt872YEgEo_bNPEnEJMaw
  提取码:bjl2

# git clone https://github.com/seb-m/pyinotify.git
# cd pyinotify/
# ls
# python setup.py install

2.使用在代码中直接导入就可以

# -*- coding: utf-8 -*-
# !/usr/bin/env python
import os
import Queue
import datetime
import pyinotify
import logging
#debug
import threading,time pos = 0
save_pos = 0
filename ="" #
filename1 =""
pathname ="" class Singleton(type):
def __call__(cls, *args, **kwargs):
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls.instance
def __new__(cls, name, bases, dct):
return type.__new__(cls, name, bases, dct) def __init__(cls, name, bases, dct):
super(Singleton, cls).__init__(name, bases, dct) class AuditLog(object):
__metaclass__ = Singleton
def __init__(self): FORMAT = ('%(asctime)s.%(msecs)d-%(levelname)s'
'[%(filename)s:%(lineno)d:%(funcName)s]: %(message)s')
DATEFMT = '%Y-%m-%d %H:%M:%S'
logging.basicConfig(level=logging.DEBUG, format=FORMAT,datefmt=DATEFMT) logging.debug("__init__")
self.log_queue = Queue.Queue(maxsize=1000)
self.str = "AuditLog" def start(self,path): # path as: /var/log/auth.log
try:
print "start:",threading.currentThread()
if( not os.path.exists(path)):
logging.debug("文件路径不存在")
return
logging.debug("文件路径:{}".format(path))
global pathname
pathname = path # # 输出前面的log
# printlog()
file = path[:path.rfind('/')] global filename
global filename1
filename = path[path.rfind('/')+1:]
filename1 = filename + ".1"
print "filename:",filename," filename1 ",filename1
# watch manager
wm = pyinotify.WatchManager()
wm.add_watch(file, pyinotify.ALL_EVENTS, rec=True)
eh = MyEventHandler()
# notifier
notifier = pyinotify.Notifier(wm, eh)
notifier.loop() except Exception as e:
logging.error('[AuditLog]:send error: %s',str(e))
return def read_log_file(self):
global pos
global save_pos
try:
# if( not os.pathname.exists(pathname)):
# logging.debug("读取的文件不存在")
# return
fd = open(pathname)
if pos != 0:
fd.seek(pos, 0)
while True:
line = fd.readline()
if line.strip():
logging.debug("put queue:{}".format(line.strip()))
try:
self.log_queue.put_nowait(line.strip())
except Queue.Full:
logging.warn('send_log_queue is full now') pos = fd.tell()
save_pos = pos
else:
break
fd.close()
except Exception, e:
logging.error('[AuditLog]:send error: %s',str(e)) def read_log1_file(self): try:
global save_pos
global pos
pos = 0
pathname1 = pathname + ".1"
# if( not os.pathname1.exists(pathname1)):
# logging.debug("读取的文件不存在")
# return
fd = open(pathname1)
if save_pos != 0:
fd.seek(save_pos, 0)
while True:
line = fd.readline()
if line.strip():
if save_pos > fd.tell() :
print save_pos," ",fd.tell()
continue
try:
self.log_queue.put_nowait(line.strip())
logging.debug("put queue:{}".format(line.strip()))
except Queue.Full:
logging.warn('send_log_queue is full now') else:
save_pos = 0
break
fd.close()
except Exception, e:
logging.error('[AuditLog]:send error: %s',str(e)) def __del__(self):
print "del" class MyEventHandler(pyinotify.ProcessEvent): print "MyEventHandler :",threading.currentThread()
def __init__(self):
print "MyEventHandler __init__"
self.auditLogObject = AuditLog()
print self.auditLogObject.str
# 当文件被修改时调用函数
def process_IN_MODIFY(self, event): #文件修改
print "process_IN_MODIFY",event.name def process_IN_CREATE(self, event): #文件创建
# logging.debug("process_IN_CREATE")
print "create event:", event.name
# log.log.1
global save_pos
try: if(event.name == filename):
print "=="
self.auditLogObject.read_log1_file()
else:
logging.debug("审计的文件不相同{} {}".format(filename1).format(event.name))
except Exception as e:
logging.error('[AuditLog]:send error: %s',str(e)) def process_IN_DELETE(self, event): #文件删除
# logging.debug("process_IN_DELETE")
print "delete event:", event.name def process_IN_ACCESS(self, event): #访问
# logging.debug("process_IN_ACCESS")
print "ACCESS event:", event.name def process_IN_ATTRIB(self, event): #属性
# logging.debug("process_IN_ATTRIB")
print "ATTRIB event: 文件属性", event.name def process_IN_CLOSE_NOWRITE(self, event):
# logging.debug("process_IN_CLOSE_NOWRITE")
print "CLOSE_NOWRITE event:", event.name def process_IN_CLOSE_WRITE(self, event): # 关闭写入
# logging.debug("process_IN_CLOSE_WRITE")
print "CLOSE_WRITE event:", event.name
try:
if(event.name == filename):
self.auditLogObject.read_log_file() else:
logging.debug("文件名不对 不是审计文件")
return except Exception as e:
logging.error('[AuditLog]:send error: %s',str(e)) def process_IN_OPEN(self, event): # 打开
# logging.debug("process_IN_OPEN")
print "OPEN event:", event.name def Producer(): try:
auditLogObj = AuditLog()
auditLogObj.start("./log/log.log") except Exception as e:
logging.error('[auditLog]:send error: %s',str(e)) def Consumer(): try:
print "Consumer"
auditLogObject = AuditLog()
print auditLogObject.str
while True:
print "ddd"
time.sleep(1) while auditLogObject.log_queue.qsize() != 0 :
print "queue size",auditLogObject.log_queue.qsize()
print auditLogObject.log_queue.get()
# time.sleep(5) except Exception as e:
logging.error('[AuditLog]:send error: %s',str(e)) if __name__ == '__main__': # a = threading.Thread(target=Producer,)
# a.start()
b = threading.Thread(target=Consumer,)
b.start()

liunx pyinotify的安装和使用的更多相关文章

  1. Libevent2.1.8版在Liunx中编译安装遇到的问题

    Libevent2.1.8版在Liunx中编译安装遇到的问题 前言:在网上找了很久,都没有一个明确的解决方法,通过分析可能的原因,将自己实际操作及解决的成功结果记录如下,以供遇到相似的问题,能提供思路 ...

  2. liunx环境下安装mysql数据库

    一:如果你的机器上之前安装有mysql数据库,先进行卸载 (1)需要先将它的文件删除 (2)同时注意删除老板本的etc/my.cnf文件和/etc/mysql目录,这两个文件控制的是mysql的一些配 ...

  3. liunx环境下安装禅道

    环境: vm12.5.2 CentOS-7-x86_64 ZenTaoPMS.9.1.stable.zbox_64 SecureCRT 8.0 因为liunx环境下配置apache, php, mys ...

  4. liunx下Oracle安装

    1. 引言 将近一个月没有更新博客了,最近忙着数据库数据迁移工作:自己在服务器上搭建了oracle数据库,一步步走下来遇见很多BUG:现在自己记录下,方便以后有用上的地方: 2. 准备工作 oracl ...

  5. Liunx之MySQL安装与主从复制

    MYSQL安装(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL ...

  6. liunx系统中安装lua以及torch

    一直在用pytorch,最近在做项目的时候,遇到了torch的开源代码,所以又开始不得不接触torch以及他所依赖的环境lua. liunx下lua环境的配置代码如下: ''' curl -R -O ...

  7. liunx 服务器下面安装mysql8.0

    闲来无事,准备自己搭建一个服务器高点事情,不可避免的就是需要使用到mysql数据库了.在Linux系统安装MySQL8.0,网上已经有很多的教程了,到自己安装的时候却发现各种各样的问题,现在把安装过程 ...

  8. liunx检查与安装软件包

    检查软件包# rpm -qa | grep 例如:# rpm -qa | grep make检查make包 安装软件包 yum install 例如:yum install  unixODBC安装un ...

  9. Liunx下全局安装 Composer

    我把它放在系统的PATH目录中,这样就能在全局访问它. curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/l ...

随机推荐

  1. Qt编写数据可视化大屏界面电子看板10-改造QCustomPlot

    一.前言 为了抛弃对QChart的依赖,以及echart的依赖,(当然,后期也会做qchart的版本和echart的版本,尤其是echart的版本是肯定会做的,毕竟echart的效果牛逼的一塌糊涂,全 ...

  2. labelme

    项目:https://github.com/wkentaro/labelme?tdsourcetag=s_pcqq_aiomsg 说明:https://www.bilibili.com/video/a ...

  3. JAVA 基础编程练习题49 【程序 49 子串出现的个数】

    49 [程序 49 子串出现的个数] 题目:计算字符串中子串出现的次数 package cskaoyan; public class cskaoyan49 { public static void m ...

  4. ffmpeg 编译集成libfdk-aac

    目录 1. 编译libfdk-aac 2. 编译ffmpeg 1. 编译libfdk-aac 下载源码:$ git clone https://github.com/mstorsjo/fdk-aac. ...

  5. JS遍历数组,实现数组去重(重复的元素只保留一个)

    1.遍历数组法 它是最简单的数组去重方法(indexOf方法) 实现思路:新建一个数组,遍历去要重的数组,当值不在新数组的时候(indexOf为-1)就加入该新数组中: var arr=[2,8,5, ...

  6. JPG文件结构分析

    [转自网络  作者:一 江秋水] 一.简述 JPEG是一个压缩标准,又可分为标准 JPEG.渐进式JPEG及JPEG2000三种: ①标准JPEG:以24位颜色存储单个光栅图像,是与平台无关的格式,支 ...

  7. linux netfilter

    yum -y install iptables//三张表 filter nat mangle [root@wang /]# iptables -t filter -nvL [root@wang /]# ...

  8. spring的控制器如何跳转到指定的视图

    1.控制器代码 2.跳转代码 return "greeting"; 引号内为跳转的页面,默认不需要加html

  9. stat中的st_dev和st_rdev

    目录 stat中的st_dev和st_rdev title: stat中的st_dev和st_rdev date: 2019/11/27 21:04:25 toc: true --- stat中的st ...

  10. qt坐标系统见解

    窗口坐标为逻辑坐标,是基于视口坐标系的. 视口坐标为物理坐标,是基于绘图设备坐标系的 窗口坐标始终以视口坐标为最终目标进行映射: QPainter::setWindow 修改了窗口位置和大小(左上角重 ...