文件操作实践(一)

来源:互联网 发布:恢复删除照片软件 编辑:程序博客网 时间:2024/06/06 13:05

简介

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

文件内容

global               log 127.0.0.1 local2        daemon        maxconn 256        log 127.0.0.1 local2 infodefaults        log global        mode http        timeout connect 5000ms        timeout client 50000ms        timeout server 50000ms        option  dontlognulllisten stats :8888        stats enable        stats uri       /admin        stats auth      admin:1234frontend 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 wwwbackend 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 3000backend buy.oldboy.org        server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000原配置文件如上现增加ha配置文件为:

实践一

import jsondef 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 resultdef 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_strwith 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 jsonimport shutildef 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 resultdef 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 jsonimport shutildef 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 resultdef 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)
原创粉丝点击