设为首页 收藏本站
云服务器等爆品抢先购,低至4.2元/月
查看: 1078|回复: 0

文件监控脚本源码

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-1-11 09:31:17 | 显示全部楼层 |阅读模式

#!/usr/bin/env python
# coding:utf-8
import sys, os, time, json, re, datetime, urllib, urllib2,MySQLdb,promon

reload(sys)
sys.setdefaultencoding('utf8')

class main(object):
    def __init__(self, path, filename='', updatefile=1, delfile=1, modifyfile=1, size=1,time_interval="60",start_time="00:00", end_time='23:59',includeChild=1):
        self.path = path  # 路径,
        #print self.path
        if not   os.path.isdir(path):
            print "要监控的dir不存在"
        self.filename = filename
        self.updatefile = updatefile
        self.delfile = delfile
        self.modifyfile=modifyfile  # 修改文件
        self.time_interval = time_interval  # 执行时间间隔
        self.start_time = start_time  # 开始执行时间段
        self.end_time=end_time #结束执行时间段
        self.size=size
        self.includeChild=includeChild#子目录
        print includeChild,"1监控子目录,0不监控"


    def get_all_file(self):
        alllist=[]
        all=os.walk(self.path)
        flag = True
        for i in all:
            #print i
            if self.includeChild == 0:
                flag =False
            if i[2]:
                for x in i[2]:
                    alllist.append("%s/%s"%(i[0],x))
            if not flag:
                break
        print self.filename
        if self.filename and type(self.filename)==list:

            alllist=self.filename
            print "只监控指定文件",alllist

        print alllist
        if not os.path.isdir("db"):
            os.makedirs("db")
        else:
            with open("db/filenum","w") as f:
                dic={}
                #dic[alllist]=len(alllist)
                dic[len(alllist)]=alllist

                dic = json.dumps(dic)
                f.write(dic)


        return alllist

    def read_file_add_del(self):
        if not os.path.isdir("db"):
            os.makedirs("db")
        if os.path.isfile("db/filenum"):
            with open("db/filenum") as f:
                for i in f:
                    if not  i.strip():
                        continue
                    read_info=json.loads(i)
                    num=read_info.keys()
                    if num:
                        num=int(num[0])
                        read_filelist=read_info[str(num)]
                        return read_filelist
        return None

    def bijiao_file_add_del(self):
        sj_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        read_info=self.read_file_add_del()
        get_info=self.get_all_file()
        if read_info:
            for i in read_info:
                if i.strip() not in get_info:
                    if self.includeChild==0:
                        file_name=str(i).replace(self.path,'')
                        file_name=file_name.replace(file_name[0],'')
                        if '/' in file_name:
                            pass

                    if self.delfile==1:
                        print i,"这个文件被删除了,时间:%s"%(sj_time)
                        # 调用发监控脚本的地方
                        promon.main(i,"del %s"%sj_time)
                    else:
                        print "没有监控文件删除"
        #print get_info
            for x in get_info:
                if self.includeChild==0:
                    file_name = str(x).replace(self.path, '')
                    file_name = file_name.replace(file_name[0], '')
                    #print file_name
                    if '/' in file_name:
                        print '不监控子目录', x
                        continue
                if x not  in read_info:
                    if self.updatefile==1:
                        print x,"这个文件,是增加的,时间:%s"%(sj_time)
                        #调用发监控脚本的地方
                        promon.main(x, "add %s" % sj_time)
                    else:
                        print "没有监控文件增加"

    def get_file_info(self,filename):
        print filename,self.path
        if "/" not in filename:
            filename="%s/%s"%(self.path,filename)
        try:
            fileStats = os.stat(filename)
            # 定义一个字典
        except Exception:
            print filename,"不存在"
            promon.main(filename,"del")
            return False

        fileInfo = {
            'filename': filename,
            'Size': fileStats.st_size,  # 获取文件大小

            'LastModified': fileStats.st_mtime,  # 获取文件最后修改时间

            'LastAccessed': fileStats.st_atime,  # 获取文件最后访问时间

            'CreationTime': fileStats.st_ctime,  # 获取文件创建时间

            'Mode': fileStats.st_mode  # 获取文件的模式

        }

        return fileInfo

    hostname = os.popen('hostname').read().strip()
    def insert_fileinfo(self):
        filelist=self.get_all_file()
        jiaoben_name=sys.argv[0 ]


        for filename in filelist:

            fileinfo=self.get_file_info(filename)
            if filename:
                filesize=fileinfo['Size']
                LastModified=fileinfo['LastModified']
                LastAccessed=fileinfo['LastAccessed']
                CreationTime=fileinfo['CreationTime']
                updatetime=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                sql='''insert into fileinfo (hostname,filename,filesize,LastModified,LastAccessed,CreationTime,updatetime,monit_name) values ('%s','%s','%s','%s','%s','%s','%s','%s')'''\
                    %(self.hostname,filename,filesize,LastModified,LastAccessed,CreationTime,updatetime,jiaoben_name)
                #print sql
                self.select_sql(sql)




    def select_sql(self,sql):
        conn = MySQLdb.connect(host='192.168.1.203', port=3306, user='root', passwd='root',db='selfservice', charset='UTF8')
        cur = conn.cursor()
        #print sql
        cur.execute(sql)
        conn.commit()
        cur.close()
        conn.close()
        for i in cur:
            data=i
            if data:
                return data

    def bijiao_fileinfo(self):
        filelist = self.get_all_file()

        for filename in filelist:
            file_name=filename.replace(self.path,'')
            file_name=file_name.replace(file_name[0],'')
            #print file_name
            if '/' in file_name:
                print self.includeChild
                if self.includeChild==0:
                    pass

            if len(filename.strip())==0:
                continue

            updatetime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            sql='''select * from fileinfo where filename='%s'\
            and updatetime<'%s' and hostname='%s' order by id desc limit 1'''%(filename,updatetime,self.hostname)

            newinfo=self.select_sql(sql)
            sjc=time.time()
            x = time.localtime(sjc - 60)#秒
            updatetime5=time.strftime('%Y-%m-%d %H:%M:%S',x)
            sql = '''select * from fileinfo where filename='%s'\
                and updatetime<'%s' and hostname='%s' order by id desc limit 1''' % (
            filename, updatetime5, self.hostname)
            try:
                laoinfo = self.select_sql(sql)
            except Exception,e:
                print e
            else:
                if not laoinfo:
                    continue
                if laoinfo[3]!=newinfo[3]:
                    if self.modifyfile==1:
                        sj_time=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                        print filename,"这个文件被修改了,时间:%s"%datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                        # 调用发监控脚本的地方
                        promon.main(filename, "modifyfile %s" % sj_time)
                    else:
                        print "虽然被修改了,但是没有监控"
                if laoinfo[2] != newinfo[2]:
                    if self.size==1:
                        sj_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                        print filename, "这个文件大小变了,时间:%s" % datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                        # 调用发监控脚本的地方
                        promon.main(filename, "size %s" % sj_time)
                    else:
                        print "虽然大小变了,但是没有监控"
    def panduanjiankong(self):
        if self.filename:

            for i in self.filename:
                filepath="%s/%s"(self.path,i)
                sql='''delete from fileinfo where hostname='%s' and filename<>'%s' '''%(self.hostname,filepath)
                self.insert_mysql(sql)
        #if self.includeChild==0:
         #   filelist=self.get_all_file()
          #  for x in filelist:
           #     filename=str(x).replace(self.path,'')
            #    if '/' in filename:
             #       sql = '''delete from fileinfo where hostname='%s' and filename<>'%s' ''' % (self.hostname, x)
              #      self.insert_mysql(sql)




def get_conf_info():
    jiaoben_name=sys.argv[0]
    conf=jiaoben_name.replace(".py",".txt")
    if os.path.isfile(conf):
        with open(conf) as f:
            for i in f:
                if i.strip():
                    conf_info = json.loads(i)
                    #print conf_info
                    return conf_info
    else:
        print "配置文件不存在"



if __name__=="__main__":
    while True:
        conf=get_conf_info()
        filePath=conf["filePath"]
        fileName=conf["fileName"]
        mcInterval=int(conf["mcInterval"])#时间间隔
        includeChild=int(conf["includeChild"])#子目录
        add=int(conf["add"])
        modify=int(conf["modify"])#修改
        remove=int(conf["remove"])
        size=int(conf["size"])
        alarmBTime=int(conf["alarmBTime"])
        alarmETime=int(conf["alarmETime"])
        dq_time=int(datetime.datetime.now().strftime("%H%M"))
        #print conf
        try:
            if dq_time>alarmBTime and dq_time<alarmETime:
                obj=main(filePath,filename=fileName,updatefile=add,delfile=remove,modifyfile=modify,size=size,start_time=alarmBTime,end_time=alarmETime,includeChild=includeChild)

                obj.bijiao_file_add_del()
                obj.insert_fileinfo()
                #obj.panduanjiankong()
                obj.bijiao_fileinfo()
        except Exception,e:
            print e

        time.sleep(mcInterval*30)




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-326820-1-1.html 上篇帖子: zabbix监控添加psql数据库和sql_server数据库模板 下篇帖子: centos6.x 初始化脚本 null 监控
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表