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. JavaScript对象属性(二)

    对象object  例子一: var car = { "wheels":4, "engines":1, "seats":5}; 例子二: v ...

  2. Linux学习笔记

    性能问题排查: Linux系统出现了性能问题,一般我们可以通过top.iostat.free.vmstat等命令来查看初步定位问题.内存资源占用:free命令 IO占用:iostat -d -k 1 ...

  3. Createjs学习一

    需求1:根据后端返回过来的不同信息,实现长按保存图与文字片功能(图片都是一样的,文字信息不同) 首先我们来分析一下要求,得出需要用到哪些技术.长按保存这一功能只针对图片,文字长按的话只会出现复制.. ...

  4. magento后台paypal设置

    如何在magento后台设置paypal呢? 这边把整理的简单跟大家分享一下. 1.system->config-paypel1.1 Merchant Country 设置国家1.2 Email ...

  5. 定时器中实现数据库表数据移动的功能,Exception in thread "Timer-0" isExist java.lang.NullPointerException定时器中线程报错。

    package com.shawnway.trade.marketdata.constants; import java.sql.SQLException; import java.util.Cale ...

  6. C++:C++的两种多态形式

    // // main.cpp // Test.cpp // // Created by mac on 15/8/11. // Copyright (c) 2015年. All rights reser ...

  7. Windows Server 2008 R2组策略创建用户桌面快捷方式

    问题: 如何让所有域用户桌面有一个公司共享的快捷方式,让所有域用户直接双击就能打开公司共享. 解决办法: 1.创建一个zhuyu组织单元 ----- 在zhuyu组织单元创建一个域用户user1. 2 ...

  8. python之面向对象编程

    1.面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2. 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的抽象, ...

  9. Hive:Spark中如何实现将rdd结果插入到hive1.3.0表中

    DataFrame写入hive API: registerTempTable函数是创建spark临时表 insertInto函数是向表中写入数据,可以看出此函数不能指定数据库和分区等信息,不可以直接进 ...

  10. post- build event

    Ref:http://blog.csdn.net/teng_ontheway/article/details/8307410 Ref: http://blog.csdn.net/sodickbird/ ...