Пример #1
0
 def __init__(self, file):
     self.__conffile = file
     self.__conffile_bak = '%s%s' %(file, '.new')
     self.__read_helper = MyFileHelper(self.__conffile)
     self.__write_helper = MyFileHelper(self.__conffile_bak)
     self.__all = self.__read_helper.get_all()
     self.__backends = self.__get_backends() # 保存从文件读出来的backend信息
Пример #2
0
 def __init__(self, file):
     self.__conffile = file
     self.__conffile_bak = '%s%s' % (file, '.new')
     self.__read_helper = MyFileHelper(self.__conffile)
     self.__write_helper = MyFileHelper(self.__conffile_bak)
     self.__all = self.__read_helper.get_all()
     self.__backends = self.__get_backends()  # 保存从文件读出来的backend信息
Пример #3
0
 def __init__(self, file):
     '''
     客户类构造方法
     :param file: 客户信息文件地址
     :return: 客户类
     '''
     self.__helper = MyFileHelper(file)  # 初始化文件helper
     self.__password_col_num = 1  # 定义密码所在的列
     self.__status_col_num = 2  # 定义客户状态所在的列
     self.__error_count_num = 3  # 定义最多可以操作错误的次数所在的列
     self.__balance_col_num = 4  # 定义余额所在的列
     self.__error_count_max = conf.error_count_max  # 从配置文件读取最多可以输入错误多少次
     self.__current_customer_info = {}  # 初始化当前用户信息
Пример #4
0
    def __init__(self, file):
        '''
        构造方法
        :param file: 商品信息文件地址
        :return: 商品对象
        '''
        self.__helper = MyFileHelper(file)  # 获取商品的文件helper
        #self.__all_goods = self.__helper.getlist() # 通过调用文件helper的getlist方法获取所有商品
        self.__all_goods_list = []  # 初始话所有商品信息的列表,每个元素是一个列表
        self.__shopping_cart = []  # 初始化购物车列表

        for goods in self.__helper.getlist():  # 遍历商品列表
            temp_dict = {}  # 定义临时列表
            temp_dict['id'] = goods[0]
            temp_dict['name'] = goods[1]
            temp_dict['price'] = goods[2]
            temp_dict['class'] = goods[3]

            self.__all_goods_list.append(temp_dict)  # 将临时字典追加到商品信息中
Пример #5
0
 def __init__(self, file):
     '''
     客户类构造方法
     :param file: 客户信息文件地址
     :return: 客户类
     '''
     self.__helper = MyFileHelper(file) # 初始化文件helper
     self.__password_col_num = 1 # 定义密码所在的列
     self.__status_col_num = 2 # 定义客户状态所在的列
     self.__error_count_num = 3 # 定义最多可以操作错误的次数所在的列
     self.__balance_col_num = 4 # 定义余额所在的列
     self.__error_count_max = conf.error_count_max # 从配置文件读取最多可以输入错误多少次
     self.__current_customer_info = {} # 初始化当前用户信息
Пример #6
0
    def __init__(self, file):
        """
        构造方法
        :param file: 商品信息文件地址
        :return: 商品对象
        """
        self.__helper = MyFileHelper(file)  # 获取商品的文件helper
        # self.__all_goods = self.__helper.getlist() # 通过调用文件helper的getlist方法获取所有商品
        self.__all_goods_list = []  # 初始话所有商品信息的列表,每个元素是一个列表
        self.__shopping_cart = []  # 初始化购物车列表

        for goods in self.__helper.getlist():  # 遍历商品列表
            temp_dict = {}  # 定义临时列表
            temp_dict["id"] = goods[0]
            temp_dict["name"] = goods[1]
            temp_dict["price"] = goods[2]
            temp_dict["class"] = goods[3]

            self.__all_goods_list.append(temp_dict)  # 将临时字典追加到商品信息中
Пример #7
0
class goods(object):
    def __init__(self, file):
        """
        构造方法
        :param file: 商品信息文件地址
        :return: 商品对象
        """
        self.__helper = MyFileHelper(file)  # 获取商品的文件helper
        # self.__all_goods = self.__helper.getlist() # 通过调用文件helper的getlist方法获取所有商品
        self.__all_goods_list = []  # 初始话所有商品信息的列表,每个元素是一个列表
        self.__shopping_cart = []  # 初始化购物车列表

        for goods in self.__helper.getlist():  # 遍历商品列表
            temp_dict = {}  # 定义临时列表
            temp_dict["id"] = goods[0]
            temp_dict["name"] = goods[1]
            temp_dict["price"] = goods[2]
            temp_dict["class"] = goods[3]

            self.__all_goods_list.append(temp_dict)  # 将临时字典追加到商品信息中

    # def getfile(self):
    #     return  self.__helper.getfile()

    def get_all_list(self):
        """
        获取所有商品信息方法
        :return: 返回所有商品信息
        """
        return self.__all_goods_list

    def add_to_shopping_cart(self, gid):
        """
        添加购物车方法
        :param gid: 商品id
        :return: 无
        """
        temp_dict = {}
        for one_goods in self.__shopping_cart:  # 遍历所有购物车的商品
            if one_goods["id"] == gid:  # 判断是否存在商品
                one_goods["num"] += 1  # 数量加1
                one_goods["subtotal"] += int(one_goods["price"])  # 小计累加
                break  # 退出遍历
        else:
            # 正常遍历结束,说明商品不存在于购物车内
            # 将历史字典用于保存购物车一个条目
            temp_dict["id"] = gid
            temp_dict["name"] = self.__all_goods_list[int(gid) - 1]["name"]
            temp_dict["price"] = int(self.__all_goods_list[int(gid) - 1]["price"])
            temp_dict["num"] = 1
            temp_dict["subtotal"] = temp_dict["price"]
            self.__shopping_cart.append(temp_dict)  # 降临时字典最佳到购物车列表

    def get_shopping_gid(self):
        """
        获取购物车商品id方法
        :return: 返回购物车内商品的id列表
        """
        gid_list = []
        for one_goods in self.__shopping_cart:  # 遍历购物车条目
            gid_list.append(one_goods["id"])  # 将购物车条目的商品id追加到列表
        return gid_list

    def del_goods_from_cart(self, gid):
        """
        删除购物车商品方法
        :param gid: 要删除的商品id
        :return: 无
        """
        for one_goods in self.__shopping_cart:  # 遍历购物车
            if one_goods["id"] == gid:  # 判断是否id是否等于要删除商品的id
                if one_goods["num"] == 1:  # 判断是否只剩1件
                    # 只剩在1件
                    self.__shopping_cart.remove(one_goods)  # 删除整个条目
                    break
                else:
                    # 否则就是剩余多件
                    one_goods["num"] -= 1  # 商品数量减1
                    one_goods["subtotal"] -= int(one_goods["price"])  # 小计递减
                    break
        else:
            print("输入错误或商品编号不存在")

    def get_shopping_cart(self):
        """
        获取购物车所有信息列表
        :return: 返回购物车列表
        """
        return self.__shopping_cart

    def del_all_cart(self):
        """
        清空购物车方法
        :return: 无
        """
        self.__shopping_cart = []
Пример #8
0
class haproxy(object):
    def __init__(self, file):
        self.__conffile = file
        self.__conffile_bak = '%s%s' % (file, '.new')
        self.__read_helper = MyFileHelper(self.__conffile)
        self.__write_helper = MyFileHelper(self.__conffile_bak)
        self.__all = self.__read_helper.get_all()
        self.__backends = self.__get_backends()  # 保存从文件读出来的backend信息

    def getfile(self):
        return self.__helper.getfile()

    def get_conf(self):
        return self.__helper.get_all()

    def __get_backends(self):
        '''
        读取配置文件,从配置文件中读出backend节点的配置,并保存成有序字典
        :return: 返回处理后的backends列表
        '''
        #all_lines = self.__helper.get_all() # 调用helper的get_all()方法将配置文件全部出来
        all_lines = self.__all
        backends_list = []  # 定义用来保存所有backend信息的空列表
        for line in all_lines:  # 遍历每一行
            line = line.strip()
            if line.startswith('backend'):  # 判断是否是backend开头
                backend_name = line.split()[1]  # 获取到backend名称
                temp_dict = collections.OrderedDict()  # 创建用来保存backend信息的空的有序字典
                temp_dict['backend'] = backend_name
                temp_dict['record'] = []  # 创建用来保存每个record信息的空列表
                backends_list.append(temp_dict)  # 将backend信息追加到列表

            if line.startswith(
                    'server'):  # 通过判断是否为server开头判断是否是backend下面的一条记录record
                tmp_list = line.split()  # 将record记录通过空格拆分
                tmp_dic = collections.OrderedDict()  # 创建用来保存record信息的空有序字典
                tmp_dic['server'] = tmp_list[2]  # 保存record名称
                for i in range(3, len(tmp_list), 2):
                    tmp_dic[tmp_list[i]] = tmp_list[i + 1]  # 保存recordoptions信息
                temp_dict['record'].append(tmp_dic)  # record最佳到后record列表
        return backends_list

    def get_backend(self, backend_name):
        '''
        通过backdend名获取backend信息
        :param backend_name: backend名称
        :return: 如果存在返回所有backend的record信息,如果没有找到返回空字典
        '''
        backends = self.__backends  # 获取所有backend信息
        #print(backends)
        for backend in backends:  # 遍历所有backend
            if backend[
                    'backend'] == backend_name:  # 如果找到名称相同的返回该backend下面的record信息
                return backend['record']
        else:
            return {}  # 如果没有找到返回空的字典

    def check_record_option_key(self, op_keys):
        '''
        检查新添加的添加、删除、修改等操作的record的options选项是否合法
        :param op_keys: 欲添加、删除、修改record所有的选项名称,包括server
        :return: 布尔值,如果合法返回True,否则返回Fasle
        '''
        # 通过差集判断是否存在配置文件conf.py中未定义的合法字段、另外必须包含'server'
        return not (set(list(op_keys)).difference(set(conf.record_op_list))
                    or 'server' not in op_keys)

    def check_record_option_type(self, records):
        '''
        检查新添加的添加、删除、修改等操作的record的options选项参数类型是否符合合法
        :param records: 欲添加、删除、修改record所有的选项的参数说着说值,不包括server
        :return: 布尔值,如果合法返回True,如果不合法返回False
        '''
        for key in records.keys():  # 遍历所有options的参数
            #print(type(conf.record_op[key]), type(records[key]))
            if type(conf.record_op[key]) != type(
                    records[key]):  # 对比参数类型,如果不合法返回Fasle
                return False
        return True  # 如果遍历没有返回False说明合法,返回True

    def check_ip(self, ip_str):
        '''
        判断server参数的ip地址是否合法
        :param ip_str: ip地址
        :return: 布尔值,如果合法返回True,如果不合法返回False
        '''
        #res = re.match('(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$',ip_str) # 通过正则表达式判断ip地址是否合法

        return re.match(
            '(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$',
            str(ip_str))  # 通过正则表达式判断ip地址是否合法

    def add_record(self, backend_name, record):
        '''
        添加
        :param backend_name: backend名称,表示要添加到该backend下
        :param record: # record字典
        :return:
        '''
        backends = self.__backends
        for backend in backends:  # 遍历backend列表
            if backend['backend'] == backend_name:  # 判断backend是否存在
                # 存在执行
                for rec in backend['record']:  # 遍历所哟record
                    if rec['server'] == record[
                            'server']:  # 通过server的ip的地址判断该记录是否存在
                        backend['record'][backend['record'].index(
                            rec)] = record  # 如果存在,覆盖
                        #rec = record
                        break
                else:
                    backend['backend'].append(record)  # 如果不存在,追加到后面
                break
        else:
            # 如果backend不存在
            tmp_dict = collections.OrderedDict()  # 创建一个空有序字典用来保存新的backend信息
            tmp_dict['backend'] = backend_name
            tmp_dict['record'] = [record]
            backends.append(tmp_dict)  # 将构建的backend追加到后面

    def get_backends(self):
        '''
        获取所有backend信息
        :return: 返回所有backend列表
        '''
        return self.__backends

    def del_record(self, backend_name, server_name):
        '''
        删除backend下面的record
        :param backend_name: backend名称
        :param server_name: record下的server的值,也就是ip地址
        :return: 布尔值,是否删除成功
        '''
        records = self.get_backend(backend_name)  # 获取backend的所有记录
        if records:  # 获取的不为空执行
            for record in records:  # 遍历所有record
                if record['server'] == server_name:  # 判断是否是要删除的记录
                    records.remove(record)  # 如果是移除
                    #print(records)
                    if not records:  # 判断移除后是不是为空
                        # 如果为空删除backend
                        for backend in self.__backends:  # 遍历所有backend
                            if backend[
                                    'backend'] == backend_name:  # 判断是否为要删除的backend
                                self.__backends.remove(backend)  # 移除backend
                                break
                    return True
        return False
        #print(1)

    def write_to_file(self, backend_str):
        '''
        写入文件
        :return: 写入成功返回True
        '''
        import os
        import datetime
        #file_str = conf.conf_model.format(backends = backend_str)
        #for line in self.__all
        has_write = False  # 定义表示符,用来判断backend是否写入到文件
        file_str = ''  # 初始化文件的内容
        for line in self.__all:  # 遍历源haproxy配置文件的所有行
            if line.strip().startswith('backend') or line.strip().startswith(
                    'server'):  # 判断开头是否为backend或server

                if has_write:  # 判断是否已经写过backend
                    continue
                else:
                    file_str = '%s%s' % (file_str, backend_str
                                         )  # 如果没写过,将当前backend所有信息写入到文件
                    #print(backend_str)
                    has_write = True  # 将标识符改为Ture,说明backend已经全部写完了
            else:
                file_str = '%s%s' % (file_str, line)
                #print(line)
        # print(file_str)
        if self.__write_helper.write_all(file_str):
            # 文件完后,将当前ha_proxy文件用刚才写入的文件替换并备份
            os.rename(
                self.__conffile, '.'.join([
                    self.__conffile,
                    datetime.datetime.now().strftime('%Y%m%d%H%M%S')
                ]))
            # print(''.join([self.__conffile, datetime.datetime.now().strftime('%Y%m%d%H%M%S') ]))
            os.rename(self.__conffile_bak, self.__conffile)
            return True
        else:
            return False
Пример #9
0
class customer(object):  # 定义客户类
    def __init__(self, file):
        '''
        客户类构造方法
        :param file: 客户信息文件地址
        :return: 客户类
        '''
        self.__helper = MyFileHelper(file)  # 初始化文件helper
        self.__password_col_num = 1  # 定义密码所在的列
        self.__status_col_num = 2  # 定义客户状态所在的列
        self.__error_count_num = 3  # 定义最多可以操作错误的次数所在的列
        self.__balance_col_num = 4  # 定义余额所在的列
        self.__error_count_max = conf.error_count_max  # 从配置文件读取最多可以输入错误多少次
        self.__current_customer_info = {}  # 初始化当前用户信息

    def __get_customer_list(self):
        '''
        定义私有方法获取所有客户信息
        :return: 返回所有客户信息
        '''
        return self.__helper.getdict()  # 调用文件helper的getdict方法获取所有用户信息,并返回

    def __customer_list_to_file(self):
        '''
        定义私有方法,将所有客户信息写入到文件
        :return:无
        '''
        self.__helper.dict_to_file(
            self.__customer_list)  # 调用文件helper的dict_to_file方法将所有用户信息重新写入到文件

    def get_current_customer_info(self):
        '''
        获取当前用户信息方法
        :return: 返回当前用户信息
        '''
        return self.__current_customer_info

    def authenticate(self):
        '''
        用户认证方法
        :return: 返回布尔值,用户是否成功认证登录
        '''
        self.__customer_list = self.__get_customer_list()
        flag = True
        while flag:
            # 输入用户名
            username = input('Username(Enter quit to exit): ').strip()
            # 判断是否输入的是否为quit
            if username == 'quit':
                # 是则退出循环,返回False
                return False
            password = input('Password: '******'Error: 用户名或密码错误')
                continue
            # 判断用户是否被锁定
            if self.__customer_list[username][self.__status_col_num -
                                              1] == 'lock':
                # 如果被锁定退出当前循环让用重新如输入
                print('Error: 您的账号已经锁定,请联系管理员')
                continue
            # 判断用户密码是否正确
            if password == self.__customer_list[username][
                    self.__password_col_num - 1]:
                # 将用户名和余额保存自当前用户信息
                self.__current_customer_info['username'] = username
                self.__current_customer_info['balance'] = self.__customer_list[
                    username][self.__balance_col_num - 1]
                # 正确返回True
                return True
            else:
                # 不正确
                # 提示用户名或密码错误
                print('Error: 用户名或密码错误')
                # 输入错误次数加1
                self.__customer_list[username][
                    self.__error_count_num - 1] = str(
                        int(self.__customer_list[username][
                            self.__error_count_num - 1]) + 1)
                # 判断是否已经达到3次
                if int(self.__customer_list[username][
                        self.__error_count_num - 1]) == self.__error_count_max:
                    # 如果输入错误达到3次
                    # 提示账户将被锁定
                    print("Error: 输入错误超过%s次,账号将被锁定")
                    # 将用户状态改为lock并写入文件
                    self.__customer_list[username][self.__status_col_num -
                                                   1] = 'lock'
                    self.__customer_list_to_file()
                    break
                self.__customer_list_to_file()

    def pay(self, total):
        '''
        支付方法
        :param total: 购物总金额
        :return: 无
        '''
        current_user = self.__customer_list[
            self.__current_customer_info['username']]  # 获取当前用户所有信息
        balance = int(current_user[self.__balance_col_num - 1])  # 获取余额
        current_user[self.__balance_col_num - 1] = str(balance -
                                                       total)  # 更新当前用户余额
        self.__current_customer_info['balance'] = current_user[
            self.__balance_col_num - 1]  # 更新self.__current_customer_info余额信息
        self.__customer_list_to_file()  # 调用私有方法将更新后的所有信息写入到文件
Пример #10
0
class goods(object):
    def __init__(self, file):
        '''
        构造方法
        :param file: 商品信息文件地址
        :return: 商品对象
        '''
        self.__helper = MyFileHelper(file)  # 获取商品的文件helper
        #self.__all_goods = self.__helper.getlist() # 通过调用文件helper的getlist方法获取所有商品
        self.__all_goods_list = []  # 初始话所有商品信息的列表,每个元素是一个列表
        self.__shopping_cart = []  # 初始化购物车列表

        for goods in self.__helper.getlist():  # 遍历商品列表
            temp_dict = {}  # 定义临时列表
            temp_dict['id'] = goods[0]
            temp_dict['name'] = goods[1]
            temp_dict['price'] = goods[2]
            temp_dict['class'] = goods[3]

            self.__all_goods_list.append(temp_dict)  # 将临时字典追加到商品信息中

    # def getfile(self):
    #     return  self.__helper.getfile()

    def get_all_list(self):
        '''
        获取所有商品信息方法
        :return: 返回所有商品信息
        '''
        return self.__all_goods_list

    def add_to_shopping_cart(self, gid):
        '''
        添加购物车方法
        :param gid: 商品id
        :return: 无
        '''
        temp_dict = {}
        for one_goods in self.__shopping_cart:  # 遍历所有购物车的商品
            if one_goods['id'] == gid:  # 判断是否存在商品
                one_goods['num'] += 1  # 数量加1
                one_goods['subtotal'] += int(one_goods['price'])  # 小计累加
                break  # 退出遍历
        else:
            # 正常遍历结束,说明商品不存在于购物车内
            # 将历史字典用于保存购物车一个条目
            temp_dict['id'] = gid
            temp_dict['name'] = self.__all_goods_list[int(gid) - 1]['name']
            temp_dict['price'] = int(self.__all_goods_list[int(gid) -
                                                           1]['price'])
            temp_dict['num'] = 1
            temp_dict['subtotal'] = temp_dict['price']
            self.__shopping_cart.append(temp_dict)  # 降临时字典最佳到购物车列表

    def get_shopping_gid(self):
        '''
        获取购物车商品id方法
        :return: 返回购物车内商品的id列表
        '''
        gid_list = []
        for one_goods in self.__shopping_cart:  # 遍历购物车条目
            gid_list.append(one_goods['id'])  # 将购物车条目的商品id追加到列表
        return gid_list

    def del_goods_from_cart(self, gid):
        '''
        删除购物车商品方法
        :param gid: 要删除的商品id
        :return: 无
        '''
        for one_goods in self.__shopping_cart:  # 遍历购物车
            if one_goods['id'] == gid:  # 判断是否id是否等于要删除商品的id
                if one_goods['num'] == 1:  # 判断是否只剩1件
                    # 只剩在1件
                    self.__shopping_cart.remove(one_goods)  # 删除整个条目
                    break
                else:
                    # 否则就是剩余多件
                    one_goods['num'] -= 1  # 商品数量减1
                    one_goods['subtotal'] -= int(one_goods['price'])  # 小计递减
                    break
        else:
            print('输入错误或商品编号不存在')

    def get_shopping_cart(self):
        '''
        获取购物车所有信息列表
        :return: 返回购物车列表
        '''
        return self.__shopping_cart

    def del_all_cart(self):
        '''
        清空购物车方法
        :return: 无
        '''
        self.__shopping_cart = []
Пример #11
0
class customer(object): # 定义客户类
    def __init__(self, file):
        '''
        客户类构造方法
        :param file: 客户信息文件地址
        :return: 客户类
        '''
        self.__helper = MyFileHelper(file) # 初始化文件helper
        self.__password_col_num = 1 # 定义密码所在的列
        self.__status_col_num = 2 # 定义客户状态所在的列
        self.__error_count_num = 3 # 定义最多可以操作错误的次数所在的列
        self.__balance_col_num = 4 # 定义余额所在的列
        self.__error_count_max = conf.error_count_max # 从配置文件读取最多可以输入错误多少次
        self.__current_customer_info = {} # 初始化当前用户信息

    def __get_customer_list(self):
        '''
        定义私有方法获取所有客户信息
        :return: 返回所有客户信息
        '''
        return self.__helper.getdict() # 调用文件helper的getdict方法获取所有用户信息,并返回

    def __customer_list_to_file(self):
        '''
        定义私有方法,将所有客户信息写入到文件
        :return:无
        '''
        self.__helper.dict_to_file(self.__customer_list) # 调用文件helper的dict_to_file方法将所有用户信息重新写入到文件

    def get_current_customer_info(self):
        '''
        获取当前用户信息方法
        :return: 返回当前用户信息
        '''
        return self.__current_customer_info

    def authenticate(self):
        '''
        用户认证方法
        :return: 返回布尔值,用户是否成功认证登录
        '''
        self.__customer_list = self.__get_customer_list()
        flag = True
        while flag:
            # 输入用户名
            username = input('Username(Enter quit to exit): ').strip()
            # 判断是否输入的是否为quit
            if username == 'quit':
                # 是则退出循环,返回False
                return False
            password = input('Password: '******'Error: 用户名或密码错误')
                continue
            # 判断用户是否被锁定
            if self.__customer_list[username][self.__status_col_num - 1] == 'lock':
                # 如果被锁定退出当前循环让用重新如输入
                print('Error: 您的账号已经锁定,请联系管理员')
                continue
            # 判断用户密码是否正确
            if password == self.__customer_list[username][self.__password_col_num - 1]:
                # 将用户名和余额保存自当前用户信息
                self.__current_customer_info['username'] = username
                self.__current_customer_info['balance'] = self.__customer_list[username][self.__balance_col_num - 1]
                # 正确返回True
                return True
            else:
                # 不正确
                # 提示用户名或密码错误
                print('Error: 用户名或密码错误')
                # 输入错误次数加1
                self.__customer_list[username][self.__error_count_num - 1] = str(int(self.__customer_list[username][ self.__error_count_num - 1]) + 1)
                # 判断是否已经达到3次
                if int(self.__customer_list[username][self.__error_count_num - 1]) == self.__error_count_max:
                    # 如果输入错误达到3次
                    # 提示账户将被锁定
                    print("Error: 输入错误超过%s次,账号将被锁定")
                    # 将用户状态改为lock并写入文件
                    self.__customer_list[username][self.__status_col_num - 1] = 'lock'
                    self.__customer_list_to_file()
                    break
                self.__customer_list_to_file()

    def pay(self, total):
        '''
        支付方法
        :param total: 购物总金额
        :return: 无
        '''
        current_user =  self.__customer_list[self.__current_customer_info['username']] # 获取当前用户所有信息
        balance = int(current_user[self.__balance_col_num - 1]) # 获取余额
        current_user[self.__balance_col_num - 1] = str(balance - total) # 更新当前用户余额
        self.__current_customer_info['balance'] = current_user[self.__balance_col_num - 1] # 更新self.__current_customer_info余额信息
        self.__customer_list_to_file() # 调用私有方法将更新后的所有信息写入到文件
Пример #12
0
class haproxy(object):
    def __init__(self, file):
        self.__conffile = file
        self.__conffile_bak = '%s%s' %(file, '.new')
        self.__read_helper = MyFileHelper(self.__conffile)
        self.__write_helper = MyFileHelper(self.__conffile_bak)
        self.__all = self.__read_helper.get_all()
        self.__backends = self.__get_backends() # 保存从文件读出来的backend信息

    def getfile(self):
        return self.__helper.getfile()

    def get_conf(self):
        return self.__helper.get_all()

    def __get_backends(self):
        '''
        读取配置文件,从配置文件中读出backend节点的配置,并保存成有序字典
        :return: 返回处理后的backends列表
        '''
        #all_lines = self.__helper.get_all() # 调用helper的get_all()方法将配置文件全部出来
        all_lines = self.__all
        backends_list = [] # 定义用来保存所有backend信息的空列表
        for line in all_lines: # 遍历每一行
            line = line.strip()
            if line.startswith('backend'): # 判断是否是backend开头
                backend_name = line.split()[1] # 获取到backend名称
                temp_dict = collections.OrderedDict() # 创建用来保存backend信息的空的有序字典
                temp_dict['backend'] = backend_name
                temp_dict['record'] = [] # 创建用来保存每个record信息的空列表
                backends_list.append(temp_dict) # 将backend信息追加到列表

            if line.startswith('server'): # 通过判断是否为server开头判断是否是backend下面的一条记录record
                tmp_list = line.split() # 将record记录通过空格拆分
                tmp_dic = collections.OrderedDict() # 创建用来保存record信息的空有序字典
                tmp_dic['server'] = tmp_list[2] # 保存record名称
                for i in range(3,len(tmp_list),2):
                    tmp_dic[tmp_list[i]] = tmp_list[i+1] # 保存recordoptions信息
                temp_dict['record'].append(tmp_dic) # record最佳到后record列表
        return backends_list

    def get_backend(self, backend_name):
        '''
        通过backdend名获取backend信息
        :param backend_name: backend名称
        :return: 如果存在返回所有backend的record信息,如果没有找到返回空字典
        '''
        backends = self.__backends # 获取所有backend信息
        #print(backends)
        for backend in backends: # 遍历所有backend
            if backend['backend'] == backend_name: # 如果找到名称相同的返回该backend下面的record信息
                return backend['record']
        else:
            return {} # 如果没有找到返回空的字典

    def check_record_option_key(self, op_keys):
        '''
        检查新添加的添加、删除、修改等操作的record的options选项是否合法
        :param op_keys: 欲添加、删除、修改record所有的选项名称,包括server
        :return: 布尔值,如果合法返回True,否则返回Fasle
        '''
        # 通过差集判断是否存在配置文件conf.py中未定义的合法字段、另外必须包含'server'
        return not(set(list(op_keys)).difference(set(conf.record_op_list))  or 'server' not in op_keys)

    def check_record_option_type(self, records):
        '''
        检查新添加的添加、删除、修改等操作的record的options选项参数类型是否符合合法
        :param records: 欲添加、删除、修改record所有的选项的参数说着说值,不包括server
        :return: 布尔值,如果合法返回True,如果不合法返回False
        '''
        for key in records.keys(): # 遍历所有options的参数
            #print(type(conf.record_op[key]), type(records[key]))
            if type(conf.record_op[key]) != type(records[key]): # 对比参数类型,如果不合法返回Fasle
                return False
        return True # 如果遍历没有返回False说明合法,返回True

    def check_ip(self,ip_str):
        '''
        判断server参数的ip地址是否合法
        :param ip_str: ip地址
        :return: 布尔值,如果合法返回True,如果不合法返回False
        '''
        #res = re.match('(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$',ip_str) # 通过正则表达式判断ip地址是否合法

        return re.match('(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$',str(ip_str)) # 通过正则表达式判断ip地址是否合法

    def add_record(self,backend_name, record):
        '''
        添加
        :param backend_name: backend名称,表示要添加到该backend下
        :param record: # record字典
        :return:
        '''
        backends = self.__backends
        for backend in backends: # 遍历backend列表
            if backend['backend'] == backend_name: # 判断backend是否存在
                # 存在执行
                for rec in backend['record']: # 遍历所哟record
                    if rec['server'] == record['server']: # 通过server的ip的地址判断该记录是否存在
                        backend['record'][backend['record'].index(rec)] = record # 如果存在,覆盖
                        #rec = record
                        break
                else:
                    backend['backend'].append(record) # 如果不存在,追加到后面
                break
        else:
            # 如果backend不存在
            tmp_dict = collections.OrderedDict()  # 创建一个空有序字典用来保存新的backend信息
            tmp_dict['backend'] = backend_name
            tmp_dict['record'] = [record]
            backends.append(tmp_dict) # 将构建的backend追加到后面

    def get_backends(self):
        '''
        获取所有backend信息
        :return: 返回所有backend列表
        '''
        return self.__backends

    def del_record(self, backend_name, server_name):
        '''
        删除backend下面的record
        :param backend_name: backend名称
        :param server_name: record下的server的值,也就是ip地址
        :return: 布尔值,是否删除成功
        '''
        records = self.get_backend(backend_name) # 获取backend的所有记录
        if records: # 获取的不为空执行
            for record in records: # 遍历所有record
                if record['server'] == server_name: # 判断是否是要删除的记录
                    records.remove(record) # 如果是移除
                    #print(records)
                    if not records: # 判断移除后是不是为空
                        # 如果为空删除backend
                        for backend in self.__backends: # 遍历所有backend
                            if backend['backend'] == backend_name: # 判断是否为要删除的backend
                                self.__backends.remove(backend) # 移除backend
                                break
                    return True
        return False
        #print(1)

    def write_to_file(self, backend_str):
        '''
        写入文件
        :return: 写入成功返回True
        '''
        import os
        import datetime
        #file_str = conf.conf_model.format(backends = backend_str)
        #for line in self.__all
        has_write = False # 定义表示符,用来判断backend是否写入到文件
        file_str = '' # 初始化文件的内容
        for line in self.__all: # 遍历源haproxy配置文件的所有行
            if line.strip().startswith('backend') or line.strip().startswith('server'): # 判断开头是否为backend或server

                if has_write: # 判断是否已经写过backend
                    continue
                else:
                    file_str = '%s%s' %(file_str, backend_str) # 如果没写过,将当前backend所有信息写入到文件
                    #print(backend_str)
                    has_write = True # 将标识符改为Ture,说明backend已经全部写完了
            else:
                file_str = '%s%s' %(file_str, line)
                #print(line)
        # print(file_str)
        if self.__write_helper.write_all(file_str):
            # 文件完后,将当前ha_proxy文件用刚才写入的文件替换并备份
            os.rename(self.__conffile,'.'.join([self.__conffile, datetime.datetime.now().strftime('%Y%m%d%H%M%S') ]))
            # print(''.join([self.__conffile, datetime.datetime.now().strftime('%Y%m%d%H%M%S') ]))
            os.rename(self.__conffile_bak, self.__conffile)
            return True
        else:
            return False