文件操作实践(一)

xiaoxiao2021-02-27  234

简介

利用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)
转载请注明原文地址: https://www.6miu.com/read-12227.html

最新回复(0)