python监控文件或目录变化


Posted in Python onJune 07, 2016

本文实例实现的功能是监控一个文件或目录的变化,如果有变化,把文件上传备份至备份主机,并且要监控上传过程是否有问题等,具体内容如下

#!/usr/bin/env python
#coding=utf-8
#
#Status wd gs/ccs sql file changed
#文件有变化上传至备份主机,上传之后验证文件是否正确
#

import paramiko,os,sys,datetime,time,MySQLdb
from pyinotify import WatchManager, Notifier, ProcessEvent, IN_DELETE, IN_CREATE,IN_MODIFY
'''
CREATE TABLE `wddel_log.status_sql` (
 `ip` varchar(16) NOT NULL COMMENT '机器IP',
 `tar_name` varchar(50) NOT NULL COMMENT '备份文件名字',
 `md5` varchar(50) NOT NULL COMMENT '备份文件MD5',
 `flag` int(2) NOT NULL COMMENT '0:成功;1:失败',
 `error_log` varchar(100) NOT NULL COMMENT '错误日志',
 `uptime` datetime NOT NULL COMMENT '更新时间',
 KEY `ip` (`ip`),
 KEY `uptime` (`uptime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8'''#日志表创建脚本
GM_path='/home/asktao/'
center_hostname='192.168.1.100'
center_username='root'
center_password='123456'
center_port=63008
def log2db(ip,tar_name,md5,flag,error='0'):#删除日志入库
  try:
    tar_name = os.path.split(tar_name)[1]
    now = time.strftime("%Y-%m-%d %H:%M:%S")
    conn = MySQLdb.connect(host = '192.168.1.104',user = 'root',passwd = '1q2w3e4r',charset='utf8',connect_timeout=20)
    cursor = conn.cursor()
    sql = "SELECT ip FROM wddel_log.status_sql WHERE ip='%s'" % ip
    cursor.execute(sql)
    res = cursor.fetchall()
    if len(res)==0:
      inster_sql = "insert into wddel_log.status_sql VALUES('%s','%s','%s',%s,'%s','%s')" % (ip,tar_name,md5,flag,error,now)
      cursor.execute(inster_sql)
      conn.commit()
    else:
      update_sql = "UPDATE wddel_log.status_sql SET md5='%s',flag='%s',error_log='%s',uptime='%s' WHERE ip='%s'" % (md5,flag,error,now,ip)
      cursor.execute(update_sql)
      conn.commit()
    cursor.close()
    conn.close()
  except Exception,e:
    print e
def find_ip():#获取本地eth0的IP地址
  ip = os.popen("/sbin/ip a|grep 'global eth0'").readlines()[0].split()[1].split("/")[0]
  if "192.168." in ip:
    ip = os.popen("/sbin/ip a|grep 'global eth1'").readlines()[0].split()[1].split("/")[0]
  return ip
def md5sum(file_name):#验证sql打包文件的MD5
  if os.path.isfile(file_name):
    f = open(file_name,'rb')
    py_ver = sys.version[:3]
    if py_ver == "2.4":
      import md5 as hashlib
    else:
      import hashlib
      md5 = hashlib.md5(f.read()).hexdigest()
      f.close()
      return md5
  else:
    return 0
def center_md5(file_name):#上传至备份中心的文件的MD5
  try:
    s=paramiko.SSHClient()
    s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    s.connect(hostname = center_hostname,port=center_port,username=center_username, password=center_password)
    conm = "/usr/bin/md5sum %s" % file_name
    stdin,stdout,stderr=s.exec_command(conm)
    result = stdout.readlines()[0].split()[0].strip()
    s.close()
    return result
  except Exception,e:
    return e
def back_file(ip,tar_name,tar_md5):#上传文件到备份中心
  remote_dir='/data/sql'
  file_name=os.path.join(remote_dir,os.path.split(tar_name)[1])
  try:
    t=paramiko.Transport((center_hostname,center_port))
    t.connect(username=center_username,password=center_password)
    sftp=paramiko.SFTPClient.from_transport(t)
    sftp.put(tar_name,file_name)
    t.close()
    #print "%s back_file OK" % tar_name
    os.remove(tar_name)
    remot_md5=center_md5(file_name)
    if remot_md5 == tar_md5:
      log2db(ip,tar_name,tar_md5,0)
    else:
      log2db(ip,tar_name,tar_md5,1,'remot_md5!=tar_md5')
  except Exception,e:
    #print "connect error!"
    log2db(ip,tar_name,tar_md5,1,e)
    os.remove(tar_name)
def back_sql():#执行备份
  ip = find_ip()
  tar_name = "/tmp/%s.tar.gz" % ip
  sql_conn = "/usr/bin/find %s -type f -name '*.sql'|/usr/bin/xargs /bin/tar zcvPf %s" % (GM_path,tar_name)
  sql_tar = os.popen(sql_conn).readlines()
  tar_md5 = md5sum(tar_name)
  if tar_md5 != 0:
    back_file(ip,tar_name,tar_md5)
  else:
    error_log = "%s not find" % tar_name
    log2db(ip,tar_name,tar_md5,0,error_log)
class PFilePath(ProcessEvent):#文件变化的触发
  def process_IN_CREATE(self, event):
    if os.path.splitext(event.name)[1] == ".sql":
      text = "Create file: %s " % os.path.join(event.path, event.name)
      #print text
      back_sql()
  def process_IN_MODIFY(self, event):
    if os.path.splitext(event.name)[1] == ".sql":
      text = "Modify file: %s " % os.path.join(event.path, event.name)
      #print text
      back_sql()
def FSMonitor():#主监控函数
  back_sql()#运行脚本先备份sql文件
  wm = WatchManager()
  mask = IN_CREATE |IN_MODIFY
  notifier = Notifier(wm, PFilePath())
  wdd = wm.add_watch(GM_path, mask, rec=True)
  print 'now starting monitor %s' % (GM_path)
  while True:
    try :
      notifier.process_events()
      if notifier.check_events():
        notifier.read_events()
    except KeyboardInterrupt:
      notifier.stop()
      break
if __name__ == "__main__":
  FSMonitor()

以上就是本文的全部内容,希望对大家的学习有所帮助。

Python 相关文章推荐
python登录QQ邮箱发信的实现代码
Feb 10 Python
python条件变量之生产者与消费者操作实例分析
Mar 22 Python
python中reduce()函数的使用方法示例
Sep 29 Python
python好玩的项目—色情图片识别代码分享
Nov 07 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
May 07 Python
python操作kafka实践的示例代码
Jun 19 Python
使用python爬取抖音视频列表信息
Jul 15 Python
python异常触发及自定义异常类解析
Aug 06 Python
pycharm修改file type方式
Nov 19 Python
简单了解python装饰器原理及使用方法
Dec 18 Python
python exit出错原因整理
Aug 31 Python
浅析Python中的多条件排序实现
Jun 07 #Python
Python卸载模块的方法汇总
Jun 07 #Python
Python运行报错UnicodeDecodeError的解决方法
Jun 07 #Python
PyCharm使用教程之搭建Python开发环境
Jun 07 #Python
Python使用Pycrypto库进行RSA加密的方法详解
Jun 06 #Python
Python的Flask框架应用调用Redis队列数据的方法
Jun 06 #Python
Python第三方库的安装方法总结
Jun 06 #Python
You might like
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
PHP实现的迷你漂流瓶
2015/07/29 PHP
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
JavaScript中的逻辑判断符&&、||与!介绍
2014/12/31 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
举例讲解AngularJS中的模块
2015/06/17 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
实例解析Vue.js下载方式及基本概念
2018/05/11 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
[45:32]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
Python Socket使用实例
2017/12/18 Python
python3+dlib实现人脸识别和情绪分析
2018/04/21 Python
Html5实现iPhone开机界面示例代码
2013/06/30 HTML / CSS
基于html5实现的图片墙效果
2014/10/16 HTML / CSS
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
公司财务工作总结的自我评价
2013/11/23 职场文书
教育专业自荐书范文
2013/12/17 职场文书
保护地球的标语
2014/06/17 职场文书
竞选班干部演讲稿300字
2014/08/20 职场文书
2014年保密工作总结
2014/11/22 职场文书
具结保证书
2015/01/17 职场文书
解除同居协议书
2015/01/29 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书