python第九天----今天来晚了!
作业 1. HAproxy配置文件操作
1. 根据用户输入输出对应的backend下的server信息
2. 可添加backend 和sever信息
3. 可修改backend 和sever信息
4. 可删除backend 和sever信息
5. 操作配置文件前进行备份
6 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建;若信息与已有信息重复则不操作
照旧,上一下流程图:
详细代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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("\033[31;1mHAproxy文件出错,请仔细检查!\033[0m") 31 exit() 32 return file_dict#返回字典 所有backend的信息 33 34 def out():#返回退出函数 35 qu=input("请按提示操作!按\033[31;1mY/y\033[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('\033[43;1m添加backend信息!输入格式示例:\033[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('\n操作提示:按 \033[31;1m B/b\033[0m返回上层菜单<<< \033[31;1mQ/q\033[0m直接退出!\n') 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('\033[41;1mbackend已经存在\033[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='''\nbackend {_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("\033[43;1m警告!\033[0m是否进行添加操作,按\033[43;1mY/y!\033[0m确认!否则返回") 74 if q=='y' or q=='Y': 75 add_file.write(backend_add_for)#写入文件 76 add_file.flush()#实时写入 77 print('\033[32;1m恭喜!添加成功!\033[0m\n\n') 78 continue 79 else: 80 break 81 except Exception as e:#出错可返回操作 82 print("\033[31;1m输入的格式有误,请重新输入!\033[0m") 83 pass 84 85 def char_file():#修改backend信息 86 while True: 87 print('\033[35;1m修改backend信息!输入格式示例:\033[0m'.center(40,'=')) 88 show()#显示提示 89 print('\n操作提示:按 \033[35;1m B/b\033[0m返回上层菜单<<< \033[35;1mQ/q\033[0m直接退出!\n') 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('\033[32;1m新的配置\033[0m'.center(50,'-')) 102 print_info(backend,record)#显示要修改后的信息 103 dict_file=file_query()#执行查询函数 104 print('\033[37;1m旧的配置\033[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='''\tserver {_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("\033[45;1m警告!\033[0m是否进行修改操作,按\033[45;1mY/y!\033[0m确认!否则退出修改操作!") 117 if q=='y' or q=='Y': 118 write_file(file_pop_list)#写文件函数 119 print("\033[31;1m修改完成!\033[0m") 120 continue 121 else: 122 break 123 else: 124 jud=input('该信息不存在,是否进行添加?按 \033[35;1m B/b\033[0m返回不添加 <<< \033[35;1mY/y\033[0m确定添加!\n') 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("\033[31;1m输入的格式有误,请重新输入!\033[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('\033[31;1m删除backend信息!输入格式示例:\033[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('\n操作提示:按 \033[31;1m B/b\033[0m返回上层菜单<<< \033[31;1mQ/q\033[0m直接退出!\n') 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("\033[41;1m警告!\033[0m是否进行删除操作,按\033[41;1mY/y!\033[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("\033[31;1m删除完成!\033[0m") 191 continue 192 else: 193 break 194 else: 195 print("\033[31;1m您所的信息不存,请重新输入!\033[0m") 196 except Exception as e:#出错可返回操作 197 print("\033[31;1m输入的格式有误,请重新输入!\033[0m") 198 pass 199 200 def print_info(backend,record):#输入相关信息 201 infor_pr=''' 202 \033[35;1m=======确认信息=========\033[0m 203 backend:{arg} 204 server: {server} {server1} 205 weight: {weight} 206 maxconn: {maxconn} 207 \033[35;1m=======================\033[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 \033[35;1m===========确认信息=============\033[0m 213 214 \033[36;1m温馨提示:\033[0m\033[31;1m操作有风险,\033[0m\033[32;1m阁下需谨慎!\033[0m\033[33;1m请再次确认!'\033[0m 215 \033[37;1m确认操作系统将为您自动备份!\033[0m 216 \033[35;1m===============================\033[0m 217 '''#定义输出文本 218 print(infor_pr_1) 219 220 #程序开始 221 print('\033[35;1mHAproxy 配置文件修改器\033[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('''您可以进行以下相关操作:\n 229 按\033[32;1m 1 >>> 查询backend信息.\033[0m 230 按\033[33;1m 2 >>> 添加修改相关backend信息.\033[0m 231 按\033[35;1m 3 >>> 修改相关backend信息.\033[0m 232 按\033[31;1m 4 >>> 删除相关backend信息.\033[0m 233 按\033[30;1m 5 >>> 直接出退修改器.\033[0m 234 ''') 235 choose=input('请输入您想要的操作 >>> :') 236 if choose=='1': 237 while True: 238 print('\033[32;1m查询backend信息界面!\033[0m'.center(50,'=')) 239 #print_sss() 240 print('操作提示:按 \033[31;1m B/b\033[0m返回上层菜单<<< \033[31;1mQ/q\033[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('\033[33;1m添加backend信息界面!\033[0m'.center(50,'=')) 260 print_sss() 261 qch=input('按提示进行操作:\033[33;1mB/b<<<\033[0m返回上层 \033[33;1mY/y>>>\033[0m确定开始添加 ') 262 if qch=='b' or qch=='B': 263 break 264 elif qch=='Y' or qch=='y': 265 print('添加backend信息,有一定的风险!已经为您自动备份配置文件!') 266 print('备份文件:\033[33;1m%s\033[0m'%filebak())#自动备份配置文件 267 add()#增加信息函数\ 268 else: 269 pass 270 elif choose=='3': 271 while True: 272 print('\033[35;1m修改backend信息界面!\033[0m'.center(50,'=')) 273 print_sss() 274 qch=input('按提示进行操作:\033[35;1mB/b<<<\033[0m返回上层 \033[35;1mY/y>>>\033[0m确定开始添加 ') 275 if qch=='b' or qch=='B': 276 break 277 elif qch=='Y' or qch=='y': 278 print('修改backend信息,有一定的风险!已经为您自动备份配置文件!') 279 print('备份文件:\033[35;1m%s\033[0m'%filebak()) 280 char_file()#修改文件函数 281 else: 282 pass 283 elif choose=='4': 284 while True: 285 print('\033[31;1m删除backend信息界面!\033[0m'.center(40,'=')) 286 print_sss() 287 qch=input('按提示进行操作:\033[31;1mB/b<<<\033[0m返回上层 \033[31;1mY/y>>>\033[0m确定开始删除 ') 288 if qch=='b' or qch=='B': 289 break 290 elif qch=='Y' or qch=='y': 291 print('删除信息,有一定的风险!已经为您自动备份配置文件!') 292 print('备份文件:\033[31;1m%s\033[0m'%filebak()) 293 infor_pop()#删除信息函数 294 else: 295 pass 296 elif choose=='5': 297 print('\033[30;1m您已经出退修改器.\033[0m') 298 exit() 299 else: 300 print('\033[41;1m您的输入有误!请重新输入!\033[0m') 301 pass
前后两天!终于搞定了!明天,嗯,今天就可以交作业啦!
![](https://files.cnblogs.com/files/uge3/%E5%BE%AE%E4%BF%A1.bmp)
您的资助是我最大的动力!
金额随意,欢迎来赏!
![](https://files.cnblogs.com/files/uge3/%E6%94%AF%E4%BB%98%E5%AE%9D.bmp)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的
因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【莫柔落切】!
联系或打赏博主【莫柔落切】!https://home.cnblogs.com/u/uge3/