[ python ] 项目:haproxy配置文件增删改查
1. 开发要求
实现对 haproxy.cfg 增删改查操作
2. 程序介绍
- # 作者:hkey
- # 博客地址:https://www.cnblogs.com/hukey/p/9288279.html
- # 功能实现:对 haproxy.cfg 增删改查
- # 目录结构:
- haproxy/
- ├── haproxy.cfg # haproxy 主配置文件
- └── ops.py # 操作程序
- # 使用说明:
- 1. 查询
- 2. 新增
- 3. 修改
- 4. 删除
- 5. 退出
README
3. 程序逻辑图
4. 程序代码
- global
- log 127.0.0.1 local2
- chroot /var/lib/haproxy
- pidfile /var/run/haproxy.pid
- maxconn
- user haproxy
- group haproxy
- daemon
- # turn on stats unix socket
- stats socket /var/lib/haproxy/stats
- defaults
- mode http
- log global
- option httplog
- option dontlognull
- #option http-server-close
- #option forwardfor except 127.0.0.0/
- option redispatch
- retries
- timeout http-request 10s
- timeout queue 1m
- timeout connect 10s
- timeout client 1m
- timeout server 1m
- timeout http-keep-alive 10s
- timeout check 10s
- maxconn
- backend www.super.com
- server 10.0.10.1 weight maxconn
- server 10.0.10.2 weight maxconn
- backend www.super1.com
- server 10.0.10.1 weight maxconn
- server 10.0.10.2 weight maxconn
- server 10.0.10.3 weight maxconn
- backend www.super2.com
- server 10.0.10.2 weight maxconn
- server 10.0.10.20 weight maxconn
- server 10.0.10.3 weight maxconn
- backend www.super20.com
- server 10.0.0.10 10.0.10.10 weight maxconn
haproxy.cfg
- # -*- coding: utf-8 -*-
- # Author: hkey
- import os
- def file_handle(backend_data, src=None, type='fetch'):
- '''解耦函数'''
- if type == 'fetch':
- with open('haproxy.cfg', 'r') as read_f:
- ret = []
- Flag = False
- for read_line in read_f:
- if backend_data == read_line.strip():
- Flag = True
- continue
- if Flag == True and read_line.startswith('backend'):
- break
- if Flag:
- print('\33[42;1m%s\33[0m' % read_line, end='')
- ret.append(read_line)
- return ret
- elif type == 'change':
- with open('haproxy.cfg', 'r') as read_f, open('haproxy.conf', 'w') as write_f:
- flag = False
- has_write = False
- for read_line in read_f:
- if read_line.strip() == backend_data:
- flag = True
- continue
- if flag and read_line.startswith('backend'):
- flag = False
- if not flag:
- write_f.write(read_line)
- else:
- if not has_write:
- for record in src:
- write_f.write(record)
- has_write = True
- os.rename('haproxy.cfg', 'haproxy.cfg_bak')
- os.rename('haproxy.conf', 'haproxy.cfg')
- os.remove('haproxy.cfg_bak')
- def fetch(find_str):
- '''查询功能'''
- backend_str = 'backend %s' % find_str
- return file_handle(backend_str)
- def add(backend):
- '''新增功能'''
- print('这是新增功能.')
- backend_list = fetch(backend)
- if not backend_list:
- return '\33[41;1mbackend不存在。\33[0m'
- new_server = input('输入新增server:')
- backend_data = 'backend %s' % backend
- backend_list.insert(0, '%s\n%s\n' % (backend_data, new_server))
- return file_handle(backend_data, src=backend_list, type='change')
- def change(modify_data):
- '''修改功能'''
- print('这是修改功能.')
- modify_data = eval(modify_data)
- backend = modify_data[0]['backend']
- backend_data = 'backend %s' % backend
- backend_list = fetch(backend)
- old_server = '%sserver %s weight %s maxconn %s\n' %(' ' *4, modify_data[0]['record']['server'],
- modify_data[0]['record']['weight'], modify_data[0]['record']['maxconn'])
- new_server = '%sserver %s weight %s maxconn %s\n' %(' ' *4, modify_data[1]['record']['server'],
- modify_data[1]['record']['weight'], modify_data[1]['record']['maxconn'])
- if not backend_list and old_server not in backend_list:
- return '修改的记录不存在。'
- else:
- index = backend_list.index(old_server)
- backend_list[index] = new_server
- backend_list.insert(0, '%s\n' % backend_data)
- return file_handle(backend_data, src=backend_list, type='change')
- def delete(backend):
- '''删除功能'''
- print('这是删除功能.')
- backend_list = fetch(backend)
- if not backend_list:
- return '\33[41;1mbackend 【%s】不存在。\33[0m' % backend
- del_server = input('输入要删除的server:') + '\n'
- if del_server not in backend_list:
- return '\33[41;1m输入的server不存在。\33[0m'
- else:
- backend_data = 'backend %s' % backend
- backend_list.insert(0, '%s\n' %backend_data)
- backend_list.remove(del_server)
- return file_handle(backend_data, src=backend_list, type='change')
- if __name__ == '__main__':
- msg = '''
- 1. 查询
- 2. 新增
- 3. 修改
- 4. 删除
- 5. 退出
- '''
- msg_dict = {
- '': fetch,
- '': add,
- '': change,
- '': delete,
- }
- while True:
- print(msg)
- choice = input('>>>').strip()
- if not choice: continue
- if choice == '': break
- find_str = input('请输入你的数据:').strip()
- res = msg_dict[choice](find_str)
- print(res)
ops.py
5. 程序运行展示
(1)查询
(2)新增
server 1.1.1.1 weight 1 maxconn 1(前面4个空格)
(3)修改
[{'backend': 'www.super2.com', 'record':{'server': '10.0.10.20', 'weight': 30, 'maxconn': 40}}, {'backend': 'www.super2.com', 'record':{'server': '10.0.10.200', 'weight': 100, 'maxconn': 100}}]
(4)删除
server 1.1.1.1 weight 1 maxconn 1(开头4个空格)
(5)退出
[ python ] 项目:haproxy配置文件增删改查的更多相关文章
- python操作mysql数据库增删改查的dbutils实例
python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...
- django之创建第8-1个项目-数据库之增删改查/数据库数据显示在html页面
1.为test.DB数据库预先创建下面数据 1 张三 16 2015-01-02 12 李四 17 2015-01-04 13 王五 14 ...
- winform 配置文件增删改查
winform 配置文件是 App.config webform 的配置文件 是web.config 其实基本操作都一样 设置个配置文件 全局文件 访问者个配置文件 对这个配置文件增删 ...
- Asp.net WebApi 项目示例(增删改查)
1.WebApi是什么 ASP.NET Web API 是一种框架,用于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务.ASP.NET Web API 是一种用于在 .NET ...
- python学习(list增删改查、及常用方法)
1.Python多条件判断: 多条件判断if: passelse: pass循环 while for i = 0 while i > 1: print('hello') else: print( ...
- Python之注册表增删改查(干货)
在Windows平台下,对注册表的增删改查的需求比较多,微软提供了很多用于访问,修改注册表等的API,我们可以使用诸如bat,或者C++等各种方式去访问修改注册表.无所不能的python下如何完成这些 ...
- Python实现mysql数据库增删改查
利用python操作mysql数据库用法简单,环境配置容易,本文将实现对库增.删.改.查的简易封装! 1. 环境配置 安装第三方包 ,导入模块 mysql.connector pip inst ...
- DAY4(python)打印字符串以及增删改查
用while循环打印字符串 #if i in s: # print ( i ) s='nanfjkhndaol' index = 0 while 1 : print (s[index]) index+ ...
- 2018.8.1 python中字典的增删改查及其它操作
一.字典的简单介绍 1.dict 用{}来表示 键值对数据 {key:value} 唯一性 2.键都必须是可哈希,不可变的数据类型就可以当做字典中的键 值没有任何限制 ...
随机推荐
- 【题解】洛谷P3709大爷的字符串题
最近想要练习一下莫队(实在是掌握的太不熟练了啊.)这题一开始看到有点懵(题面杀),后来发现是要求众数的个数.乍一看好像很难的样子. 但仔细分析一下:首先往序列当中加入一个数,这个是很简单的,只需要维护 ...
- [BZOJ5339] [TJOI2018]教科书般的亵渎
题目链接 BZOJ题面. 洛谷题面. Solution 随便推一推,可以发现瓶颈在求\(\sum_{i=1}^n i^k\),关于这个可以看看拉格朗日插值法. 复杂度\(O(Tm^2)\). #inc ...
- [洛谷P3181][HAOI2016]找相同字符
题目大意:给你两个字符串,求从两个字符串中各选择一个字串使得这两个字串相同的方案数. 题解:建广义$SAM$,对每个点求出在第一个串中出现次数和第二个串中出现次数,乘起来就行了 卡点:无 C++ Co ...
- POJ2891:Strange Way to Express Integers——题解
http://poj.org/problem?id=2891 题目大意: k个不同的正整数a1,a2,...,ak.对于一些非负m,满足除以每个ai(1≤i≤k)得到余数ri.求出最小的m. 输入和输 ...
- React的setState执行机制
1. setState基本特点 1. setState是同步执行的 setState是同步执行的,但是state并不一定会同步更新 2. setState在React生命周期和合成事件中批量覆盖执行 ...
- 【计数】【UVA11401】 Triangle Counting
传送门 Description 把1……n这n个数中任取3个数,求能组成一个三角形的方案个数 Input 多组数据,对于每组数据,包括: 一行一个数i,代表前i个数. 输入结束标识为i<3. O ...
- 淘淘相关DTO
result 用于Controller层返回值或Controller于service层之间返回值 package com.taotao.common.pojo; import java.util.Li ...
- process monitor教程汇总
这是只一个简单的例子,当然还有更复杂的规则说明,可以参考一下列表里的规则. 最后说下 process monitor 到底有什么用? 除了那些电脑高手喜欢分析程序运行情况外, 还有那些编程 ...
- 【SPOJ】2319 BIGSEQ - Sequence
[算法]数位DP [题解]动态规划 题目要求的是大整数……没办法只写了小数字的,感觉应该没错. 大题框架是最大值最小化的二分问题. 对于每一块要求count(b)-count(a-1)≥s 已知a如何 ...
- Go从入门到精通(持续更新)
1.0 搭建环境 由于我们 Go官方网站 在我大天朝被和谐了,所以我们只能去 Go语言中文网 来下载了.Go的安装很简单,不像Java还要配置一大堆的东西,选择自己系统的对应版本,下载安装,像安装QQ ...