haproxy文件的增删改查
在构建一个程序项目之前,首先需要设计程序的框架,从总体上构建一个项目中的一个个功能,之后对每一个功能进行补充,最终实现总体的功能。
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") # 将新文件重命名
1.4 文件内容的修改
haproxy文件的增删改查的更多相关文章
- 对haproxy文件进行增删改查
1.文件内容 global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defaults log global ...
- 【练习】Python第四次:实现对文件的增删改查
一,实现对文件的增删改查 (一),三级菜单的处理结构及退出技巧:使用TAG标记 tag=True while tag: print('leve1') choice=input("level1 ...
- Python文件操作-文件的增删改查
需求:对文件进行增删改查 由于时间原因,本次代码没有增加任何注释,如有疑问,请联系编辑者:闫龙 其实我也是醉了,看着这些个代码,我脑袋也特么大了,没办法,大神说了,不让用新知识,只可以使用学过的,所以 ...
- MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存
二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...
- java对xml文件做增删改查------摘录
java对xml文件做增删改查 package com.wss; import java.io.File;import java.util.ArrayList;import java.util.Lis ...
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...
- 基于SpringMVC的文件(增删改查)上传、下载、更新、删除
一.项目背景 摘要:最近一直在忙着项目的事,3个项目过去了,发现有一个共同的业务,那就是附件的处理,附件包括各种文档,当然还有图片等特殊文件,由于时间的关系,每次都是匆匆忙忙的搞定上线,称这项目的空档 ...
- 使用dom4j对xml文件进行增删改查
1.使用dom4j技术对dom_demo.xml进行增删改查 首选要下载dom4j的jar包 在官网上找不到,网上搜索了一下在这个链接:http://sourceforge.net/projects/ ...
- Python 模拟SQL对文件进行增删改查
#!/usr/bin/env python # _*_ coding:UTF-8 _*_ # __auth__: Dalhhin # Python 3.5.2,Pycharm 2016.3.2 # 2 ...
随机推荐
- 网络编程-TCP连接-readLine
Server: package com.net.tcp; import java.io.BufferedReader; import java.io.IOException; import java. ...
- lightoj1145 【DP优化求方案】
题意: 有一个k面的骰子,然后问你n个骰子朝上的面数字之和=s的方案: 思路: dp[i][j] 代表 前 i 个骰子组成 j 有多少种方案: 显然 dp[i][j] = dp[i - 1][j - ...
- 【BZOJ1174】: [Balkan2007]Toponyms
→原题← ↑这样子我就不复制题面啦~ 就是一题很裸的字典树而已,不过空间卡的很死,直接开个数组 tr[N][52] 什么之类的一定会RE的(惨痛的教训) 当字典树空间不够而时间限制又比较宽松时,我们可 ...
- OFFICE 365 A1 Plus账号注册
OFFICE365 A1 Plus账号注册 Office2019与Office365专业增强版之间的区别: Office2019是一次性购买,不会在购买后接收功能更新,但会根据需要接收质量和安全修补程 ...
- kafka剖析(转)
Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.Spa ...
- js+canvas(H5)实现小球移动小demo
*canvas提供画布,大小自定义,js得到画布,从画布对象通过getContext('2d')来得到画笔,然后就可以开始画了 代码: <!DOCTYPE html> <html l ...
- 微信小程序使用字体图标
项目中常常需要使用到字体图标,微信小程序中使用字体图标与在平常的web前端中类似但是又有区别.下面以使用阿里图标为例子讲解如何在微信小程序中使用字体图标. 第一步:下载需要的字体图标 进入阿里图标官网 ...
- JMeter博客系列:JMeter BeanShell示例
1.简介 Apache JMeter是一个基于Java的开源工具,使您可以在应用程序上执行功能,负载,性能和回归测试.应用程序可以在Web服务器上运行,也可以是独立的.它支持在包含静态和动态资源的客户 ...
- AtCoder Beginner Contest 054 ABCD题
A - One Card Poker Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Ali ...
- (洛谷 P1429 平面最近点对(加强版) || 洛谷 P1257 || Quoit Design HDU - 1007 ) && Raid POJ - 3714
这个讲的好: https://phoenixzhao.github.io/%E6%B1%82%E6%9C%80%E8%BF%91%E5%AF%B9%E7%9A%84%E4%B8%89%E7%A7%8D ...