zoukankan      html  css  js  c++  java
  • 修改haproxy配置文件

    需求:

    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、输入是字典模式的字符串,需要把字符串转换为字典,对字典进行处理
    2、对文件进行copy,读取,覆盖写操作,还要设置标志,进行区分处理
    3、函数的调用

    功能查:
    def fetch(backend):
    #取出backend相关的server信息
    result = [] #定义结果列表
    with open("haproxy","r",encoding="utf-8") as f: #循环读取文件
    flag = False #标记为假
    for line in f :
    #以backend开头
    line = line.strip()
    if line.startswith("backend") and line == "backend %s" %backend:
    flag = True #读取到backend开头的信息,标记为真
    continue #直接返回到for语句
    #如果遇到下一个backend开头的语句,直接break跳出for语句,因为数据拿完了
    if flag and line.startswith("backend"):
    flag = False
    break
    #server信息添加到result列表
    if flag and line.strip():
    result.append(line)
    return result

    实现代码:
    import shutil
    import json

    def list_function():
    print("Please choice the ID of a action.".center(50,"#"))# 50g个字符,提示在中间,不够的#补足
    print("【1】.Fetch haproxy backend infomation.")
    print("【2】.Add haproxy backend infomation.")
    print("【3】.Delete haproxy backend infomation.")
    print("【q】.Delete haproxy backend infomation.")
    def fetch(backend):
    #取出backend相关的server信息
    result = [] #定义结果列表
    with open("haproxy","r",encoding="utf-8") as f: #循环读取文件
    flag = False #标记为假
    for line in f :
    #以backend开头
    line = line.strip()
    if line.startswith("backend") and line == "backend %s" %backend:
    flag = True #读取到backend开头的信息,标记为真
    continue #直接返回到for语句
    #如果遇到下一个backend开头的语句,直接break跳出for语句,因为数据拿完了
    if flag and line.startswith("backend"):
    flag = False
    break
    #server信息添加到result列表
    if flag and line.strip():
    result.append(line)
    return result

    def writer(backend,record_list):
    with open("haproxy","r") as old,open("haproxy_new","w") as new:
    flag = False
    for line in old:
    if line == "backend %s " %backend:
    flag = True
    new.write(line)
    for new_line in record_list:
    new.write(""*4 + new_line + " ")
    continue
    if flag and line.strip().startswith("backend"):
    flag = False
    new.write(line)
    continue #跳到下一次循环,防止backend写两次
    if line.strip() and not flag:
    new.write(line)

    def add(backend, record):
    global change_flag
    record_list = fetch(backend) #查找是否存在backend
    if not record_list and record_list != []: #backend不存在同时record_list是空列表
    with open('haproxy','r') as old, open("haproxy_new",'w') as new:
    for line in old:
    new.write(line)
    new.write(" backend " + backend + " ")
    new.write(" "*4 + record + " ")
    print("33[32;1mAdd done33[0m")
    change_flag = True
    else: #backend存在
    if record in record_list:
    print("Record already in it,Nothing to do!")
    change_flag = False
    else: #backend存在,record不存在
    record_list.append(record)
    writer(backend,record_list)
    print("33[32;1mAdd done33[0m")
    change_flag = True

    def delete(backend, record):
    global change_flag
    record_list = fetch(backend)
    if not record_list:
    print("Not match the backend,no need delete!".center(50,"#"))
    else:
    if record in record_list:
    record_list.remove(record)
    writer(backend,record_list) #写入
    print("33[31;1mDelete done33[0m")
    change_flag = True
    else: #backend存在,record不存在
    print("Only math backend,no need delete!".center(50,"#"))
    change_flag = False
    return change_flag

    def output(servers):
    #输出指定backend的server信息
    print("Match the server info:".center(50,"#"))
    for server in servers:
    print("33[32;1m%s33[0m" % server)
    print("#".center(50,"#"))

    def operate(action):
    global change_flag
    if action == "fetch":
    backend_info = input("Input backend info:")
    result = fetch(backend_info) #取出backend信息
    if result:
    output(result) #输出获取到的server信息
    else:
    print("33[31;1mNot a match is found!33[0m")
    elif action is None:
    print("33[31;1mNothing to do!33[0m")
    else:
    backend_record = input("Input backend info(dict):") # 输入的是字符串,
    backend_record_dict = eval(backend_record)
    backend = backend_record_dict['backend']
    record = backend_record_dict['record']
    record = "server %s %s weight %s maxconn %s" % (record['server'], record['server'],
    record['weight'], record['maxconn'])
    if action == "add":
    add(backend,record)
    elif action == "delete":
    delete(backend,record)
    if change_flag is True: #文件有修改,才进行文件更新
    shutil.copy("haproxy","haproxy_old")
    shutil.copy("haproxy_new","haproxy")
    result = fetch(backend)
    output(result) #输出获取到的server信息

    def judge_input():
    #判断输入功能编号,执行相应步骤
    input_info = input("Your input number:").strip()
    if input_info == "1": #查询指定backend记录
    action = "fetch"
    elif input_info == "2":
    action = "add"
    elif input_info == "3":
    action = "delete"
    elif input_info == "q" or input_info == "quit":
    exit("Bye,thanks!".center(50,"#"))
    else:
    print("33[31;1mInput error!33[0m")
    action = None
    return action

    def main():
    exit_flag = False
    while exit_flag is not True:
    global change_flag
    change_flag = False
    list_function()
    action = judge_input()
    operate(action)

    if __name__ == '__main__':
    main()
  • 相关阅读:
    SOA简介
    WebService传XML
    架构设计师与SOA(转)
    第二次自己总结WebService
    SQL SERVER的数据类型
    使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法
    写了一个分页存储过程把总记录数也写到返回表的每行了
    ASP.net新手经常会碰到的问题
    动态添加、删除附件
    七问七答 SOA
  • 原文地址:https://www.cnblogs.com/qianyuyu/p/9593915.html
Copyright © 2011-2022 走看看