工作需要檢查線上所有服務器 ngxin 的 host 配置,是否都添加禁止訪問目錄中帶 /.svn/ 和以 tar.gz、tar、zip、等結尾 url,如果沒有則添加,由於線上 nginx 服務器將近百台,每台的 nginx 配置至少 10 幾個,手工檢查太慢了,本人也不想浪費太多時間做這些無用功。故用 python 寫了一個檢測腳本。來完成這些無聊事情。


    想用 python 完成這些事情,思路大概為:先備份每台服務器原來的配置,然後遍曆每台服務器內所有 host 配置,正則匹配 host 配置看是否已經添加相關配置,如有則跳過,遇到有但不全或沒有的則在對應的位置上插入相應的配置。除文本插入時我遇到一個問題外,其他比較簡單。因為 python 目前沒有對文本進行插入操作的模塊。整個插入過程需要自己一步一步實現。


    當時我考慮文本插入思路:把原配置文件載入內存,正則找到要插入的位置,以此中心把原文件分成兩部分,開辟新內存空間按順序先存放第一部內容,然後存放出插入的內容,然後存放第二部內容。最後 flush 到硬盤。即通俗說法把原配置根據正則進行重定向。


    我了解實現這種重定向有兩個方法,第一種: 打開原文件,根據規則重定向到新建的文件上。第二種:使用 fileinput 對原文件重定向。


    下麵是代碼,實現過程大概為:先判斷目錄 nginx 配置目錄,如果存在則備份,然後遍曆所有配置文件,匹配每個配置文件是否已添加相關內容,如果沒有添加或者之前添加了部分內容,找到配置文件第一個花括號“}”,下一行插入相應的內容。


    #!/usr/bin/python #coding:utf-8 #author by qfeian@20140215"""first backup file and then update all nginx configurein the path "/usr/local/nginx/conf/vhosts".insert rule is to find the configure of the first "}"after inserting content"""import fileinputimport osimport reimport sysimport stringimport timefrom subprocess import calls_all = """    location ~* ^(.*)\/\.svn\/ {deny all;}location ~* \.(tar|gz|zip|tgz|sh)$ {deny all;}"""s_svn = """    location ~* ^(.*)\/\.svn\/ {deny all;}"""s_tar = """location ~* \.(tar|gz|zip|tgz|sh)$ {deny all;}"""def file_insert(fname, str):r = ur''}''f = open(fname)old = f.readnum = int(re.search(r, old).start)f_input = fileinput.input(fname, ince=1)#for line in fileinput.input(fname, ince=1):for line in f_input:    if r in line:print line.rstripprint "\n"+str+"\n"f.seek(num+2)print f.readbreak    else:print line.rstripf.closef_input.close#print "ok! the %s configure has been sucessfull added!" % fnameprint "ok! 配置文件%s已經添加成功!" % fnamedef file_list(f_dir):    #check the content of configure,and add the correcsponding content    rsvn = ur''\\\/\\.svn\\\/''    rtar = ur''\(tar\|gz\|zip\|tgz\|sh\)''    if os.path.exists(f_dir): #check dirfor f_name in os.listdir(f_dir): #list the dir all configure file   f_path = os.path.join(f_dir,f_name) #get the filename full path   f1 = open(f_path)   f1_old = f1.read   f1.close   if re.findall(rsvn, f1_old) and re.findall(rtar, f1_old):       #print "notice!  %s have been added ,ignore this configure ...." % f_path       print "notice! %s 已添加過相關的配置,忽略此配置文件" % f_path       continue   elif re.findall(rsvn, f1_old):       file_insert(f_path, s_tar)   elif re.findall(rtar, f1_old):       file_insert(f_path, s_svn)   else:       file_insert(f_path, s_all)    else:print "warnning! dir %s isn''t exists!" % f_dirdef file_backup(f_dir):    # if the file has been backed up with a minute before,will not back up    bak_dir = "/data/nginx_config_bak/" + time.strftime(''%y%m%d_%h_%m'')    if not os.path.exists(bak_dir):os.makedirs(bak_dir)if os.path.exists(f_dir):    cp = "cp -rp"    cmd = "%s %s %s" % (cp, f_dir, bak_dir)    call(cmd, shell=true) #backup the configureif __name__ == "__main__":    f_dir = "/usr/local/nginx/conf/vhosts"    file_backup(f_dir)    file_list(f_dir)    print "-"*90,"\n 所有 nginx 配置文件更新完成 !\n"  </pre>


    參考:


    http://ryanstd.iteye/blog/480781


    http://docs.python.org/2/library/fileinput.html

章節目錄

閱讀記錄

Python實戰-從菜鳥到大牛的進階之路所有內容均來自互聯網,鉛筆小說網隻為原作者極客學院的小說進行宣傳。歡迎各位書友支持極客學院並收藏Python實戰-從菜鳥到大牛的進階之路最新章節