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与js)两种实现
Feb 21 Python
在Python中使用列表生成式的教程
Apr 27 Python
Python爬虫爬取一个网页上的图片地址实例代码
Jan 16 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
Django中Middleware中的函数详解
Jul 18 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
Aug 14 Python
Keras实现将两个模型连接到一起
May 23 Python
python如何求100以内的素数
May 27 Python
Python字典fromkeys()方法使用代码实例
Jul 20 Python
Python趣味挑战之给幼儿园弟弟生成1000道算术题
May 28 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
php中使用接口实现工厂设计模式的代码
2012/06/17 PHP
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
php自定义hash函数实例
2015/05/05 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
javascript按位非运算符的使用方法
2013/11/14 Javascript
js单例模式详解实例
2013/11/21 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
2015/09/25 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
Python字符串的encode与decode研究心得乱码问题解决方法
2009/03/23 Python
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
Python实现字符串反转的常用方法分析【4种方法】
2017/09/30 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
python爬虫中PhantomJS加载页面的实例方法
2020/11/12 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
HTML5表格_动力节点Java学院整理
2017/07/11 HTML / CSS
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
软件测试面试题
2014/01/05 面试题
啤酒销售实习自我鉴定
2013/09/24 职场文书
会计顶岗实习心得
2014/01/25 职场文书
幼儿评语大全
2014/04/30 职场文书
党员剖析材料范文
2014/12/18 职场文书
高二化学教学反思
2016/02/22 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js
工厂无线对讲系统解决方案
2022/02/18 无线电