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("\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         show()#显示提示
 50         print('\n操作提示:按 \033[31;1m B/b\033[0m返回上层菜单<<<  \033[31;1mQ/q\033[0m直接退出!\n')
 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('\033[41;1mbackend已经存在\033[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='''\nbackend {_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("\033[43;1m警告!\033[0m是否进行添加操作,按\033[43;1mY/y!\033[0m确认!否则返回")
 72                         if q=='y' or q=='Y':
 73                             add_file.write(backend_add_for)#写入文件
 74                             add_file.flush()#实时写入
 75                             print('\033[32;1m恭喜!添加成功!\033[0m\n\n')
 76                             continue
 77                         else:
 78                             pass
 79             except Exception as e:#出错可返回操作
 80                 print("\033[31;1m输入的格式有误,请重新输入!\033[0m")
 81                 pass
 82 
 83 def char_file():#修改backend信息
 84     while True:
 85         print('\033[35;1m修改backend信息!输入格式示例:\033[0m'.center(40,'='))
 86         show()#显示提示
 87         print('\n操作提示:按 \033[35;1m B/b\033[0m返回上层菜单<<<  \033[35;1mQ/q\033[0m直接退出!\n')
 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('\033[37;1m旧的配置\033[0m'.center(50,'-'))
101                     print_info(backend,dict_file[backend] )#显示修改前的信息
102                     print('\033[32;1m新的配置\033[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='''\tserver {_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("\033[45;1m警告!\033[0m是否进行修改操作,按\033[45;1mY/y!\033[0m确认!否则退出修改操作!")
115                     if q=='y' or q=='Y':
116                         write_file(file_pop_list)#写文件函数
117 
118                         print("\033[31;1m修改完成!\033[0m")
119                         #file_pop_list=[]#清空列表
120                         continue
121                     else:
122                         pass
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     #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('\033[31;1m删除backend信息!输入格式示例:\033[0m'.center(40,'-'))
153         show()#显示提示
154         print('\n操作提示:按 \033[31;1m B/b\033[0m返回上层菜单<<<  \033[31;1mQ/q\033[0m直接退出!\n')
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("\033[41;1m警告!\033[0m是否进行删除操作,按\033[41;1mY/y!\033[0m确认!否则退出返回!")
179                     if q=='y' or q=='Y':
180                         write_file(file_pop_list)#写文件函数
181                         #file_pop_list=[]#清空列表
182                         print("\033[31;1m删除完成!\033[0m")
183                         #清空列表
184                         continue
185                     else:
186                         pass
187                 else:
188                     print("\033[31;1m您所的信息不存,请重新输入!\033[0m")
189             except Exception as e:#出错可返回操作
190                 print("\033[31;1m输入的格式有误,请重新输入!\033[0m")
191                 pass
192 
193 def print_info(backend,record):#输出相关信息
194     infor_pr='''
195         \033[35;1m=======配置信息=========\033[0m
196             backend:{arg}
197             server: {server} {server1}
198             weight: {weight}
199             maxconn: {maxconn}
200         \033[35;1m=======================\033[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         \033[35;1m===========确认信息=============\033[0m
208 
209     \033[36;1m温馨提示:\033[0m\033[31;1m操作有风险,\033[0m\033[32;1m阁下需谨慎!\033[0m\033[33;1m请再次确认!'\033[0m
210             \033[37;1m确认操作系统将为您自动备份!\033[0m
211 
212         \033[35;1m===============================\033[0m
213     '''#定义输出文本
214     print(infor_pr_1)
215 
216 #程序开始
217 print('\033[35;1mHAproxy 配置文件修改器\033[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('''您可以进行以下相关操作:\n
225             按\033[32;1m 1 >>> 查询backend信息.\033[0m
226             按\033[33;1m 2 >>> 添加修改相关backend信息.\033[0m
227             按\033[35;1m 3 >>> 修改相关backend信息.\033[0m
228             按\033[31;1m 4 >>> 删除相关backend信息.\033[0m
229             按\033[30;1m 5 >>> 直接出退修改器.\033[0m
230     ''')
231     choose=input('请输入您想要的操作 >>> :')
232     if choose=='1':
233         while True:
234             print('\033[32;1m查询backend信息界面!\033[0m'.center(50,'='))
235             print('\033[42;1m查询示例\033[0m'.center(50,'-'))
236             print('www.oldboy.org\n')
237             print('操作提示:按 \033[31;1m B/b\033[0m返回上层菜单<<<  \033[31;1mQ/q\033[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('\033[33;1m添加backend信息界面!\033[0m'.center(50,'='))
255             print_sss()
256             qch=input('按提示进行操作:\033[33;1mB/b<<<\033[0m返回上层 \033[33;1mY/y>>>\033[0m确定开始添加 ')
257             if qch=='b' or qch=='B':
258                 break
259             elif qch=='Y' or qch=='y':
260                 print('\033[31;1m添加backend信息,有一定的风险!已经为您自动备份配置文件!\033[0m')
261                 print('备份文件:\033[33;1m%s\033[0m'%filebak())#自动备份配置文件
262                 add()#增加信息函数\
263             else:
264                 pass
265     elif choose=='3':
266         while True:
267             print('\033[35;1m修改backend信息界面!\033[0m'.center(50,'='))
268             print_sss()
269             qch=input('按提示进行操作:\033[35;1mB/b<<<\033[0m返回上层 \033[35;1mY/y>>>\033[0m确定开始添加 ')
270             if qch=='b' or qch=='B':
271                 break
272             elif qch=='Y' or qch=='y':
273                 print('\033[31;1m修改backend信息,有一定的风险!已经为您自动备份配置文件!\033[0m')
274                 print('备份文件:\033[35;1m%s\033[0m'%filebak())
275                 char_file()#修改文件函数
276             else:
277                 pass
278     elif choose=='4':
279         while True:
280             print('\033[31;1m删除backend信息界面!\033[0m'.center(40,'='))
281             print_sss()
282             qch=input('按提示进行操作:\033[31;1mB/b<<<\033[0m返回上层 \033[31;1mY/y>>>\033[0m确定开始删除 ')
283             if qch=='b' or qch=='B':
284                 break
285             elif qch=='Y' or qch=='y':
286                 print('\033[31;1m删除backend信息,有一定的风险!已经为您自动备份配置文件!\033[0m')
287                 print('备份文件:\033[31;1m%s\033[0m'%filebak())
288                 infor_pop()#删除信息函数
289             else:
290                 pass
291     elif choose=='5':
292         print('\033[30;1m您已经出退修改器.\033[0m')
293         exit()
294     else:
295         print('\033[41;1m您的输入有误!请重新输入!\033[0m')
296         pass
View Code

功能全部实现!

 

posted @ 2017-05-12 13:07  莫柔落切  阅读(384)  评论(0编辑  收藏  举报