Python蜕变-2017-4-23
我的第一篇博客,这是试水练习。这次上的菜是Haporxy配置文件操作。
<1> 上需求:
具体配置文件如下:
global
log 127.0.0.1 local2
daemon
maxconn 256
log 127.0.0.1 local2 info
defaults
log global
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option dontlognull listen stats :8888
stats enable
stats uri /admin
stats auth admin:1234 frontend oldboy.org
bind 0.0.0.0:80
option httplog
option httpclose
option forwardfor
log global
acl www hdr_reg(host) -i www.oldboy.org
use_backend www.oldboy.org if www backend www.oldboy.org
server 100.1.7.9 weight 20 maxconn 3000
<2>分析需求:
1.将配置文件中的主要信息也就是“backend”后的数据展示出来。
2.能够对数据进行增删改查的操作。
3.每次操作后进行备份。
<3>功能分析:
1.读取配置文件并截取有用数据打印。
2.具备增删改查功能,在此有用户输入,所以有必要进行判断,防止错误输入导致程序崩溃。
3.将操作后的数据与原始的无关数据进行拼接写入配置文件
<4>完整代码:
#--------------------------Haporxy配置文件操作--------------------------------------
#py3.4 by:羽凡 2017-4-23
#----------------------------------------------读取文件处理数据(返回字典Info{})-------
def Deal_file():
s = ""
Info = {}
with open("配置文件.txt","r") as f:
for i in f:
if i.startswith("backend"):
backend = i.strip().split(" ")[1]
Info[backend] = []
elif i.strip().startswith("server"):
server = i.strip().split(" ")[1]
weight = i.strip().split(" ")[3]
maxconn = i.strip().split(" ")[5]
Server = {"server":server,"weight":weight,"maxconn":maxconn}
Info[backend].append(Server)
else:
continue
return Info
#----------------------------------------------信息保存-----------------------------
def Save_Info(Info):
s = ""
with open("配置文件.txt","r") as f:
for i in f:
if not i.startswith("backend"):
s = s + i
else:
break
s1 = ""
for backend in Info:
s2 = "backend " + backend
s1 = s1 + s2 + "\n"
for di in Info[backend]:
server = di["server"]
weight = di["weight"]
maxconn = di["maxconn"]
s3 = " server {} weight {} maxconn {}".format(server,weight,maxconn)
s1 = s1 + s3 + "\n"
S = s + s1
with open("配置文件.txt","w+") as F:
F.write(S)
return(S)
#----------------------------------------------展示信息,返回指令---------------------
def Show(Info):
show_list = []
print("--------------------""\033[1;31;0m""HaProxy配置文件管理""\033[0m""-------------------------------")
for i,n in enumerate(Info):
show_list.append(n)
print("\033[1;32;0m",i+1,n,"\033[0m")
print("------------------------------------------------------------------------")
order = input("请输入指令(A)新建、(D)删除、(M)修改、(C)查询、(Q)退出:")
while order not in ("A","D","M","C","Q"):
order = input("\033[1;31;0m""输入错误,请重新输入:""\033[0m")
show_list = list(show_list)
return order,show_list
#----------------------------------------------Backend编号输入判断-------------------
def Jude(choice,show_list):
try:
if eval(choice) not in range(len(show_list)+1):
return True
else:return False
except:
return True
#----------------------------------------------Server编号判断-----------------------
def JudeS(choiceS,a):
try:
if int(choiceS) in range(1,a+1) or int(choiceS) == 1:
return False
else:
return True
except:
return True
#----------------------------------------------新增信息判断--------------------------
def JudeA(backend,weight,maxconn):
try:
if backend.startswith("www") and int(weight) in range(50) and int(maxconn) in range(5000):
return False
except:
return True
#----------------------------------------------查询---------------------------------
def Check(show_list):
choice = input("请选择backend:")
while Jude(choice,show_list):
choice = input("\033[1;31;0m""输入错误,请重新输入:""\033[0m")
choice = int(choice)
print("------------------------------",show_list[choice-1],"------------------------------")
for a,b in enumerate(Info[show_list[choice-1]]):
print("{} server:{} weight:{} maxconn:{}".format(a+1,b["server"],b["weight"],b["maxconn"]))
print("----------------------------------------------------------------------------")
select = input("请输入指令(Q)退出、(B)返回:")
while select not in ("Q","B"):
select = input("\033[1;31;0m""请输入正确指令:""\033[0m")
if select == "Q":
pass
elif select == "B":
main()
#----------------------------------------------删除---------------------------------
def Delete(show_list):
choice = input("删除Backend(B) or Server(S)?:")
while(choice not in ("B","S")):
choice = input("\033[1;31;0m""请输入正确的指令:""\033[0m")
selection = input("请选择Backend编号:")
while Jude(selection,show_list):
selection = input("\033[1;31;0m""请输入正确的编号:""\033[0m")
selection = int(selection)
if choice =="B":
del Info[show_list[selection-1]]
Save_Info(Info)
print("\033[1;31;0m""删除成功!""\033[0m")
main()
elif choice == "S":
print("------------------------------",show_list[selection-1],"------------------------------")
for a,b in enumerate(Info[show_list[selection-1]]):
print("{} server:{} weight:{} maxconn:{}".format(a+1,b["server"],b["weight"],b["maxconn"]))
print("----------------------------------------------------------------------------")
choiceS = input("选择要删除的Server:")
while JudeS(choiceS,a):
choiceS = input("\033[1;31;0m""请输入正确的编号:""\033[0m")
choiceS = int(choiceS)
Info[show_list[selection-1]].pop(choiceS-1)
Save_Info(Info)
print("\033[1;31;0m""删除成功!""\033[0m")
main()
#----------------------------------------------增加---------------------------------
def Add():
print("————>请输入详细信息<————")
backend = input("Backend名称:")
server = input("Server名称:")
weight = input("权重(weight):")
maxconn = input("最大链接数(maxconn):")
while JudeA(backend,weight,maxconn):
print("\033[1;31;0m""输入信息错误,请重新输入!!!""\033[0m")
Add()
if backend not in Info:
Info[backend] = [{"server":server,"weight":weight,"maxconn":maxconn}]
print(">>>>>新建成功")
else:
flag = 1
for ser in Info[backend]:
if server == ser["server"]:
flag = 0
ser["weight"] = weight
ser["maxconn"] = maxconn
print(">>>>>backend及server信息已存在,""\033[1;31;0m""server信息已修改""\033[0m")
if flag:
Info[backend].append({"server":server,"weight":weight,"maxconn":maxconn})
print(">>>>>backend已存在,""\033[1;31;0m""server添加成功""\033[0m")
Save_Info(Info)
main()
#----------------------------------------------修改---------------------------------
def Modify(show_list):
selection = input("修改backend(B) or server(S)?>")
while (selection not in ("B","S")):
selection = input("\033[1;31;0m""请输入正确回答:""\033[0m")
choice = input("请输入要修改的backend编号:")
while Jude(choice,show_list):
choice = input("\033[1;31;0m""请输入正确编号:""\033[0m")
choice = int(choice)
if selection == "B":
backend = input("修改backend名称为:")
while not backend.startswith("www"):
backend = input("\033[1;31;0m""请输入合法的backend名称:""\033[0m")
temp = Info[show_list[choice-1]]
del Info[show_list[choice-1]]
Info[backend] = temp
Save_Info(Info)
print("\033[1;31;0m""修改backend成功""\033[0m")
main()
else:
print("------------------------------",show_list[choice-1],"------------------------------")
for a,b in enumerate(Info[show_list[choice-1]]):
print("{} server:{} weight:{} maxconn:{}".format(a+1,b["server"],b["weight"],b["maxconn"]))
print("----------------------------------------------------------------------------")
selection = input("修改哪个server?>")
while JudeS(selection,a):
selection = input("\033[1;31;0m""请输入正确的server编号:""\033[0m")
selection = int(selection)
sername = input("修改server为:")
Info[show_list[choice-1]][a-1]["server"] = sername
Save_Info(Info)
print("\033[1;31;0m""修改server成功""\033[0m")
main()
#----------------------------------------------指令处理------------------------------
def Deal_order(order,show_list):
if order =="Q": #退出
pass
elif order =="A" : #新建
Add()
elif order == "D": #删除
Delete(show_list)
elif order == "M": #修改
Modify(show_list)
elif order == "C":
Check(show_list)
else:
order = input("\033[1;31;0m""输入错误,请重新输入:""\033[0m")
Deal_order(order,show_list)
#----------------------------------------------主函数--------------------------------
def main():
order,show_list = Show(Info)
Deal_order(order,show_list)
if __name__=="__main__":
Info = Deal_file()
main()
<5>处理流程:
<6>主要函数功能介绍:
1.Deal_file():读取配置文件,并截取操作数据,通过String.startswith()找到截取位置获取数据,返回字典形式。
def Deal_file():
s = ""
Info = {}
with open("配置文件.txt","r") as f:
for i in f:
if i.startswith("backend"):
backend = i.strip().split(" ")[1]
Info[backend] = []
elif i.strip().startswith("server"):
server = i.strip().split(" ")[1]
weight = i.strip().split(" ")[3]
maxconn = i.strip().split(" ")[5]
Server = {"server":server,"weight":weight,"maxconn":maxconn}
Info[backend].append(Server)
else:
continue
return Info
2.Save_Info():将操作后的数据与原始无关数据拼接保存,接收字典作为参数。
def Save_Info(Info):
s = ""
with open("配置文件.txt","r") as f:
for i in f:
if not i.startswith("backend"):
s = s + i
else:
break
s1 = ""
for backend in Info:
s2 = "backend " + backend
s1 = s1 + s2 + "\n"
for di in Info[backend]:
server = di["server"]
weight = di["weight"]
maxconn = di["maxconn"]
s3 = " server {} weight {} maxconn {}".format(server,weight,maxconn)
s1 = s1 + s3 + "\n"
S = s + s1
with open("配置文件.txt","w+") as F:
F.write(S)
return(S)
3.Show():将要操作的数据打印出来提示输入操作指令,白名单判断输入指令,进行判断,返回输入指令和打印列表。
效果:
def Show(Info):
show_list = []
print("--------------------""\033[1;31;0m""HaProxy配置文件管理""\033[0m""-------------------------------")
for i,n in enumerate(Info):
show_list.append(n)
print("\033[1;32;0m",i+1,n,"\033[0m")
print("------------------------------------------------------------------------")
order = input("请输入指令(A)新建、(D)删除、(M)修改、(C)查询、(Q)退出:")
while order not in ("A","D","M","C","Q"):
order = input("\033[1;31;0m""输入错误,请重新输入:""\033[0m")
show_list = list(show_list)
return order,show_list
4.Jude()、JudeA()、JudeS()分别对输入的backend编号、server编号和新建的数据信息进行简单判断。
#----------------------------------------------Backend编号输入判断-------------------
def Jude(choice,show_list):
try:
if eval(choice) not in range(len(show_list)+1):
return True
else:return False
except:
return True
#----------------------------------------------Server编号判断-----------------------
def JudeS(choiceS,a):
try:
if int(choiceS) in range(1,a+1) or int(choiceS) == 1:
return False
else:
return True
except:
return True
#----------------------------------------------新增信息判断--------------------------
def JudeA(backend,weight,maxconn):
try:
if backend.startswith("www") and int(weight) in range(50) and int(maxconn) in range(5000):
return False
except:
return True
5.Deal_order():接受来自Show()的返回值,对输入的指令进行分流给不同的函数处理。
def Deal_order(order,show_list):
if order =="Q": #退出
pass
elif order =="A" : #新建
Add()
elif order == "D": #删除
Delete(show_list)
elif order == "M": #修改
Modify(show_list)
elif order == "C":
Check(show_list)
else:
order = input("\033[1;31;0m""输入错误,请重新输入:""\033[0m")
Deal_order(order,show_list)
6.Check():查询,主要查看backend下的server信息。
效果:
#----------------------------------------------查询---------------------------------
def Check(show_list):
choice = input("请选择backend:")
while Jude(choice,show_list):
choice = input("\033[1;31;0m""输入错误,请重新输入:""\033[0m")
choice = int(choice)
print("------------------------------",show_list[choice-1],"------------------------------")
for a,b in enumerate(Info[show_list[choice-1]]):
print("{} server:{} weight:{} maxconn:{}".format(a+1,b["server"],b["weight"],b["maxconn"]))
print("----------------------------------------------------------------------------")
select = input("请输入指令(Q)退出、(B)返回:")
while select not in ("Q","B"):
select = input("\033[1;31;0m""请输入正确指令:""\033[0m")
if select == "Q":
pass
elif select == "B":
main()
7.Add():新建,可以新建backend若已存在则在backend下新建server信息,若两种都存在则修改server信息。
#----------------------------------------------增加---------------------------------
def Add():
print("————>请输入详细信息<————")
backend = input("Backend名称:")
server = input("Server名称:")
weight = input("权重(weight):")
maxconn = input("最大链接数(maxconn):")
while JudeA(backend,weight,maxconn):
print("\033[1;31;0m""输入信息错误,请重新输入!!!""\033[0m")
Add()
if backend not in Info:
Info[backend] = [{"server":server,"weight":weight,"maxconn":maxconn}]
print(">>>>>新建成功")
else:
flag = 1
for ser in Info[backend]:
if server == ser["server"]:
flag = 0
ser["weight"] = weight
ser["maxconn"] = maxconn
print(">>>>>backend及server信息已存在,""\033[1;31;0m""server信息已修改""\033[0m")
if flag:
Info[backend].append({"server":server,"weight":weight,"maxconn":maxconn})
print(">>>>>backend已存在,""\033[1;31;0m""server添加成功""\033[0m")
Save_Info(Info)
main()
8.Delete():删除,可以删除backend或Server信息。
效果:
#----------------------------------------------删除---------------------------------
def Delete(show_list):
choice = input("删除Backend(B) or Server(S)?:")
while(choice not in ("B","S")):
choice = input("\033[1;31;0m""请输入正确的指令:""\033[0m")
selection = input("请选择Backend编号:")
while Jude(selection,show_list):
selection = input("\033[1;31;0m""请输入正确的编号:""\033[0m")
selection = int(selection)
if choice =="B":
del Info[show_list[selection-1]]
Save_Info(Info)
print("\033[1;31;0m""删除成功!""\033[0m")
main()
elif choice == "S":
print("------------------------------",show_list[selection-1],"------------------------------")
for a,b in enumerate(Info[show_list[selection-1]]):
print("{} server:{} weight:{} maxconn:{}".format(a+1,b["server"],b["weight"],b["maxconn"]))
print("----------------------------------------------------------------------------")
choiceS = input("选择要删除的Server:")
while JudeS(choiceS,a):
choiceS = input("\033[1;31;0m""请输入正确的编号:""\033[0m")
choiceS = int(choiceS)
Info[show_list[selection-1]].pop(choiceS-1)
Save_Info(Info)
print("\033[1;31;0m""删除成功!""\033[0m")
main()
9.Modify():修改,修改backend或是Server信息。
效果:
def Modify(show_list):
selection = input("修改backend(B) or server(S)?>")
while (selection not in ("B","S")):
selection = input("\033[1;31;0m""请输入正确回答:""\033[0m")
choice = input("请输入要修改的backend编号:")
while Jude(choice,show_list):
choice = input("\033[1;31;0m""请输入正确编号:""\033[0m")
choice = int(choice)
if selection == "B":
backend = input("修改backend名称为:")
while not backend.startswith("www"):
backend = input("\033[1;31;0m""请输入合法的backend名称:""\033[0m")
temp = Info[show_list[choice-1]]
del Info[show_list[choice-1]]
Info[backend] = temp
Save_Info(Info)
print("\033[1;31;0m""修改backend成功""\033[0m")
main()
else:
print("------------------------------",show_list[choice-1],"------------------------------")
for a,b in enumerate(Info[show_list[choice-1]]):
print("{} server:{} weight:{} maxconn:{}".format(a+1,b["server"],b["weight"],b["maxconn"]))
print("----------------------------------------------------------------------------")
selection = input("修改哪个server?>")
while JudeS(selection,a):
selection = input("\033[1;31;0m""请输入正确的server编号:""\033[0m")
selection = int(selection)
sername = input("修改server为:")
Info[show_list[choice-1]][a-1]["server"] = sername
Save_Info(Info)
print("\033[1;31;0m""修改server成功""\033[0m")
main()
Python蜕变-2017-4-23的更多相关文章
- 总结 Date 2017.09.23
总结 Date 2017.09.23 <1>统计数字 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计 ...
- Python实战 :2017国考职业表excel转数据库,再查询生成excel
最近看2017年国考的职业表,多而杂,不好过滤我想要的信息,特此把它转成Sqlite3数据库,再从数据库里把查询结果导出成excel,方便找职业. (后附上整套代码) 环境:python2.7 x ...
- python全栈开发 * 23 面向对象 知识点汇总 * 180704
23 面向对象 -----特殊方法 1. isinstance(obj,类名) 判断对象是否是此类实例化或者此类的子类实例化出来的class A:passclass B(A):passb1=B()pr ...
- python实战===2017年30个惊艳的Python开源项目 (转)
本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...
- Python 学习入门(23)—— 进程
本文介绍Python的os包中有查询和修改进程信息的函数,Python的这些工具符合Linux系统的相关概念,所以可以帮助理解Linux体系. 1. 进程信息 os包中相关函数如下: uname() ...
- 团队作业4——第一次项目冲刺(Alpha版本) 2017.4.23
本次会议为第二次Scrum Meeting会议~ 由于本次会议项目经理召开时间为10:30,在五社区会五号楼召开,召开时长约30分钟,对昨天的工作进行了总结并分配了今天的任务. 1.站立式会议照片(拍 ...
- python网络-计算机网络基础(23)
一.网络简介 网络是由节点和连线构成,表示诸多对象及其相互联系. 一个人玩: 两个人玩: 多个人玩: 说明 网络就是一种辅助双方或者多方能够连接在一起的工具 如果没有网络可想单机的世界是多么的孤单 使 ...
- 我的第一个python web开发框架(23)——代码版本控制管理与接口文档
书接上一回,小白和老菜聊到代码的版本控制和接口文档 小白:为什么要做版本控制,我不弄版本控制不也完成了项目了吗?要做版本控制不是很麻烦,又要安装服务又要提交代码,代码又不是多人用开发,还要写文档... ...
- python 笔记 2017
26.反斜杠用处,断言一些字符包含特殊字符的 if "<h3 class=\"entH 22222setH\">刷新成功</h3>" i ...
- 2017.10.23 Java 面向对象深入学习---final 关键字、static关键字、匿名对象等
今日内容介绍 1.final 关键字 2.static 关键字 3.匿名对象 4.内部类 5.包的声明与访问 6.访问修饰符 7.代码块 第一节课 01(面向对象)final关键字概念.avi 02: ...
随机推荐
- 走进BFC
在解释 BFC 是什么之前,需要先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位: Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由 ...
- Java下一个简单的数据库分库帮助类
简介 前面两篇文章主要讲了数据库读写分离和分表分库的一些问题,这篇文章主要讲一下我个人实现的一个分表分库项目. 在此之前,我有写过一个.Net的分库,最近在做Java的项目,就顺便做出一 ...
- 如何使用 ui-router-extras
为了使用ui-router创建tabs构架,使用ui-router-extras 使用方法: 0. 安装包 bower install ui-router-extras --save-dev 1. 引 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- 超好用的Redis管理及监控工具,使用后可大大提高你的工作效率!
Redis做为现在web应用开发的黄金搭担组合,大量的被应用,广泛用于存储session信息,权限信息,交易作业等热数据.做为一名有10年以上JAVA开发经验的程序员,工作中项目也是广泛使用了Redi ...
- PHP设计模式:简单工厂
示例代码详见https://github.com/52fhy/design_patterns 简单工厂 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例. 也就是使用的 ...
- PHP加密字符串函数(Discuz内置的)
接触Discuz有一段时间了,一直很喜欢这个论坛程序,确实是一个很不错的程序,灰常值得我们去学习,这里介绍它其中的一个加密函数(含解密)这个加密函数的特点在于,比普通的加密函数多了一个随机密钥 ,可以 ...
- shell中source与sh区别
shell中使用source conf.sh,是直接运行conf.sh的命令,不创建子shell,类似与html中include,而sh是则创建子shell, 子shell里面 的变量父shell无法 ...
- iOS 输入限制之 InputKit
前言 最近接手了两个 O2O 的老项目,其中的 Bug 也不言而喻,单看项目中的布局就有 n 种不同的方式,有用纯代码的,有用 Masonry 的,有用 VFL 的,也有用 Xib 的,更有用代码约束 ...
- 团队开发冲刺2-----2day
冲刺目标: 1.在第一阶段的基础上完成app内部界面设计. 2.逐步完成app内每一部分内容. 3.对app的实现进一步仔细钻研考虑. 4.对app每一部分内容模块化,分工在进一步明确. 5.设计好数 ...