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查找指定具有相同内容文件的方法
Jun 28 Python
Python ftp上传文件
Feb 13 Python
Python+MongoDB自增键值的简单实现
Nov 04 Python
Python实现Logger打印功能的方法详解
Sep 01 Python
Pandas 对Dataframe结构排序的实现方法
Apr 10 Python
对numpy的array和python中自带的list之间相互转化详解
Apr 13 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
May 02 Python
PyTorch中Tensor的维度变换实现
Aug 18 Python
Python面向对象之Web静态服务器
Sep 03 Python
python爬虫实现POST request payload形式的请求
Apr 30 Python
Django使用rest_framework写出API
May 21 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 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中使用excel的简单介绍
2013/08/02 PHP
常用PHP封装分页工具类
2017/01/14 PHP
PHP中危险的file_put_contents函数详解
2017/11/04 PHP
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
解决Extjs上传图片无法预览的解决方法
2012/03/22 Javascript
javascript标签在页面中的位置探讨
2013/04/11 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
详解参数传递四种形式
2015/07/21 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
2017/01/11 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
ES6学习之变量的两种命名方法示例
2017/07/18 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
[39:21]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.24
2019/09/10 DOTA
Python机器学习之决策树算法
2017/12/22 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
python web框架 django wsgi原理解析
2019/08/20 Python
python中如何实现将数据分成训练集与测试集的方法
2019/09/13 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
如何写早恋检讨书
2014/09/10 职场文书
简单的离婚协议书范本
2014/11/16 职场文书
市场总监岗位职责
2015/02/11 职场文书
办公室行政主管岗位职责
2015/04/09 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
先进个人主要事迹范文
2015/11/04 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL
Spring整合Mybatis的全过程
2021/06/28 Java/Android