在构建一个程序项目之前,首先需要设计程序的框架,从总体上构建一个项目中的一个个功能,之后对每一个功能进行补充,最终实现总体的功能。
1 程序的总体框架:
首先把所有的功能设计成相应的函数,用pass来实现。
def add(operation):
"增加"
pass
def remove(operation):
"删除"
pass
def change(operation):
"更改"
pass
if __name__ == '__main__':
msg ="""
1.查找
2.增加
3.删除
4.更改
5.退出
"""
# 通过定义字典,在输入序号时,能够对应相应的函数
msg_dict={
"1":serach,
"2":add,
"3":remove,
"4":change,
"5":exit
}
while True:
print(msg)
usr_choice = input("请输入要进行的操作>>:").strip()
if len(usr_choice) == 0 or usr_choice not in msg_dict : continue # 用户输入为空,或者超出字典的内容,继续输入
if usr_choice == '5':
break
operation = input("请输入要操作的内容>>:").strip()
msg_dict[usr_choice](operation) # 通过字典调用函数,并传入参数operation
1.1 查询函数实现
查找是首先匹配到相应的行,判断开始和结束的位置,这里是通过标志位进行控制的。
def serach(operation):
"查找"
# pass
# serach_line = "backend %s" % operation # 查找的内容之情有backend,把输入的内容和backend进行拼接
# 还可以通过if line.strip().startwith("backend") and operation in line
search_list =[] # 将查找到的内容存放到此列表中
search_flag = False # 读取到匹配行时打开此flag
with open("haproxy.conf",encoding="utf-8") as f_read: # 打开文件,默认读操作
for line in f_read: # 逐行读取文件
# if line.strip() == serach_line: # 将匹配到每一行去掉换行,
if line.strip().startswith("backend") and operation in line: # 匹配到相应的行
search_flag = True # 匹配到后标志位为True
continue # 跳过匹配的行,操作的是下一行的内容
if line.strip().startswith("backend") and search_flag: # 判断结束行,需要放在search_flag之前
break
# search_flag = False
if search_flag:
search_list.append(line.strip()) # 将匹配的内容存储到列表中,同时删除换行符
for i in search_list:
print(i)
return search_list # 返回值是获取到的内容的列表
1.2 文件内容的增加操作
对文件的增加操作涉及了输入一个字典内容,但是实际在输入的过程中,输入的是字符串,这里用到eval()函数,能够将输入的字典形式的内容转换成字典的格式。
对文件进行修改,必然会创建一个新的文件。在这里采用的是把原来的文件中内容一行行读取并写入到新的文件中,最后把新文件的名字改成原来文件的名字。
def add(operation):
"增加,增加内容存在的情况(可以通过search()函数进行查询),增加内容不存在的情况"
# pass
backend_url = operation["backend"] # 获取输入的字典中的backend的value
record_list = serach(backend_url) #将获取到的url传递给search函数,search函数的返回值是search_list[],并赋值
backend_data = "backend %s" %backend_url # 将获取的URL同backend进行字符串的拼接
# 组成 backend www.oldboyX.org
# 用户输入的内容格式:
# {"backend":"www.oldboy.org","record":{"server":"1.1.1.1","weight":"3000","maxconn":"33333"}}
# 获取输入的字典的内容并进行字符串的拼接
dict_string = "sever %s weight %s maxconn %s" %(operation["record"]["server"],\
operation["record"]["weight"],\
operation["record"]["maxconn"],
)
if not record_list: # 这是record_list中不存在查询的内容的情况,需要进行写入
record_list.append(backend_data) # 首先对record_list进行添加 backend www.oldboyX.org
record_list.append(dict_string) # 添加具体的server weight maxconn 信息
with open("haproxy.conf",encoding="utf-8") as file_read,\
open("haproxy_new.conf","w+",encoding="utf-8") as file_write:
# 读取源文件的内容写入到新的文件中,并写入添加的内容
for line_read in file_read: # 遍历源文件的每一行内容
file_write.write(line_read) # 逐行写入新的文件
for new_line in record_list:
if new_line.startswith("backend"): # 判断新的内容是backend时,写入并换行
file_write.write(new_line+"\n")
else:
file_write.write("%s%s\n" %(" "*8,new_line))
import os
os.rename("haproxy.conf","haproxy_bak.conf") # 将源文件备份
os.rename("haproxy_new.conf","haproxy.conf") # 将新文件重命名
1.3 文件内容的删除操作
文件删除是在文件内容查询的基础进行修改的
def remove(operation):
"删除"
# pass
backend_url = operation["backend"] # 获取输入的字典中的backend的value
record_list = serach(backend_url) # 将获取到的url传递给search函数,search函数的返回值是search_list[],并赋值
backend_data = "backend %s" % backend_url # 将获取的URL同backend进行字符串的拼接
# 组成 backend www.oldboyX.org
# 用户输入的内容格式:
# 删除以下的内容
# {"backend":"www.oldboy20.org","record":{"server":'10.10.0.10.10.10.0.10',"weight":9999,"maxconn":333}}
# 获取输入的字典的内容并进行字符串的拼接
dict_string = "sever %s weight %s maxconn %s" % (operation["record"]["server"], \
operation["record"]["weight"], \
operation["record"]["maxconn"],
)
if not record_list : # 没有backend的情况 和 有backend 但是下面的内容不存在的情况
print("没有需要删除的内容")
return
else:
record_list.insert(0,backend_data) # 把拼接的backend信息插入到list中
with open("haproxy.conf",encoding="utf-8") as file_read,\
open("haproxy_new.conf","w+",encoding="utf-8") as file_write:
# 读取源文件的内容写入到新的文件中,并写入添加的内容
tag = False
flag_write = False
for r_line in file_read:
if r_line == backend_data:
tag = True
continue
if tag and r_line.startswith("backend"):
tag = False
if not tag:
file_write.write(r_line)
else:
if not flag_write:
for new_line in record_list:
if new_line.startswith("backend"):
file_write.write(new_line+"\n")
else:
file_write.write("%s%s\n" % (" " * 8, new_line))
os.rename("haproxy.conf", "haproxy_bak.conf") # 将源文件备份
os.rename("haproxy_new.conf", "haproxy.conf") # 将新文件重命名