python案例1---修改haproxy的配置文件


運用的知識點:

  1.python簡單數據結構的使用:列表、字典等

  2.python兩個模塊的使用:os和json

      1.os.rename('文件1','文件2')

      2.json完成自動識別字典、列表,並識別后進行自動轉換

  3.python函數的定義和調用

  4.標志位的靈活運用:flag和haswrite分別用於找backend的record和判斷是否已經將記錄寫入到文件

  5.python基本語法的使用:for循環、if...else....判斷

  6.python文件的操作的基本使用:with open('文件1','模式') as obj1,open('文件2','模式') as obj2

 

  

代碼:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#導入2個模塊json和os
import  json,os

#定義fetch函數,並同時傳入我們指定backend參數,此參數代表backend名
def fetch(backend):
    flag = False #定義flag,目的是為了后面是否取可用的backend
    fetch_list=[]  #定義空列表,目的是為了后面將取出的backend信息存儲在此列表里面

    #以讀的形式打開'ha'文件,一行一行讀,然后將我們指定backend讀取到列表里面
    #最后返回裝有我們指定backend信息的列表
    with open('ha') as obj:
        for line in obj:
            if line.strip() == "backend %s" %(backend):
                flag = True
                continue
            if line.strip().startswith('backend'):
                flag=False
            if flag and line.strip():
                fetch_list.append(line.strip())

    return fetch_list

#定義add1函數,並同時傳入參數dict_info,此字典參數里面包含我們要傳入的server相關信息
def add1(dict_info):

    backend_title = dict_info.get("backend") #要插入的backend的名稱
    context_title = "backend %s" %(backend_title)  #要插入backend整個字段
    record_title = dict_info["record"]
    #要插入的記錄信息
    context_record = "server %s %s weight %s maxconn %s" %(record_title["server"],record_title["server"],record_title["weight"],record_title["maxconn"])

    #將backend獲取,並存儲在fetch_list列表里面
    fetch_list=fetch(backend_title)

    #如果要插入的backend存在
        #1.首先設定2個標志:flag和has_write
            #flag:用於找到要添加的backend下的內容
            #has_write:用於判斷fetch_list中的內容是否重新寫入到了文件
        #2.遍歷源文件ha:
            #1首先逐行讀取,並同時進行判斷,
                # 1.判斷backend是否已經找到,先把backend寫入文件,然后找到后將flag設置為True,最后跳出本次循環
                # 2.判斷找到的backend里面的record是否為空,若為空將flag設置為False
                # 3.對flag進行判斷
                    #1.將flag為True的record從fetch_list寫入到文件中,在這里面同時要進行是否已經寫入的判斷,即定義has_write的作用
                    #2.若flag為False,就直接寫入新文件,即將非列表里的內容直接寫入

    if fetch_list:
        flag=False
        has_write = False
        with open('ha') as read_obj,open('ha.new','w') as write_obj:
            for line in read_obj:
                if line.strip() == context_title:
                    write_obj.write("\n"+line)
                    flag=True
                    continue
                if flag and line.startswith('backend'):
                    flag = False
                if flag:
                    for new_line in fetch_list:
                        if not has_write:
                            temp = "%s%s" %(" "*8,new_line)
                            write_obj.write(temp)
                            has_write=True
                else:
                    write_obj.write(line)


    else:
    #如果要插入的backend不存在
        #分2部分寫入:
            # 1部分.從ha文件里面直接讀取,並同時將讀取的內容寫入新的文件ha.new
            # 2部分.將新的backend和context信息,直接寫到新的文件ha.new的文件尾部
        with open('ha') as read_obj,open('ha.new','w') as write_obj:
            for line in read_obj:
                write_obj.write(line)
            write_obj.write("\n"+context_title+"\n")
            temp=" "*8+context_record+"\n"
            write_obj.write(temp)

    #將原文件ha改名備用文件為ha.bak,即將ha下線
    #將新文件ha.new改名為線上文件ha,即將ha.new上線
    os.rename('ha','ha.bak')
    os.rename('ha.new','ha')


#刪除函數
def delete(dict_info):
    #1.首先獲取用戶的記錄並以列表的形式存儲,以便於我們調用
    del_backend = dict_info["backend"]
    del_record = dict_info["record"]

    context_title = "backend %s" %(del_backend)
    context_record = "server %s %s weight %s maxconn %s" %(del_record["server"],del_record["server"],del_record["weight"],del_record["maxconn"])

    #調用上面定義的fetch()函數,得到包含backend內容的列表
    fetch_list = fetch(del_backend)
    #判斷1:若列表為空:直接返回
    if not fetch_list:
        return
    #判斷2:否則不為空
    else:
        #判斷1:若用戶輸入的server信息不在fetch_list里面,直接返回
        if context_record not in fetch_list:
            print "your server message is not exists"
            return
        #判斷2:若輸入的server在fetch_list里面,就將此server信息從列表中移除
        else:
            fetch_list.remove(context_record)

        #逐行從ha文件中讀取,並同時進行判斷
        #核心思想:
            #首先邊讀取、邊判斷、邊寫入,
            # 判斷其實就是我們自己輸入的backend,找到后將列表fetch_list信息寫入到新的文件里面。
            # 其余的非列表的內容直接從源文件ha寫到新文件ha.new即可
        with open('ha','r') as read_obj,open('ha.new','w') as write_obj:
            flag = False
            has_write = False
            for line in read_obj:
                if line.strip() == context_title:
                    write_obj.write(line)
                    flag = True
                    continue
                if flag and line.startswith('backend'):
                    flag = False
                if flag:
                    if not has_write:
                        print fetch_list
                        for new_line in fetch_list:
                            temp = "%s%s\n" %(" "*8,new_line)
                            write_obj.write(temp)
                        has_write = True
                else:
                    write_obj.write(line)

    #將原文件ha改名備用文件為ha.bak,即將ha下線
    #將新文件ha.new改名為線上文件ha,即將ha.new上線
    os.rename('ha','ha.bak')
    os.rename('ha.new','ha')


"""
s='{"backend":"ttt.oldboy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":"3000"}}'
data_info=json.loads(s)
add1(data_info)
#delete(data_info)
"""

#主函數
if __name__ == "__main__":
    #獲取用戶的操作選擇
    print u"1.獲取記錄\n2.添加記錄\n3.刪除記錄\n"
    select_num=raw_input("plz input number:")

    #根據用戶的選擇,進行調用函數
    if select_num == "1":
        backend = raw_input("plz input backend:")
        fetch_list = fetch(backend)
        for i in fetch_list:
            print i
    else:
        print "plz input like this example:"
        print '{"backend":"ttt.oldboy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":"3000"}}'
        data_str = raw_input("plz input record>>>")
        data_dict = json.loads(data_str)
        if select_num == "2":
            add1(data_dict)
        elif select_num == "3":
            delete(data_dict)
        else:
            print "input error"

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM