Python3学习之路~2.10 修改haproxy配置文件
需求:
- 、查
- 输入:www.oldboy.org
- 获取当前backend下的所有记录
- 、新建
- 输入:
- arg = {
- 'bakend': 'www.oldboy.org',
- 'record':{
- 'server': '100.1.7.9',
- 'weight': ,
- 'maxconn':
- }
- }
- 、删除
- 输入:
- arg = {
- 'bakend': 'www.oldboy.org',
- 'record':{
- 'server': '100.1.7.9',
- 'weight': ,
- 'maxconn':
- }
- }
原配置文件:
- global
- log 127.0.0.1 local2
- daemon
- maxconn
- 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 :
- stats enable
- stats uri /admin
- stats auth admin:
- frontend oldboy.org
- bind 0.0.0.0:
- 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 100.1.7.9 weight maxconn
代码如下:
- #Author:Zheng Na
- # 参考:https://www.cnblogs.com/1dreams/p/6880205.html
- # 代码缺陷:
- # 对每次输入都没有做校验,一旦格式错误就报错
- # 某些功能未实现
- # 将文件先变成一个列表,如果文件很大就没办法了
- import json
- f = open('haproxy.txt','r',encoding="UTF-8")
- f_new = open('haproxy_new.txt','w',encoding="UTF-8")
- #将文件内容转换为一个列表,并定义一个变量。
- f_list =f.readlines()
- #print(f_list)
- process_list = ["获取ha记录","增加ha记录","删除ha记录"]
- print("可选操作如下:".center(20,'*'))
- for index,item in enumerate(process_list):
- print(index+1,item)
- num = int(input("请输入操作序号:"))
- if num == 1:
- read = input("请输入backend:") # 如输入:www.oldboy.org
- # 利用字符串拼接,定义一个变量,-----backend所在的行。
- backend_title = "backend %s\n" % read
- if backend_title in f_list:
- index_bt = f_list.index(backend_title)
- print(f_list[index_bt],f_list[index_bt+1]) #没有判断backend下面有多少行,万一有很多行呢?
- else:
- print("您查找的内容不存在!")
- if num ==2:
- read = input("请输入要新加的记录:") # 如: {"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
- # 将read字符串转换成 字典类型 方法1
- read_dict = json.loads(read)
- # 将read字符串转换成 字典类型 方法2 有点儿low
- # read_dict = eval(read)
- # 通过列表计数器来判断输入的内容是否在列表中存在,如果计数器为0则不存在,如果计数器不为0则存在。
- # 不存在则添加,存在则不添加。
- backend_title = "backend %s\n" % read_dict["backend"]
- f_find = f_list.count(backend_title)
- if f_find == 0:
- for line in f_list:
- f_new.write(line)
- f_new.write("\n\n")
- f_new.write(backend_title)
- f_new.write(" server %s %s weight %s maxconn %s"\
- %(read_dict["record"]["server"],read_dict["record"]["server"],\
- read_dict["record"]["weight"],read_dict["record"]["maxconn"]))
- else:
- # # 如果已经存在,
- # # 则在此节点下添加根据用输入构造出的记录,例如:
- # server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
- # # (可选)可以再对节点下记录进行判断是否已经存在
- # 未实现此功能
- print("您要添加的记录已存在!")
- if num == 3:
- read = input("请输入要删除的记录:") # 如: {"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
- # 将read字符串转换成 字典类型 方法1
- read_dict = json.loads(read)
- # 将read字符串转换成 字典类型 方法2 有点儿low
- # read_dict = eval(read)
- # 通过列表计数器来判断输入的内容是否在列表中存在,如果计数器为0则不存在,如果计数器不为0则存在。
- backend_title = "backend %s\n" % read_dict["backend"]
- f_find = f_list.count(backend_title)
- # 存在则删除
- # #去配置文件中找到指定的节点,并在删除指定记录,如:
- # backend test.oldboy.org
- # server 100.1.7.10 100.1.7.10 weight 20 maxconn 3000
- # server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000 # 删除掉
- #
- # # (可选)如果backend下所有的记录都已经被删除,那么将当前 backend test.oldboy.org 也删除掉。
- # 未实现此功能
- if f_find != 0:
- index_bt = f_list.index(backend_title)
- f_list.pop(index_bt)
- f_list.pop(index_bt) #删掉index_bt位置元素后,index_bt+1位置元素自动向前占据index_bt位置
- for line in f_list:
- f_new.write(line)
- else:
- print("您要删除的记录不存在!")
- f.close()
- f_new.close()
菜鸟版
- # Author:Zheng Na
- # 参考:https://www.cnblogs.com/Ian-learning/p/7895004.html
- import json
- def recd_read():
- # 用来读取数据
- read = input("请输入backend:") # 如输入:www.oldboy.org
- with open('haproxy.txt', 'r', encoding='UTF-8') as f: # 用只读的形式打开
- for line in f:
- if 'backend' in line:
- backend_title = "backend %s\n" % read
- if line == backend_title:
- return print(f.readline())
- return print("您查找的内容不存在!")
- def recd_add():
- # 用来增加数据,暂时没有加入判断输入数据类型的内容
- read = input(
- "请输入要新加的记录:") # 如: {"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
- # 将read字符串转换成 字典类型 方法1
- read_dict = json.loads(read)
- # 将read字符串转换成 字典类型 方法2 有点儿low
- # read_dict = eval(read)
- with open('haproxy.txt', 'r+', encoding='UTF-8') as f: # 用可以读写的形式打开
- for line in f:
- if 'backend' in line:
- backend_title = "backend {website}\n".format(website=read_dict['backend'])
- if line == backend_title:
- return print("您要添加的记录已存在!")
- f.write("\n\n")
- f.write(backend_title)
- f.write("\t\tserver {} {} weight {} maxconn {}\n" \
- .format(read_dict["record"]["server"], read_dict["record"]["server"], \
- read_dict["record"]["weight"], read_dict["record"]["maxconn"]))
- return print('添加记录成功!')
- def recd_delete():
- # 用来删除数据
- read = input(
- "请输入要删除的记录:") # 如: {"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
- # 将read字符串转换成 字典类型
- read_dict = json.loads(read)
- flag = 0
- with open('haproxy.txt', 'r', encoding='UTF-8') as f, \
- open('haproxy_tmp.txt', 'w', encoding='UTF-8') as f_tmp:
- backend_title = "backend {}\n".format(read_dict['backend'])
- for line in f:
- backend_title = "backend {}\n".format(read_dict['backend'])
- if line == backend_title:
- flag = 1
- f.readline()
- continue
- f_tmp.write(line)
- if flag == 0:
- return print("您要删除的记录不存在!")
- else:
- with open('haproxy.txt', 'w', encoding='UTF-8') as f, \
- open('haproxy_tmp.txt', 'r', encoding='UTF-8') as f_tmp:
- for line in f_tmp:
- f.write(line)
- return print('记录已被删除!')
- choice_recd = ['add', 'delete', 'read', 'quit'] # 用来判断输入的内容对不对
- while True:
- choice = input("Please choose 'add', 'delete', 'read','quit'>>>")
- if choice in choice_recd: # 判断输入的内容对不对
- if choice == 'add':
- recd_add()
- elif choice == 'read':
- recd_read()
- elif choice == 'delete':
- recd_delete()
- elif choice == 'quit':
- exit("您已退出程序")
进阶版
- # Author:Zheng Na
- # 参考:https://www.cnblogs.com/Ian-learning/p/7895004.html
- import shutil
- import json
- def list_function():
- print("Please choice the ID of a action.".center(50, "#"))
- print("【1】.Fetch haproxy.cfg backend infomation.")
- print("【2】.Add haproxy.cfg backend infomation.")
- print("【3】.Delete haproxy.cfg backend infomation.")
- print("End".center(50, "#"))
- def fetch(backend):
- # 取出backend相关server信息
- result = [] # 定义结果列表
- with open("haproxy.cfg", "r", encoding="utf-8") as f: # 循环读取文件
- flag = False # 标记为假
- for line in f:
- # 以backend开头
- if line.strip().startswith("backend") and line.strip() == "backend " + backend:
- flag = True # 读取到backend开头的信息,标记为真
- continue
- # 下一个backend开头
- if flag and line.strip().startswith("backend"):
- flag = False
- break
- # server信息添加到result列表
- if flag and line.strip():
- result.append(line.strip())
- return result
- def writer(backend, record_list):
- with open("haproxy.cfg", "r") as old, open("new.cfg", "w") as new:
- flag = False
- for line in old:
- if line.strip().startswith('backend') and line.strip() == "backend " + backend:
- flag = True
- new.write(line)
- for new_line in record_list:
- new.write(" " * 4 + new_line + "\n")
- continue # 跳到下一次循环,避免下一个backend写二次
- if flag and line.strip().startswith("backend"): # 下一个backend
- flag = False
- new.write(line)
- continue # 退出此循环,避免server信息二次写入
- if line.strip() and not flag:
- new.write(line)
- def add(backend, record):
- global change_flag
- record_list = fetch(backend) # 查找是否存在记录
- if not record_list: # backend不存在, record不存在
- with open('haproxy.cfg', 'r') as old, open('new.cfg', 'w') as new:
- for line in old:
- new.write(line)
- # 添加新记录
- new.write("\nbackend " + backend + "\n")
- new.write(" " * 8 + record + "\n")
- print("\033[32;1mAdd done\033[0m")
- change_flag = True
- else: # backend存在,record存在
- if record in record_list:
- print("\033[31;1mRecord already in it,Nothing to do!\033[0m")
- change_flag = False
- else: # backend存在,record不存在
- record_list.append(record)
- writer(backend, record_list)
- print("\033[32;1mAdd done\033[0m")
- change_flag = True
- def delete(backend, record):
- global change_flag
- record_list = fetch(backend) # 查找是否存在记录
- if not record_list: # backend不存在, record不存在
- print("Not match the backend,no need delete!".center(50, "#"))
- change_flag = False
- else: # backend存在,record存在
- if record in record_list:
- record_list.remove(record) # 移除元素
- writer(backend, record_list) # 写入
- print("\033[31;1mDelete done\033[0m")
- change_flag = True
- else: # backend存在,record不存在
- print("Only match backend,no need delete!".center(50, "#"))
- change_flag = False
- return change_flag
- def output(servers):
- # 输出指定backend的server信息
- print("Match the server info:".center(50, "#"))
- for server in servers:
- print("\033[32;1m%s\033[0m" % server)
- print("#".center(50, "#"))
- def input_json():
- # 判断输入,要求为json格式
- continue_flag = False
- while continue_flag is not True:
- backend_record = input("Input backend info(json):").strip()
- try:
- backend_record_dict = json.loads(backend_record)
- except Exception as e:
- print("\033[31;1mInput not a json data type!\033[0m")
- continue
- continue_flag = True
- return backend_record_dict
- def operate(action):
- global change_flag
- if action == "fetch":
- backend_info = input("Input backend info:").strip()
- result = fetch(backend_info) # 取出backend信息
- if result:
- output(result) # 输出获取到的server信息
- else:
- print("\033[31;1mNot a match is found!\033[0m")
- elif action is None:
- print("\033[31;1mNothing to do!\033[0m")
- else:
- backend_record_dict = input_json() # 要求输入json格式
- for key in backend_record_dict:
- backend = key
- record = backend_record_dict[key]
- if action == "add":
- add(backend, record)
- elif action == "delete":
- delete(backend, record)
- if change_flag is True: # 文件有修改,才进行文件更新
- # 将操作结果生效
- shutil.copy("haproxy.cfg", "old.cfg")
- shutil.copy("new.cfg", "haproxy.cfg")
- result = fetch(backend)
- output(result) # 输出获取到的server信息
- def judge_input():
- # 判断输入功能编号,执行相应步骤
- input_info = input("Your input number:").strip()
- if input_info == "": # 查询指定backend记录
- action = "fetch"
- elif input_info == "": # 添加backend记录
- action = "add"
- elif input_info == "": # 删除backend记录
- action = "delete"
- elif input_info == "q" or input_info == "quit":
- exit("Bye,thanks!".center(50, "#"))
- else:
- print("\033[31;1mInput error!\033[0m")
- action = None
- return action
- def main():
- exit_flag = False
- while exit_flag is not True:
- global change_flag
- change_flag = False
- list_function()
- action = judge_input()
- operate(action)
- if __name__ == '__main__':
- main()
大神版
Python3学习之路~2.10 修改haproxy配置文件的更多相关文章
- Python3.5 day3作业二:修改haproxy配置文件。
需求: 1.使python具体增删查的功能. haproxy的配置文件. global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 lo ...
- Python3学习之路~5.10 PyYAML模块
Python也可以很容易的处理ymal文档格式,只不过需要安装一个模块,参考文档:http://pyyaml.org/wiki/PyYAMLDocumentation
- (转)Python3.5 day3作业二:修改haproxy配置文件
原文:http://www.cnblogs.com/iwxk/p/6010018.html
- Python3学习之路~0 目录
目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...
- USB小白学习之路(10) CY7C68013A Slave FIFO模式下的标志位(转)
转自良子:http://www.eefocus.com/liangziusb/blog/12-11/288618_bdaf9.html CY7C68013含有4个大端点,可以用来处理数据量较大的传输, ...
- s12-day03-work01 python修改haproxy配置文件(初级版本)
#!/usr/local/env python3 ''' Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song ...
- Python3学习之路~10.2 协程、Greenlet、Gevent
一 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切 ...
- Python3学习之路~10.1 多进程、进程间通信、进程池
一 多进程multiprocessing multiprocessing is a package that supports spawning processes using an API simi ...
- Python3学习之路~10.3 论事件驱动与异步IO
论事件驱动----详见:https://www.cnblogs.com/alex3714/articles/5248247.html Select\Poll\Epoll异步IO----详见:http: ...
随机推荐
- [Optimization] Greedy method
Given two sequences of letters A and B, find if B is a subsequence of A in thesense that one can del ...
- HTTPS与证书
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息.它使用安全套接字层( ...
- Ext.form.field.Picker (ComboBox、Date、TreePicker、colorpick.Field)竖向滚动导致布局错误
ComboBox.Date.TreePicker.colorpick.Field这些继承了Ext.form.field.Picker的控件. 在6.0.0和6.0.1中,在界面中存在竖向滚动条时,点击 ...
- IntelliJ IDEA连接TFS local workspace无法正常签入
前几天为了便于在本地修改,将TFS workspace的类型从Server修改为Local.基于Visual Studio的开发正常没有问题,用IntelliJ IDEA时却提示以下错误: Error ...
- C++内存管理(转)
C++内存管理 [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理 ...
- 什么是IOC为什么要使用IOC
概念: 作用: 结论:借助于“第三方”实现具有依赖关系的对象之间的解耦 在使用IOC之前的情况 如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运 使用IOC之后 对象A获得依赖对象B的过程,由 ...
- 【CF587D】Duff in Mafia 二分+前缀优化建图+2-SAT
[CF587D]Duff in Mafia 题意:给你一张n个点m条边的无向图,边有颜色和边权.你要从中删去一些边,满足: 1.任意两条删掉的边没有公共的顶点.2.任意两条剩余的.颜色相同的边没有公共 ...
- 同一个tomcat使用不同http端口配置多个web项目
1.复制 conf/server.xml下的 复制粘贴新的一个Service元素下的所有内容,并修改name为Catalina2,<Service name="Catalina&quo ...
- (ecj)Eclipse的Java编译器分析之一——ecj介绍
Java是一个开放的平台,对于除发布编译器/解释器/基础类库之外,该语言的负责机构更多的是制定一系列标准,任何符合标准的厂商产品均可用于市场投放.甚至包括其编译器及解释器. (比如Hibernate提 ...
- js arrayBuffer 字节序问题,小端法,大端法
原文博客 { var buffer = new ArrayBuffer(2) var bytes = new Uint16Array(buffer) bytes[0] = (65 << 8 ...