1. 程式人生 > >Python 03 基礎作業

Python 03 基礎作業

配置文件 python return import

操作haproxy配置文件

技術分享

#!/usr/bin/env python# -*- coding: utf-8 -*-import re,sys,os,time,platformfrom collections import defaultdict,OrderedDict
conf = "haproxy.cfg"jgf = ‘‘def input_handle(s):    if str.isdigit(s):
        s = int(s)    return sdef backend_read(conf):
    show_dict = {}
    backend_list = []
    backend_name_dict = defaultdict(list)
    with open(conf, "r") as ha_file:        for line in ha_file:
            line = line.strip("\n")            if re.match(‘backend‘, line):
                backend = line.split()[1]
                backend_list.append(backend)            elif re.match(‘\s+server‘, line):
                server = line.split()
                server_dic = OrderedDict()
                server_dic["name"] = server[1]
                server_dic["address"] = server[2]
                server_dic["weight"] = server[4]
                server_dic["maxconn"] = server[6]
                backend_name_dict[backend].append(server_dic)    for k,v in enumerate(backend_list, 1):
        show_dict[k] = v        print(‘%d . %s‘ % (k, v))    return (show_dict,backend_name_dict)def backend_server_show(backend_show_value,server_show_dict):    print(jgf.center(70,‘=‘))    print(‘\033[1m後端服務器信(%s)息如下:\033[0m‘ %backend_show_value)    print(‘\033[31;1m%-20s %-20s %-20s %-20s\033[0m‘ % (‘name‘, ‘addres‘, ‘weight‘, ‘maxconn‘))
    server_list = server_show_dict[backend_show_value]    for v in server_list:
        n = list(v.values())        print(‘\033[32;1m%-20s %-20s %-20s %-20s\033[1m‘ % (n[0], n[1], n[2], n[3]))    print(jgf.center(60, ‘=‘))def name_decide():
    (name,name_flag) = (‘‘,True)    while name_flag:
        name_input = input(‘\033[32m請輸入新服務器名(退出輸入q):\033[0m‘)        if len(name_input) == 0:            continue
        elif name_input == ‘q‘:
            name_flag = False
            sys.exit(‘\033[32m腳本已退出!\033[1m‘)        elif re.match(‘[0-9a-zA-Z\_]+‘,name_input):
            name = name_input
            name_flag = False        else:            print(‘\033[31m名稱輸入錯誤,請重新輸入!!!\033[0m‘)    return (name)def ipaddress_decide():
    (address,address_flag) = (‘‘,True)    while address_flag:
        address_input = input(‘\033[32m請輸入新IP(退出輸入q):\033[0m‘)        if len(address_input) == 0:            continue
        elif address_input == ‘q‘:
            address_flag = False
            sys.exit(‘\033[32;1m腳本已退出!\033[1m‘)        elif re.match(‘(25[0-5]|2[0-4]\d|[0-1]?\d\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}(\:\d{1,5})?$‘,address_input):
            address = address_input
            address_flag = False        else:            print(‘\033[31m地址輸入錯誤,請重新輸入!!!\033[0m‘)    return (address)def number_decide(name):
    (number,number_flag) = (‘‘,True)    while number_flag:
        number_input = input(‘\033[32m請輸入%s(數字)(退出輸入q):\033[0m‘ % name)        if len(number_input) == 0:            continue
        elif number_input == ‘q‘:
            number_flag = False
            sys.exit(‘\033[32;1m腳本已退出!\033[32;1m‘)        else:            try:
                int(number_input)            except:                print(‘033[31;1m%s輸入類型錯誤,請重新輸入!!!\033[0m‘ % name)            else:
                number = number_input
                number_flag = False    return (number)def backend_input_if(input_index,input_dict):
    (input_name,input_flag) = (‘‘,True)    if len(input_index) != 0:
        input_index = input_handle(input_index)    if input_index == ‘b‘:
        input_flag = False    elif input_index in input_dict.keys():
        input_name = input_dict[input_index]    elif input_index in input_dict.values():
        input_name = input_index    else:
        input_name = ‘‘
    return (input_name,input_flag)def backend_server_handle(conf,handle_dict):
    newfile = ‘%s.new‘ % conf
    server_flag = False
    with open(conf,‘r‘) as read_file,open(newfile,‘w‘) as write_file:        for line in read_file:            if re.match(‘backend‘,line):
                write_file.write(line)
                backend_name = line.split()[1]                for server_dict in handle_dict[backend_name]:
                    server_line = ‘\tserver {name} {address} weight {weight} maxconn {maxconn} \n‘
                    write_file.write(server_line.format(**server_dict))

                server_flag = True            elif server_flag and re.match(‘\s+server‘,line):                pass
            else:
                write_file.write(line)
                server_flag = False    print(‘\033[33;1m server更新成功\033[0m‘)
    system = platform.system()    if system == ‘Windows‘:
        os.system(‘move %s %s.bak‘ % (conf, conf))
        os.system(‘move %s %s‘ % (newfile, conf))    elif system == ‘Linux‘:
        os.system(‘mv %s %s.bak‘ %(conf,conf))
        os.system(‘mv %s %s‘ %(newfile,conf))if __name__ == ‘__main__‘:
    flag = True
    backend_name = ‘‘
    haproxy_name_show_dict = {}
    haproxy_server_show_dict = {}    while flag:        print(jgf.center(60,‘=‘))
        hy=‘\033[36m歡迎訪問haproxy配置文件管理腳本\033[0m‘
        print(hy.center(60,‘*‘))        print(‘\033[1mbackend列表信息如下:‘)
        (haproxy_name_show_dict, haproxy_server_show_dict) = backend_read(conf)        print(jgf.center(50,‘=‘))
        time.sleep(1)        print(‘‘‘        \033[35;1m1.查詢後端服務\033[0m
        \033[34;1m 2.添加後端服務\033[0m
        \033[33;1m 3.修改後端服務\033[0m
        \033[31;1m 4.刪除後端服務\033[0m
        \033[32;1m 5.退出\033[0m‘‘‘)        print(jgf.center(60,‘=‘))
        select_num = input(‘\033[35;1m請選擇操作條目:\033[0m‘)        if select_num == ‘1‘:
            query_flag = True            while query_flag:
                backend_index = input(‘\033[31;1m請輸入需要查詢的backend編號名稱(返回上級菜單輸入b,退出輸入q):\033[0m‘)
                (backend_name,query_flag) = backend_input_if(backend_index,haproxy_name_show_dict)                if backend_name:
                    backend_server_show(backend_name,haproxy_server_show_dict)                elif backend_index == ‘b‘:                    break
                elif backend_index == ‘q‘:
                    sys.exit(‘\033[35;1m退出腳本!\033[0m‘)                else:
                    query_flag = False                    print(‘\033[31;1m您輸入的節點不存在!請重新輸入!‘)
                    time.sleep(1)        if select_num == ‘2‘:
            add_flag = True            while add_flag:
                backend_index = input(‘\033[32;1m請輸入添加的backend編號或者名稱(返回上級菜單請輸入b: \033[0m)‘)

                (backend_name,add_flag) = backend_input_if(backend_index,haproxy_name_show_dict)                if backend_name:
                    backend_server_show(backend_name,haproxy_server_show_dict)
                    add_server_dict = OrderedDict()                    print(‘\033[34;1m請依次輸入後端服務信息(name,address,wight,maxconn):\033[0m‘)
                    add_server_dict[‘name‘] = name_decide()
                    add_server_dict[‘address‘] = ipaddress_decide()
                    add_server_dict[‘weight‘] = number_decide(‘權重值‘)
                    add_server_dict[‘maxconn‘] = number_decide(‘最大連接數‘)                    print(add_server_dict[‘name‘],add_server_dict[‘address‘],add_server_dict[‘weight‘],add_server_dict[‘maxconn‘])                    if add_server_dict[‘name‘] and add_server_dict[‘address‘] and add_server_dict[‘weight‘] and add_server_dict[‘maxconn‘]:
                        add_commit = input(‘\033[31;1m請確認是否添加此條目(y | n):\033[0m‘)                        if add_commit == ‘y‘:
                            haproxy_server_show_dict[backend_name].append(add_server_dict)
                            backend_server_handle(conf,haproxy_server_show_dict)                        else:
                            add_flag = False                    else:                        print(‘\033[31;1m server信息輸入有誤,請重新輸入!!!\033[0m‘)
                        time.sleep(2)        if select_num == ‘3‘:
            backend_modify_flag = True            while backend_modify_flag:
                backend_index = input(‘\033[32;1m請輸入修改的backend的編號或名稱(返回上級菜單,請輸入b): \033[0m‘)
                (backend_name,backend_modify_flag) = backend_input_if(backend_index,haproxy_name_show_dict)                if backend_name:
                    backend_server_show(backend_name,haproxy_server_show_dict)

                    server_modify_flag = True                    while server_modify_flag:

                        server_index = input(‘\033[32;1m請輸入修改的server的編號(返回上級菜單,請輸入b): \033[0m‘)                        if len(server_index) != 0:
                            server_index = input_handle(server_index)                        if server_index ==‘b‘:
                            server_modify_flag = False                        elif server_index >= 1 and server_index <= len(haproxy_server_show_dict[backend_name]):
                            modify_server_dict = OrderedDict()                            print(‘\033[34;1m請以此輸入後端服務信息(name,address,weight,maxconn): \033[0m‘)
                            modify_server_dict[‘name‘] = name_decide()
                            modify_server_dict[‘address‘] = ipaddress_decide()
                            modify_server_dict[‘weight‘] = number_decide(‘權重值‘)
                            modify_server_dict[‘maxconn‘] = number_decide(‘最大連接數‘)                            print(modify_server_dict[‘name‘],modify_server_dict[‘address‘],modify_server_dict[‘weight‘],modify_server_dict[‘maxconn‘])                            if modify_server_dict[‘name‘] and modify_server_dict[‘address‘] and modify_server_dict[‘weight‘] and modify_server_dict[‘maxconn‘]:
                                modify_commit = input(‘\033[32;1m請確認是否修改此條目(y|n):\033[0m‘)                                if modify_commit == ‘y‘:
                                    haproxy_server_show_dict[backend_name][server_index - 1] = modify_server_dict
                                    backend_server_handle(conf,haproxy_server_show_dict)
                                    modify_server_flag = False                                else:
                                    modify_server_flag = False                            else:                                print(‘\033[31m server輸入信息有誤,請重新輸入!!!\033[0m‘)                        else:                            print(‘\033[31m server編號輸入錯誤,請重新輸入!!!\033[0m‘)        if select_num == ‘4‘:
            backend_delete_flag = True            while backend_delete_flag:
                backend_index = input(‘\033[32;1m請輸入刪除的backend下條目編號或名稱(返回上層菜單,請輸入b): \033[0m‘)
                (backend_name,backend_delete_flag) = backend_input_if(backend_index,haproxy_name_show_dict)                if backend_name:
                    backend_server_show(backend_name,haproxy_server_show_dict)

                    server_delete_flag = True                    while server_delete_flag:

                        server_index = input(‘\033[32;1m請輸入要刪除的server編號(返回上層菜單,請輸入b): \033[0m‘)                        if len(server_index) != 0:
                            server_index = input_handle(server_index)                        if server_index == ‘b‘:
                            server_delete_flag = False                        elif server_index >= 1 and server_index <= len(haproxy_server_show_dict[backend_name]):                            print(haproxy_server_show_dict[backend_name][server_index - 1])
                            delete_commit = input(‘請確認是否刪除此條目(y|n):‘)                            if delete_commit == ‘y‘:                                del haproxy_server_show_dict[backend_name][server_index -1]
                                backend_server_handle(conf,haproxy_server_show_dict)
                                delete_server_flag = False                            else:
                                delete_server_flag = False                        else:                            print(‘\033[31m server編號輸入錯誤,請重新輸入!!!\033[0m‘)        if select_num == ‘5‘:            print(‘\033[31;1m程序將退出,歡迎再次使用,謝謝!\033[0m‘)
            time.sleep(1)print(‘\033[31;1m程序退出‘)
            sys.exit()


本文出自 “python改變世界” 博客,請務必保留此出處http://python88.blog.51cto.com/12933681/1929821

Python 03 基礎作業