#! /usr/bin/env python
# -*- coding:utf-8 -*-
import shutil
import json
def main():
quit_flag = False
while not quit_flag:
item_list()
choice = input("make your choice:").strip()
if choice == "1":
backend_info = input("input your fetch backend:").strip()
result = fetch(backend_info)
print(result)
elif choice == "2":
back_up()
backend_record_dict = input_json() # 要求输入json格式
for key in backend_record_dict:
backend = key
record = backend_record_dict[key]
delete(backend,record)
elif choice == "3":
back_up()
backend_record_dict = input_json() # 要求输入json格式
for key in backend_record_dict:
backend = key
record = backend_record_dict[key]
add(backend,record)
elif choice == "4":
back_up()
backend_record_dict = input_json() # 要求输入json格式
for key in backend_record_dict:
backend = key
record = backend_record_dict[key]
modify(backend,record)
elif choice == "q" or choice == "quit":
quit_flag = True
exit("quit")
else:
print("invalid type")
def item_list():
lis = ["1.查询", "2.删除", "3.添加", "4.修改"]
print(lis)
def back_up():
shutil.copyfile('haproxy', 'haproxy.bak')
def fetch(backend):
flag = False
fetch_list = []
with open("haproxy", "r", encoding="utf-8") as f:
for line in f:
if line.strip() == "backend %s" %(backend):
flag = True # 读取到backend开头的信息,标记为真
continue
if line.strip().startswith("backend"): # 下一个backend开头
flag = False
if flag and line.strip():
fetch_list.append(line.strip())
return fetch_list
def fetch1(backend):
# 打印bankend和server 防止后面的判断不准确
flag = False
fetch_list = []
with open("haproxy", "r", encoding="utf-8") as f:
for line in f:
if line.strip() == "backend %s" %(backend):
fetch_list.append(backend)
flag = True # 读取到backend开头的信息,标记为真
continue
if line.strip().startswith("backend"): # 下一个backend开头
flag = False
if flag and line.strip():
fetch_list.append(line.strip())
return fetch_list
def writer(backend, record_list):
# 保留backend,删除或增加server
with open("haproxy", "r", encoding="utf-8") as old, open("new.cfg", "w", encoding="utf-8") as new:
flag = False
for line in old:
if line.strip().startswith('backend') and line.strip() == "backend %s" % 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 writer1(backend, record_list):
# 删除backend,删除或增加server
with open("haproxy", "r", encoding="utf-8") as old, open("new.cfg", "w", encoding="utf-8") as new:
flag = False
for line in old:
if line.strip().startswith('backend') and line.strip() == "backend %s" % backend:
flag = True
#new.write(line)
for new_line in record_list:
new.write(" " * 4 + new_line + "\n")
new.flush()
continue # 跳到下一次循环,避免下一个backend写二次
if flag and line.strip().startswith("backend"): # 下一个backend
flag = False
new.write(line)
new.flush()
continue # 退出此循环,避免server信息二次写入
if line.strip() and not flag:
new.write(line)
new.flush()
def writer2(backend, record_list):
# 只删除backend
with open("haproxy", "r", encoding="utf-8") as old, open("new.cfg", "w", encoding="utf-8") as new:
flag = False
for line in old:
if line.strip().startswith('backend') and line.strip() == "backend %s" % 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)
new.flush()
continue # 退出此循环,避免server信息二次写入
if line.strip() and not flag:
new.write(line)
new.flush()
def add(backend, record):
global change_flag
record_list = fetch(backend) # 查找是否存在记录
if not record_list: # backend不存在, record不存在
with open('haproxy', 'r',encoding="utf-8") as old, open('new.cfg', 'w', encoding="utf-8") as new:
for line in old:
new.write(line)
# 添加新记录
new.write("\nbackend " + backend + "\n")
new.write(" " * 4 + 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
if change_flag is True: # 文件有修改,才进行文件更新
# 将操作结果生效
shutil.move("new.cfg", "haproxy")
def delete(backend, record):
global change_flag
record_list = fetch1(backend) # 查找是否存在记录
print(record_list)
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) # 移除元素
writer1(backend, record_list) # 写入 删除backend和server
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
writer2(backend,record)
print("\033[31;1mDelete done\033[0m")
change_flag = True
if change_flag is True: # 文件有修改,才进行文件更新
# 将操作结果生效
shutil.move("new.cfg", "haproxy")
return change_flag
def modify(backend, record):
global change_flag
record_list = fetch1(backend) # 查找是否存在记录
if not record_list: # backend不存在, record不存在
with open('haproxy', 'r',encoding="utf-8") as old, open('new.cfg', 'w', encoding="utf-8") as new:
for line in old:
new.write(line)
# 添加新记录
new.write("\nbackend " + backend + "\n")
new.write(" " * 4 + record + "\n")
change_flag = True
if change_flag is True: # 文件有修改,才进行文件更新
# 将操作结果生效
shutil.move("new.cfg", "haproxy")
else: # backend存在或者record存在
delete(backend, record)
add(backend, record)
return change_flag
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
if __name__ == '__main__':
main()转载于:https://blog.51cto.com/lifei88/1880188
本文介绍了一个用于管理HAProxy配置的Python脚本,支持查询、添加、删除及修改后端服务器记录。脚本通过简单的命令行交互实现,能够备份当前配置并安全地应用更改。
90

被折叠的 条评论
为什么被折叠?



