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 正则表达式操作指南
May 04 Python
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
跟老齐学Python之用Python计算
Sep 12 Python
Python模仿POST提交HTTP数据及使用Cookie值的方法
Nov 10 Python
wxPython中listbox用法实例详解
Jun 01 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
Aug 15 Python
Python程序退出方式小结
Dec 09 Python
详解python opencv、scikit-image和PIL图像处理库比较
Dec 26 Python
8种常用的Python工具
Aug 05 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
Sep 25 Python
Python暴力破解Mysql数据的示例
Nov 09 Python
Python之qq自动发消息的示例代码
Feb 18 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
实现 win2003 下 mysql 数据库每天自动备份
2006/12/06 PHP
php cookie使用方法学习笔记分享
2013/11/07 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
php 二维数组快速排序算法的实现代码
2017/10/17 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
2016/12/08 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
angular中子控制器向父控制器传值的实例
2018/10/08 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
讲解Python中的递归函数
2015/04/27 Python
python使用PyGame模块播放声音的方法
2015/05/20 Python
Python的Django框架下管理站点的基本方法
2015/07/17 Python
利用Python批量生成任意尺寸的图片
2016/08/29 Python
Python实现的快速排序算法详解
2017/08/01 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
Python理解递归的方法总结
2019/01/28 Python
python实现维吉尼亚算法
2019/03/20 Python
Pyqt5实现英文学习词典
2019/06/24 Python
python conda操作方法
2019/09/11 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
会计专业毕业生推荐信
2013/11/05 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
应届电子商务毕业自荐书范文
2014/02/11 职场文书
个人先进事迹材料
2014/12/29 职场文书
总经理岗位职责
2015/02/04 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL