文件操作实践(一)

简介

利用Python的文件操作命令和函数功能,实现 :
1、获取ha记录
2、增加ha记录
3、删除ha记录

文件内容

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
        server 100.1.7.10 100.1.7.9 weight 20 maxconn 3000
        server 100.1.7.11 100.1.7.9 weight 20 maxconn 3000

backend buy.oldboy.org
        server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000

原配置文件如上

现增加ha配置文件为:

实践一

import json


def read_haproxy(backend_str, f1):
    """
    查找、获取记录
    :param backend_str: 输入的backend
    :param f1: 文件句柄
    :return:
    """
    backend_str = "backend " + backend_str
    result = 0
    for line in f1:
        if backend_str.strip() == line.strip():
            line_str = f1.readline()
            result = 1
            while line_str.startswith("        server"):
                print(line_str)
                line_str = f1.readline()
    return result


def add_haproxy(str, f1, f2):
    """
    增加记录
    :param str: 记录语句
    :param f1: 文件句柄
    :param f2: 文件句柄
    :return:
    """
    read_dict = json.loads(str)
    # n = json.loads(s) # 将一个字符串,转换成python的基本数据类型; 注意:字符串形式的字典'{"k1":"v1"}'内部的字符串必须是 双引号
    backend_title = read_dict['backend']
    server = read_dict['record']['server']
    weight = read_dict['record']['weight']
    maxconn = read_dict['record']['maxconn']
    new_str = "        server {} weight {} maxconn {}".format(server, weight, maxconn)
    result = 0
    for line in f1:
        if ("backend " + backend_title).strip() == line.strip():
            print("backend is already exist")
            result = 1
            # 针对已存在了的backend,如果下一级record也存在,则继续;如果不存在则追加新Node(record)
        if result == 1 and new_str.strip() == line.strip():
            print("record is already exist")
            result = 2
        if result == 1 and not len(line.strip()):
            print("到了backend 的结尾")
            if result != 2:
                print("结尾追加新Node(record)")
                f2.write("{}\n".format(new_str))
                result = -1
        f2.write(line)
    return result, new_str


with open('haproxy', 'r+', encoding='utf-8')as f1, open('haproxy_change', 'w', encoding='utf-8')as f2:
    input_code = input("命令:\n1、获取ha记录\n2、增加ha记录\n3、删除ha记录")
    if input_code == "1":
        back_end = input("请输入backend:")
        acquire_result = read_haproxy(back_end, f1)
        if acquire_result == 0:
            print("没有该backend记录")
    elif input_code == "2":
        add_new_line = input("请输入要增加的新backend记录:")
        # {"backend": "test.oldboy.org","record":{"server": "100.1.7.9 100.1.7.90","weight": 20,"maxconn": 30}}
        # {"backend": "www.oldboy.org","record":{"server": "100.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}}
        # {"backend": "www.oldboy.org","record":{"server": "110.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}}
        # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.90 100.1.7.90","weight": 20,"maxconn": 3000}}
        # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.100 100.1.7.90","weight": 20,"maxconn": 3000}}
        add_result, new_str = add_haproxy(add_new_line, f1, f2)
        if add_result == 0:
            print("可以增加新backend记录")
            read_dict = json.loads(add_new_line)
            backend_title = read_dict['backend']
            new_backend = "\nbackend {}".format(backend_title)
            f2.write(new_backend)
            f2.write("\n{}".format(new_str))

    else:
        pass

查询操作

这里写图片描述

这里写图片描述

增加操作

这里写图片描述

结果:
这里写图片描述

如果都已经存在:
这里写图片描述

如果下级record不存在:
这里写图片描述

增加后的文档:
这里写图片描述

实践二

特点在于只使用了两种状态的flag,先从简单逻辑写起,再复杂实现。使用了内存列表read_result,将record.strip() in read_result进行判断记录和复写。

import json
import shutil


def fetch(backend):
    # backend = "www.oldboy.org"
    with open("haproxy", 'r', encoding="utf-8") as f:
        result = []
        flag = False
        for line in f:
            if line.strip().startswith("backend") and line.strip() == "backend " + backend:
                print("当前所在backend %s 开头" % backend)
                flag = True
                continue  # 表示下面的不执行,进入下次迭代,不过修改了flag = True
            if line.strip().startswith("backend") and flag:
                print("读到下个backend了")
                break
            if not line.strip() and flag:
                print("读到了空白行")
                break
            if flag and line.strip():
                print("读到server了")
                result.append(line.strip())
    return result


def add_backend(backend, record):
    read_result = fetch(backend)
    # backend不存在
    if not read_result:
        print("正增加新backend...")
        with open("haproxy", 'r', encoding='utf-8') as old_f, open("haproxy_new", 'w', encoding='utf-8') as new_f:
            for line in old_f:
                new_f.write(line)
            new_f.write("\n{}\n".format(backend))
            new_f.write(record)
    else:
        # backend已存在
        print("backend已存在")
        if record.strip() in read_result:
            # backend 和 record 都已存在
            print("backend 和 record 都已存在")
            shutil.copy("haproxy", 'haproxy_new')  # 拷贝一份
        else:
            # backend存在,但record不存在
            print("backend存在,但record不存在")
            read_result.append(record.strip())
            flag = False
            with open("haproxy", 'r', encoding='utf-8') as old_f, open("haproxy_new", 'w', encoding='utf-8') as new_f:
                for line in old_f:
                    if line.strip() == "backend " + backend and line.strip().startswith("backend"):
                        print("-->>当前所在backend %s 开头" % backend)
                        flag = True
                        new_f.write(line)
                        for new_record in read_result:
                            new_f.write("{}{}\n".format(" " * 8, new_record))
                        continue  # 表示记录了当前行,跳过下面语句,否则会重写一行
                    if flag and not line.strip():
                        flag = False
                        print("-->>读到空白了")
                        new_f.write(line)
                        continue
                    if not flag:
                        print("-->>读到其他")
                        new_f.write(line)


command = input("命令:\n1、获取ha记录\n2、增加ha记录\n3、删除ha记录")
if command == "1":
    put_backend = input("请输入要获取的backend:")  # backend = "www.oldboy.org" "buy.oldboy.org"
    ret = fetch(put_backend)
    print("\n".join(ret))
elif command == "2":
    # {"backend": "test.oldboy.org","record":{"server": "100.1.7.9 100.1.7.90","weight": 20,"maxconn": 30}}
    # {"backend": "www.oldboy.org","record":{"server": "100.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}}
    # {"backend": "www.oldboy.org","record":{"server": "110.1.7.10 110.1.7.9","weight": 20,"maxconn": 3000}}
    # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.90 100.1.7.90","weight": 20,"maxconn": 3000}}
    # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.100 100.1.7.100","weight": 20,"maxconn": 3000}}
    put_backend = input("请输入要增加的backend:")
    dict_backend = json.loads(put_backend)  # str转换为字典
    bk = dict_backend['backend']
    rd = "{}server {} weight {} maxconn {}".format(" " * 8, dict_backend['record']['server'],
                                                   dict_backend['record']['weight'],
                                                   dict_backend['record']['maxconn'])
    add_backend(bk, rd)

实践三

特点是,增加backend时不需要用到fecth进行全部的扫描,只需要读一行,判断一行,写一行。

import json
import shutil


def fetch(backend):
    # backend = "www.oldboy.org"
    with open("haproxy", 'r', encoding="utf-8") as f:
        result = []
        flag = False
        for line in f:
            if line.strip().startswith("backend") and line.strip() == "backend " + backend:
                print("当前所在backend %s 开头" % backend)
                flag = True
                continue  # 表示下面的不执行,进入下次迭代,不过修改了flag = True
            if line.strip().startswith("backend") and flag:
                print("读到下个backend了")
                break
            if not line.strip() and flag:
                print("读到了空白行")
                break
            if flag and line.strip():
                print("读到server了")
                result.append(line.strip())
    return result


def add2(backend, record):
    with open('haproxy', 'r', encoding='utf-8') as old, open('new.conf', 'w', encoding='utf-8') as new:
        in_backend = False
        has_backend = False
        has_record = False
        for line in old:
            if line.strip().startswith('backend') and line.strip() == "backend " + backend:
                print("已存在backend")
                has_backend = True
                in_backend = True
                new.write(line)
                continue

            if in_backend and not line.strip():
                print("in_backend的结尾为空白行")
                if not has_record:
                    print("没有record")
                    new.write(record + '\n')  # 先写record,
                new.write(line)  # 再写当前的空白行
                in_backend = False
                continue

            if in_backend and line.strip() == record.strip():
                print("backend和record都已存在")
                has_record = True
                new.write(line)
                continue

            new.write(line)

        if not has_backend:
            # 写backend,写record
            print("backend不存在,正在增加...")
            new.write('\nbackend ' + backend + '\n')
            new.write(record + '\n')


command = input("命令:\n1、获取ha记录\n2、增加ha记录\n3、删除ha记录")
if command == "1":
    put_backend = input("请输入要获取的backend:")  # backend = "www.oldboy.org" "buy.oldboy.org"
    ret = fetch(put_backend)
    print("\n".join(ret))
elif command == "2":
    # {"backend": "test.oldboy.org","record":{"server": "100.1.7.9 100.1.7.90","weight": 20,"maxconn": 30}}
    # {"backend": "www.oldboy.org","record":{"server": "100.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}}
    # {"backend": "www.oldboy.org","record":{"server": "110.1.7.10 110.1.7.9","weight": 20,"maxconn": 3000}}
    # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.90 100.1.7.90","weight": 20,"maxconn": 3000}}
    # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.100 100.1.7.100","weight": 20,"maxconn": 3000}}
    put_backend = input("请输入要增加的backend:")
    dict_backend = json.loads(put_backend)  # str转换为字典
    bk = dict_backend['backend']
    rd = "{}server {} weight {} maxconn {}".format(" " * 8, dict_backend['record']['server'],
                                                   dict_backend['record']['weight'],
                                                   dict_backend['record']['maxconn'])
    add2(bk, rd)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何以问天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值