我的第一篇博客,这是试水练习。这次上的菜是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的更多相关文章

  1. 总结 Date 2017.09.23

    总结 Date 2017.09.23 <1>统计数字 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计 ...

  2. Python实战 :2017国考职业表excel转数据库,再查询生成excel

    最近看2017年国考的职业表,多而杂,不好过滤我想要的信息,特此把它转成Sqlite3数据库,再从数据库里把查询结果导出成excel,方便找职业. (后附上整套代码) 环境:python2.7   x ...

  3. python全栈开发 * 23 面向对象 知识点汇总 * 180704

    23 面向对象 -----特殊方法 1. isinstance(obj,类名) 判断对象是否是此类实例化或者此类的子类实例化出来的class A:passclass B(A):passb1=B()pr ...

  4. python实战===2017年30个惊艳的Python开源项目 (转)

    本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...

  5. Python 学习入门(23)—— 进程

    本文介绍Python的os包中有查询和修改进程信息的函数,Python的这些工具符合Linux系统的相关概念,所以可以帮助理解Linux体系. 1. 进程信息 os包中相关函数如下: uname()  ...

  6. 团队作业4——第一次项目冲刺(Alpha版本) 2017.4.23

    本次会议为第二次Scrum Meeting会议~ 由于本次会议项目经理召开时间为10:30,在五社区会五号楼召开,召开时长约30分钟,对昨天的工作进行了总结并分配了今天的任务. 1.站立式会议照片(拍 ...

  7. python网络-计算机网络基础(23)

    一.网络简介 网络是由节点和连线构成,表示诸多对象及其相互联系. 一个人玩: 两个人玩: 多个人玩: 说明 网络就是一种辅助双方或者多方能够连接在一起的工具 如果没有网络可想单机的世界是多么的孤单 使 ...

  8. 我的第一个python web开发框架(23)——代码版本控制管理与接口文档

    书接上一回,小白和老菜聊到代码的版本控制和接口文档 小白:为什么要做版本控制,我不弄版本控制不也完成了项目了吗?要做版本控制不是很麻烦,又要安装服务又要提交代码,代码又不是多人用开发,还要写文档... ...

  9. python 笔记 2017

    26.反斜杠用处,断言一些字符包含特殊字符的 if "<h3 class=\"entH 22222setH\">刷新成功</h3>" i ...

  10. 2017.10.23 Java 面向对象深入学习---final 关键字、static关键字、匿名对象等

    今日内容介绍 1.final 关键字 2.static 关键字 3.匿名对象 4.内部类 5.包的声明与访问 6.访问修饰符 7.代码块 第一节课 01(面向对象)final关键字概念.avi 02: ...

随机推荐

  1. 软件测试基础(软件测试分类和工具组)firebug、firepath的安装

    白盒测试:需要了解内部结构和代码 黑盒测试:不关心内部结构和代码 灰盒测试:介于白盒黑盒之间 静态测试:测试时不执行被测试软件 动态测试:测试时执行被测试软件 单元测试:测试软件的单元模块 集成测试: ...

  2. MyBatis源码分析之环境准备篇

    前言 之前一段时间写了[Spring源码分析]系列的文章,感觉对Spring的原理及使用各方面都掌握了不少,趁热打铁,开始下一个系列的文章[MyBatis源码分析],在[MyBatis源码分析]文章的 ...

  3. selenium+python浏览器窗口的切换

    1.首先需要知道当前浏览器中有多少个活动的窗口 >>> br.window_handles[u'{075a54ee-3d10-4c76-b56d-b645259bbd54}', u' ...

  4. 在WIN SERVER 2016上安装DOCKER(带过坑)

    目录 1    概要    1 1.1    主要优势    1 2    在Windows Server上部署Docker    2 概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解 ...

  5. 零基础开始学python

    变量规则:在python中变量名不能有特殊字符和数字开头以及python里的一些关键字,可以使用下划线开头,在python里,变量是支持使用中文的,但尽量不要使用中文,为什么?因为这样会让你看起来太l ...

  6. Codewars练习笔记·1 - 6.23

    Codewars地址:https://www.codewars.com/ 笔记资料来源:JavaScript高级程序设计. 欢迎和大家一起来讨论~   基础练习(1):   我的解答为: class ...

  7. IP地址分类百科

    IP地址分类介绍 这里讨论IPv4,IP地址分成了A类.B类.C类.C类.E类,如下图所示: 解释: A类以0开头,网络地址有7位,主机地址有24位,举例:A类地址:0 10000000 000000 ...

  8. Pycharm创建的virtualenv环境缺失pip.exe的问题(Windows系统)

    Windows环境: 1. Python安装在d:\Python\Python35下, Python新版本安装时默认会勾选pip功能 2. PyCharm的Settings中Create Virtua ...

  9. 矩阵的f范数及其求偏导法则

    转载自: http://blog.csdn.net/txwh0820/article/details/46392293 矩阵的迹求导法则   1. 复杂矩阵问题求导方法:可以从小到大,从scalar到 ...

  10. [翻译]成为顶尖程序员应当学什么?Python、C还是Ruby?

    原文地址(墙外):https://medium.com/life-tips/should-you-learn-python-c-or-ruby-to-be-a-top-coder-infographi ...