返回顶部
首页 > 资讯 > 后端开发 > Python >Python-day3作业-haprox
  • 123
分享到

Python-day3作业-haprox

作业Pythonhaprox 2023-01-31 06:01:12 123人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

#!/usr/bin/env pythonimport os,sys,time,re,prettytable,JSONfrom collections import defaultdict,OrderedDictconf='haproxy.

#!/usr/bin/env python

import os,sys,time,re,prettytable,JSON

from collections import defaultdict,OrderedDict

conf='haproxy.cfg'  ###指定haproxy配置文件###

jgf=''

######################1.input输入字符类型转化函数#######################

def input_handle(s):

    if str.isdigit(s):                                                     ###对输入是否是数字进行判断###

        s = int(s)                                                         ###如果输出的是个数字,则转化为整数类型###

    return s                                                              ###返回输入字符###


###########################2.backend列表展示函数############################

def backend_read(conf):

    backend_list = []                                                       ###初始化backend的列表###

    show_dict = {}                                                          ###初始化要返回的显示字典###

    backend_name_dict = defaultdict(list)                                   ###定义一个value为列表的字典,用来存放server###

    server_flag = False                                                     ###初始化server判断标志位###

    with open(conf,'r') as ha:                                             ###打开haproxy配置文件###

        for line in ha:

            server_dict = OrderedDict()                                      ###定义一个有序字典###

            line = line.strip('\n')

            #情况1

            if re.match('backend',line):                                    ###匹配配置文件以backend开头的行###

                backend_name = re.split('\s+',line)[1]

                backend_list.append(backend_name)                            ###将配置到的backend的名称插入到列表###

                server_flag = True                                           ###赋值标志位为真,用来与server关联###

            #情况2

            elif server_flag and re.match('\s+server',line):               ###匹配配置文件以server开头的行###

                server_info = re.split('\s+',line)                          ###对server进行分隔###

                server_dict['name'] = server_info[2]                        ###对server的具体信息进行字典赋值###

                server_dict['address'] = server_info[3]

                server_dict['weight'] = server_info[5]

                server_dict['maxconn'] = server_info[7]

                backend_name_dict[backend_name].append(server_dict)          ###将server字典与backend的名称进行关联###

            else:

                server_flag = False                                          ###当server没匹配到,赋值标志位为假,结束关联###

    for k,v in enumerate(backend_list,1):

        show_dict[k] = v                                                     ###对backend名称进行新字典赋值,方便查询和展示###

        print('%d . %s' % (k,v))                                             ###输出backend列表###

    return(show_dict,backend_name_dict)                                     ###返回显示的字典和backend-server字典###


########################3.显示server服务器函数#############################

def backend_server_show(backend_show_value,server_show_dict):

    ############对backend名称进行遍历并加上数字编号###########################

    print(jgf.center(70,'='))

    print('\033[1m后端服务器(%s)信息如下:\033[0m'%backend_show_value)

    print('%-20s %-20s %-20s %-20s'%('name','address','weight','maxconn'))

    server_list = server_show_dict[backend_show_value]

    for v in server_list:                                     ###用enumerate进行server展示###

        n=list(v.values())

        print('\033[32;40m%-5s%20s%15s%25s\033[1m'%(n[0],n[1],n[2],n[3]))

    print(jgf.center(60, '='))


#####################4.名称输入判断函数#############################

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':                                           ###输入q,退出本次输入###

            name_flag = False

            sys.exit('\033[32;1m脚本已退出!\033[1m')

        elif re.match('[0-9a-zA-Z\_]+',name_input):                       ###匹配输入是否以字符、数字或下划线开头###

            name = name_input

            name_flag = False                                              ###输入成功后退出循环###

        else:

            print('\033[31m名称输入错误,请重新输入!!!\033[0m')

        break

    return(name)                                                          ###返回输入的结果###

#####################5.IP地址及端口输入判断函数#############################

def ipaddress_decide():

    (address,address_flag) = ('',True)                                     ###初始化返回的IP地址和判断标志位###

    while address_flag:

        address_input = input('\033[32m请输入新地址(IP哦)(退出输入q):\033[0m')

        if len(address_input) == 0:                                        ###如果输入为空则直接下一次循环###

            continue

        elif address_input == 'q':                                        ###输入q,退出本次输入###

            address_flag = False

            sys.exit('\033[32;1m脚本已退出!\033[1m')

        ##################匹配输入是否是ip:port的格式######################

        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)                                                       ###返回输入的结果###


####################6.数字输入判断函数######################################

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':                                        ###输入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)                                                       ###返回输入的结果###


#############################7.节点输入判断函数##########################

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':                                                ###如果输入为b,则退出程序###

        input_flag = False

    elif input_index in input_dict.keys():                                ###如果输入为数字编号,则从字典中获取具体backend名称###

        input_name = input_dict[input_index]

    elif input_index in input_dict.values():                              ###如果输入为backend名称,则直接获取###

        input_name = input_index

    else:

        input_name = ''                                                    ###输入其他字符,赋值变量为空###

    return(input_name,input_flag)                                         ###返回输入的结果和循环标志位###


########################8.配置文件操作函数#################

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):                                     ###匹配到backend行时进行server信息插入###

                write_file.write(line)

                backend_name = re.split('\s+',line)[1]

                for server_dict in handle_dict[backend_name]:                ###对backend-server字典进行遍历###

                    server_line = '\tserver {name} {address} weight {weight} maxconn {maxconn}\n'

                    write_file.write(server_line.fORMat(**server_dict))       ###将指定的backend下的server条目插入文件###


                server_flag = True                                           ###指定标志位为真,方便server判断###

            elif server_flag and re.match('\s+server',line):                 ###匹配server开头的行,跳过不做任何操作###

                pass

            else:

                write_file.write(line)                                        ###其他的行,直接插入新文件###

                server_flag = False

    print('\033[33;1m server更新成功\033[0m')

    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 = {}                                                ###初始化backend显示字典###

    haproxy_server_show_dict = {}                                              ###初始化server显示字典###

    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[35;1m 2.添加后端服务\033[0m

        \033[35;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')


        #######################1. 查询后端服务################################

        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列表###

                    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)


        #######################2. 添加后端服务################################

        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列表###

                    backend_server_show(backend_name,haproxy_server_show_dict)

                    add_server_dict = OrderedDict()                           ###设置实例默认为有序字典

                    print('\033[34;1m请依次输入后端服务信息(name,address,weight,maxconn):\033[0m')

                    add_server_dict['name'] = name_decide()                  ###对输入的name有效性进行判断###

                    add_server_dict['address'] = ipaddress_decide()          ###对输入的IP有效性进行判断###

                    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[1;31m server信息输入有误,请重新输入!!!\033[0m')

                        time.sleep(2)


        #######################3. 修改后端服务#################################

        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列表###

                    backend_server_show(backend_name,haproxy_server_show_dict)


                    server_modify_flag = True                                  ###初始化server条目修改标志位###

                    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':                               ###输入b,返还上一层###

                            server_modify_flag = False

                        #####################指定具体的server编号进行判断#####

                        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[1m')

                                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')


        #######################4. 删除后端服务################################

        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列表###

                    backend_server_show(backend_name,haproxy_server_show_dict)


                    server_delete_flag = True                                 ###初始化server条目删除标志位###

                    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':                               ###输入b,返还上一层###

                            server_delete_flag = False

                        #####################指定具体的server编号进行判断#####

                        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')


        #######################5. 退出程序######################

        if select_num == '5':

           print('\033[31;1m程序将在两秒后退出,欢迎再次使用,谢谢!\033[0m')

           time.sleep(1)

           print('\033[32;1m1s\033[0m')

           time.sleep(1)

           print('\033[32;1m2s\033[0m')

           print('\033[31;1m程序退出')

           sys.exit()


--结束END--

本文标题: Python-day3作业-haprox

本文链接: https://www.lsjlt.com/news/189327.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python-day3作业-haprox
    #!/usr/bin/env pythonimport os,sys,time,re,prettytable,jsonfrom collections import defaultdict,OrderedDictconf='haproxy....
    99+
    2023-01-31
    作业 Python haprox
  • Python学习day3作业
    作业需求 HAproxy配置文件操作 根据用户输入,输出对应的backend下的server信息 可添加backend 和sever信息 可修改backend 和sever信息 可删除backend 和sever信息 操作配置文件前...
    99+
    2023-01-31
    作业 Python
  • Python Day3
    mode 打开文件方式 r 读(默认) w 写 x 创建并写 a 追加 r+ 读写 w+ 写读 x+ 创建并写读 a+ 追加读 #w a r 三种纯净模式 #如果是windows平台一般还要...
    99+
    2023-01-31
    Python
  • python 22- day3
    1、知识点补充 2、编码 3、集合 4、深浅copy 5、文件操作 file1 = open("D:/myclass/课堂文件/day02/day02/02 字符串.py",encoding='utf-8',mode='r') print...
    99+
    2023-01-31
    python
  • python之day3(文件操作、字符转
    文件操作 f=open(“yesterday”,”r”,encoding=”utf-8”)  #以只读模式打开文件data=f.read()                             #读取所有内容data2=f.read()...
    99+
    2023-01-31
    字符 操作 文件
  • python学习(day3)
    1、集合的使用:#1、集合的操作: list_1 = [1,4,5,7,3,6,7,9] list_1 = set(list_1)#创建集合 list_2 = set([2,6,0,22,66,8,4]) print(list_1,typ...
    99+
    2023-01-31
    python
  • python笔记day3
    字典修改或者添加:dict['key'] = value程序二:file1.txt文件内容如下:alex|123|1carrick|123|1tony|123|1从文件file1.txt中读出内容,写成dic = {'carrick': [...
    99+
    2023-01-31
    笔记 python
  • python 基础 day3
    python 操作文件的常用方式有如下 读文件:r 模式 实例演示1:f1 = open(file='D:\Python3.5-learn\模块2\character3_文件操作\staff_table.txt',mode='r',enco...
    99+
    2023-01-31
    基础 python
  • python 学习day3
    set(无序不重复的序列)创建两种方式 例一:s1 = {1,2,3} 例二:s2 = set() ,s3 = set([1,2,3,4,5])功能 s2.add(123) #添加s2集合中123元素 s2.clear() #清除内容 s2...
    99+
    2023-01-31
    python
  • day3 python函数
    自定义函数:def myfun(args1,args2):函数体return value def get_info(): userinfo = {} with open("info.txt","r",encoding="ut...
    99+
    2023-01-31
    函数 python
  • Day3 python基础
    集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集、差集、并集等关系 list_1 = [1, 4, 5, 7, 3, 6, 7, 9] list_1 = ...
    99+
    2023-01-31
    基础 python
  • Python练习题(day3)
    一、函数练习题: 1、写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作 2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数 3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于...
    99+
    2023-01-31
    练习题 Python
  • python爬虫笔记-day3
    正则使用的注意点re.findall("a(.*)b","str"),能够返回括号中的内容,括号前后的内容起到定位和过滤的效果原始字符串r,待匹配字符串中有反斜杠的时候,使用r能够忽视反斜杠带来的转义的效果点号默认情况匹配不到\n\s能够匹...
    99+
    2023-01-31
    爬虫 笔记 python
  • python培训Day3 随笔
    collections类这个类相当于一个扩展包,包含针对字典、列表、元组等数据类型的一些扩展操作。1、计数器Counter#计数器可以列出字符串和列表中元素出现的个数,并以字典返回>>> import collection...
    99+
    2023-01-31
    随笔 python
  • day3 python 学习随笔
    三目运算(三元运算)例:result = 1 if 2 == 2 else 32. set是一个无序且不重复的元素集合3.生成器range不是生成器 和 xrange 是生成器readlines不是生成器 和 xreadlines 是生成器...
    99+
    2023-01-31
    随笔 python
  • Python学习记录day3
    Python学习记录 day3今天是银角大王武sir讲课。先回顾了上节课所学,然后讲到了面向对象思想。setset是一个无序且不重复,可嵌套的元素集合class set(object):     """     set() -> ne...
    99+
    2023-01-31
    Python
  • python作业
    创建以用户登录程序:保存用户的用户名与密码 新建用户时,判断用户是否已经存在,若存在则报错; 登录系统是,确保用户名存在于系统中,密码正确,有三次机会,超过三次报错冷却 #!/usr/bin/env python# coding:utf-8...
    99+
    2023-01-31
    作业 python
  • 从零开始学Python-day3
    Python--Day3学习要有定位,明确目标地去学习。---leavespython02---list知识一 list的概念    列表的概念:列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(所谓嵌套)。...
    99+
    2023-01-31
    从零开始 Python
  • Python作业3
      1.   ***程序  2.    ***程序   3.    ***程序     测试...
    99+
    2023-01-31
    作业 Python
  • python--作业3
    作业题目:6题程序:测试:7题程序:测试:...
    99+
    2023-01-31
    作业 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作