# coding=utf-8 # Usage: run_check.py base_path clsname # 读取参数规范配置文件,生成静态的参数规范值 # 输入参数: # 参数规范配置文件名称 # 输出参数: # 静态参数值的配置文件:tidb_config_parameter.config # 是否检查||组件名称(K)||参数名称(K)||组件节点(K)||检查源表||默认值||规范值||规范静态值||规范值类型 # 约定变量名: # 服务器信息的默认变量:CPU_TYPE,CPU_CNT,MEM_TOTAL,NODE_NUM # 导入模块 import os, sys, time, re # 定义变量 # 安装地址 os_cmd = os.popen('grep -w ^tidb /etc/passwd').read() tidb_home = os_cmd.split(':')[5] if len(sys.argv) > 2: base_path = sys.argv[1] input_csv = sys.argv[2] else: base_path = "%s/scripts/normalcheck" % (tidb_home) input_csv = "%s/config/tidb_parameter.csv" %(base_path) # 配置文件地址 var_file = base_path + '/config/tidb_vars.config' para_config_file = base_path + '/config/tidb_parameter.config' def read_parameter_value(filename=''): """读取变量配置文件,shell格式""" return_dict = {} with open(filename, "r") as fd: for line in fd: line_lst = line.strip().split('=') return_dict[line_lst[0]] = line_lst[1].strip('"').strip() return return_dict def parameter_formula_calculate(formula=''): """参数值计算""" formula_new = formula.replace(' ', '') #有"的数值,CSV格式不对 if re.findall(r'"', formula_new): # print("csv:", formula) formula_new = formula_new.replace('"', '') #有()的取()前值 if re.findall(r'\(', formula_new): return formula_new.split('(')[0] elif re.findall(r'(', formula_new): return formula_new.split('(')[0] #变量值替换为具体数值 for var in var_lst: if var.upper() in dft_para_val: formula_new = formula_new.replace(var, dft_para_val[var]) formula_new = formula_new.replace(var.lower(), dft_para_val[var]) #数字表达式计算 try: formula_val = eval(formula_new) if formula_val >= 1: formula_val = int(formula_val) elif formula_val > 0: formula_val = round(formula_val, 1) except: # print('calculate error', formula_new) formula_val = formula #返回静态值 return formula_val # 读取参数配置文件 def read_csv(filename=''): """读取和解析配置文件,非法csv格式将被忽略""" print('%s: start read csv %s ' % ( time.strftime("%Y-%m-%d-%H.%M.%S", time.localtime()), filename)) global dft_para_val, var_lst, para_val_dict, para_val_key_lst var_lst = ['CPU_TYPE', 'CPU_CNT', 'MEM_TOTAL', '/N'] check_class_lst = ['pd', 'tidb', 'tikv', 'tiflash', '系统变量'] check_class_dict = { 'pd': 'information_schema.cluster_config', 'tidb': 'information_schema.cluster_config', 'tikv': 'information_schema.cluster_config', 'tiflash': 'information_schema.cluster_config', '系统变量': 'mysql.global_variables' } para_val_dict = {} para_val_key_lst = [] #读取变量的具体赋值 dft_para_val = read_parameter_value(var_file) dft_para_val['/N'] = "/%s" % (dft_para_val['NODE_NUM']) #读取参数规范配置文件,csv格式 #组件,编号(安装配置规范),参数名,默认值,规范值,参数说明,备注 with open(filename, 'r') as fd: i = 0 for line in fd: line_lst = line.split(',') check_class = line_lst[0].lower() if check_class not in check_class_lst: # print('%s,不支持的检查组件或csv格式错误' %(line.strip('\n'))) continue else: check_parameter = line_lst[2] check_param_val0 = line_lst[4].strip('\n') check_param_val = parameter_formula_calculate(check_param_val0) # print(check_class, check_parameter, check_param_val0, check_param_val) #暂存参数名与配置值 para_val_dict["%s,%s,all_node" %(check_class, check_parameter.strip())] = "%s,%s" % (check_param_val0, check_param_val) para_val_key_lst.append("%s,%s,all_node" %(check_class, check_parameter.strip())) def write_parameter_config(filename=''): """写config配置文件""" print('%s: start write output file %s ' % ( time.strftime("%Y-%m-%d-%H.%M.%S", time.localtime()), filename)) check_class_dict = { 'pd': 'information_schema.cluster_config', 'tidb': 'information_schema.cluster_config', 'tikv': 'information_schema.cluster_config', 'tiflash': 'information_schema.cluster_config', '系统变量': 'mysql.global_variables' } #KV格式如下 #'系统变量||tidb_auto_analyze_start_time||all_node': '22:00 +0800||22:00 +0800' with open(filename, 'w') as fd: fd.write("是否检查,组件名称(PK),参数名称(PK),组件节点(PK),检查源表,规范值,规范静态值\n") with open(filename, 'a') as fd: for k in para_val_key_lst: check_class = k.split(',')[0] fd.write("enable,%s,%s,%s\n" % (k, check_class_dict[check_class], para_val_dict[k])) def main(): read_csv(input_csv) # print(len(para_val_dict), para_val_dict) # file_name = '/tmp/tidb_parameter.txt' write_parameter_config(para_config_file) if __name__ == '__main__': main()