diff --git a/sysom_server/sysom_knowledge/main.py b/sysom_server/sysom_knowledge/main.py index 14ff858369742769938eb6151c87957839de3254..9a9bf77128516f5f12b1d85a3083ff0cf724b4bb 100644 --- a/sysom_server/sysom_knowledge/main.py +++ b/sysom_server/sysom_knowledge/main.py @@ -35,65 +35,59 @@ db = SessionLocal() @app.post("/api/v1/knowledge/input") async def knowledge_input(request: dict): - retdict = {"success":False,"errmsg":""} - param_list = ["logs","funcs","calltrace","issuedesc","issuelink","diagret","field"] + RET_DICT_SUCCESS = False + RET_DICT_ERRMSG = "" + PARAM_LIST = ["logs", "funcs", "calltrace", "issuedesc", "issuelink", "diagret", "field"] + + # 使用集合进行效率更高的存在性检查 + missing_params = [param for param in PARAM_LIST if param not in request] + if missing_params: + RET_DICT_ERRMSG = "Missing parameters: {}\n".format(", ".join(missing_params)) + return {"success": RET_DICT_SUCCESS, "errmsg": RET_DICT_ERRMSG} + + # 检查参数内容的逻辑优化 + if not any(request[param] for param in ["logs", "funcs", "calltrace"]): + RET_DICT_ERRMSG += "logs, funcs and calltrace could not be all empty!\n" + if not any(request[param] for param in ["issuedesc", "issuelink", "diagret"]): + RET_DICT_ERRMSG += "issuedesc, issuelink and diagret could not be all empty!\n" + if not request["field"]: + RET_DICT_ERRMSG += "field could not be empty!\n" + + if RET_DICT_ERRMSG: + return {"success": RET_DICT_SUCCESS, "errmsg": RET_DICT_ERRMSG} + + calltrace_extrack = request["calltrace"] + if request["calltrace"]: + column = { + 'func_name': '', + 'rip': '', + 'title': '', + 'bugat': '', + 'ripmod': '', + 'ver': '', + 'comm': '', + 'unload': '', + 'softlockup_modcheck': '', + 'calltrace_list': [], + 'calltrace': '', + } + extract_calltrace(column, request["calltrace"]) + if column['calltrace']: + calltrace_extrack = f"{column['func_name']}${column['calltrace']}" + elif column['func_name']: + calltrace_extrack = column['func_name'] try: - errmsg = "" - for param in param_list: - if param not in request: - errmsg += "Missing parametre: %s\n"%param - retdict["errmsg"] = errmsg - if len(errmsg) > 0: - return retdict - if len(request["logs"]) == 0 and len(request["calltrace"]) == 0 and len(request["funcs"]) == 0: - errmsg += "logs, funcs and calltrace could not be all empty!\n" - if len(request["issuedesc"]) == 0 and len(request["issuelink"]) == 0 and len(request["diagret"]) == 0: - errmsg += "issuedesc, issuelink and diagret could not be all empty!\n" - if len(request["field"]) == 0: - errmsg += "field could not be empty!\n" - if len(errmsg) > 0: - retdict["errmsg"] = errmsg - return retdict - - calltrace_extrack = request["calltrace"] - if len(request["calltrace"]) > 0: - column = {} - column['func_name'] = '' - column['rip'] = '' - column['title'] = '' - column['bugat'] = '' - column['ripmod'] = '' - column['ver'] = '' - column['comm'] = '' - column['unload'] = '' - column['softlockup_modcheck'] = '' - column['calltrace_list'] = [] - column['calltrace'] = '' - extract_calltrace(column,request["calltrace"]) - if len(column['calltrace']) > 0: - calltrace_extrack = "%s$%s"%(column['func_name'],column['calltrace']) - elif len(column['func_name']) > 0: - calltrace_extrack = column['func_name'] - - try: - create_knowledge(db, Knowledge( - issuedesc=request["issuedesc"], logs=request["logs"], calltrace=request["calltrace"],calltrace_extrack=calltrace_extrack, - funcs=request["funcs"], create_time=datetime.now(), issuelink=request["issuelink"], - diagret=request["diagret"],field=request["field"])) - retdict["success"] = True - - except Exception as e: - traceback.print_exc() - logger.exception(e) - retdict["errmsg"] += "insert into database failed: %s\n"%e - pass - + create_knowledge(db, Knowledge( + issuedesc=request["issuedesc"], logs=request["logs"], calltrace=request["calltrace"], calltrace_extrack=calltrace_extrack, + funcs=request["funcs"], create_time=datetime.now(), issuelink=request["issuelink"], + diagret=request["diagret"], field=request["field"])) + return {"success": True} except Exception as e: + # 具体地记录和处理异常 traceback.print_exc() logger.exception(e) - pass - return retdict + return {"success": False, "errmsg": f"insert into database failed: {e}\n"} @app.post("/api/v1/knowledge/match") async def knowledge_match(request: dict):