flag标志位,标识位,在其他语言中可能叫开关,个人觉得当作开关更容易理解。下面我们来利用这个开关来控制文件操作的流程,从而优雅的修改配置文件。

global
log 127.0.0.1 local2
daemon
maxconn 256
log 127.0.0.1 local2 info
defaults
log global
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option dontlognull listen stats :8888
stats enable
stats uri /admin
stats auth admin:1234 frontend oldboy.org
bind 0.0.0.0:80
option httplog
option httpclose
option forwardfor
log global
acl www hdr_reg(host) -i www.oldboy.org
use_backend www.oldboy.org if www backend www.oldboy.org
server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000 原配置文件

haproxy原配置文件

我们的需求是:

1、实现fetch获取内容的功能

2、往配置文件中指定位置插入内容的功能

3、删除(或者修改)参数

1、查
输入:www.oldboy.org
获取当前backend下的所有记录 2、新建
输入:
arg = {
'bakend': 'www.oldboy.org',
'record':{
'server': '100.1.7.9',
'weight': 20,
'maxconn': 30
}
} 3、删除
输入:
arg = {
'bakend': 'www.oldboy.org',
'record':{
'server': '100.1.7.9',
'weight': 20,
'maxconn': 30
}
} 需求

代码需求

思路梳理:

1)定义fetch()函数,函数内容为打开haproxy配置文件,找到backend开头的行,打开开关,找到第二backend开头的行,关闭开关,将开关开启状态下的行添加到我们定义的空列表中。

def fetch(a):
result=[]
flag = False
with open('ha.conf','r')as f:
for line in f:
if line.strip()=='backend %s'%a:
flag=True
continue
if flag==True:
if line.strip().startswith('backend'):
flag=False
else:
result.append(line.strip())
return result
ret=fetch('www.oldboy.org')
print(ret)

fetch函数

2)定义add()函数:

方法一:把内容添加进列表,然后把列表内容写入。

# a=input('请输入网址:')
# a='www.oldboy.org' # b=input('请输入新纪录字典:')
b='{"backend":"www.oldboy.org","record":{"server":"100.1.7.6","weight":20,"maxconn":30}}'
b=json.loads(b)
a=b["backend"]
s=b["record"]
s="server %s %s weight %s maxconn %s" % (s['server'],s['server'],s['weight'],s['maxconn'])
title='backend %s' % a
l1=chaxun(a)
l1.append(s)
print(l1)
with open('mm') as read_obj, open('nn', 'w') as write_obj:
flag = False #默认没有找到目标标题
has_write = False #默认列表内容还没有写
for line in read_obj:
if line.strip() == title:
write_obj.write(line)
flag = True #找到标题
continue
if flag and line.strip().startswith('backend'):
flag = False #标题结束
if flag: #如果已经找到目标标题
if not has_write: #如果还没有写内容
for new_line in l1:
temp = "%s %s \n" %(" "*8, new_line)
write_obj.write(temp)
has_write = True
#列表内容书写完毕,即使flag=True,即使没遇到下一个backend,也不会书写内容
else:
# 写入上下部分
write_obj.write(line)# a=input('请输入网址:')
# a='www.oldboy.org' # b=input('请输入新纪录字典:')
b='{"backend":"www.oldboy.org","record":{"server":"100.1.7.6","weight":20,"maxconn":30}}'
b=json.loads(b)
a=b["backend"]
s=b["record"]
s="server %s %s weight %s maxconn %s" % (s['server'],s['server'],s['weight'],s['maxconn'])
title='backend %s' % a
l1=chaxun(a)
l1.append(s)
print(l1)
with open('mm') as read_obj, open('nn', 'w') as write_obj:
flag = False #默认没有找到目标标题
has_write = False #默认列表内容还没有写
for line in read_obj:
if line.strip() == title:
write_obj.write(line)
flag = True #找到标题
continue
if flag and line.strip().startswith('backend'):
flag = False #标题结束
if flag: #如果已经找到目标标题
if not has_write: #如果还没有写内容
for new_line in l1:
temp = "%s %s \n" %(" "*8, new_line)
write_obj.write(temp)
has_write = True
#列表内容书写完毕,即使flag=True,即使没遇到下一个backend,也不会书写内容
else:
# 写入上下部分
write_obj.write(line)

add函数列表写入

方法二:读一行,写一行,直到写到第二个backend,再此之前插入内容即可。

# a=input('请输入网址:')
# a='www.oldboy.org' # b=input('请输入新纪录字典:')
b='{"backend":"www.oldboy.org","record":{"server":"100.1.7.6","weight":20,"maxconn":30}}'
b=json.loads(b)
a=b["backend"]
s=b["record"]
s="server %s %s weight %s maxconn %s" % (s['server'],s['server'],s['weight'],s['maxconn'])
title='backend %s' % a
l1=chaxun(a)
l1.append(s)
print(l1)
with open('mm') as read_obj, open('nn', 'w') as write_obj:
flag = False #默认没有找到目标标题
for line in read_obj:
if line.strip() == title:
write_obj.write(line)
flag = True #找到标题
continue
if flag and line.strip().startswith('backend'):
write_obj.write("%s%s \n" %(" "*8, s))
write_obj.write(line)
flag = False #标题结束
else:
# 写入上下部分
write_obj.write(line)

add函数边读边写

整体实现功能,武sir的标准答案:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import json
import os def fetch(backend):
backend_title = 'backend %s' % backend
record_list = []
with open('ha') as obj:
flag = False
for line in obj:
line = line.strip()
if line == backend_title:
flag = True
continue
if flag and line.startswith('backend'):
flag = False
break if flag and line:
record_list.append(line) return record_list def add(dict_info):
backend = dict_info.get('backend')
record_list = fetch(backend)
backend_title = "backend %s" % backend
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'])
if not record_list:
record_list.append(backend_title)
record_list.append(current_record)
with open('ha') as read_file, open('ha.new', 'w') as write_file:
flag = False
for line in read_file:
write_file.write(line)
for i in record_list:
if i.startswith('backend'):
write_file.write(i+'\n')
else:
write_file.write("%s%s\n" % (8*" ", i))
else:
record_list.insert(0, backend_title)
if current_record not in record_list:
record_list.append(current_record) with open('ha') as read_file, open('ha.new', 'w') as write_file:
flag = False
has_write = False
for line in read_file:
line_strip = line.strip()
if line_strip == backend_title:
flag = True
continue
if flag and line_strip.startswith('backend'):
flag = False
if not flag:
write_file.write(line)
else:
if not has_write:
for i in record_list:
if i.startswith('backend'):
write_file.write(i+'\n')
else:
write_file.write("%s%s\n" % (8*" ", i))
has_write = True
os.rename('ha','ha.bak')
os.rename('ha.new','ha') def remove(dict_info):
backend = dict_info.get('backend')
record_list = fetch(backend)
backend_title = "backend %s" % backend
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'])
if not record_list:
return
else:
if current_record not in record_list:
return
else:
del record_list[record_list.index(current_record)]
if len(record_list) > 0:
record_list.insert(0, backend_title)
with open('ha') as read_file, open('ha.new', 'w') as write_file:
flag = False
has_write = False
for line in read_file:
line_strip = line.strip()
if line_strip == backend_title:
flag = True
continue
if flag and line_strip.startswith('backend'):
flag = False
if not flag:
write_file.write(line)
else:
if not has_write:
for i in record_list:
if i.startswith('backend'):
write_file.write(i+'\n')
else:
write_file.write("%s%s\n" % (8*" ", i))
has_write = True
os.rename('ha','ha.bak')
os.rename('ha.new','ha') if __name__ == '__main__':
"""
print '1、获取;2、添加;3、删除'
num = raw_input('请输入序号:')
data = raw_input('请输入内容:')
if num == '1':
fetch(data)
else:
dict_data = json.loads(data)
if num == '2':
add(dict_data)
elif num == '3':
remove(dict_data)
else:
pass
"""
#data = "www.oldboy.org"
#fetch(data)
#data = '{"backend": "tettst.oldboy.org","record":{"server": "100.1.7.90","weight": 20,"maxconn": 30}}'
#dict_data = json.loads(data)
#add(dict_data)
#remove(dict_data) demo

整体代码

flag+文件操作的更多相关文章

  1. Linux文件操作的主要接口API及相关细节

    操作系统API: 1.API是一些函数,这些函数是由linux系统提供支持的,由应用层程序来使用,应用层程序通过调用API来调用操作系统中的各种功能,来干活 文件操作的一般步骤: 1.在linux系统 ...

  2. go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

    go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...

  3. Python 第三天 文件操作(2)

    文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  fi ...

  4. python- shutil 高级文件操作

    简介 shutil模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作.对单个文件的操作也可参见os模块. 拷贝文件 shutil.copyfile(src, ...

  5. 【Go语言】集合与文件操作

    本文目录 1.数据集合的主要操作 1_1.字典的声明 1_2.字典的初始化和创建 1_3.字典的访问和操作 1_4.其他类型的数据集 2.文件操作 2_1.文件操作概述os包和path包 2_2.文件 ...

  6. (六)文件操作的主要接口API

    1.什么是操作系统API (1)API是一些函数,这些函数是由linux系统提供支持的,由应用层程序来使用. (2)应用层程序通过调用API来调用操作系统中的各种功能,来干活. (3)学习一个操作系统 ...

  7. go文件操作大全

    参考Go官方库的文件操作分散在多个包中,比如os.ioutil包,我本来想写一篇总结性的Go文件操作的文章,却发现已经有人2015年已经写了一篇这样的文章,写的非常好,所以我翻译成了中文,强烈推荐你阅 ...

  8. Go文件操作

    UNIX 的一个基础设计就是"万物皆文件"(everything is a file).我们不必知道一个文件到底映射成什么,操作系统的设备驱动抽象成文件.操作系统为设备提供了文件格 ...

  9. Python基础篇【第2篇】: Python文件操作

    Python文件操作 在Python中一个文件,就是一个操作对象,通过不同属性即可对文件进行各种操作.Python中提供了许多的内置函数和方法能够对文件进行基本操作. Python对文件的操作概括来说 ...

随机推荐

  1. xcode中使用正则表达式来搜索替换代码

    有这样的需求: 类似于 GLOBAL_STR(@"请继续添加"); 这样的代码,需要批量修改为: GLOBAL_STR(@"请继续添加", nil); 这里使用 ...

  2. 我的MySQL整理

    MySql unique的实现原理简析 MYSQL操作 MySql数据类型(转) MySql数据类型 MySql和CSV MySql超新手入门(很好的Mysql学习教材) MySql加锁处理分析 My ...

  3. iOS:基于CoreText的排版引擎

    一.CoreText的简介 CoreText是用于处理文字和字体的底层技术.它直接和Core Graphics(又被称为Quartz)打交道.Quartz是一个2D图形渲染引擎,能够处理OSX和iOS ...

  4. log4j+mongodb

    maven 配置: <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java ...

  5. RegExp 对象 (JavaScript)

    $1...$9 属性 (RegExp) (JavaScript) 返回在模式匹配期间找到的,所存储的最近的九个部分.只读. 语法         RegExp.$n 参数     RegExp 始终为 ...

  6. cocos2dx 3.x(让精灵随着重力感应的方向移动而移动)

    // // GameScene.hpp // HelloWord // // Created by apple on 2017/1/7. // // #ifndef GameScene_hpp #de ...

  7. 微服务之Swagger

    Swagger使用 1. Swagger UI 按以下步骤配置,项目启动后访问:http://localhost:8080/swagger-ui.html 1.1 添加依赖 <dependenc ...

  8. Jquery操作select,左右移动,双击移动 取到所有option的值

    $(function () { function MoveItem(fromId, toId) { $("#" + fromId + " option:selected& ...

  9. Y-TDC 的一些函数

    typedef void (*func_ptr)(void); func_ptr usm_rom_set_tx2_drive_strength_hs; 定义一个函数指针类型.比如你有三个函数:void ...

  10. was not declared in this scope

    “was not declared in this scope”是一个错误信息,在编译的时候会遇到.其含义为标识符在其出现的地方是未被定义的. 出现该错误的时候,会同时把未定义的变量名显示出来.比如如 ...