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 __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 __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 __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 __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) # 将临时字典追加到商品信息中
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 = []
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
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() # 调用私有方法将更新后的所有信息写入到文件
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 = []
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() # 调用私有方法将更新后的所有信息写入到文件
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