• python第九天----今天来晚了!


    作业 1. HAproxy配置文件操作
    1. 根据用户输入输出对应的backend下的server信息
    2. 可添加backend 和sever信息
    3. 可修改backend 和sever信息
    4. 可删除backend 和sever信息
    5. 操作配置文件前进行备份
    6 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建;若信息与已有信息重复则不操作

    照旧,上一下流程图:

    详细代码:

      1 #!usr/bin/env python
      2 #-*-coding:utf-8-*-
      3 # Author calmyan
      4 import time
      5 time_format='%y-%m-%d_%H-%M-%S'#格式化时间输出格式
      6 times=time.strftime(time_format)#将时间转为字符串
      7 
      8 def filebak():#自动备份配置文件函数
      9     haproxy_bak='HA_bak_'+times
     10     with open('HAproxy','r+',encoding='utf-8') as ha_file,
     11             open(haproxy_bak,'w',encoding='utf-8') as new_file:
     12         for line in ha_file:
     13             new_file.write(line)
     14     return haproxy_bak#返回备份文件名
     15 
     16 def file_query():#查询server信息函数
     17     file_dict={}#创建一个空字典
     18     with open('HAproxy','r+',encoding='utf-8') as ha_file:
     19         for line in ha_file:
     20             line=line.strip()#去除空格与回车
     21             try:
     22                 if line.startswith('backend'):#判断以backend开头的行
     23                     key_1=line.split()[1]#以空格进行分割赋于变量
     24                     file_dict[key_1]={}#设置字典格式
     25                     file_dict_key1=file_dict[key_1]#赋于变量
     26                 if line.startswith('server'):
     27                     b={'server':[line.split()[1],line.split()[2]],'weight':line.split()[4],'maxconn':line.split()[6]}#
     28                     file_dict_key1.update(b)#更新字典
     29             except Exception as e:#出错可返回操作
     30                 print("33[31;1mHAproxy文件出错,请仔细检查!33[0m")
     31                 exit()
     32         return file_dict#返回字典 所有backend的信息
     33 
     34 def out():#返回退出函数
     35     qu=input("请按提示操作!按33[31;1mY/y33[0m退出修改器!其它键返回!")
     36     if qu=='Y'or qu=='y':
     37         print("您已经退出修改器!" )
     38         exit()#退出程序
     39     else :
     40         pass
     41 
     42 def show():#提示示例
     43     arg_list="{'backend':'www.oldboy3.org','record':{'server':['110.110.1.1','110.110.1.1'],'weight':20,'maxconn':344}}"
     44     print(arg_list)
     45 
     46 def add():#添加backend信息函数
     47     while True:
     48         print('33[43;1m添加backend信息!输入格式示例:33[0m'.center(40,'-'))
     49         #arg_list="{'backend':'www.oldboy3.org','record':{'server':['110.110.1.1','110.110.1.1'],'weight':20,'maxconn':344}}"
     50         #print(arg_list)
     51         show()#显示提示
     52         print('
    操作提示:按 33[31;1m B/b33[0m返回上层菜单<<<  33[31;1mQ/q33[0m直接退出!
    ')
     53         arg=input('>>>>>请输入你要添加的信息:')
     54         if arg=='b' or arg=='B':
     55             break
     56         elif arg=='q' or arg=='Q':
     57             out()
     58         else :
     59             try:#进行异常处理
     60                 arg_dict=eval(arg)#输入信息转为字典
     61                 if judge(arg_dict):#判断是否已经存在
     62                     print('33[41;1mbackend已经存在33[0m'.center(40,'*'))
     63                     continue
     64                 else:
     65                     with open('HAproxy','a',encoding='utf-8') as add_file:
     66                         backend=arg_dict['backend']#key赋于变量 backend信息
     67                         record=arg_dict['record']##key赋于变量
     68                         print_info(backend,record)
     69                         #要添加的字符串变量
     70                         backend_add='''
    backend {_backend_}
     71         server {_server_1} {_server_2} weight {_weight_} maxconn {_maxconn_}'''
     72                         backend_add_for=backend_add.format(_backend_=backend,_server_1=record[server][0],_server_2=record[server][1],_weight_=record[weight],_maxconn_=record[maxconn])#进行格式化
     73                         q=input("33[43;1m警告!33[0m是否进行添加操作,按33[43;1mY/y!33[0m确认!否则返回")
     74                         if q=='y' or q=='Y':
     75                             add_file.write(backend_add_for)#写入文件
     76                             add_file.flush()#实时写入
     77                             print('33[32;1m恭喜!添加成功!33[0m
    
    ')
     78                             continue
     79                         else:
     80                             break
     81             except Exception as e:#出错可返回操作
     82                 print("33[31;1m输入的格式有误,请重新输入!33[0m")
     83                 pass
     84 
     85 def char_file():#修改backend信息
     86     while True:
     87         print('33[35;1m修改backend信息!输入格式示例:33[0m'.center(40,'='))
     88         show()#显示提示
     89         print('
    操作提示:按 33[35;1m B/b33[0m返回上层菜单<<<  33[35;1mQ/q33[0m直接退出!
    ')
     90         arg=input('>>>>>请输入你要修改的信息:')
     91         if arg=='b' or arg=='B':
     92             break
     93         elif arg=='q' or arg=='Q':
     94             out()
     95         else:
     96             try:
     97                 arg_dict=eval(arg)#转为字典
     98                 if judge(arg_dict):#判断是否存在
     99                     backend=arg_dict['backend']#key赋于变量 backend信息
    100                     record=arg_dict['record']##key赋于变量
    101                     print('33[32;1m新的配置33[0m'.center(50,'-'))
    102                     print_info(backend,record)#显示要修改后的信息
    103                     dict_file=file_query()#执行查询函数
    104                     print('33[37;1m旧的配置33[0m'.center(50,'-'))
    105                     print_info(backend,dict_file[backend] )#显示修改前的信息
    106                     server_infor='server '+ dict_file[backend][server][0]+' '+dict_file[backend][server][1]#判断ip文本
    107                     backend_add='''	server {_server_1} {_server_2} weight {_weight_} maxconn {_maxconn_}'''#新的配置信息
    108                     backend_add_for=backend_add.format(_server_1=record[server][0],_server_2=record[server][1],_weight_=record[weight],_maxconn_=record[maxconn])#进行格式化
    109                     #file_char_list=[]
    110                     with open('HAproxy','r',encoding='utf-8') as chars_file:
    111                         for line in chars_file:
    112                             if server_infor in line:#判断 backend所在行
    113                                 line=backend_add_for
    114                                 file_pop_list.append(line)#写入列表
    115                             file_pop_list.append(line)#写入列表
    116                     q=input("33[45;1m警告!33[0m是否进行修改操作,按33[45;1mY/y!33[0m确认!否则退出修改操作!")
    117                     if q=='y' or q=='Y':
    118                         write_file(file_pop_list)#写文件函数
    119                         print("33[31;1m修改完成!33[0m")
    120                         continue
    121                     else:
    122                         break
    123                 else:
    124                     jud=input('该信息不存在,是否进行添加?按 33[35;1m B/b33[0m返回不添加 <<<  33[35;1mY/y33[0m确定添加!
    ')
    125                     if jud=='b' or jud=='B':
    126                         break
    127                     elif jud=='Y' or jud=='y':
    128                         add()
    129                     else:
    130                         pass
    131             except Exception as e:#出错可返回操作
    132                 print("33[31;1m输入的格式有误,请重新输入!33[0m")
    133                 pass
    134 
    135 def write_file(file_pop_list):#写文件函数
    136     with open('HAproxy','w',encoding='utf-8') as pop_file:
    137         for i in range(len(file_pop_list)):
    138             pop_file.write(file_pop_list[i])#修改文件
    139         pop_file.flush()
    140 
    141 def judge(arg_dict):#判断是否存在的函数
    142     backend=arg_dict['backend']#key赋于变量 backend信息
    143     record=arg_dict['record']##key赋于变量
    144     file_dict=file_query()#调用查询函数
    145     if backend in file_dict:#判断是否已经存在
    146         return True#返回真
    147     else:
    148         return False#返回假
    149 
    150 def infor_pop():#删除backend信息
    151     while True:
    152         print('33[31;1m删除backend信息!输入格式示例:33[0m'.center(40,'-'))
    153         #arg_list="{'backend':'www.oldboy3.org','record':{'server':['110.110.1.1','110.110.1.1'],'weight':20,'maxconn':344}}"
    154         #print(arg_list)
    155         show()#显示提示
    156         print('
    操作提示:按 33[31;1m B/b33[0m返回上层菜单<<<  33[31;1mQ/q33[0m直接退出!
    ')
    157         arg=input('>>>>>请输入你要删除的信息:')
    158         if arg=='b' or arg=='B':
    159             break
    160         elif arg=='q' or arg=='Q':
    161             out()
    162         else:
    163             try:#进行异常处理
    164                 arg_dict=eval(arg)#转为字典
    165                 if judge(arg_dict):#进行判断是否存在
    166                     backend=arg_dict['backend']#key赋于变量 backend信息
    167                     record=arg_dict['record']##key赋于变量
    168                     server_infor='server '+ record[server][0]+' '+record[server][1]#判断ip文本
    169                     #file_pop_list=[]
    170                     with open('HAproxy','r+',encoding='utf-8') as pop_file:
    171                         for line in pop_file:
    172                             if line.startswith('backend') and backend in line:#判断 backend所在行
    173                                 line=''#
    174                                 file_pop_list.append(line)#写入列表
    175                             if server_infor in line:#判断server所在行
    176                                 line=''
    177                                 file_pop_list.append(line)#写入列表
    178                             file_pop_list.append(line)#写入列表 追加
    179                     print_info(backend,record)
    180                     #print(file_pop_list)
    181                     q=input("33[41;1m警告!33[0m是否进行删除操作,按33[41;1mY/y!33[0m确认!否则退出返回!")
    182                     if q=='y' or q=='Y':
    183                         # with open('HAproxy','w',encoding='utf-8') as pop_file:
    184                         #     for i in range(len(file_pop_list)):
    185                         #         pop_file.write(file_pop_list[i])
    186                         # file_pop_list=[]
    187                         # pop_file.flush()
    188                         print(1)
    189                         write_file(file_pop_list)#写文件函数
    190                         print("33[31;1m删除完成!33[0m")
    191                         continue
    192                     else:
    193                         break
    194                 else:
    195                     print("33[31;1m您所的信息不存,请重新输入!33[0m")
    196             except Exception as e:#出错可返回操作
    197                 print("33[31;1m输入的格式有误,请重新输入!33[0m")
    198                 pass
    199 
    200 def print_info(backend,record):#输入相关信息
    201     infor_pr='''
    202         33[35;1m=======确认信息=========33[0m
    203             backend:{arg}
    204             server: {server} {server1}
    205             weight: {weight}
    206             maxconn: {maxconn}
    207         33[35;1m=======================33[0m
    208     '''#定义输出文本
    209     infor_pr=infor_pr.format(arg=backend,server=record[server][0],server1=record[server][1],weight=record[weight],maxconn=record[maxconn])#格式化文本
    210 def print_sss():
    211     infor_pr_1='''
    212         33[35;1m===========确认信息=============33[0m
    213 
    214     33[36;1m温馨提示:33[0m33[31;1m操作有风险,33[0m33[32;1m阁下需谨慎!33[0m33[33;1m请再次确认!'33[0m
    215             33[37;1m确认操作系统将为您自动备份!33[0m
    216         33[35;1m===============================33[0m
    217     '''#定义输出文本
    218     print(infor_pr_1)
    219 
    220 #程序开始
    221 print('33[35;1mHAproxy 配置文件修改器33[0m'.center(40,'='))
    222 file_pop_list=[]#修改,删除,时读写的文件列表
    223 backend_key='backend'
    224 server='server'#定义字符串变量
    225 weight='weight'
    226 maxconn='maxconn'
    227 while True:
    228     print('''您可以进行以下相关操作:
    
    229             按33[32;1m 1 >>> 查询backend信息.33[0m
    230             按33[33;1m 2 >>> 添加修改相关backend信息.33[0m
    231             按33[35;1m 3 >>> 修改相关backend信息.33[0m
    232             按33[31;1m 4 >>> 删除相关backend信息.33[0m
    233             按33[30;1m 5 >>> 直接出退修改器.33[0m
    234     ''')
    235     choose=input('请输入您想要的操作 >>> :')
    236     if choose=='1':
    237         while True:
    238             print('33[32;1m查询backend信息界面!33[0m'.center(50,'='))
    239             #print_sss()
    240             print('操作提示:按 33[31;1m B/b33[0m返回上层菜单<<<  33[31;1mQ/q33[0m直接退出!')
    241             arg=input('请输您要查询的信息:')
    242             if arg=='b' or arg=='B':
    243                 break
    244             elif arg=='q' or arg=='Q':
    245                 out()
    246             else :
    247                 dict_file=file_query()#执行查询函数
    248                 if arg in dict_file:#如果所输入的存在
    249                     dict_file_key=dict_file[arg]#所对应的信息赋于变量
    250                     #infor=infor.format(arg=arg,server=dict_file_key[server][0],server1=dict_file_key[server][1],weight=dict_file_key[weight],maxconn=dict_file_key[maxconn])#格式化文本
    251                     #print(infor)
    252                     print_info(arg,dict_file_key)#调用信息函数
    253                     out()
    254                 else:
    255                     print('您输入的不存在,请重新输入')
    256                     pass
    257     elif choose=='2':
    258         while True:
    259             print('33[33;1m添加backend信息界面!33[0m'.center(50,'='))
    260             print_sss()
    261             qch=input('按提示进行操作:33[33;1mB/b<<<33[0m返回上层 33[33;1mY/y>>>33[0m确定开始添加 ')
    262             if qch=='b' or qch=='B':
    263                 break
    264             elif qch=='Y' or qch=='y':
    265                 print('添加backend信息,有一定的风险!已经为您自动备份配置文件!')
    266                 print('备份文件:33[33;1m%s33[0m'%filebak())#自动备份配置文件
    267                 add()#增加信息函数
    268             else:
    269                 pass
    270     elif choose=='3':
    271         while True:
    272             print('33[35;1m修改backend信息界面!33[0m'.center(50,'='))
    273             print_sss()
    274             qch=input('按提示进行操作:33[35;1mB/b<<<33[0m返回上层 33[35;1mY/y>>>33[0m确定开始添加 ')
    275             if qch=='b' or qch=='B':
    276                 break
    277             elif qch=='Y' or qch=='y':
    278                 print('修改backend信息,有一定的风险!已经为您自动备份配置文件!')
    279                 print('备份文件:33[35;1m%s33[0m'%filebak())
    280                 char_file()#修改文件函数
    281             else:
    282                 pass
    283     elif choose=='4':
    284         while True:
    285             print('33[31;1m删除backend信息界面!33[0m'.center(40,'='))
    286             print_sss()
    287             qch=input('按提示进行操作:33[31;1mB/b<<<33[0m返回上层 33[31;1mY/y>>>33[0m确定开始删除 ')
    288             if qch=='b' or qch=='B':
    289                 break
    290             elif qch=='Y' or qch=='y':
    291                 print('删除信息,有一定的风险!已经为您自动备份配置文件!')
    292                 print('备份文件:33[31;1m%s33[0m'%filebak())
    293                 infor_pop()#删除信息函数
    294             else:
    295                 pass
    296     elif choose=='5':
    297         print('33[30;1m您已经出退修改器.33[0m')
    298         exit()
    299     else:
    300         print('33[41;1m您的输入有误!请重新输入!33[0m')
    301         pass
    View Code

    前后两天!终于搞定了!明天,嗯,今天就可以交作业啦!

    您的资助是我最大的动力!
    金额随意,欢迎来赏!

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

    如果,想给予我更多的鼓励,求打

    因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【莫柔落切】!

    联系或打赏博主【莫柔落切】!https://home.cnblogs.com/u/uge3/

  • 相关阅读:
    第五届“飞思卡尔”智能车竞赛分赛区赛后总结
    最佳编程语录
    通过UserAgent判断智能手机(设备,Android,IOS)
    Sql Server 系统存储过程分析 2 数据库引擎存储过程
    OutputCache 导致页面下载的解决办法
    w3wp.exe(IIS ) CPU 占用 100% 的常见原因及解决办法
    过滤并替换页面html输出
    Sql Server 系统存储过程分析 1 目录存储过程
    Sql Server 监控 Job 执行情况
    OutPutCache 自定义缓存:session、登录用户、cookie 等
  • 原文地址:https://www.cnblogs.com/uge3/p/6843640.html
Copyright © 2020-2023  润新知