python pyinotify 监控远程文件夹来实现即时全量同步

简介:

我们经常会遇到监控一个文件或目录的变化,如果有变化,把文件上传备份至备份主机,并且我们还要监控上传过程是否有问题等,根据此需求,查阅了相关的一些材料,编写如下脚本实现这个功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/env python
#coding=utf-8
#######################
#
#Status wd gs/ccs sql file changed
#date:2013-08-26  王伟
#文件有变化上传至备份主机,上传之后验证文件是否正确
#
#######################
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):
         =  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()

自己犯了错,就是命名为了pyinotify.py.

初学者就是容易犯这么简单的错误。

wKiom1gQRzjjoX99AAAQBcrvYNU079.png-wh_50


为什么要测试这个程序,只是想看看是不是增量备份的。



本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1865838,如需转载请自行联系原作者

相关文章
|
8月前
|
监控 算法 安全
深度洞察内网监控电脑:基于Python的流量分析算法
在当今数字化环境中,内网监控电脑作为“守城卫士”,通过流量分析算法确保内网安全、稳定运行。基于Python的流量分析算法,利用`scapy`等工具捕获和解析数据包,提取关键信息,区分正常与异常流量。结合机器学习和可视化技术,进一步提升内网监控的精准性和效率,助力企业防范潜在威胁,保障业务顺畅。本文深入探讨了Python在内网监控中的应用,展示了其实战代码及未来发展方向。
|
2月前
|
数据采集 存储 监控
Python爬虫自动化:定时监控快手热门话题
Python爬虫自动化:定时监控快手热门话题
|
6月前
|
监控 算法 安全
基于 Python 广度优先搜索算法的监控局域网电脑研究
随着局域网规模扩大,企业对高效监控计算机的需求增加。广度优先搜索(BFS)算法凭借其层次化遍历特性,在Python中可用于实现局域网内的计算机设备信息收集、网络连接状态监测及安全漏洞扫描,确保网络安全与稳定运行。通过合理选择数据结构与算法,BFS显著提升了监控效能,助力企业实现智能化的网络管理。
87 7
|
6月前
|
存储 监控 API
1688平台API接口实战:Python实现店铺全量商品数据抓取
本文介绍如何使用Python通过1688开放平台的API接口自动化抓取店铺所有商品数据。首先,开发者需在1688开放平台完成注册并获取App Key和App Secret,申请“商品信息查询”权限。接着,利用`alibaba.trade.product.search4trade`接口,构建请求参数、生成MD5签名,并通过分页机制获取全量商品数据。文中详细解析了响应结构、存储优化及常见问题处理方法,还提供了竞品监控、库存预警等应用场景示例和完整代码。
|
8月前
|
监控 网络安全 开发者
Python中的Paramiko与FTP文件夹及文件检测技巧
通过使用 Paramiko 和 FTP 库,开发者可以方便地检测远程服务器上的文件和文件夹是否存在。Paramiko 提供了通过 SSH 协议进行远程文件管理的能力,而 `ftplib` 则提供了通过 FTP 协议进行文件传输和管理的功能。通过理解和应用这些工具,您可以更加高效地管理和监控远程服务器上的文件系统。
220 20
|
9月前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
179 20
|
11月前
|
Python
Python批量自动处理文件夹
Python批量自动处理文件夹
146 0
Python批量自动处理文件夹
|
12月前
|
监控 网络协议 数据库连接
Python3 监控端口:使用 socket 库
Python3 监控端口:使用 socket 库
175 1
|
12月前
|
机器学习/深度学习 监控 TensorFlow
使用Python实现深度学习模型:智能宠物监控与管理
使用Python实现深度学习模型:智能宠物监控与管理
349 0

热门文章

最新文章

推荐镜像

更多