作业 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. python 旋转数组 多种解题思路

    leetcode 题目描述:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题. 要求使用空间复杂度为 O(1) 的 ...

  2. 【LeetCode】9. 回文数

    题目 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1:输入: 121 输出: true 示例 2:输入: -121 输出: false 解释: 从左 ...

  3. 自己动手实现爬虫scrapy框架思路汇总

    这里先简要温习下爬虫实际操作: cd ~/Desktop/spider scrapy startproject lastspider # 创建爬虫工程 cd lastspider/ # 进入工程 sc ...

  4. iOS之Settings.Bundle的应用

    Settings.Bundle Settings.Bundle支持六种配置项分别是:Title,MultiValue,Group,Slider,ToggleSwitch,TextField . Tit ...

  5. python之排序算法

    排序是每个语言都需要学会的,不管是c++.java还是python,套路都是类似的 python中也有自带的排序函数sort,直接使用也可 闲来无事写了几个排序算法,各不相同 1.每次遇到最小的数都交 ...

  6. 常用博客Metaweblog Api地址

    常用博客Metaweblog Api地址 CSDN: http://write.blog.csdn.net/xmlrpc/index 博客园(cnblogs):http://www.cnblogs.c ...

  7. LDA-线性判别分析(二)Two-classes 情形的数学推导

    本来是要调研 Latent Dirichlet Allocation 的那个 LDA 的, 没想到查到很多关于 Linear Discriminant Analysis 这个 LDA 的资料.初步看了 ...

  8. UFLDL 教程学习笔记(三)自编码与稀疏性

    UFLDL(Unsupervised Feature Learning and Deep Learning)Tutorial 是由 Stanford 大学的 Andrew Ng 教授及其团队编写的一套 ...

  9. 第八章:四大组件之Content Provider

    前言 Content Provider——Android四大组件之一. 本文要点 1.Content Provider简介 2.URI简介 3.如何访问Content Provider中数据 一.Co ...

  10. salesforce lightning零基础学习(六)Lightning Data Service(LDS)

    本篇可参看:https://trailhead.salesforce.com/modules/lightning_data_service Lightning中针对object的detail页面,一个 ...