• python第十天


    今天,检查了所有的作业,提交完成了!!

    总结了一下,只常码代码才能慢慢熟悉相关的语法!

    HAproxy配置文件操作 作业 经过测试完成啦!

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

    先上一下流程图:

    详细代码如下:

      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         show()#显示提示
     50         print('
    操作提示:按 33[31;1m B/b33[0m返回上层菜单<<<  33[31;1mQ/q33[0m直接退出!
    ')
     51         arg=input('>>>>>请输入你要添加的信息:')
     52         if arg=='b' or arg=='B':
     53             break
     54         elif arg=='q' or arg=='Q':
     55             out()
     56         else :
     57             try:#进行异常处理
     58                 arg_dict=eval(arg)#输入信息转为字典
     59                 if judge(arg_dict):#判断是否已经存在
     60                     print('33[41;1mbackend已经存在33[0m'.center(40,'*'))
     61                     continue
     62                 else:
     63                     with open('HAproxy','a',encoding='utf-8') as add_file:
     64                         backend=arg_dict['backend']#key赋于变量 backend信息
     65                         record=arg_dict['record']##key赋于变量
     66                         print_info(backend,record)#输出相关信息
     67                         #要添加的字符串变量
     68                         backend_add='''
    backend {_backend_}
     69         server {_server_1} {_server_2} weight {_weight_} maxconn {_maxconn_}'''
     70                         backend_add_for=backend_add.format(_backend_=backend,_server_1=record[server][0],_server_2=record[server][1],_weight_=record[weight],_maxconn_=record[maxconn])#进行格式化
     71                         q=input("33[43;1m警告!33[0m是否进行添加操作,按33[43;1mY/y!33[0m确认!否则返回")
     72                         if q=='y' or q=='Y':
     73                             add_file.write(backend_add_for)#写入文件
     74                             add_file.flush()#实时写入
     75                             print('33[32;1m恭喜!添加成功!33[0m
    
    ')
     76                             continue
     77                         else:
     78                             pass
     79             except Exception as e:#出错可返回操作
     80                 print("33[31;1m输入的格式有误,请重新输入!33[0m")
     81                 pass
     82 
     83 def char_file():#修改backend信息
     84     while True:
     85         print('33[35;1m修改backend信息!输入格式示例:33[0m'.center(40,'='))
     86         show()#显示提示
     87         print('
    操作提示:按 33[35;1m B/b33[0m返回上层菜单<<<  33[35;1mQ/q33[0m直接退出!
    ')
     88         arg=input('>>>>>请输入你要修改的信息:')
     89         if arg=='b' or arg=='B':
     90             break
     91         elif arg=='q' or arg=='Q':
     92             out()
     93         else:
     94             try:
     95                 arg_dict=eval(arg)#转为字典
     96                 if judge(arg_dict):#判断是否存在
     97                     backend=arg_dict['backend']#key赋于变量 backend信息
     98                     record=arg_dict['record']##key赋于变量
     99                     dict_file=file_query()#执行查询函数
    100                     print('33[37;1m旧的配置33[0m'.center(50,'-'))
    101                     print_info(backend,dict_file[backend] )#显示修改前的信息
    102                     print('33[32;1m新的配置33[0m'.center(50,'-'))
    103                     print_info(backend,record)#显示要修改后的信息
    104                     server_infor='server '+ dict_file[backend][server][0]+' '+dict_file[backend][server][1]#ip判断文本所在行
    105                     backend_add='''	server {_server_1} {_server_2} weight {_weight_} maxconn {_maxconn_}'''#新的配置信息
    106                     backend_add_for=backend_add.format(_server_1=record[server][0],_server_2=record[server][1],_weight_=record[weight],_maxconn_=record[maxconn])#进行格式化字符串
    107                     file_pop_list=[]
    108                     with open('HAproxy','r',encoding='utf-8') as chars_file:
    109                         for line in chars_file:
    110                             if server_infor in line:#判断 backend所在行
    111                                 file_pop_list.append(backend_add_for)#写入列表
    112                             else:
    113                                 file_pop_list.append(line)#写入列表
    114                     q=input("33[45;1m警告!33[0m是否进行修改操作,按33[45;1mY/y!33[0m确认!否则退出修改操作!")
    115                     if q=='y' or q=='Y':
    116                         write_file(file_pop_list)#写文件函数
    117 
    118                         print("33[31;1m修改完成!33[0m")
    119                         #file_pop_list=[]#清空列表
    120                         continue
    121                     else:
    122                         pass
    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     #file_pop_list=[]#清空列表
    141 
    142 def judge(arg_dict):#判断是否存在的函数
    143     backend=arg_dict['backend']#key赋于变量 backend信息
    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         show()#显示提示
    154         print('
    操作提示:按 33[31;1m B/b33[0m返回上层菜单<<<  33[31;1mQ/q33[0m直接退出!
    ')
    155         arg=input('>>>>>请输入你要删除的信息:')
    156         if arg=='b' or arg=='B':
    157             break
    158         elif arg=='q' or arg=='Q':
    159             out()
    160         else:
    161             try:#进行异常处理
    162                 arg_dict=eval(arg)#转为字典
    163                 if judge(arg_dict):#进行判断是否存在
    164                     backend=arg_dict['backend']#key赋于变量 backend信息
    165                     record=arg_dict['record']##key赋于变量
    166                     server_infor='server '+ record[server][0]+' '+record[server][1]#判断ip文本
    167                     file_pop_list=[]
    168                     with open('HAproxy','r+',encoding='utf-8') as pop_file:
    169                         for line in pop_file:
    170                             if line.startswith('backend') and backend in line:#判断 backend所在行
    171                                 line=''#
    172                                 file_pop_list.append(line)#写入列表
    173                             if server_infor in line:#判断server所在行
    174                                 line=''
    175                                 file_pop_list.append(line)#写入列表
    176                             file_pop_list.append(line)#写入列表 追加
    177                     print_info(backend,record)
    178                     q=input("33[41;1m警告!33[0m是否进行删除操作,按33[41;1mY/y!33[0m确认!否则退出返回!")
    179                     if q=='y' or q=='Y':
    180                         write_file(file_pop_list)#写文件函数
    181                         #file_pop_list=[]#清空列表
    182                         print("33[31;1m删除完成!33[0m")
    183                         #清空列表
    184                         continue
    185                     else:
    186                         pass
    187                 else:
    188                     print("33[31;1m您所的信息不存,请重新输入!33[0m")
    189             except Exception as e:#出错可返回操作
    190                 print("33[31;1m输入的格式有误,请重新输入!33[0m")
    191                 pass
    192 
    193 def print_info(backend,record):#输出相关信息
    194     infor_pr='''
    195         33[35;1m=======配置信息=========33[0m
    196             backend:{arg}
    197             server: {server} {server1}
    198             weight: {weight}
    199             maxconn: {maxconn}
    200         33[35;1m=======================33[0m
    201     '''#定义输出文本
    202     infor_pr=infor_pr.format(arg=backend,server=record[server][0],server1=record[server][1],weight=record[weight],maxconn=record[maxconn])#格式化文本
    203     print(infor_pr)
    204 
    205 def print_sss():#界面提示文字
    206     infor_pr_1='''
    207         33[35;1m===========确认信息=============33[0m
    208 
    209     33[36;1m温馨提示:33[0m33[31;1m操作有风险,33[0m33[32;1m阁下需谨慎!33[0m33[33;1m请再次确认!'33[0m
    210             33[37;1m确认操作系统将为您自动备份!33[0m
    211 
    212         33[35;1m===============================33[0m
    213     '''#定义输出文本
    214     print(infor_pr_1)
    215 
    216 #程序开始
    217 print('33[35;1mHAproxy 配置文件修改器33[0m'.center(50,'='))
    218 #file_pop_list=[]#修改,删除,时读写的文件列表
    219 backend_key='backend'
    220 server='server'#定义字符串变量
    221 weight='weight'
    222 maxconn='maxconn'
    223 while True:
    224     print('''您可以进行以下相关操作:
    
    225             按33[32;1m 1 >>> 查询backend信息.33[0m
    226             按33[33;1m 2 >>> 添加修改相关backend信息.33[0m
    227             按33[35;1m 3 >>> 修改相关backend信息.33[0m
    228             按33[31;1m 4 >>> 删除相关backend信息.33[0m
    229             按33[30;1m 5 >>> 直接出退修改器.33[0m
    230     ''')
    231     choose=input('请输入您想要的操作 >>> :')
    232     if choose=='1':
    233         while True:
    234             print('33[32;1m查询backend信息界面!33[0m'.center(50,'='))
    235             print('33[42;1m查询示例33[0m'.center(50,'-'))
    236             print('www.oldboy.org
    ')
    237             print('操作提示:按 33[31;1m B/b33[0m返回上层菜单<<<  33[31;1mQ/q33[0m直接退出!')
    238             arg=input('请输您要查询的信息:')
    239             if arg=='b' or arg=='B':
    240                 break
    241             elif arg=='q' or arg=='Q':
    242                 out()
    243             else :
    244                 dict_file=file_query()#执行查询函数
    245                 if arg in dict_file:#如果所输入的存在
    246                     dict_file_key=dict_file[arg]#所对应的信息赋于变量
    247                     print_info(arg,dict_file_key)#调用函数格式化输出
    248                     out()
    249                 else:
    250                     print('您输入的不存在,请重新输入')
    251                     pass
    252     elif choose=='2':
    253         while True:
    254             print('33[33;1m添加backend信息界面!33[0m'.center(50,'='))
    255             print_sss()
    256             qch=input('按提示进行操作:33[33;1mB/b<<<33[0m返回上层 33[33;1mY/y>>>33[0m确定开始添加 ')
    257             if qch=='b' or qch=='B':
    258                 break
    259             elif qch=='Y' or qch=='y':
    260                 print('33[31;1m添加backend信息,有一定的风险!已经为您自动备份配置文件!33[0m')
    261                 print('备份文件:33[33;1m%s33[0m'%filebak())#自动备份配置文件
    262                 add()#增加信息函数
    263             else:
    264                 pass
    265     elif choose=='3':
    266         while True:
    267             print('33[35;1m修改backend信息界面!33[0m'.center(50,'='))
    268             print_sss()
    269             qch=input('按提示进行操作:33[35;1mB/b<<<33[0m返回上层 33[35;1mY/y>>>33[0m确定开始添加 ')
    270             if qch=='b' or qch=='B':
    271                 break
    272             elif qch=='Y' or qch=='y':
    273                 print('33[31;1m修改backend信息,有一定的风险!已经为您自动备份配置文件!33[0m')
    274                 print('备份文件:33[35;1m%s33[0m'%filebak())
    275                 char_file()#修改文件函数
    276             else:
    277                 pass
    278     elif choose=='4':
    279         while True:
    280             print('33[31;1m删除backend信息界面!33[0m'.center(40,'='))
    281             print_sss()
    282             qch=input('按提示进行操作:33[31;1mB/b<<<33[0m返回上层 33[31;1mY/y>>>33[0m确定开始删除 ')
    283             if qch=='b' or qch=='B':
    284                 break
    285             elif qch=='Y' or qch=='y':
    286                 print('33[31;1m删除backend信息,有一定的风险!已经为您自动备份配置文件!33[0m')
    287                 print('备份文件:33[31;1m%s33[0m'%filebak())
    288                 infor_pop()#删除信息函数
    289             else:
    290                 pass
    291     elif choose=='5':
    292         print('33[30;1m您已经出退修改器.33[0m')
    293         exit()
    294     else:
    295         print('33[41;1m您的输入有误!请重新输入!33[0m')
    296         pass
    View Code

    功能全部实现!

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

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

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

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

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

  • 相关阅读:
    【javaFX学习】(二) 面板手册
    Android开发从系统图库中选择一张图片的方法
    用Android studio进行 OpenCV 开发的第一个项目
    【Android学习入门】Android中activity的启动模式
    Android Studio快捷键【Android学习入门】
    【Android学习入门】Android studio基本设置
    安装Android模拟器Genymotion【Android学习入门】
    Android studio 安装与配置【Android学习入门】
    【知乎】日常生活中有哪些十分钟就能学会并可以终生受用的技能?(一)
    C++学生信息处理
  • 原文地址:https://www.cnblogs.com/uge3/p/6845083.html
Copyright © 2020-2023  润新知