1. 开发要求

实现对 haproxy.cfg 增删改查操作

2. 程序介绍

  1. # 作者:hkey
  2.  
  3. # 博客地址:https://www.cnblogs.com/hukey/p/9288279.html
  4.  
  5. # 功能实现:对 haproxy.cfg 增删改查
  6.  
  7. # 目录结构:
  8. haproxy/
  9. ├── haproxy.cfg # haproxy 主配置文件
  10. └── ops.py # 操作程序
  11.  
  12. # 使用说明:
  13.  
  14. 1. 查询
  15. 2. 新增
  16. 3. 修改
  17. 4. 删除
  18. 5. 退出

README

3. 程序逻辑图

4. 程序代码

  1. global
  2. log 127.0.0.1 local2
  3.  
  4. chroot /var/lib/haproxy
  5. pidfile /var/run/haproxy.pid
  6. maxconn
  7. user haproxy
  8. group haproxy
  9. daemon
  10.  
  11. # turn on stats unix socket
  12. stats socket /var/lib/haproxy/stats
  13.  
  14. defaults
  15. mode http
  16. log global
  17. option httplog
  18. option dontlognull
  19. #option http-server-close
  20. #option forwardfor except 127.0.0.0/
  21. option redispatch
  22. retries
  23. timeout http-request 10s
  24. timeout queue 1m
  25. timeout connect 10s
  26. timeout client 1m
  27. timeout server 1m
  28. timeout http-keep-alive 10s
  29. timeout check 10s
  30. maxconn
  31.  
  32. backend www.super.com
  33. server 10.0.10.1 weight maxconn
  34. server 10.0.10.2 weight maxconn
  35.  
  36. backend www.super1.com
  37. server 10.0.10.1 weight maxconn
  38. server 10.0.10.2 weight maxconn
  39. server 10.0.10.3 weight maxconn
  40.  
  41. backend www.super2.com
  42. server 10.0.10.2 weight maxconn
  43. server 10.0.10.20 weight maxconn
  44. server 10.0.10.3 weight maxconn
  45. backend www.super20.com
  46. server 10.0.0.10 10.0.10.10 weight maxconn

haproxy.cfg

  1. # -*- coding: utf-8 -*-
  2. # Author: hkey
  3. import os
  4.  
  5. def file_handle(backend_data, src=None, type='fetch'):
  6. '''解耦函数'''
  7. if type == 'fetch':
  8. with open('haproxy.cfg', 'r') as read_f:
  9. ret = []
  10. Flag = False
  11. for read_line in read_f:
  12. if backend_data == read_line.strip():
  13. Flag = True
  14. continue
  15. if Flag == True and read_line.startswith('backend'):
  16. break
  17. if Flag:
  18. print('\33[42;1m%s\33[0m' % read_line, end='')
  19. ret.append(read_line)
  20. return ret
  21.  
  22. elif type == 'change':
  23. with open('haproxy.cfg', 'r') as read_f, open('haproxy.conf', 'w') as write_f:
  24. flag = False
  25. has_write = False
  26. for read_line in read_f:
  27. if read_line.strip() == backend_data:
  28. flag = True
  29. continue
  30. if flag and read_line.startswith('backend'):
  31. flag = False
  32. if not flag:
  33. write_f.write(read_line)
  34. else:
  35. if not has_write:
  36. for record in src:
  37. write_f.write(record)
  38. has_write = True
  39. os.rename('haproxy.cfg', 'haproxy.cfg_bak')
  40. os.rename('haproxy.conf', 'haproxy.cfg')
  41. os.remove('haproxy.cfg_bak')
  42.  
  43. def fetch(find_str):
  44. '''查询功能'''
  45. backend_str = 'backend %s' % find_str
  46. return file_handle(backend_str)
  47.  
  48. def add(backend):
  49. '''新增功能'''
  50. print('这是新增功能.')
  51. backend_list = fetch(backend)
  52. if not backend_list:
  53. return '\33[41;1mbackend不存在。\33[0m'
  54. new_server = input('输入新增server:')
  55. backend_data = 'backend %s' % backend
  56. backend_list.insert(0, '%s\n%s\n' % (backend_data, new_server))
  57. return file_handle(backend_data, src=backend_list, type='change')
  58.  
  59. def change(modify_data):
  60. '''修改功能'''
  61. print('这是修改功能.')
  62. modify_data = eval(modify_data)
  63. backend = modify_data[0]['backend']
  64. backend_data = 'backend %s' % backend
  65. backend_list = fetch(backend)
  66. old_server = '%sserver %s weight %s maxconn %s\n' %(' ' *4, modify_data[0]['record']['server'],
  67. modify_data[0]['record']['weight'], modify_data[0]['record']['maxconn'])
  68. new_server = '%sserver %s weight %s maxconn %s\n' %(' ' *4, modify_data[1]['record']['server'],
  69. modify_data[1]['record']['weight'], modify_data[1]['record']['maxconn'])
  70.  
  71. if not backend_list and old_server not in backend_list:
  72. return '修改的记录不存在。'
  73. else:
  74. index = backend_list.index(old_server)
  75. backend_list[index] = new_server
  76. backend_list.insert(0, '%s\n' % backend_data)
  77. return file_handle(backend_data, src=backend_list, type='change')
  78.  
  79. def delete(backend):
  80. '''删除功能'''
  81. print('这是删除功能.')
  82. backend_list = fetch(backend)
  83. if not backend_list:
  84. return '\33[41;1mbackend 【%s】不存在。\33[0m' % backend
  85. del_server = input('输入要删除的server:') + '\n'
  86. if del_server not in backend_list:
  87. return '\33[41;1m输入的server不存在。\33[0m'
  88. else:
  89. backend_data = 'backend %s' % backend
  90. backend_list.insert(0, '%s\n' %backend_data)
  91. backend_list.remove(del_server)
  92. return file_handle(backend_data, src=backend_list, type='change')
  93.  
  94. if __name__ == '__main__':
  95. msg = '''
  96. 1. 查询
  97. 2. 新增
  98. 3. 修改
  99. 4. 删除
  100. 5. 退出
  101. '''
  102.  
  103. msg_dict = {
  104. '': fetch,
  105. '': add,
  106. '': change,
  107. '': delete,
  108. }
  109.  
  110. while True:
  111. print(msg)
  112. choice = input('>>>').strip()
  113. if not choice: continue
  114. if choice == '': break
  115. find_str = input('请输入你的数据:').strip()
  116. res = msg_dict[choice](find_str)
  117. 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配置文件增删改查的更多相关文章

  1. python操作mysql数据库增删改查的dbutils实例

    python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...

  2. django之创建第8-1个项目-数据库之增删改查/数据库数据显示在html页面

    1.为test.DB数据库预先创建下面数据 1    张三    16    2015-01-02    12    李四    17    2015-01-04    13    王五    14  ...

  3. winform 配置文件增删改查

    winform 配置文件是  App.config webform   的配置文件 是web.config 其实基本操作都一样    设置个配置文件  全局文件 访问者个配置文件  对这个配置文件增删 ...

  4. Asp.net WebApi 项目示例(增删改查)

    1.WebApi是什么 ASP.NET Web API 是一种框架,用于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务.ASP.NET Web API 是一种用于在 .NET ...

  5. python学习(list增删改查、及常用方法)

    1.Python多条件判断: 多条件判断if: passelse: pass循环 while for i = 0 while i > 1: print('hello') else: print( ...

  6. Python之注册表增删改查(干货)

    在Windows平台下,对注册表的增删改查的需求比较多,微软提供了很多用于访问,修改注册表等的API,我们可以使用诸如bat,或者C++等各种方式去访问修改注册表.无所不能的python下如何完成这些 ...

  7. Python实现mysql数据库增删改查

    利用python操作mysql数据库用法简单,环境配置容易,本文将实现对库增.删.改.查的简易封装!   1. 环境配置 安装第三方包  ,导入模块 mysql.connector  pip inst ...

  8. DAY4(python)打印字符串以及增删改查

    用while循环打印字符串 #if i in s: # print ( i ) s='nanfjkhndaol' index = 0 while 1 : print (s[index]) index+ ...

  9. 2018.8.1 python中字典的增删改查及其它操作

    一.字典的简单介绍 1.dict 用{}来表示       键值对数据           {key:value} 唯一性 2.键都必须是可哈希,不可变的数据类型就可以当做字典中的键 值没有任何限制 ...

随机推荐

  1. 【题解】洛谷P3709大爷的字符串题

    最近想要练习一下莫队(实在是掌握的太不熟练了啊.)这题一开始看到有点懵(题面杀),后来发现是要求众数的个数.乍一看好像很难的样子. 但仔细分析一下:首先往序列当中加入一个数,这个是很简单的,只需要维护 ...

  2. [BZOJ5339] [TJOI2018]教科书般的亵渎

    题目链接 BZOJ题面. 洛谷题面. Solution 随便推一推,可以发现瓶颈在求\(\sum_{i=1}^n i^k\),关于这个可以看看拉格朗日插值法. 复杂度\(O(Tm^2)\). #inc ...

  3. [洛谷P3181][HAOI2016]找相同字符

    题目大意:给你两个字符串,求从两个字符串中各选择一个字串使得这两个字串相同的方案数. 题解:建广义$SAM$,对每个点求出在第一个串中出现次数和第二个串中出现次数,乘起来就行了 卡点:无 C++ Co ...

  4. POJ2891:Strange Way to Express Integers——题解

    http://poj.org/problem?id=2891 题目大意: k个不同的正整数a1,a2,...,ak.对于一些非负m,满足除以每个ai(1≤i≤k)得到余数ri.求出最小的m. 输入和输 ...

  5. React的setState执行机制

    1. setState基本特点 1. setState是同步执行的 setState是同步执行的,但是state并不一定会同步更新 2. setState在React生命周期和合成事件中批量覆盖执行 ...

  6. 【计数】【UVA11401】 Triangle Counting

    传送门 Description 把1……n这n个数中任取3个数,求能组成一个三角形的方案个数 Input 多组数据,对于每组数据,包括: 一行一个数i,代表前i个数. 输入结束标识为i<3. O ...

  7. 淘淘相关DTO

    result 用于Controller层返回值或Controller于service层之间返回值 package com.taotao.common.pojo; import java.util.Li ...

  8. process monitor教程汇总

          这是只一个简单的例子,当然还有更复杂的规则说明,可以参考一下列表里的规则. 最后说下 process monitor 到底有什么用? 除了那些电脑高手喜欢分析程序运行情况外, 还有那些编程 ...

  9. 【SPOJ】2319 BIGSEQ - Sequence

    [算法]数位DP [题解]动态规划 题目要求的是大整数……没办法只写了小数字的,感觉应该没错. 大题框架是最大值最小化的二分问题. 对于每一块要求count(b)-count(a-1)≥s 已知a如何 ...

  10. Go从入门到精通(持续更新)

    1.0 搭建环境 由于我们 Go官方网站 在我大天朝被和谐了,所以我们只能去 Go语言中文网 来下载了.Go的安装很简单,不像Java还要配置一大堆的东西,选择自己系统的对应版本,下载安装,像安装QQ ...