近期公司开发使用的版本控制工具由svn转向git,由于开发需求,经常会更改本地的时间,从而暴漏出一个原先使用svn不会出现的问题:commit的时间经常会不对。主要是因为git提交到远程服务器需要两部曲commit-push,而commit时使用的是本地的系统时间,这样就导致在修改本地时间之后,commit的时间就与正常时间对不上。现在希望开发一个脚本实现在提交的时候检查本地的时间是否正常,如果异常就阻止此次提交,以此来控制提交时间。
在定位好问题之后,确定使用git中pre-commit这个hook达到本地提交的时候检查本地时间的目的。由于hook支持python,我对python又比较熟,所以决定使用python实现。
确定好以上问题之后,需要解决的问题是如何获取到远程服务器的时间。由于公司统一在内网开发,所以开发机是无法连接到外网的,所以是无法直接获取到外网的时间,于是考虑在内网搭建一台ntp服务器。搭建服务器的教程参考:http://www.cnblogs.com/kerrycode/archive/2015/08/20/4744804.html。搭建完ntp服务器后,编写了第一版程序:
#!/usr/bin/env python
#coding=utf-8
import time
import ntplib
import sys
import math
max_diff = 20 * 60 # 最大允许相差20分钟
url = "time.windows.com" # 获取时间的ntp服务器
def STD(s_time):
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(s_time))
def get_server_time():
try:
client = ntplib.NTPClient()
return client.request('time.windows.com').tx_time
except:
return -1
def judge_commit_time():
now = time.time()
server_time = get_server_time()
if (server_time <= 0):
print "远程服务器不可用,请确认当前系统时间!"
sys.exit(0)
elif (math.fabs(now - server_time) > max_diff):
print ("远程服务器时间: " + STD(server_time) + " 与 本地时间: " + STD(now) + " 相差太远,无法提交!")
sys.exit(1) # 返回1,代表无法成功提交
else:
print ("远程服务器时间: " + STD(server_time) + " 与 本地时间: " + STD(now) + " 相近, 可以提交!")
sys.exit(0)
judge_commit_time()
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
本地简单的进行了测试,是ok的。当将该程序共享给小伙伴的时候出现问题了,大家都没有ntplib这个库。所以只好只使用python的基础库重写。。。。
由于搭建ntp的服务器提供nginx服务,于是就想到写了简单的网页输出系统时间,在nginx配置一个端口指向这个网页,然后在python中直接curl该网页。网页如下:
<script type="text/javascript">
var date = new Date();
document.write(Date.parse(date));
</script>
1
2
3
4
nginx配置如下:
server {
listen 30303;
server_name localhost;
location / {
root `path`; # 网页所在的路径
index index.html
}
.....
.....
}
1
2
3
4
5
6
7
8
9
10
11
当我妄图通过urllib.urlopen(url)获取到时间的时候傻眼了,直接获取到的是网页的源码,也就是script那一段,我不需要啊!!!!正在我百愁莫展之际,我突然发现,urllib的返回是携带时间信息的,这给了我灵感,我就直接取返回的网页中携带的时间信息当做远程服务器的时间,经过修改后的代码如下:
#!/usr/bin/env python
#coding=utf-8
import time
import urllib
import sys
import math
max_diff = 20 * 60 # 最大允许相差20分钟
url = "http://www.baidu.com" # 获取时间的ntp服务器
def STD(s_time):
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(s_time))
def DTS(d_time):
gmt_time = time.mktime(time.strptime(d_time, "%a, %d %b %Y %H:%M:%S GMT")) # 返回的时间是GMT时间,需要转化为UTC8的时间
utc8_time = gmt_time + 8 * 60 * 60
return utc8_time
def get_server_time():
try:
page = urllib.urlopen(url)
stime = float(DTS(page.headers.dict.get("date")))
return stime
except:
return -1
def judge_commit_time():
now = time.time()
server_time = get_server_time()
if (server_time <= 0):
print "远程服务器不可用,请确认当前系统时间!"
sys.exit(0)
elif (math.fabs(now - server_time) > max_diff):
print ("远程服务器时间: " + STD(server_time) + " 与 本地时间: " + STD(now) + " 相差太远,无法提交!")
sys.exit(1) # 返回1,代表无法成功提交
else:
print ("远程服务器时间: " + STD(server_time) + " 与 本地时间: " + STD(now) + " 相近, 可以提交!")
sys.exit(0)
judge_commit_time()
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
经过投机取巧,终于解决了,各位如果有什么更好的想法,欢迎留言讨论!
---------------------
作者:青竹梦
来源:CSDN
原文:https://blog.csdn.net/rowanhaoa/article/details/52818637
版权声明:本文为博主原创文章,转载请附上博文链接!
来源:oschina
链接:https://my.oschina.net/u/4000302/blog/3033697