
    \i5                         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  \R                  " \5      r " S S5      rg)	uS   
工具执行器

执行 AI 调用的工具，包括命令执行、文件操作等
    N)DictAnyCallableOptional)Path   )SandboxConfigc                   *   \ rS rSrSrSS\S\S\4S jjrS\S	\	\\
4   S
\	\\
4   4S jrS\	S
\4S jrS\S\4S jrS\	\\
4   S
\	\\
4   4S jrS\	\\
4   S
\	\\
4   4S jrS\	\\
4   S
\	\\
4   4S jrS\	\\
4   S
\	\\
4   4S jrS\S\4S jrSrg)ToolExecutor   uL   工具执行器

负责执行 AI 调用的各种工具，并确保安全性
Nsandboxlog_callbackworking_dirc                    U=(       d
    [        5       U l        X l        U(       a  X0l        Ob[	        [
        5      R                  R                  R                  R                  R                  n[        US-  R                  5       5      U l        U R                  U R                  U R                  U R                  S.U l        g)u   初始化工具执行器

Args:
    sandbox: 沙箱配置
    log_callback: 日志回调函数，接受 (level, message) 参数
    working_dir: 默认工作目录
ge10)run_command	read_file
write_filelist_directoryN)r	   r   r   r   r   __file__parentstrresolve_handle_run_command_handle_read_file_handle_write_file_handle_list_directory	_handlers)selfr   r   r   ctf_dirs        H   /Users/yu22x/Desktop/ddd_副本138/ctf/app/services/ai/tools/executor.py__init__ToolExecutor.__init__   s     1-/( * 8n++2299@@GGG"Gf$4#=#=#?@D  33//11"99	
    	tool_name	argumentsreturnc           
      (   U R                   R                  U5      nU(       d  SSU 3S.$  U R                  SSU 35        U" U5      nU$ ! [         a<  nU R                  SSU S[	        U5       35        SS	[	        U5       3S.s S
nA$ S
nAff = f)u   执行工具

Args:
    tool_name: 工具名称
    arguments: 工具参数
    
Returns:
    执行结果字典:
    - success: 是否成功
    - result: 执行结果或错误信息
Fu   未知的工具: successresultinfou   执行工具: erroru   工具执行失败: z - u   执行失败: N)r   get_log	Exceptionr   )r   r%   r&   handlerr+   es         r!   executeToolExecutor.execute8   s     ..$$Y/ -i[9 
		IIfyk:;Y'FM 	IIg!5i[CF8LM *3q6(3 	s   A 
B1BBB	tool_callc                    UR                  S0 5      nUR                  SS5      n [        R                  " UR                  SS5      5      nU R	                  X45      nUS   (       a  US   nOSUS    3nU R
                  (       a  U R
                  R                  OS	n[        U5      U:  a  US
U S[        U5       S3-   nU$ ! [        R                   a    0 n Nf = f)u   执行 AI 返回的工具调用

Args:
    tool_call: AI 返回的工具调用字典，包含:
        - id: 工具调用 ID
        - function: {name, arguments}
        
Returns:
    工具执行结果字符串（用于返回给 AI）
functionname r&   z{}r*   r+   u   错误: i@  Nu"   
... [输出已截断，原长度 u    字符])r.   jsonloadsJSONDecodeErrorr3   r   max_output_sizelen)r   r5   funcr%   r&   r+   outputmax_lens           r!   execute_tool_callToolExecutor.execute_tool_callW   s     }}Z,HHVR(		

488K#>?I
 i3 )H%Fx 012F 37,,$,,..Dv; HW%*McRXk]Zb(ccF! ## 	I	s   &C CClevelmessagec                     U R                   (       a  U R                  X5        [        [        U[        R                  5      nU" SU 35        g)u   记录日志z[ToolExecutor] N)r   getattrloggerr,   )r   rD   rE   log_funcs       r!   r/   ToolExecutor._logz   s:    e-65&++6?7),-r$   argsc           
        ^ ^ UR                  SS5      nUR                  S5      =(       d    T R                  mUR                  ST R                  R                  5      nT R                  R	                  UTS9u  pEU(       d  SSU 3S.$ T(       a(  T R                  R                  T5      (       d  SS	T 3S.$ T R                  R                  U5      nU(       a  [        X65      n T R                  S
SUSS  S35        T R                  R                  UT5      n[        UU 4S jU 5       5      n[        R                  R                  5       n	SU	S'   U(       a  SU	S'   SU	S'   T R                  S
S5        [        R                  " USTSSUU	S9n
U
R                   nU
R"                  (       a  USU
R"                   3-  n[%        U5      T R                  R&                  :  a  UST R                  R&                   S-   nU
R(                  S:H  U=(       d    SU
R(                  S.$ ! [        R*                   a    SSU S3S.s $ [,         a  nSS [/        U5       3S.s SnA$ SnAff = f)!u<   处理命令执行

Args:
    args: {command, cwd, timeout}
commandr9   cwdtimeout)r   Fu   命令被拒绝: r)   u#   工作目录不在允许范围内: r,   u   执行命令: Nd   z...c              3   \   >#    U  H!  nTR                   R                  UT5      v   M#     g 7f)N)r   is_data_executable_path_allowed).0pathrN   r   s     r!   	<genexpr>3ToolExecutor._handle_run_command.<locals>.<genexpr>   s,      %,D <<T3GG,s   ),catPAGERtrueRESTRICTED_MODEz/tmp,outputALLOWED_WRITE_DIRSu=   执行 data/ 目录内的可执行文件，应用受限环境T)shellrN   capture_outputtextrO   envz

[stderr]
u   
... [输出已截断]r   u   (无输出))r*   r+   return_codeu   命令执行超时 (u   秒)u   命令执行错误: )r.   r   r   command_timeoutis_command_allowedis_path_allowedget_timeoutminr/   _extract_executable_pathsanyosenvironcopy
subprocessrunstdoutstderrr>   r=   
returncodeTimeoutExpiredr0   r   )r   rK   rM   rO   allowedreasonactual_timeoutexecutable_pathsis_data_executabler_   r+   r@   r2   rN   s   `            @r!   r    ToolExecutor._handle_run_command   sl    ((9b)hhuo1!1!1((9dll&B&BC ,,99's9S -fX6  t||33C88 ?uE  11': 9N8	IIfwt}oSAB  $||EEgsS!$ %,% " **//#C CL ")/%&,9()		&$ac  ^^#&F ]]F}}L88 6{T\\999 =!=!=>AZZ ",,1 1M%00  (( 	 00@E   	 0Q9 	s%   'D>H& &I)	I)I$I)$I)c           	      >   UR                  SS5      nU(       d  SSS.$ [        R                  R                  U5      (       d*  [        R                  R	                  U R
                  U5      nU R                  R                  U5      (       d  SSU 3S.$  [        U5      nUR                  5       (       d  SSU 3S.$ UR                  5       (       d  SSU 3S.$ UR                  5       R                  nX@R                  R                  :  a   SS	U S
U R                  R                   S3S.$ UR                  SS9nU R                  SSU S[!        U5       S35        SUS.$ ! ["         a    SSU 3S.s $ [$         a  nSS['        U5       3S.s SnA$ SnAff = f)u+   处理文件读取

Args:
    args: {path}
rT   r9   F   未指定文件路径r)   u#   文件路径不在允许范围内: u   文件不存在: u   不是文件: u   文件过大: u    字节 (最大 )utf-8encodingr,   u   读取文件:  (    字符)Tu$   文件不是有效的 UTF-8 文本: u   读取文件失败: N)r.   rh   rT   isabsjoinr   r   rc   r   existsis_filestatst_sizemax_file_size	read_textr/   r>   UnicodeDecodeErrorr0   r   )r   rK   rT   	file_path	file_sizecontentr2   s          r!   r   ToolExecutor._handle_read_file   s    xx# 1  ww}}T""77<< 0 0$7D ||++D11 ?vF 
*	T
I##%%$ 1$8 
 $$&&$ .tf5  "(00I<<555$ .yk9I$,,JdJdIeefg   ))7);GIIftfBs7|nHMN  ! 
 " 	 @G   	 0Q9 	s7   'E$ >E$ AE$ .5E$ $F8	FFFFc           	         UR                  SS5      nUR                  SS5      nU(       d  SSS.$ [        R                  R                  U5      (       d*  [        R                  R	                  U R
                  U5      nU R                  R                  U5      (       d  SSU 3S.$ [        UR                  S5      5      U R                  R                  :  a  SS	U R                  R                   S
3S.$  [        U5      nUR                  R                  SSS9  UR                  USS9  U R                  SSU S[        U5       S35        SSU 3S.$ ! [          a  nSS[#        U5       3S.s SnA$ SnAff = f)u4   处理文件写入

Args:
    args: {path, content}
rT   r9   r   Frx   r)   u)   文件路径不在允许写入范围内: rz   u   内容过大 (最大 u    字节)T)parentsexist_okr{   r,   u   写入文件: r}   r~   u   文件已保存: u   写入文件失败: N)r.   rh   rT   r   r   r   r   is_write_path_allowedr>   encoder   r   r   mkdir
write_textr/   r0   r   )r   rK   rT   r   r   r2   s         r!   r   ToolExecutor._handle_write_file  s    xx#((9b) 1  ww}}T""77<< 0 0$7D ||11$77 EdVL  w~~g&'$,,*D*DD 1$,,2L2L1MXV 
	T
I ""4$"?   7 ;IIftfBs7|nHMN  -dV4 
  	 0Q9 	s   7AE 
E; E60E;6E;c           	         UR                  SS5      nU(       d  SSS.$ [        R                  R                  U5      (       d*  [        R                  R	                  U R
                  U5      nU R                  R                  U5      (       d  SSU 3S.$  [        U5      nUR                  5       (       d  SSU 3S.$ UR                  5       (       d  SSU 3S.$ / n[        UR                  5       5       Hu  nUR                  5       (       a!  UR                  S	UR                   S
35        M9  UR                  5       R                   nUR                  SUR                   SU S35        Mw     U(       a  SU S3SR	                  U5      -   OSU 3nU R#                  SSU S[%        U5       S35        SUS.$ ! [&         a  nSS[)        U5       3S.s SnA$ SnAff = f)u+   处理目录列表

Args:
    args: {path}
rT   r9   Fu   未指定目录路径r)   u#   目录路径不在允许范围内: u   目录不存在: u   不是目录: u   📁 /u   📄 r}   z bytes)u   目录: 
u   目录为空: r,   u   列出目录: u    项)Tu   列出目录失败: N)r.   rh   rT   r   r   r   r   rc   r   r   is_dirsortediterdirappendr8   r   r   r/   r>   r0   r   )	r   rK   rT   dir_pathitemsitemsizer+   r2   s	            r!   r   #ToolExecutor._handle_list_directoryV  s    xx# 1  ww}}T""77<< 0 0$7D ||++D11 ?vF 
%	DzH??$$$ 1$8 
 ??$$$ .tf5  Ex//12;;==LL51!5699;..DLL52dV7!CD 3 @ExvR(499U+;;N[_Z`JaFIIftfBs5zl%HI    
  	 0Q9 	s+   'F: >F: CF: :
GGGGr1   c                 J    X R                   U'   U R                  SSU 35        g)u   注册自定义工具处理器

Args:
    tool_name: 工具名称
    handler: 处理函数，接受 args 字典，返回 {success, result} 字典
r,   u   注册工具处理器: N)r   r/   )r   r%   r1   s      r!   register_handlerToolExecutor.register_handler  s&     %,y!		&3I;?@r$   )r   r   r   r   )NNN)__name__
__module____qualname____firstlineno____doc__r	   r   r   r"   r   r   r3   rB   r/   r   r   r   r   r   __static_attributes__ r$   r!   r   r      s   

 
H 
be 
< c3h DcN >!4 !C !F.# . .VS#X V4S> VpCd38n Cc3h CJ5tCH~ 5$sCx. 5n>4S> >d38n >@A# A Ar$   r   )r   rh   rk   r:   loggingtypingr   r   r   r   pathlibr   r   r	   	getLoggerr   rH   r   r   r$   r!   <module>r      sB    
    0 0  "			8	$JA JAr$   