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

照旧,上一下流程图:

详细代码:

 #!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
import time
time_format='%y-%m-%d_%H-%M-%S'#格式化时间输出格式
times=time.strftime(time_format)#将时间转为字符串 def filebak():#自动备份配置文件函数
haproxy_bak='HA_bak_'+times
with open('HAproxy','r+',encoding='utf-8') as ha_file,\
open(haproxy_bak,'w',encoding='utf-8') as new_file:
for line in ha_file:
new_file.write(line)
return haproxy_bak#返回备份文件名 def file_query():#查询server信息函数
file_dict={}#创建一个空字典
with open('HAproxy','r+',encoding='utf-8') as ha_file:
for line in ha_file:
line=line.strip()#去除空格与回车
try:
if line.startswith('backend'):#判断以backend开头的行
key_1=line.split()[1]#以空格进行分割赋于变量
file_dict[key_1]={}#设置字典格式
file_dict_key1=file_dict[key_1]#赋于变量
if line.startswith('server'):
b={'server':[line.split()[1],line.split()[2]],'weight':line.split()[4],'maxconn':line.split()[6]}#
file_dict_key1.update(b)#更新字典
except Exception as e:#出错可返回操作
print("\033[31;1mHAproxy文件出错,请仔细检查!\033[0m")
exit()
return file_dict#返回字典 所有backend的信息 def out():#返回退出函数
qu=input("请按提示操作!按\033[31;1mY/y\033[0m退出修改器!其它键返回!")
if qu=='Y'or qu=='y':
print("您已经退出修改器!" )
exit()#退出程序
else :
pass def show():#提示示例
arg_list="{'backend':'www.oldboy3.org','record':{'server':['110.110.1.1','110.110.1.1'],'weight':20,'maxconn':344}}"
print(arg_list) def add():#添加backend信息函数
while True:
print('\033[43;1m添加backend信息!输入格式示例:\033[0m'.center(40,'-'))
#arg_list="{'backend':'www.oldboy3.org','record':{'server':['110.110.1.1','110.110.1.1'],'weight':20,'maxconn':344}}"
#print(arg_list)
show()#显示提示
print('\n操作提示:按 \033[31;1m B/b\033[0m返回上层菜单<<< \033[31;1mQ/q\033[0m直接退出!\n')
arg=input('>>>>>请输入你要添加的信息:')
if arg=='b' or arg=='B':
break
elif arg=='q' or arg=='Q':
out()
else :
try:#进行异常处理
arg_dict=eval(arg)#输入信息转为字典
if judge(arg_dict):#判断是否已经存在
print('\033[41;1mbackend已经存在\033[0m'.center(40,'*'))
continue
else:
with open('HAproxy','a',encoding='utf-8') as add_file:
backend=arg_dict['backend']#key赋于变量 backend信息
record=arg_dict['record']##key赋于变量
print_info(backend,record)
#要添加的字符串变量
backend_add='''\nbackend {_backend_}
server {_server_1} {_server_2} weight {_weight_} maxconn {_maxconn_}'''
backend_add_for=backend_add.format(_backend_=backend,_server_1=record[server][0],_server_2=record[server][1],_weight_=record[weight],_maxconn_=record[maxconn])#进行格式化
q=input("\033[43;1m警告!\033[0m是否进行添加操作,按\033[43;1mY/y!\033[0m确认!否则返回")
if q=='y' or q=='Y':
add_file.write(backend_add_for)#写入文件
add_file.flush()#实时写入
print('\033[32;1m恭喜!添加成功!\033[0m\n\n')
continue
else:
break
except Exception as e:#出错可返回操作
print("\033[31;1m输入的格式有误,请重新输入!\033[0m")
pass def char_file():#修改backend信息
while True:
print('\033[35;1m修改backend信息!输入格式示例:\033[0m'.center(40,'='))
show()#显示提示
print('\n操作提示:按 \033[35;1m B/b\033[0m返回上层菜单<<< \033[35;1mQ/q\033[0m直接退出!\n')
arg=input('>>>>>请输入你要修改的信息:')
if arg=='b' or arg=='B':
break
elif arg=='q' or arg=='Q':
out()
else:
try:
arg_dict=eval(arg)#转为字典
if judge(arg_dict):#判断是否存在
backend=arg_dict['backend']#key赋于变量 backend信息
record=arg_dict['record']##key赋于变量
print('\033[32;1m新的配置\033[0m'.center(50,'-'))
print_info(backend,record)#显示要修改后的信息
dict_file=file_query()#执行查询函数
print('\033[37;1m旧的配置\033[0m'.center(50,'-'))
print_info(backend,dict_file[backend] )#显示修改前的信息
server_infor='server '+ dict_file[backend][server][0]+' '+dict_file[backend][server][1]#判断ip文本
backend_add='''\tserver {_server_1} {_server_2} weight {_weight_} maxconn {_maxconn_}'''#新的配置信息
backend_add_for=backend_add.format(_server_1=record[server][0],_server_2=record[server][1],_weight_=record[weight],_maxconn_=record[maxconn])#进行格式化
#file_char_list=[]
with open('HAproxy','r',encoding='utf-8') as chars_file:
for line in chars_file:
if server_infor in line:#判断 backend所在行
line=backend_add_for
file_pop_list.append(line)#写入列表
file_pop_list.append(line)#写入列表
q=input("\033[45;1m警告!\033[0m是否进行修改操作,按\033[45;1mY/y!\033[0m确认!否则退出修改操作!")
if q=='y' or q=='Y':
write_file(file_pop_list)#写文件函数
print("\033[31;1m修改完成!\033[0m")
continue
else:
break
else:
jud=input('该信息不存在,是否进行添加?按 \033[35;1m B/b\033[0m返回不添加 <<< \033[35;1mY/y\033[0m确定添加!\n')
if jud=='b' or jud=='B':
break
elif jud=='Y' or jud=='y':
add()
else:
pass
except Exception as e:#出错可返回操作
print("\033[31;1m输入的格式有误,请重新输入!\033[0m")
pass def write_file(file_pop_list):#写文件函数
with open('HAproxy','w',encoding='utf-8') as pop_file:
for i in range(len(file_pop_list)):
pop_file.write(file_pop_list[i])#修改文件
pop_file.flush() def judge(arg_dict):#判断是否存在的函数
backend=arg_dict['backend']#key赋于变量 backend信息
record=arg_dict['record']##key赋于变量
file_dict=file_query()#调用查询函数
if backend in file_dict:#判断是否已经存在
return True#返回真
else:
return False#返回假 def infor_pop():#删除backend信息
while True:
print('\033[31;1m删除backend信息!输入格式示例:\033[0m'.center(40,'-'))
#arg_list="{'backend':'www.oldboy3.org','record':{'server':['110.110.1.1','110.110.1.1'],'weight':20,'maxconn':344}}"
#print(arg_list)
show()#显示提示
print('\n操作提示:按 \033[31;1m B/b\033[0m返回上层菜单<<< \033[31;1mQ/q\033[0m直接退出!\n')
arg=input('>>>>>请输入你要删除的信息:')
if arg=='b' or arg=='B':
break
elif arg=='q' or arg=='Q':
out()
else:
try:#进行异常处理
arg_dict=eval(arg)#转为字典
if judge(arg_dict):#进行判断是否存在
backend=arg_dict['backend']#key赋于变量 backend信息
record=arg_dict['record']##key赋于变量
server_infor='server '+ record[server][0]+' '+record[server][1]#判断ip文本
#file_pop_list=[]
with open('HAproxy','r+',encoding='utf-8') as pop_file:
for line in pop_file:
if line.startswith('backend') and backend in line:#判断 backend所在行
line=''#
file_pop_list.append(line)#写入列表
if server_infor in line:#判断server所在行
line=''
file_pop_list.append(line)#写入列表
file_pop_list.append(line)#写入列表 追加
print_info(backend,record)
#print(file_pop_list)
q=input("\033[41;1m警告!\033[0m是否进行删除操作,按\033[41;1mY/y!\033[0m确认!否则退出返回!")
if q=='y' or q=='Y':
# with open('HAproxy','w',encoding='utf-8') as pop_file:
# for i in range(len(file_pop_list)):
# pop_file.write(file_pop_list[i])
# file_pop_list=[]
# pop_file.flush()
print(1)
write_file(file_pop_list)#写文件函数
print("\033[31;1m删除完成!\033[0m")
continue
else:
break
else:
print("\033[31;1m您所的信息不存,请重新输入!\033[0m")
except Exception as e:#出错可返回操作
print("\033[31;1m输入的格式有误,请重新输入!\033[0m")
pass def print_info(backend,record):#输入相关信息
infor_pr='''
\033[35;1m=======确认信息=========\033[0m
backend:{arg}
server: {server} {server1}
weight: {weight}
maxconn: {maxconn}
\033[35;1m=======================\033[0m
'''#定义输出文本
infor_pr=infor_pr.format(arg=backend,server=record[server][0],server1=record[server][1],weight=record[weight],maxconn=record[maxconn])#格式化文本
def print_sss():
infor_pr_1='''
\033[35;1m===========确认信息=============\033[0m \033[36;1m温馨提示:\033[0m\033[31;1m操作有风险,\033[0m\033[32;1m阁下需谨慎!\033[0m\033[33;1m请再次确认!'\033[0m
\033[37;1m确认操作系统将为您自动备份!\033[0m
\033[35;1m===============================\033[0m
'''#定义输出文本
print(infor_pr_1) #程序开始
print('\033[35;1mHAproxy 配置文件修改器\033[0m'.center(40,'='))
file_pop_list=[]#修改,删除,时读写的文件列表
backend_key='backend'
server='server'#定义字符串变量
weight='weight'
maxconn='maxconn'
while True:
print('''您可以进行以下相关操作:\n
按\033[32;1m 1 >>> 查询backend信息.\033[0m
按\033[33;1m 2 >>> 添加修改相关backend信息.\033[0m
按\033[35;1m 3 >>> 修改相关backend信息.\033[0m
按\033[31;1m 4 >>> 删除相关backend信息.\033[0m
按\033[30;1m 5 >>> 直接出退修改器.\033[0m
''')
choose=input('请输入您想要的操作 >>> :')
if choose=='':
while True:
print('\033[32;1m查询backend信息界面!\033[0m'.center(50,'='))
#print_sss()
print('操作提示:按 \033[31;1m B/b\033[0m返回上层菜单<<< \033[31;1mQ/q\033[0m直接退出!')
arg=input('请输您要查询的信息:')
if arg=='b' or arg=='B':
break
elif arg=='q' or arg=='Q':
out()
else :
dict_file=file_query()#执行查询函数
if arg in dict_file:#如果所输入的存在
dict_file_key=dict_file[arg]#所对应的信息赋于变量
#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])#格式化文本
#print(infor)
print_info(arg,dict_file_key)#调用信息函数
out()
else:
print('您输入的不存在,请重新输入')
pass
elif choose=='':
while True:
print('\033[33;1m添加backend信息界面!\033[0m'.center(50,'='))
print_sss()
qch=input('按提示进行操作:\033[33;1mB/b<<<\033[0m返回上层 \033[33;1mY/y>>>\033[0m确定开始添加 ')
if qch=='b' or qch=='B':
break
elif qch=='Y' or qch=='y':
print('添加backend信息,有一定的风险!已经为您自动备份配置文件!')
print('备份文件:\033[33;1m%s\033[0m'%filebak())#自动备份配置文件
add()#增加信息函数\
else:
pass
elif choose=='':
while True:
print('\033[35;1m修改backend信息界面!\033[0m'.center(50,'='))
print_sss()
qch=input('按提示进行操作:\033[35;1mB/b<<<\033[0m返回上层 \033[35;1mY/y>>>\033[0m确定开始添加 ')
if qch=='b' or qch=='B':
break
elif qch=='Y' or qch=='y':
print('修改backend信息,有一定的风险!已经为您自动备份配置文件!')
print('备份文件:\033[35;1m%s\033[0m'%filebak())
char_file()#修改文件函数
else:
pass
elif choose=='':
while True:
print('\033[31;1m删除backend信息界面!\033[0m'.center(40,'='))
print_sss()
qch=input('按提示进行操作:\033[31;1mB/b<<<\033[0m返回上层 \033[31;1mY/y>>>\033[0m确定开始删除 ')
if qch=='b' or qch=='B':
break
elif qch=='Y' or qch=='y':
print('删除信息,有一定的风险!已经为您自动备份配置文件!')
print('备份文件:\033[31;1m%s\033[0m'%filebak())
infor_pop()#删除信息函数
else:
pass
elif choose=='':
print('\033[30;1m您已经出退修改器.\033[0m')
exit()
else:
print('\033[41;1m您的输入有误!请重新输入!\033[0m')
pass

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

python第九天----今天来晚了!的更多相关文章

  1. Python第九课学习

    Python第九课学习 数据结构: 深浅拷贝 集合set 函数: 概念 创建 参数 return 定义域 www.cnblogs.com/yuanchenqi/articles/5782764.htm ...

  2. Python第九章模块和包(2)

    1.如果文件下没有__init__.py文件,程序将不会认为这是一个Python的包. 2.如果要使用from 包  import  *  则需要 这样做. 是模块中包含 方法 的文件没有包含类: # ...

  3. Python第九章模块和包

    1.import Python文件的时候文件名不能跟Python中自带的关键字重复,否则无法使用关键字的方法. 2.Reload(),重载例子 import sysreload(sys)sys.set ...

  4. Python 第九篇:队列Queue、生产者消费者模型、(IO/异步IP/Select/Poll/Epool)、Mysql操作

    Mysql操作: grant select,insert,update,delete on *.* to root@"%" Identified by "123456&q ...

  5. python第九章:面向对象--小白博客

     面向对象介绍 一.面向对象和面向过程 面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 缺点 ...

  6. python第九十六天 ---Django(1)

    django 模块 一  安装: pip3 install django 或 python -m pip install django 二  添加环境变量 相关命令: #cmd 下 django-ad ...

  7. python第九十五天--js正则

    定义正则表达式 /.../ 用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配 JS正则匹配时本身就是支持多行,此处多行匹配只是影响正则表达式^ ...

  8. 流畅的python第九章符合Python风格的对象学习记录

    对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式.Python提供了两种方式 repr()便于开发者理解的方式返回对象的字符串表示形式 str()便于用户理解的方式返回对 ...

  9. python第九篇:Python进程

    Python进程 接下来我主要按照下图中思维导图上的关键点对进程和线程进行一个总结 进程知识点总结:   一.Python进程 1.概念 程序和进程: 程序:是可执行文件,是静态的,占据磁盘空间,程序 ...

随机推荐

  1. es 基于match_phrase的模糊匹配原理及使用

    [版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 在业务中经常会遇到类似数据库的"like"的模糊匹配需求 ...

  2. 课程五(Sequence Models),第一 周(Recurrent Neural Networks) —— 0.Practice questions:Recurrent Neural Networks

    [解释] It is appropriate when every input should be matched to an output. [解释] in a language model we ...

  3. 解决vue路由history模式刷新后404的问题

    server { listen ;#默认端口是80,如果端口没被占用可以不用修改 server_name localhost; root E:/vue/my_project/dist;#vue项目的打 ...

  4. 从零开始学 Web 之 CSS3(五)transform

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  5. 创建Docker私有仓库

    1.有时候,在公司内部为了提高分享的速度,需要在公司内部自己搭建一个本地的仓库,供私人使用. 2.docker官方提供了一个工具docker-registry,我们可以借助这个工具构建私有镜像仓库a. ...

  6. 基于easyui与MVC的前端界面

    1.登录界面: 2.主界面: 下载源码

  7. 读了这篇文章,你将变身web分析大师

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由shirishiyue发表于云+社区专栏 1.工具介绍 ​ 这是一个非常详细且专业的web页面性能分析工具,而且开源的!如果你打不开其 ...

  8. Linux下lz4解压缩命令小结

    lz4是一个让"人见人爱.花见花开"的压缩算法,能够在多核上很好的扩展.lz4在压缩率上略微逊色, 但是在解压速度上有着惊人的优势 (大概是gzip的3倍(多次测试对比)).因为压 ...

  9. iframe可通过postMessage解决跨域、跨窗口消息传递

    https://www.cnblogs.com/dorothyorsusie/p/6178599.html //iframe传参给父级页面 function give_info(){ console. ...

  10. ADNI数据

    之前整理的数据相关内容 数据的模态有 Clinical Data(临床数据) Genetic(基因数据) MRI PET BIOSPECIMEN(生物样本) 各模态数据的内容.特点 Clinical ...