1、如何在线上环境优雅的修改配置文件?

原配置文件

  1. #原配置文件
  2. global
  3. log 127.0.0.1 local2
  4. daemon
  5. maxconn 256
  6. log 127.0.0.1 local2 info
  7. defaults
  8. log global
  9. mode http
  10. timeout connect 5000ms
  11. timeout client 50000ms
  12. timeout server 50000ms
  13. option dontlognull
  14.  
  15. listen stats :8888
  16. stats enable
  17. stats uri /admin
  18. stats auth admin:1234
  19.  
  20. frontend oldboy.org
  21. bind 0.0.0.0:80
  22. option httplog
  23. option httpclose
  24. option forwardfor
  25. log global
  26. acl www hdr_reg(host) -i www.cnblogs.com/chenlin163/
  27. use_backend www.cnblogs.com/chenlin163/ if www
  28.  
  29. backend www.cnblogs.com/chenlin163/
  30. server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
  31.  
  32. 原配置文件
  1. 1、查
  2. 输入:www.cnblogs.com/chenlin163/
  3. 获取当前backend下的所有记录
  4.  
  5. 2、新建
  6. 输入:
  7. arg = {
  8. 'bakend': 'www.cnblogs.com/chenlin163/',
  9. 'record':{
  10. 'server': '100.1.7.9',
  11. 'weight': 20,
  12. 'maxconn': 30
  13. }
  14. }
  15.  
  16. 3、删除
  17. 输入:
  18. arg = {
  19. 'bakend': 'www.cnblogs.com/chenlin163/',
  20. 'record':{
  21. 'server': '100.1.7.9',
  22. 'weight': 20,
  23. 'maxconn': 30
  24. }
  25. }
  26.  
  27. 需求
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import json
  4. import os
  5.  
  6. def fetch(backend):
  7. backend_title = 'backend %s' % backend
  8. record_list = []
  9. with open('ha') as obj:
  10. flag = False
  11. for line in obj:
  12. line = line.strip()
  13. if line == backend_title:
  14. flag = True
  15. continue
  16. if flag and line.startswith('backend'):
  17. flag = False
  18. break
  19.  
  20. if flag and line:
  21. record_list.append(line)
  22.  
  23. return record_list
  24.  
  25. def add(dict_info):
  26. backend = dict_info.get('backend')
  27. record_list = fetch(backend)
  28. backend_title = "backend %s" % backend
  29. current_record = "server %s %s weight %d maxconn %d" % (dict_info['record']['server'], dict_info['record']['server'], dict_info['record']['weight'], dict_info['record']['maxconn'])
  30. if not record_list:
  31. record_list.append(backend_title)
  32. record_list.append(current_record)
  33. with open('ha') as read_file, open('ha.new', 'w') as write_file:
  34. flag = False
  35. for line in read_file:
  36. write_file.write(line)
  37. for i in record_list:
  38. if i.startswith('backend'):
  39. write_file.write(i+'\n')
  40. else:
  41. write_file.write("%s%s\n" % (8*" ", i))
  42. else:
  43. record_list.insert(0, backend_title)
  44. if current_record not in record_list:
  45. record_list.append(current_record)
  46.  
  47. with open('ha') as read_file, open('ha.new', 'w') as write_file:
  48. flag = False
  49. has_write = False
  50. for line in read_file:
  51. line_strip = line.strip()
  52. if line_strip == backend_title:
  53. flag = True
  54. continue
  55. if flag and line_strip.startswith('backend'):
  56. flag = False
  57. if not flag:
  58. write_file.write(line)
  59. else:
  60. if not has_write:
  61. for i in record_list:
  62. if i.startswith('backend'):
  63. write_file.write(i+'\n')
  64. else:
  65. write_file.write("%s%s\n" % (8*" ", i))
  66. has_write = True
  67. os.rename('ha','ha.bak')
  68. os.rename('ha.new','ha')
  69.  
  70. def remove(dict_info):
  71. backend = dict_info.get('backend')
  72. record_list = fetch(backend)
  73. backend_title = "backend %s" % backend
  74. current_record = "server %s %s weight %d maxconn %d" % (dict_info['record']['server'], dict_info['record']['server'], dict_info['record']['weight'], dict_info['record']['maxconn'])
  75. if not record_list:
  76. return
  77. else:
  78. if current_record not in record_list:
  79. return
  80. else:
  81. del record_list[record_list.index(current_record)]
  82. if len(record_list) > 0:
  83. record_list.insert(0, backend_title)
  84. with open('ha') as read_file, open('ha.new', 'w') as write_file:
  85. flag = False
  86. has_write = False
  87. for line in read_file:
  88. line_strip = line.strip()
  89. if line_strip == backend_title:
  90. flag = True
  91. continue
  92. if flag and line_strip.startswith('backend'):
  93. flag = False
  94. if not flag:
  95. write_file.write(line)
  96. else:
  97. if not has_write:
  98. for i in record_list:
  99. if i.startswith('backend'):
  100. write_file.write(i+'\n')
  101. else:
  102. write_file.write("%s%s\n" % (8*" ", i))
  103. has_write = True
  104. os.rename('ha','ha.bak')
  105. os.rename('ha.new','ha')
  106.  
  107. if __name__ == '__main__':
  108. """
  109. print '1、获取;2、添加;3、删除'
  110. num = raw_input('请输入序号:')
  111. data = raw_input('请输入内容:')
  112. if num == '1':
  113. fetch(data)
  114. else:
  115. dict_data = json.loads(data)
  116. if num == '2':
  117. add(dict_data)
  118. elif num == '3':
  119. remove(dict_data)
  120. else:
  121. pass
  122. """
  123. #data = "www.cnblogs.com/chenlin163/"
  124. #fetch(data)
  125. #data = '{"backend": "tettst.oldboy.org","record":{"server": "100.1.7.90","weight": 20,"maxconn": 30}}'
  126. #dict_data = json.loads(data)
  127. #add(dict_data)
  128. #remove(dict_data)
  129.  
  130. demo

2、文件处理中xreadlines的内部是如何实现的呢?

python--如何在线上环境优雅的修改配置文件?的更多相关文章

  1. Python的在线编辑环境

    另外,再提供几个Python的在线编辑环境,可以直接写代码并且运行的环境. 在线Python实验室:http://www.pythoner.cn/labs/ 在线Python编辑器:http://ww ...

  2. BUG在线上环境中出现的原因总结

    1.线上环境数据的复杂度以及数据量是测试环境不能比拟的. 2.业务操作的不可控性,用户错误的使用习惯. 3.实际场景的复杂性. 上线之后,测试人员需要做好以下二件事:   第一,灰度测试 项目上线之后 ...

  3. Appium+python自动化15-在Mac上环境搭建

    前言 mac上搭建appium+python的环境还是有点复杂的,需要准备的软件 1.nodejs 2.npm 3.cnpm 4.appium 5.pip 6.Appium-Python-Client ...

  4. Appium+python自动化15-在Mac上环境搭建【转载】

    前言 mac上搭建appium+python的环境还是有点复杂的,需要准备的软件 1.nodejs 2.npm 3.cnpm 4.appium 5.pip 6.Appium-Python-Client ...

  5. python的线上环境配置

    1.安装python 2.7   http://www.cnblogs.com/strikebone/p/3970512.html 2.安装相关前置工具  pip, Django http://www ...

  6. Appium+python自动化16-appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器

    前言 在mac上搭建appium踩了不少坑,先是版本低了,启动后无限重启模拟器.后来全部升级最新版本,就稳稳的了. 环境准备: 1.OS版本号10.12 2.xcode版本号8.3.2 3.appiu ...

  7. appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器 转自:上海-悠悠

    前言 在mac上搭建appium踩了不少坑,先是版本低了,启动后无限重启模拟器.后来全部升级最新版本,就稳稳的了. 环境准备: 1.OS版本号10.12 2.xcode版本号8.3.2 3.appiu ...

  8. [Nginx笔记]关于线上环境CLOSE_WAIT和TIME_WAIT过高

    运维的同学和Team里面的一个同学分别遇到过Nginx在线上环境使用中会遇到TIME_WAIT过高或者CLOSE_WAIT过高的状态 先从原因分析一下为什么,问题就迎刃而解了. 首先是TIME_WAI ...

  9. python查询修改配置文件功能

    阅读目录 一.python查询功能代码 1.查询修改配置文件 global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 i ...

随机推荐

  1. vue+typescript入门学习

    最近想要结合vue学习typescript,了解到vue2.5之后开始支持typescript,就像拿vue学习一下,首先要解决的就是环境的搭建,略微麻烦,如果想要自己体验一把,可以参考这篇文章htt ...

  2. php中三元运算符用法

    代码如下: <?php $handle=fopen("../good/html/1.txt", "r"); while(!feof($handle)) / ...

  3. 利用layui的load模块解决图片上传

    首先肯定要参考layui官网的upload模块文档:http://www.layui.com/doc/modules/upload.html 讲讲思路:在一份添加表单中,我们有个图片上传的模块,然后我 ...

  4. 149 Max Points on a Line 直线上最多的点数

    给定二维平面上有 n 个点,求最多有多少点在同一条直线上. 详见:https://leetcode.com/problems/max-points-on-a-line/description/ Jav ...

  5. Oozie是什么?

         但是,一般用Azkaban了.(具体见我写的另一篇博客:) 官网:https://oozie.apache.org/ Oozie is a workflow scheduler system ...

  6. AJPFX关于Java内部类及其实例化

    public class Outer {    private int size;    public class Inner {        private int counter = 10;  ...

  7. AJPFX循环结构整理资料

    Java语言基础(循环结构概述和for语句的格式及其使用)* A:循环结构的分类        * for,while,do...while * B:循环结构for语句的格式:*           ...

  8. AJPFX总结java开发常用类(包装,数字处理集合等)(一)

    一:首谈java中的包装类 Java为基本类型提供包装类,这使得任何接受对象的操作也可以用来操作基本类型,直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类.jav ...

  9. 如何正确理解关键字"with"与上下文管理器

    转自:https://foofish.net/with-and-context-manager.html 如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 “with” 关键字的语句,它通 ...

  10. python+selenium(环境的安装)

    前言:网上的资料层次不齐,且资料也不全,容易误导新手,所以笔者愿意把你的知识免费分享给大家,笔者用的版本为:python3 此时可能新手就会问了,为什么不用python2呢,因为道理很简单,人要往前走 ...