flag+文件操作

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

整体代码

时间: 2024-10-14 05:14:56

flag+文件操作的相关文章

小何讲Linux: 基本文件操作和实例

文件操作的基本概念参见博客: 小何讲Linux: 底层文件I/O操作 1.  函数说明 open()函数:是用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数. 所谓打开文件实质上是在进程与文件之间建立起一种连接,而"文件描述符"唯一地标识着这样一个连接 close()函数:是用于关闭一个被打开的文件.当一个进程终止时,所有被它打开的文件都由内核自动关闭,很多程序都使用这一功能而不显示地关闭一个文件. read()函数:是用于将从指定的文件描述符中读出的数据

xml文件操作

一.xml文件操作1.了解xml文件的SAX解析方式 1.1SAX解析XML  //第一步:解析xml的对象  //工厂模式   SAXParser parser = SAXParserFactory       .newInstance()       .newSAXParser();  //第二步:获得xml文件   InputStream is = getResources().openRawResource(R.raw.shu);  //第三步: 处理器   DefaultHandler

Python 第三天 文件操作

文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. open会自己在Python中找. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作. 打开文件的模式有: r,只读模式(默认). w,只写模式.[不可读,也

C语言文件操作函数的编写

 编写文件操作的头文件 /************************************************************************** Copyright(C)    :2014-08-5 toto Filename       :file.h Author          :涂作权 Version         :V1.1 Date            :2014-08-05 Description     :文件操作的头文件 Others  

Python中文件操作

一.文件打开操作 1.文件操作步骤: (1)打开文件模式: f =open("db",'a')    #文件追加 f = open("db",'r')    #只读操作(默认模式) f = open("db",'w')    #只写操作,会先清空原文件 f = open("db",'x')    #文件存在,会报错,不存在创建并只写 f = open("db",'rx|a|w')  #以二进制的方式只读或只

linux C/C++:文件操作--open、read、write

linux C/C++:文件操作--open.create.close 文件描述符 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符.读写文件也需要使用文件描述符来指定待读写的文件.系统内核会为每一个进程维护一份文件描述符表.如下: 内核分配文件描述符规则是,永远分配未使用的并且是最小的.前三个文件描述符:0.1.2,在默认情况下已被占用.当然,可以先关闭.比如关闭1,再分配,可导致重定向.

总结文件操作函数(二)-C语言

格式化读写: #include <stdio.h> int printf(const char *format, ...);                   //相当于fprintf(stdout,format,-); int scanf(const char *format, -); int fprintf(FILE *stream, const char *format, ...);      //中间的参数为写入文件的格式 int fscanf(FILE *stream, const

C语言复习——指针 链表 与 文件操作

刚刚进入大二,准备开始学习C++,对大一所学的C语言一次练习,正好也是赶上老师布置的任务,用C语言写一个  销售管理系统  ,就尽可能的把所学的都用上,也就是结构,指针,文件操作,还有数据结构,本次加入了链表. 用两个函数 Load_LinkList() 和 Save_LinkList() 让链表与文件操作结合,除了打印函数,其他都是在内存中操作链表,这样写更有条理,在创建链表时没有采用书上的用一个中间变量引导,并插入到结点前面,而是直接在链表尾的next申请内存,便于理解,操作也方便. /*首

python之路----文件操作

python文件操作 文件操作的基本流程: 1.打开文件f_read = open("filename",mode = 'r',encoding="utf-8") 打开一个文件并且将文件句柄赋值给变量f_read,模式可以有多种,如: r,只读模式(默认). w,只写模式.[不可读:不存在则创建:存在则删除内容:] a,追加模式.[可读:   不存在则创建:存在则只追加内容:] "+" 表示可以同时读写某个文件 r+,可读写文件.[可读:可写:可