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: ...
随机推荐
- Spring学习(10)--- @Qualifier注解
按类型自动装配可能多个bean实例的情况,可以使用Spring的@Qualifier注解缩小范围(或指定唯一),也可以指定单独的构造器参数或方法参数 可用于注解集合类型变量 例子: package c ...
- 【转载】SQL Server行转列,列转行
行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清 ...
- KVM之Live Migration
1.安装KVM必要的软件包 #sudo apt-get install qemu-kvm bridge-utilus 2.制作虚拟机映像ubuntu-12.04.qcow2 $qemu-img cre ...
- C#中switch的使用
今天在网上看到有人给出这么一个程序需求,博主就拿来回忆回忆C#中switch的用法 程序需求如下: 根据星期几(一 ~日) ,输出特价菜“一”.“二”.“三”,输出“干煸扁豆6元.”“四”.“五”,输 ...
- CSS中的尺寸单位
绝对单位 px: Pixel 像素 pt: Points 磅 pc: Picas 派卡 in: Inches 英寸 mm: Millimeter 毫米 cm: Centimeter 厘米 q: Qua ...
- Zabbix 3.2.6安装过程
以3.2.6版本的Zabbix为例展开说明 1.准备Lnmp环境. 本次准备的环境: Linux:2.6.32-642.el6.x86_64 Nginx:1.12.0 Mariadb:10.2.6 P ...
- Swift基础语法
简介 特点 (1)优于OC,快速,安全 (2)取消了预编译指令包括宏定义(OC用的太多了) (3)取消了OC指针和不安全访问的使用(看不到星星了) (4)舍弃 Objective-C 早期应用 Sma ...
- Python基础-类
Python基础-类 @(Python)[python, python基础] 写在前面 如非特别说明,下文均基于Python3 摘要 本文重点讲述如何创建和使用Python类,绑定方法与非绑定方法的区 ...
- Centos使用vsfotd配置fpt服务
---恢复内容开始--- vsftp简介 vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面. ...
- 【CC2530入门教程-06】CC2530的ADC工作原理与应用
第6课 CC2530的ADC工作原理与应用 广东职业技术学院 欧浩源 一.A/D转换的基本工作原理 将时间上连续变化的模拟量转化为脉冲有无的数字量,这一过程就叫做数字化,实现数字化的关键设备是AD ...