KillPython  

1.需求

HAproxy配置文件操作

根据用户输入,输出对应的backend下的server信息
可添加backend 和sever信息
可修改backend 和sever信息
可删除backend 和sever信息
操作配置文件前进行备份

2.流程图

3.代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author Kevin Liu
import json
import shutil

def input_check(s):
    """
    检查用户输入是否是数字
    :param s:用户输入
    :return:返回用户选择
    """
    if str.isdigit(s):
        s = int(s)
    return s

def fetch(backend):     #取出配置文件的匹配信息
    result = []  #把返回值取到这个列表
    with open("conf","r") as f:
        flag = False
        for line in f:    #一次读取一行文件内容
            #如果找到的不是空行而且是以"backend"开头,而且内容是"backend +用户输入,就是找到了配置项,"backend "这里有个空格
            if line.strip().startswith("backend") and line.strip() == "backend " + backend:
                flag = True
                #找到了backend 可以跳出本次循环,需要取出backend后面的配置项
                continue
            if flag and line.strip().startswith("backend"):
                #找到第二个backend,则可以退出了
                flag = False
                break
            if flag and line.strip():
                #如果flag是真,并且不是空行,就把内容写入result
                result.append(line.strip())
            #print(result)
    return result

def delete(backend,record):
    """
    删除函数
    :param backend:需要删除的配置项
    :param record: 需要删除的记录
    :return:
    """
    global delete_flag   #删除标记,用户控制是否删除
    record_list = fetch(backend)  #先用fetch找到需要删除的地方
    if not record_list:
        print(("没有找到需要删除的项。").center(50,"*"))
        delete_flag = False    #没有找到需要删除的对象,所以标记为假
    else:
        if record in record_list:    #找到了删除的backend和record,执行删除
            record_list.remove(record)
            print("\033[31;已经删除完成\033[0m")
            delete_flag = True       #删除标记设为真
        else:
            print(("配置项下没有没有可以删除的记录").center(50,"*"))   #找到了backend,但是没有找到record,也不删除
            delete_flag = False
    return delete_flag    #返回是否删除

def modify(backend,record_list):
    """
    修改配置文件函数
    :param backend:需要修改的配置项
    :param record_list: 需要修改的记录
    :return: 没有返回值
    """
    with open("conf",'r') as old,open("new",'w') as new:
        #打开2个配置文件,把修改record写入新配置文件
        flag = False
        for line in old:
            #找到需要修改的配置项
            if line.strip().startswith("backend") and line.strip() == "backend " + backend:
                flag = True
                new.write(line)
                #先写入record
                for new_line in record_list:
                    #写入需要修改的recored
                    new.write(" " * 6 + new_line + "\n")

                continue   #跳出本次循环,继续查找下一个backend下面的record
            #找到下一个backend
            if flag and line.strip().startswith("backend"):
                #写入backend后面的record
                flag = False
                new.write(line)
                continue
            if not flag and line.strip():
                #写入配置文件剩下的内容
                new.write(line)

def add(backend,record):
    """
    增加函数
    :param backend:需要增加的配置项
    :param record: 需要增加的record
    :return: 没有返回值
    """
    #先找到需要增加的配置项backend
    record_list = fetch(backend)
    #如果record不存在,而且backend也不存在
    if not record_list:
        with open("conf","r") as old,open("new","w")as new:
            for line in old:
                #备份配置文件
                new.write(line)
            #写入配置项和record
            new.write("\nbackend " + backend + "\n")
            new.write(" " * 6 + record + "\n")
        print("\033[32;1m添加完成\033[0m")

    else:
        #backend 存在 record也存在
        if record in record_list:
            print("\033[31;1m记录已经存在,无需添加\033[0m")
        else: #backend存在,record不存在,则追加记录,并调用modify函数修改完成
            record_list.append(record)
            modify(backend,record_list)
            print("\033[32;1m添加完成\033[0m")

def input_json():
    """
    判断用户输入是否是json格式
    :return: 返回配置项的字典值
    """
    flag = False
    while flag is not True:
        backend = input("输入配置文件信息").strip()
        try:
            backend_dict = json.loads(backend)
        except Exception as e:
            print("请输入json格式")
            continue
        flag = True
    return backend_dict

def input_judge():
    """
    用户输入判断函数
    :return: 根据用户输入返回对应的函数值
    """
    input_str = input("输入数字选择:").strip()
    if input_str == "1":
        func = "fetch"
    elif input_str == "2":
        func = "add"
    elif input_str == "3":
        func = "delete"
    elif input_str == "q" or input_str == "quit":
        exit(("拜拜!").center(50,'*'))
    else:
        print("输入有误,再来")
        func = None
    return func

def operation(action):
    """
    操作函数,再用户输入完成后调用对应的函数
    :param action: 根据input_judge的返回值输入
    :return: 没有返回值
    """
    global change_flag
    if action == "fetch":
        backend_info = input("输入需要操作的配置项").strip()
        #查找配置项信息
        result = fetch(backend_info)
        #找到了
        if result:
            output(result)
        else:
            print("没有找到匹配项")
    elif action is None:
        print("没有任何输入!")
    else:
        #获取输入字典值
        backend_record_dict = input_json()  #对输入是不是json格式判断
        for key in backend_record_dict:
            backend = key
            record = backend_record_dict[key]
            if action == "add":
                add(backend,record)
            elif action == "delete":
                delete(backend,record)

        if change_flag is True:
            shutil.copy("conf","old")
            shutil.copy("new","conf")
            result = fetch(backend)
            output(result)

def list():
    """
    用户ui接口函数
    :return: 没有返回值
    """
    print("选择一个需要的操作".center(60,"*"))
    print("【1】查找配置项信息")
    print("【2】增加配置项信息")
    print("【3】删除配置项信息")
    print("-".center(60,"-"))

def output(servers):
    """
    输出record的内容信息
    :param servers: record列表
    :return:
    """
    print("匹配到的配置项信息:".center(60,"*"))
    for server in servers:
        print("%s" % server)
    print("*".center(60,"*"))

def main():
    """
    主函数入口
    :return:
    """
    exit_flag = False
    while exit_flag is not True:
        global change_flag
        change_flag = False
        list()
        action = input_judge()
        operation(action)

main()

  

posted on 2017-02-14 14:51  KillPython  阅读(114)  评论(0编辑  收藏  举报