Python 03 基础作业

操作haproxy配置文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re,sys,os,time,platform
from collections import defaultdict,OrderedDict
conf = "haproxy.cfg"
jgf = ''
def input_handle(s):
    if str.isdigit(s):
        s = int(s)
    return s

def 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()

 

posted @ 2017-04-19 17:51  Hungry-fish  阅读(316)  评论(0编辑  收藏  举报