python處理ha文件


 

 

ha.txt文件內容:

frontend oldboy.org
        bind 0.0.0.0:80
        option httplog
        option httpclose
        option  forwardfor
        log global
        acl www hdr_reg(host) -i www.oldboy.org
        use_backend www.oldboy.org if www

backend www.baidu.org
        server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
        server 100.1.7.8 100.1.7.8 weight 20 maxconn 4000
backend www.baidu1.com
        server 1.1.1.1 1.1.1.1 weight 20 maxconn 3000

 操作代碼ha.py:

import os
#查詢
def fetch(data):
    # 把整行作為一個整體,做成字符串拼接
    # 相當於拼接backend www.baidu.com
    #record存放返回的數據
    backend_data = "backend %s" %data
    record_list = []    #定義空列表
    #打開文件
    with open('ha.txt','r',encoding='utf8') as f:
        #在報警期間,一直執行捕捉操作
        tag = False#報警器,默認不響
        for line in f:  #查找backend記錄
            #找backend,比較的時候把\n去掉,用sttrip實現
            if line.strip() == backend_data:#找到這行,在去除回車之后,是否等於backend
                tag = True#警報響起
                continue#backend這行不要,跳出本次循環,下次循環都要帶着tag警報了
            # 解除警報
            # 警報亮着,並且滿足再次匹配backend的時候
            #警報不能放到最后,在抓最后一個人之前,要把警報關閉
            if tag and line.startswith("backend"):
                #tag = False  # 解除警報,但是break之后什么變量都不生效了
                break
            #當tag=True的情況
            #警報亮了,並且有數據進來。line在文件中可能是空行,再加一個and操作
            if tag and line:
                record_list.append(line.strip())#添加數據,每添加一行數據,就循環一次

            #打印用戶找到的信息
        for line in record_list:
            print(line)
        return record_list#返回處理的信息




#添加
def add(data):
    backend = data['backend']#獲取
    record_list = fetch(backend)#傳遞給fetch
    #把用戶輸入的字典轉換成server的模式
    current_record = "server %s %s weight %s maxconn %s" %(data['record']['server'], \
                                                                data['record']['server'], \
                                                                data['record']['weight'], \
                                                                data['record']['maxconn'])

    backend_data = "backend %s" %backend#拼接字符串

    #record_list為空的情況下,運行下面的代碼
    if not record_list:
        #加入record里面
        record_list.append(backend_data)#標題
        record_list.append(current_record)#server記錄
        #打開源文件,打開新文件把源文件內容一行行寫入新文件
        with open("ha.txt",'r',encoding="utf-8") as read_file,\
                open("ha_new.txt",'w',encoding='utf-8') as write_file:
            #從源文件一行行讀取內容
            for r_line in read_file:
                write_file.write(r_line)#新文件一行行寫

            #用戶輸入的內容
            for new_line in record_list:#讀
                if new_line.startswith('backend'):#是backend開頭的文件
                    write_file.write(new_line + '\n')#往新文件里寫
                else:#其余行
                    write_file.write("%s%s\n" %(" "*8,new_line))#8個空格,寫
    else:
        #print(record_list)
        #自己創造一個record_list,把添加的server添加進去,保留原記錄
        record_list.insert(0,backend_data)
        if current_record not in record_list:#
            record_list.append(current_record)#添加自己拼接的記錄
        #print("new record list %s" %record_list)#新拼接的列表
        with open('ha.txt','r',encoding='utf-8') as read_file,\
                open('ha_new.txt','w',encoding='utf-8') as write_file:
            #警報
            tag = False
            has_write = False
            for r_line in read_file:#源文件讀
                if r_line.strip() == backend_data:#拉響警報
                    tag = True
                    continue
                #如果警報是響的並且是匹配到backend的情況
                if r_line.strip() == backend_data:
                    tag = True
                    continue

                if not tag:#警報沒有響
                    write_file.write(r_line)#一直往新文件里寫
                else:#警報響
                    if not has_write:#如果沒有寫的情況
                        for new_line in record_list:
                            if new_line.startswith('backend'):
                                write_file.write(new_line + '\n')
                            else:
                                write_file.write('%s%s\n' %(' '*8,new_line))
                        has_write = True#record_list不會寫
    os.rename('ha.txt','ha_bak.txt')
    os.rename('ha_new.txt','ha.txt')
    os.remove('ha_bak.txt')
#刪除
def remove(data):
    backend = data['backend']
    record_list = fetch(backend)#查
    current_record = "server %s %s weight %s maxconn %s" % (data['record']['server'],\
                                                            data['record']['server'],\
                                                            data['record']['weight'],\
                                                            data['record']['maxconn'])

    backend_data = "backend %s" % backend
    #為空
    if not record_list or current_record not in record_list:
        print("\033[33;1m無此條記錄\033[0m")
        return #終止掉
    else:
        #處理record_list,存在,統一處理
        record_list.insert(0,backend_data)#標題加進去
        record_list.remove(current_record)#把用戶刪除的列表刪掉
        with open('ha.txt','r',encoding='utf-8') as read_file,\
                open('ha_new.txt','w',encoding='utf-8') as write_file:
            tag = False
            has_write = False
            for r_line in read_file:
                if r_line.strip() == backend_data:
                    tag = True
                    continue
                if tag and r_line.startswith('backend'):
                    tag = False
                if not tag:
                    write_file.write(r_line)
                else:
                    if not has_write:
                        for new_line in record_list:
                            if new_line.startswith('backend'):
                                write_file.write(new_line + '\n')
                            else:
                                write_file.write('%s%s\n' %(' '*8,new_line))
                        has_write = True
    os.rename('ha.txt','ha_bak.txt')
    os.rename('ha_new.txt','ha.txt')
    os.remove('ha_bak.txt')

def change(data):
    #通過列表找到backend信息
    backend = data[0]['backend']
    record_list = fetch(backend)#找到backend信息

    #改的數據,舊內容,新內容
    old_record = "server %s %s weight %s maxconn %s" % (data[0]['record']['server'], \
                                                        data[0]['record']['server'], \
                                                        data[0]['record']['weight'], \
                                                        data[0]['record']['maxconn'])

    new_record = "server %s %s weight %s maxconn %s" % (data[1]['record']['server'], \
                                                        data[1]['record']['server'], \
                                                        data[1]['record']['weight'], \
                                                        data[1]['record']['maxconn'])

    backend_data = "backend %s" % backend

    #沒有backend或者server信息不存在
    if not record_list or old_record not in record_list:
        print('\033[33;1m無此內容\033[0m')
        return
    else:
        record_list.insert(0,backend_data)#重新生成record_list
        index=record_list.index(old_record)#舊內容索引
        record_list[index]=new_record#替換
        with open('ha.txt', 'r', encoding='utf-8') as read_file, \
                open('ha_new.txt', 'w', encoding='utf-8') as write_file:
            tag = False
            has_write = False
            for r_line in read_file:
                if r_line.strip() == backend_data:
                    tag = True
                    continue
                if tag and r_line.startswith('backend'):
                    tag = False
                if not tag:
                    write_file.write(r_line)
                else:
                    if not has_write:
                        for new_line in record_list:
                            if new_line.startswith('backend'):
                                write_file.write(new_line + '\n')
                            else:
                                write_file.write('%s%s\n' % (' ' * 8, new_line))
                        has_write = True
    os.rename('ha.txt', 'ha_bak.txt')
    os.rename('ha_new.txt', 'ha.txt')
    os.remove('ha_bak.txt')


#代碼運行的時候就會把__name__賦值給__main__
#如果把代碼當做模塊導入,__name__就會被賦值為文件名
if __name__ == '__main__':#系統內置變量
    #用戶提示信息
    msg = '''
    1:查詢-fetch
    2:添加-add
    3:刪除-remove
    4:修改-change
    5:退出-exit
    '''
    #定義字典,實現提示信息與上面函數的對應關系,數字:函數名,不能加(),加上就是運行結果
    #key定義成字符串的形式
    menu_dic = {
        '1':fetch,
        '2':add,
        '3':remove,
        '4':change,
        '5':exit
    }
    #死循環,不斷的跟用戶去交互
    #主邏輯
    while True:
        print(msg)
        choice=input("操作>>:").strip()#用戶選擇
        if choice == '2' or choice == '3':
            print("實例:{'backend':'www.baidu1.com','record':{'server':'2.2.2.2','weight':20,'maxconn':3000}}")
        if choice == '4':
            print("實例(舊內容,新內容):[{'backend':'www.baidu1.com','record':{'server':'1.1.1.1','weight':20,'maxconn':3000}},{'backend':'www.baidu1.com','record':{'server':'2.2.2.2','weight':20,'maxconn':4000}}]")
        #用戶為空 or 用戶超過可選范圍
        if len(choice) == 0 or choice not in menu_dic:continue#不在里面
        if choice == '5':break

        #在用戶輸入完操作選項之后,輸入
        #data輸入完之后,要把數據傳入到上面的一個個功能,就是在函數名的地方加上data
        #所以上面的所有函數都要有參數,在函數名的()內都要加上data

        #用戶輸入的是字典的話,轉換成字符串賦值給data
        data = input("數據>>:").strip()

        #如果用戶輸入不是1查詢的話,因為默認是字符串的模式,所以要加引號
        if choice != '1':
            #在下面執行的時候,再通過eval轉換成字典,最后賦值給add,或者del功能
            data = eval(data)#把用戶輸入的字符串轉換成字符串原本包含的格式,最終賦值給data

        #用戶執行操作
        #menu_dic[choice]==fetch
        #menu_dic[choice]() == fetch()
        # menu_dic[choice](data) == fetch(data)
        #定義一個字典,通過字典的方式調用一個函數,這樣函數名有變動,只要改字典的對應關系就可以了,這樣主邏輯就不用動了
        menu_dic[choice](data)

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



Python 修改ha配置文件 Python基礎之文件處理 Python之文件處理 Python處理大文件 python處理XML文件 Python之文件處理 Python基礎之文件處理 Python 文件的處理 python文件處理--筆記 python文件批處理
 
粤ICP备14056181号  © 2014-2021 ITdaan.com