需求:

  1. 、查
  2. 输入:www.oldboy.org
  3. 获取当前backend下的所有记录
  4.  
  5. 、新建
  6. 输入:
  7. arg = {
  8. 'bakend': 'www.oldboy.org',
  9. 'record':{
  10. 'server': '100.1.7.9',
  11. 'weight': ,
  12. 'maxconn':
  13. }
  14. }
  15.  
  16. 、删除
  17. 输入:
  18. arg = {
  19. 'bakend': 'www.oldboy.org',
  20. 'record':{
  21. 'server': '100.1.7.9',
  22. 'weight': ,
  23. 'maxconn':
  24. }
  25. }

原配置文件:

  1. global
  2. log 127.0.0.1 local2
  3. daemon
  4. maxconn
  5. log 127.0.0.1 local2 info
  6. defaults
  7. log global
  8. mode http
  9. timeout connect 5000ms
  10. timeout client 50000ms
  11. timeout server 50000ms
  12. option dontlognull
  13.  
  14. listen stats :
  15. stats enable
  16. stats uri /admin
  17. stats auth admin:
  18.  
  19. frontend oldboy.org
  20. bind 0.0.0.0:
  21. option httplog
  22. option httpclose
  23. option forwardfor
  24. log global
  25. acl www hdr_reg(host) -i www.oldboy.org
  26. use_backend www.oldboy.org if www
  27.  
  28. backend www.oldboy.org
  29. server 100.1.7.9 100.1.7.9 weight maxconn

作业详解

代码如下:

  1. #Author:Zheng Na
  2. # 参考:https://www.cnblogs.com/1dreams/p/6880205.html
  3. # 代码缺陷:
  4. # 对每次输入都没有做校验,一旦格式错误就报错
  5. # 某些功能未实现
  6. # 将文件先变成一个列表,如果文件很大就没办法了
  7.  
  8. import json
  9.  
  10. f = open('haproxy.txt','r',encoding="UTF-8")
  11. f_new = open('haproxy_new.txt','w',encoding="UTF-8")
  12. #将文件内容转换为一个列表,并定义一个变量。
  13. f_list =f.readlines()
  14. #print(f_list)
  15. process_list = ["获取ha记录","增加ha记录","删除ha记录"]
  16. print("可选操作如下:".center(20,'*'))
  17. for index,item in enumerate(process_list):
  18. print(index+1,item)
  19. num = int(input("请输入操作序号:"))
  20.  
  21. if num == 1:
  22. read = input("请输入backend:") # 如输入:www.oldboy.org
  23. # 利用字符串拼接,定义一个变量,-----backend所在的行。
  24. backend_title = "backend %s\n" % read
  25. if backend_title in f_list:
  26. index_bt = f_list.index(backend_title)
  27. print(f_list[index_bt],f_list[index_bt+1]) #没有判断backend下面有多少行,万一有很多行呢?
  28. else:
  29. print("您查找的内容不存在!")
  30.  
  31. if num ==2:
  32. read = input("请输入要新加的记录:") # 如: {"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
  33. # 将read字符串转换成 字典类型 方法1
  34. read_dict = json.loads(read)
  35. # 将read字符串转换成 字典类型 方法2 有点儿low
  36. # read_dict = eval(read)
  37.  
  38. # 通过列表计数器来判断输入的内容是否在列表中存在,如果计数器为0则不存在,如果计数器不为0则存在。
  39. # 不存在则添加,存在则不添加。
  40. backend_title = "backend %s\n" % read_dict["backend"]
  41. f_find = f_list.count(backend_title)
  42. if f_find == 0:
  43. for line in f_list:
  44. f_new.write(line)
  45. f_new.write("\n\n")
  46. f_new.write(backend_title)
  47. f_new.write(" server %s %s weight %s maxconn %s"\
  48. %(read_dict["record"]["server"],read_dict["record"]["server"],\
  49. read_dict["record"]["weight"],read_dict["record"]["maxconn"]))
  50. else:
  51. # # 如果已经存在,
  52. # # 则在此节点下添加根据用输入构造出的记录,例如:
  53. # server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
  54. # # (可选)可以再对节点下记录进行判断是否已经存在
  55. # 未实现此功能
  56. print("您要添加的记录已存在!")
  57.  
  58. if num == 3:
  59. read = input("请输入要删除的记录:") # 如: {"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
  60. # 将read字符串转换成 字典类型 方法1
  61. read_dict = json.loads(read)
  62. # 将read字符串转换成 字典类型 方法2 有点儿low
  63. # read_dict = eval(read)
  64.  
  65. # 通过列表计数器来判断输入的内容是否在列表中存在,如果计数器为0则不存在,如果计数器不为0则存在。
  66. backend_title = "backend %s\n" % read_dict["backend"]
  67. f_find = f_list.count(backend_title)
  68. # 存在则删除
  69. # #去配置文件中找到指定的节点,并在删除指定记录,如:
  70. # backend test.oldboy.org
  71. # server 100.1.7.10 100.1.7.10 weight 20 maxconn 3000
  72. # server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000 # 删除掉
  73. #
  74. # # (可选)如果backend下所有的记录都已经被删除,那么将当前 backend test.oldboy.org 也删除掉。
  75. # 未实现此功能
  76. if f_find != 0:
  77. index_bt = f_list.index(backend_title)
  78. f_list.pop(index_bt)
  79. f_list.pop(index_bt) #删掉index_bt位置元素后,index_bt+1位置元素自动向前占据index_bt位置
  80. for line in f_list:
  81. f_new.write(line)
  82. else:
  83. print("您要删除的记录不存在!")
  84.  
  85. f.close()
  86. f_new.close()

菜鸟版

  1. # Author:Zheng Na
  2. # 参考:https://www.cnblogs.com/Ian-learning/p/7895004.html
  3. import json
  4.  
  5. def recd_read():
  6. # 用来读取数据
  7. read = input("请输入backend:") # 如输入:www.oldboy.org
  8. with open('haproxy.txt', 'r', encoding='UTF-8') as f: # 用只读的形式打开
  9. for line in f:
  10. if 'backend' in line:
  11. backend_title = "backend %s\n" % read
  12. if line == backend_title:
  13. return print(f.readline())
  14. return print("您查找的内容不存在!")
  15.  
  16. def recd_add():
  17. # 用来增加数据,暂时没有加入判断输入数据类型的内容
  18. read = input(
  19. "请输入要新加的记录:") # 如: {"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
  20. # 将read字符串转换成 字典类型 方法1
  21. read_dict = json.loads(read)
  22. # 将read字符串转换成 字典类型 方法2 有点儿low
  23. # read_dict = eval(read)
  24. with open('haproxy.txt', 'r+', encoding='UTF-8') as f: # 用可以读写的形式打开
  25. for line in f:
  26. if 'backend' in line:
  27. backend_title = "backend {website}\n".format(website=read_dict['backend'])
  28. if line == backend_title:
  29. return print("您要添加的记录已存在!")
  30. f.write("\n\n")
  31. f.write(backend_title)
  32. f.write("\t\tserver {} {} weight {} maxconn {}\n" \
  33. .format(read_dict["record"]["server"], read_dict["record"]["server"], \
  34. read_dict["record"]["weight"], read_dict["record"]["maxconn"]))
  35. return print('添加记录成功!')
  36.  
  37. def recd_delete():
  38. # 用来删除数据
  39. read = input(
  40. "请输入要删除的记录:") # 如: {"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
  41. # 将read字符串转换成 字典类型
  42. read_dict = json.loads(read)
  43. flag = 0
  44. with open('haproxy.txt', 'r', encoding='UTF-8') as f, \
  45. open('haproxy_tmp.txt', 'w', encoding='UTF-8') as f_tmp:
  46. backend_title = "backend {}\n".format(read_dict['backend'])
  47. for line in f:
  48. backend_title = "backend {}\n".format(read_dict['backend'])
  49. if line == backend_title:
  50. flag = 1
  51. f.readline()
  52. continue
  53. f_tmp.write(line)
  54.  
  55. if flag == 0:
  56. return print("您要删除的记录不存在!")
  57. else:
  58. with open('haproxy.txt', 'w', encoding='UTF-8') as f, \
  59. open('haproxy_tmp.txt', 'r', encoding='UTF-8') as f_tmp:
  60. for line in f_tmp:
  61. f.write(line)
  62. return print('记录已被删除!')
  63.  
  64. choice_recd = ['add', 'delete', 'read', 'quit'] # 用来判断输入的内容对不对
  65.  
  66. while True:
  67. choice = input("Please choose 'add', 'delete', 'read','quit'>>>")
  68. if choice in choice_recd: # 判断输入的内容对不对
  69. if choice == 'add':
  70. recd_add()
  71. elif choice == 'read':
  72. recd_read()
  73. elif choice == 'delete':
  74. recd_delete()
  75. elif choice == 'quit':
  76. exit("您已退出程序")

进阶版

  1. # Author:Zheng Na
  2. # 参考:https://www.cnblogs.com/Ian-learning/p/7895004.html
  3.  
  4. import shutil
  5. import json
  6.  
  7. def list_function():
  8. print("Please choice the ID of a action.".center(50, "#"))
  9. print("【1】.Fetch haproxy.cfg backend infomation.")
  10. print("【2】.Add haproxy.cfg backend infomation.")
  11. print("【3】.Delete haproxy.cfg backend infomation.")
  12. print("End".center(50, "#"))
  13.  
  14. def fetch(backend):
  15. # 取出backend相关server信息
  16. result = [] # 定义结果列表
  17. with open("haproxy.cfg", "r", encoding="utf-8") as f: # 循环读取文件
  18. flag = False # 标记为假
  19. for line in f:
  20. # 以backend开头
  21. if line.strip().startswith("backend") and line.strip() == "backend " + backend:
  22. flag = True # 读取到backend开头的信息,标记为真
  23. continue
  24. # 下一个backend开头
  25. if flag and line.strip().startswith("backend"):
  26. flag = False
  27. break
  28. # server信息添加到result列表
  29. if flag and line.strip():
  30. result.append(line.strip())
  31. return result
  32.  
  33. def writer(backend, record_list):
  34. with open("haproxy.cfg", "r") as old, open("new.cfg", "w") as new:
  35. flag = False
  36. for line in old:
  37. if line.strip().startswith('backend') and line.strip() == "backend " + backend:
  38. flag = True
  39. new.write(line)
  40. for new_line in record_list:
  41. new.write(" " * 4 + new_line + "\n")
  42. continue # 跳到下一次循环,避免下一个backend写二次
  43.  
  44. if flag and line.strip().startswith("backend"): # 下一个backend
  45. flag = False
  46. new.write(line)
  47. continue # 退出此循环,避免server信息二次写入
  48. if line.strip() and not flag:
  49. new.write(line)
  50.  
  51. def add(backend, record):
  52. global change_flag
  53. record_list = fetch(backend) # 查找是否存在记录
  54. if not record_list: # backend不存在, record不存在
  55. with open('haproxy.cfg', 'r') as old, open('new.cfg', 'w') as new:
  56. for line in old:
  57. new.write(line)
  58. # 添加新记录
  59. new.write("\nbackend " + backend + "\n")
  60. new.write(" " * 8 + record + "\n")
  61. print("\033[32;1mAdd done\033[0m")
  62. change_flag = True
  63. else: # backend存在,record存在
  64. if record in record_list:
  65. print("\033[31;1mRecord already in it,Nothing to do!\033[0m")
  66. change_flag = False
  67. else: # backend存在,record不存在
  68. record_list.append(record)
  69. writer(backend, record_list)
  70. print("\033[32;1mAdd done\033[0m")
  71. change_flag = True
  72.  
  73. def delete(backend, record):
  74. global change_flag
  75. record_list = fetch(backend) # 查找是否存在记录
  76. if not record_list: # backend不存在, record不存在
  77. print("Not match the backend,no need delete!".center(50, "#"))
  78. change_flag = False
  79. else: # backend存在,record存在
  80. if record in record_list:
  81. record_list.remove(record) # 移除元素
  82. writer(backend, record_list) # 写入
  83. print("\033[31;1mDelete done\033[0m")
  84. change_flag = True
  85. else: # backend存在,record不存在
  86. print("Only match backend,no need delete!".center(50, "#"))
  87. change_flag = False
  88. return change_flag
  89.  
  90. def output(servers):
  91. # 输出指定backend的server信息
  92. print("Match the server info:".center(50, "#"))
  93. for server in servers:
  94. print("\033[32;1m%s\033[0m" % server)
  95. print("#".center(50, "#"))
  96.  
  97. def input_json():
  98. # 判断输入,要求为json格式
  99. continue_flag = False
  100. while continue_flag is not True:
  101. backend_record = input("Input backend info(json):").strip()
  102. try:
  103. backend_record_dict = json.loads(backend_record)
  104. except Exception as e:
  105. print("\033[31;1mInput not a json data type!\033[0m")
  106. continue
  107. continue_flag = True
  108. return backend_record_dict
  109.  
  110. def operate(action):
  111. global change_flag
  112. if action == "fetch":
  113. backend_info = input("Input backend info:").strip()
  114. result = fetch(backend_info) # 取出backend信息
  115. if result:
  116. output(result) # 输出获取到的server信息
  117. else:
  118. print("\033[31;1mNot a match is found!\033[0m")
  119. elif action is None:
  120. print("\033[31;1mNothing to do!\033[0m")
  121. else:
  122. backend_record_dict = input_json() # 要求输入json格式
  123. for key in backend_record_dict:
  124. backend = key
  125. record = backend_record_dict[key]
  126. if action == "add":
  127. add(backend, record)
  128. elif action == "delete":
  129. delete(backend, record)
  130. if change_flag is True: # 文件有修改,才进行文件更新
  131. # 将操作结果生效
  132. shutil.copy("haproxy.cfg", "old.cfg")
  133. shutil.copy("new.cfg", "haproxy.cfg")
  134. result = fetch(backend)
  135. output(result) # 输出获取到的server信息
  136.  
  137. def judge_input():
  138. # 判断输入功能编号,执行相应步骤
  139. input_info = input("Your input number:").strip()
  140. if input_info == "": # 查询指定backend记录
  141. action = "fetch"
  142. elif input_info == "": # 添加backend记录
  143. action = "add"
  144. elif input_info == "": # 删除backend记录
  145. action = "delete"
  146. elif input_info == "q" or input_info == "quit":
  147. exit("Bye,thanks!".center(50, "#"))
  148. else:
  149. print("\033[31;1mInput error!\033[0m")
  150. action = None
  151. return action
  152.  
  153. def main():
  154. exit_flag = False
  155. while exit_flag is not True:
  156. global change_flag
  157. change_flag = False
  158. list_function()
  159. action = judge_input()
  160. operate(action)
  161.  
  162. if __name__ == '__main__':
  163. main()

大神版

Python3学习之路~2.10 修改haproxy配置文件的更多相关文章

  1. Python3.5 day3作业二:修改haproxy配置文件。

    需求: 1.使python具体增删查的功能. haproxy的配置文件. global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 lo ...

  2. Python3学习之路~5.10 PyYAML模块

    Python也可以很容易的处理ymal文档格式,只不过需要安装一个模块,参考文档:http://pyyaml.org/wiki/PyYAMLDocumentation

  3. (转)Python3.5 day3作业二:修改haproxy配置文件

    原文:http://www.cnblogs.com/iwxk/p/6010018.html

  4. Python3学习之路~0 目录

    目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...

  5. USB小白学习之路(10) CY7C68013A Slave FIFO模式下的标志位(转)

    转自良子:http://www.eefocus.com/liangziusb/blog/12-11/288618_bdaf9.html CY7C68013含有4个大端点,可以用来处理数据量较大的传输, ...

  6. s12-day03-work01 python修改haproxy配置文件(初级版本)

    #!/usr/local/env python3 ''' Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song ...

  7. Python3学习之路~10.2 协程、Greenlet、Gevent

    一 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切 ...

  8. Python3学习之路~10.1 多进程、进程间通信、进程池

    一 多进程multiprocessing multiprocessing is a package that supports spawning processes using an API simi ...

  9. Python3学习之路~10.3 论事件驱动与异步IO

    论事件驱动----详见:https://www.cnblogs.com/alex3714/articles/5248247.html Select\Poll\Epoll异步IO----详见:http: ...

随机推荐

  1. [Optimization] Greedy method

    Given two sequences of letters A and B, find if B is a subsequence of A in thesense that one can del ...

  2. HTTPS与证书

    HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息.它使用安全套接字层( ...

  3. Ext.form.field.Picker (ComboBox、Date、TreePicker、colorpick.Field)竖向滚动导致布局错误

    ComboBox.Date.TreePicker.colorpick.Field这些继承了Ext.form.field.Picker的控件. 在6.0.0和6.0.1中,在界面中存在竖向滚动条时,点击 ...

  4. IntelliJ IDEA连接TFS local workspace无法正常签入

    前几天为了便于在本地修改,将TFS workspace的类型从Server修改为Local.基于Visual Studio的开发正常没有问题,用IntelliJ IDEA时却提示以下错误: Error ...

  5. C++内存管理(转)

    C++内存管理 [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理 ...

  6. 什么是IOC为什么要使用IOC

    概念: 作用: 结论:借助于“第三方”实现具有依赖关系的对象之间的解耦 在使用IOC之前的情况 如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运 使用IOC之后 对象A获得依赖对象B的过程,由 ...

  7. 【CF587D】Duff in Mafia 二分+前缀优化建图+2-SAT

    [CF587D]Duff in Mafia 题意:给你一张n个点m条边的无向图,边有颜色和边权.你要从中删去一些边,满足: 1.任意两条删掉的边没有公共的顶点.2.任意两条剩余的.颜色相同的边没有公共 ...

  8. 同一个tomcat使用不同http端口配置多个web项目

    1.复制 conf/server.xml下的 复制粘贴新的一个Service元素下的所有内容,并修改name为Catalina2,<Service name="Catalina&quo ...

  9. (ecj)Eclipse的Java编译器分析之一——ecj介绍

    Java是一个开放的平台,对于除发布编译器/解释器/基础类库之外,该语言的负责机构更多的是制定一系列标准,任何符合标准的厂商产品均可用于市场投放.甚至包括其编译器及解释器. (比如Hibernate提 ...

  10. js arrayBuffer 字节序问题,小端法,大端法

    原文博客 { var buffer = new ArrayBuffer(2) var bytes = new Uint16Array(buffer) bytes[0] = (65 << 8 ...