Python小程序之动态修改Haproxy配置文件
需求如下:
1、动态的查询添加删除haproxy节点信息
2、程序功能:add(添加)、Del(删除)、Query(查询)
3、添加时实例字符串为: {'backend': 'www.oldboy.com','record': {'server': '100.1.7.9','weight': 20,'maxconn': 30}}
代码:
# Author:Lee Sir
import sys haproxyconf = r"E:\Python练习脚本\day3\haproxy.txt"
haproxyconf_temp = r"E:\Python练习脚本\day3\haproxy_temp.txt" def openconf(file,mode):
fd = open(file,'%s' % mode)
return fd def closeconf(fd):
fd.close() def user_choice():
choice = ['Query','Add','Delete','Update']
for index,key in enumerate(choice):
print(index,key)
while True:
userchoice = input('Please number for your Choice: ')
if userchoice.isdigit() and int(userchoice) >= 0 and int(userchoice) < 3:
return userchoice
elif userchoice == 'q' or userchoice == 'Q':
sys.exit('Bye Bye')
else:
print('Input Error,Please try again') def listnode():
conf = openconf(haproxyconf,'r')
key = input('Please Input Your Query Node Name: ')
count = 0
for line in conf:
if key in line and line.strip().startswith('backend'):
result = True
nodenumber = 1
while result:
nodeinfo = conf.readline()
if nodeinfo.strip().startswith('server'):
print('节点 %s:%s ' % (nodenumber,nodeinfo.strip()))
count += 1
nodenumber += 1
else:
result = False
if count == 0:
print('\033[31;1mNo Node for %s\033[0m' % key)
closeconf(conf) def delenode():
conf = openconf(haproxyconf,'r')
key = input('Please input Delete Node: ')
conf_list = []
for line in conf:
if line.strip().startswith('backend'):
if key in line:
conf_list.append(line)
while True:
nodeinfo = conf.readline()
if nodeinfo.strip().startswith('server'):
conf_list.append(nodeinfo)
else:
break
else:
if len(conf_list) > 0:
old_conf = openconf(haproxyconf,'r')
write_conf = openconf(haproxyconf_temp,'w')
for info in old_conf:
if info in conf_list:
continue
else:
write_conf.write(info)
else:
closeconf(old_conf)
closeconf(write_conf)
print('Delete Node:%s Successful!' % key )
else:
sys.exit('No Node info for %s' % key) def addnode():
conf = openconf(haproxyconf_temp,'r')
# nodeinfo = '''{'backend': 'www.oldboy.com','record': {'server': '100.1.7.9','weight': 20,'maxconn': 30}}'''
nodeinfo = input('Please input Your Add node info:')
nodeinfo = eval(nodeinfo)
if isinstance(nodeinfo,dict):
backend = nodeinfo['backend']
for line in conf:
if line.strip().startswith('backend'):
if backend in line:
sys.exit('The node are exist!')
else:
add_wirte = openconf(haproxyconf_temp,'a')
backend = nodeinfo['backend']
record = nodeinfo['record']
server = record['server']
weight = record['weight']
maxconn = record['maxconn']
node_info = '''\nbackend %s\n\t\tserver %s %s weight %s maxconn %s
''' % (backend,server,server,weight,maxconn)
add_wirte.write(node_info)
print('The Node:%s Add Successful!' % backend )
else:
sys.exit('Input Error,bye bye!') def main():
userchoice = user_choice()
if userchoice == '':
listnode()
elif userchoice == '':
addnode()
elif userchoice == '':
delenode() if __name__ == '__main__':
main()
Python小程序之动态修改Haproxy配置文件的更多相关文章
- 微信小程序 JS动态修改样式
微信小程序这个坑啊,js动态修改样式,我们并不能用js或者jq 轻轻松松一行代码搞定.或者用removeClass addClass 来修改样式. 以下是一种动态修改样式的方法,原理是绑定数据,然后动 ...
- 微信小程序 setData动态修改数据数组的值
1.问题说明 有一组数据,用来存储图片路径,动态修改图片的路径来上传图片,而小程序JS只能通过事件获取时机和setData方法修改数据来改变view. 而用这样写的方式明显是错误的 2.解决办法 字符 ...
- 小程序如何动态修改标题navigationBarTitleText
首先我们先设置标题.进入页面所在的json文件加入以下代码即可成功设置: "navigationBarTitleText": "我是标题啊!", 然后修改这个标 ...
- 怎么样通过编写Python小程序来统计测试脚本的关键字
怎么样通过编写Python小程序来统计测试脚本的关键字 通常自动化测试项目到了一定的程序,编写的测试代码自然就会很多,如果很早已经编写的测试脚本现在某些基础函数.业务函数需要修改,那么势必要找出那些引 ...
- 微信小程序-04-详解介绍.json 配置文件
致我自己:小程序开发不是简单一两天的事,一两天只能算是了解,有时候看多了会烦,感觉很熟悉了,其实只是对表面进行了解,对编程却知之甚少,小程序开发不是简单的改模板,一两天很多部分改模板可能都做不到,坚持 ...
- 微信小程序,动态改变样式
小程序目前没有修改样式api,但是可以利用数据绑定实现动态改变样式,可以用view标签模拟page然后改变view标签的样式,以下案例演示了如果改变page背景颜色: <view class=& ...
- Day1:第一个python小程序
Day1:第一个python小程序与开发工具Pycharm 一.Hello World C:\Users\wenxh>python Python 3.6.2 (v3.6.2:5fd33b5, J ...
- 微信小程序之动态获取元素宽高
我以前一直以为微信小程序不能动态获取view元素的宽高.但是自从看到: wx.createSelectorQuery() 这个api接口,以前的某些问题就能得到解决了... 那么,这个api接口怎么用 ...
- Python 小程序,对文件操作及其它
以下是自己写的几个对文件操作的小程序,里面涉及到文件操作,列表(集合,字典)的运用等.比方说,从文件里读取一行数据.分别存放于列表中,再对列表进行操作.如去掉里面的反复项.排序等操作. 常见对文件里行 ...
随机推荐
- C++学习007-使用exit退出进程
使用exit可以实现退出当前进程. 如下 在程序接收到一个字符后,就退出进程 编写环境 vs2015 int main() { int a = 10, b = 20; std::cout <&l ...
- ubuntu 开热点
原文地址:https://www.cnblogs.com/king-ding/archive/2016/10/09/ubuntuWIFI.html 今天教大家一个简单方法让ubuntu发散wifi热点 ...
- 今日头条 2018 AI Camp 视频面试
1. 本次面试是在牛客网平台进行的,没有涉及到技术细节,面试官也说仅仅是聊天.但是,不知道是网络卡顿还是平台缘故,连接非常不稳定,经常听不到声音,对方那边噪音也特别大,面试体验不是很好. 2. 面试时 ...
- HDU 4467 Graph(图论+暴力)(2012 Asia Chengdu Regional Contest)
Description P. T. Tigris is a student currently studying graph theory. One day, when he was studying ...
- UGUI 代码 动态添加 Event Trigger 的事件
Additionally, if you need more than just the events provided by default, I'd suggest instead attachi ...
- postman工具中如何提取接口的返回值
提取接口返回值 当返回值是返回JSON时 1.let json = JSON.parse(responseBody); // responseBody是包含整个返回内容的字符串 提取某字段的值: ...
- 【EasyNetQ】- 多态发布和订阅
您可以订阅接口,然后发布该接口的实现. 我们来看一个例子.我有一个接口IAnimal和两个实现Cat和Dog: public interface IAnimal { string Name { get ...
- ob_flush()和flush()的区别
最近写定时任务,遇到ob_flush()和flush()混淆的问题... ob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑- 其实, 他们 ...
- thead tfoot tbody标签的使用
这三个都是<body>元素的子标签,不常用,因为其只是对<tr>标签做了一个区分 <thread>用于包裹表格头信息 <tfoot>用于包裹表格最后一行 ...
- group by 分组后 返回的是一个同属性的集合
group by 分组后 返回的是一个同属性的集合 我们可以遍历该集合