基於python開發pre-commit hook達到對git提交時間的控制

  近期公司開發使用的版本控制工具由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   通過投機取巧,終於解決了,各位若是有什麼更好的想法,歡迎留言討論!

相關文章
相關標籤/搜索