
    ,Wi`                     l    S r SSKrSSKrSSKrSSKrSSKJrJrJrJ	r	  SSK
Jr  SSKJr   " S S5      rg)u   
知识库脚本执行服务

用于执行管理员编写的知识库筛选脚本，根据用户输入获取相关的知识点和 Writeup。
    N)DictAnyListOptional)Path)CategoryConfigc                       \ rS rSrSrSS\4S jjr SS\S\\\4   S\S	\\\4   4S
 jjr	 SS\S\\\4   S\S	\\\4   4S jjr
Srg)KnowledgeScriptExecutor   u   知识库脚本执行器N	base_pathc           	         U(       a  Xl         g[        R                  R                  [        5      n[        R                  R                  [        R                  R                  [        R                  R                  [        R                  R                  U5      5      5      5      n[        R                  R                  US5      U l         g)u@   
初始化执行器

Args:
    base_path: 知识库基础路径
ge10N)r   ospathabspath__file__dirnamejoin)selfr   current_filectf_roots       P   /Users/yu22x/Desktop/ddd_副本128/ctf/app/services/knowledge/script_executor.py__init__ KnowledgeScriptExecutor.__init__   sr     &N 77??84L wwrwwrwwrwwWcGd7e'fgHWW\\(F;DN    category_id
user_inputscript_pathreturnc                 <   [         R                  R                  U5      nU(       d  [        SU S35      eU(       d  UR                  =(       d    U S3n[
        R                  R                  U5      (       dE  UR                  S5      (       a  USS n[
        R                  R                  U R                  U5      n[
        R                  R                  U5      (       d  [        SU 35      eUUR                  S5      UR                  S	5      UR                  S
/ 5      UR                  S5      UR                  S/ 5      UR                  SS5      UR                  SS5      S.n[        R                  " SSSSS9 n[        R                   " XVSSS9  UR"                  nSSS5         [$        R&                  " SUW/[
        R                  R)                  U5      SSSSS9nUR*                  S:w  a  [-        SUR.                   35      e [        R0                  " UR2                  5      n	SU	UR2                  UR.                  S .[
        R                  R                  U5      (       a  [
        R:                  " U5        $ $ ! , (       d  f       N= f! [        R4                   al    UR2                  R7                  5       R9                  S5      n
U
 Vs/ s H)  oR7                  5       (       d  M  UR7                  5       PM+     Os  snf sn/ S.n	 Nf = f! [$        R<                   a    [-        S!5      e[>         a  n[-        S"[A        U5       35      eSnAff = f! [
        R                  R                  W5      (       a  [
        R:                  " U5        f f = f)#u  
执行知识库筛选脚本

Args:
    category_id: 方向 ID
    user_input: 用户输入（包含 difficulty, language, knowledge_points 等）
    script_path: 脚本路径（如果为 None，使用默认路径）
    
Returns:
    包含知识点和 Writeup 信息的字典
u   方向 u
    不存在z
/choice.pyzge10/   Nu   知识库脚本不存在: 
difficultylanguageknowledge_pointsscenetags	max_items
   max_writeups_per_item)r   r"   r#   r$   r%   r&   r'   r)   wz.jsonFutf-8)modesuffixdeleteencoding   )ensure_asciiindentpython3T   )cwdcapture_outputtexttimeoutr/   r   u   脚本执行失败: 
)writeupsknowledge_items)successdatascript_outputscript_stderru%   脚本执行超时（超过 30 秒）u   执行脚本时出错: )!r   queryget
ValueErrorchoice_script_pathr   r   isabs
startswithr   r   existsFileNotFoundErrortempfileNamedTemporaryFilejsondumpname
subprocessrunr   
returncodeRuntimeErrorstderrloadsstdoutJSONDecodeErrorstripsplitunlinkTimeoutExpired	Exceptionstr)r   r   r   r   category
input_dataf
input_fileresultoutput_datalineslinees                r   execute_knowledge_script0KnowledgeScriptExecutor.execute_knowledge_script%   s    "''++K8w{m:>?? "55SK=
9SK ww}}[))%%g..)!"o'',,t~~{CKww~~k**#&@$NOO '$..6"z2 */A2 F^^G,NN62.#R8%/^^4KQ%O	

 ((c'%ZabfgIIj%BJ c(	&  ^^K4GGOOK0# F   A%"%9&--#IJJ"jj7  #!'!'	 ww~~j))		*% *W cb, '' ++-33D9:? P%$::<% P') (( 	HFGG 	C!8QABB	C ww~~j))		*% *sh   ?#J+A!L  J -L 
JALL1LLL LL (M?MMM =Nc                    U R                  XU5      nUS   (       d  U$ US   nUR                  S/ 5      nUR                  S/ 5      nSSKJn  U" XR                  5      n	/ n
U H  nU	R                  U5      nU(       d  U	R                  U5      nU(       d  M5  [        R                  R                  U5      (       d  M[   [        USSS	9 nUR                  5       nU
R                  UUUS
.5        SSS5        M     SU
UUR                  SS5      [        U
5      [        U5      US.S.$ ! , (       d  f       M  = f! [         a  n SnAM  SnAff = f)u   
获取知识库内容（执行脚本并读取 Writeup 文件）

Args:
    category_id: 方向 ID
    user_input: 用户输入
    script_path: 脚本路径
    
Returns:
    包含知识点和 Writeup 内容的完整字典
r<   r=   r:   r;   r   )KnowledgePathConfigrr+   )r/   )filenamecontentr   NTr>    )total_writeupsrequested_writeupsr   )r<   r:   r;   r>   metadata)rd   rA   "app.services.knowledge.path_configrg   r   find_writeup_fileget_writeup_file_pathr   r   rF   openreadappendrY   len)r   r   r   r   script_resultr`   writeup_filesr;   rg   path_configwriteup_contentsri   	file_pathr]   rj   rc   s                   r   get_knowledge_content-KnowledgeScriptExecutor.get_knowledge_content   sL    55k{[Y'  #F+#
B7%//*;R@ 	K)+~~F%H#55h?I'==hG	yRWW^^I66
iw?1"#&&((//(0'.$-1  @? &* (.*..C"%&6"7&)-&8*

 
	
 @? ! s0    D=&D+1D=+
D:	5D=:D==
EE)r   )N)__name__
__module____qualname____firstlineno____doc__rZ   r   r   r   rd   r{   __static_attributes__ r   r   r
   r
      s    "<# <& 59X&C X&T#s(^ X&.1X&=A#s(^X&v 15:
 :
$sCx. :
*-:
9=c3h:
 :
r   r
   )r   r   rJ   rM   rH   typingr   r   r   r   pathlibr   app.models.database.modelsr   r
   r   r   r   <module>r      s0   
 
    , ,  5i
 i
r   