要求:

1. 根据用户输入输出对应的backend下的server信息
2. 可添加backend 和sever信息
3. 可修改backend 和sever信息
4. 可删除backend 和sever信息
5. 操作配置文件前进行备份
6 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建;若信息与已有信息重复则不操作

 

文件内容:

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
		server 100.1.7.99 100.1.7.99 weight 20 maxconn 30
        use_backend www.oldboy.org if www
		server 100.1.7.99 100.1.7.99 weight 20 maxconn 30

backend www.oldboy.org
		server 100.1.7.99 100.1.7.99 weight 20 maxconn 30

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

代码:

import json
import os


def index(file):
    # 输出backend
    with open(file) as f:
        print_flag = False
        for i in f.readlines():
            line = i.strip('\n')
            if line.startswith('backend'):
                print(line)
                print_flag = True
            elif print_flag:
                print(line)
            elif print_flag:
                print('未找到配置!')


def bak():
    os.rename('ha.ini', 'ha.ini.l')
    os.rename('ha.ini.bak', 'ha.ini')
    os.rename('ha.ini.l', 'ha.ini.bak')


def select(backend_name):
    """
    用于查询配置文件backend信息
    :param backend_name:
    :return:
    """
    start = 0    # 找到所要查找的内容,置为1
    p_list = []  # 保存已查询到的内容
    with open('ha.ini') as fy:
        for i in fy:
            if i.startswith('backend') and start == 0:
                if backend_name in i:
                    start = 1
                    print('所查询的backend为:{}'.format(i))
                    continue
            elif i.startswith('\t') and start == 1:
                p_list.append(i)
            elif i.startswith('backend') and start == 1:
                break
        if start == 0:
            print('未找到配置!')
        elif start == 1:
            print('所查找的配置为:')
            for i in p_list:
                print(i.strip('\n'))


def insert(backend_name):
    """
    用于插入backend配置信息
    :param backend_name:输入的backend信息
    :return:
    """
    inp_dict = json.loads(backend_name)
    b_exs = 0    # 要插入的back是否已经存在,默认为否
    r_exs = 0    # 要插入的record是否已经存在,默认为否
    with open('ha.ini') as fy, open('ha.ini.bak', 'w') as fb:
        server, weight, maxconn = inp_dict['record']['server'], inp_dict['record']['weight'], inp_dict['record']['maxconn']
        for i in fy:
            if inp_dict['backend'] in i:
                b_exs = 1
                fb.write(i)
                fb.write('\t\tserver %s %s weight %s maxconn %s\n' % (server, server, weight, maxconn))
            elif i.startswith('\t') and b_exs == 1:
                a, b, c = str(server), str(weight), str(maxconn)
                if a not in i or b not in i or c not in i:
                    fb.write(i)
                elif a in i or b in i or c in i:
                    r_exs = 1
                    print('配置已存在!')
            elif i.startswith('backend'):
                b_exs = 2
                fb.write(i)
            else:
                fb.write(i)
        if r_exs == 0 and b_exs == 1:
            print('配置插入成功!')

        if b_exs == 2 or b_exs == 0:
            fb.write('\nbackend %s\n' % inp_dict['backend'])
            fb.write('\t\tserver %s %s weight %s maxconn %s\n' %
                     (inp_dict['record']['server'], inp_dict['record']['server'],
                      inp_dict['record']['weight'], inp_dict['record']['maxconn']))
            print('配置插入成功!')
    bak()


def delete(backend_name):
    """
    用于删除backend配置信息
    :param backend_name:
    :return:
    """
    inp_dict = json.loads(backend_name)
    b_is_exs = 0    # 标识backend是否存在,存在置为1
    s_is_exs = 0    # 记录backend下的配置存在的条数
    d_suc = 0       # 删除成功置为1
    with open('ha.ini') as fy, open('ha.ini.bak', 'w') as fb:
        for i in fy:
            if inp_dict['backend'] in i:
                b_is_exs = 1
                fb.write(i)
            elif i.startswith('\t') and b_is_exs == 1:
                s_is_exs += 1
                a, b, c = str(inp_dict['record']['server']), str(inp_dict['record']['weight']), str(inp_dict['record']['maxconn'])
                if a in i and b in i and c in i:
                    d_suc = 1
                else:
                    fb.write(i)
            elif i.startswith('backend'):
                b_is_exs = 2
                fb.write(i)
            else:
                fb.write(i)
        if b_is_exs == 0:
            print('未找到要删除的配置!')
        if d_suc == 1:
            print('配置已删除!')
    bak()

    if s_is_exs == 1 and d_suc == 1:    # 通过第二次循环把没有配置项的backend删除
        with open('ha.ini') as fy, open('ha.ini.bak', 'w') as fb:
            for i in fy:
                if i.startswith('backend') and inp_dict['backend'] in i:
                    pass
                else:
                    fb.write(i)
        bak()

    with open('ha.ini.bak', 'a') as fr:
        fr.write('\t\tserver %s %s weight %s maxconn %s\n' %
                 (inp_dict['record']['server'], inp_dict['record']['server'],
                  inp_dict['record']['weight'], inp_dict['record']['maxconn']))


def main():
    """
    主调用函数
    :return:
    """
    print('原文件backend内容:')
    index('ha.ini')
    print("""请选择操作:
    1、获取ha记录
    2、增加ha记录
    3、删除ha记录
    4、退出
    """)
    choice_flag = True
    while choice_flag:
        choice = input('请输入操作序号:').strip()
        if choice == '1':
            r = input('请输入backend:').strip()
            select(r)
        elif choice == '2':
            i = input('请输入要新加的记录:').strip()
            insert(i)
        elif choice == '3':
            i = input('请输入要删除的记录:').strip()
            delete(i)
        elif choice == '4':
            break
        else:
            print('请正确选择!')


if __name__ == '__main__':
    main()