近期公司開發使用的版本控制工具由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服務器後,編寫了初版程序:javascript
#!/usr/bin/env python
#coding=utf-8html
import time
import ntplib
import sys
import mathjava
max_diff = 20 * 60 # 最大容許相差20分鐘
url = "time.windows.com" # 獲取時間的ntp服務器python
def STD(s_time):
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(s_time))nginx
def get_server_time():
try:
client = ntplib.NTPClient()
return client.request('time.windows.com').tx_time
except:
return -1git
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)windows
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配置以下:curl
server {
listen 30303;
server_name localhost;svn
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 通過投機取巧,終於解決了,各位若是有什麼更好的想法,歡迎留言討論!