
    \i:U                         S r SSK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KJrJrJr   " S S5      rg)	u=   
题目生成服务

负责题目生成的核心业务逻辑
    N)DictAnyOptionalListPath)current_app)GenerationErrorValidationErrorConfigurationErrorc                   N   \ rS rSrSrS'S\S\S\\   4S jjr     S(S\\   S	\\	   S
\\
\\4      S\S\S\S\\
\\4      S\\   S\
\\4   4S jjr  S)S\\   S	\\	   S
\\
\\4      S\S\S\S\\
\\4      S\\   S\
\\4   4S jjr  S)S\\   S	\\	   S
\\
\\4      S\S\S\\
\\4      S\\   S\
\\4   4S jjr S'S\S\\   S	\\	   S
\\
\\4      S\S\S\\
\\4      S\
\\4   4S jjr S'S\\   S	\\	   S
\\
\\4      S\S\S\\
\\4      S\
\\4   4S jjrS\
\\4   S\
\\4   4S jrS\
\\4   S\
\\4   4S jrS\S\
\\4   4S jrS\4S jrS\\   4S jrS\\   S\\   4S jrS\\   S \\   S!\
\\4   S"\\   S#\S$\\   S\\   4S% jrS&rg)*ChallengeGeneratorService   u   题目生成服务类Nuser_idcategory_idtask_idc                 f    Xl         X l        X0l        [        R                  " [
        5      U l        g)uY   
Args:
    user_id: 用户ID
    category_id: 方向ID
    task_id: 任务ID（可选）
N)r   r   r   logging	getLogger__name__logger)selfr   r   r   s       =/Users/yu22x/Desktop/ge/ctf/app/services/generator/service.py__init__"ChallengeGeneratorService.__init__   s&     &''1    languagevulnerabilitiesscene
difficultyextra_requirementsai_mode	form_dataai_config_idreturnc
                    Uc  [         R                  " 5       nUR                  5           U R                  R	                  S5        U R                  R	                  SU R
                   35        SSKJn
Jn  U
" 5         U" U R
                  5        U R                  UUUUUUUU	S9nUS   S:X  a  U R                  U5      sSSS5        $ U R                  U5      sSSS5        $ ! [         aJ  nU R                  R                  S	[        U5       3S
S9  U R                  U5      s SnAsSSS5        $ SnAff = f! , (       d  f       g= f)u  生成题目

Args:
    language: 编程语言
    vulnerabilities: 漏洞列表
    scene: 场景
    difficulty: 难度
    extra_requirements: 额外要求
    ai_mode: AI 模式
    app: Flask 应用对象
    form_data: 完整的表单数据（可选，用于传递所有表单字段）
    
Returns:
    {
        'status': 'success' | 'error',
        'message': str,
        'challenge_id': Optional[int],
        'output_dir': Optional[str],
        'log_file': Optional[str]
    }
Nu   生成题目主进程开始u
   用户ID: r   )reset_log_idset_current_user_id)r   r   r   r    r!   r"   r#   r$   statussuccessu   生成进程中发生错误: Texc_info)r	   _get_current_objectapp_contextr   infor   app.routes.generator.utilsr'   r(   _execute_generation_handle_success_handle_failure	Exceptionerrorstr_handle_exception)r   r   r   r   r    r!   r"   appr#   r$   r'   r(   resultes                 r   generate"ChallengeGeneratorService.generate"   s2   B ;113C__1  !>?  :dll^!<= Y#DLL1 11%$3)'9#'!- 2 	 (#y0//7/ 2  //73 6  1!!$A#a&"JUY!Z--a00; 617 s;   D9BC"C""
D6,6D1"D6#D91D66D99
Ec	           	          US:X  a  U R                  XX4XWU5      $ US;   a  U R                  XaX#XEU5      $ U R                  XX4XW5      $ )u   执行生成逻辑api)	anyrouteragentrouter)_generate_with_api_generate_with_claude_router_generate_with_augment)	r   r   r   r   r    r!   r"   r#   r$   s	            r   r1   -ChallengeGeneratorService._execute_generatione   so     e**5>P]i  4444?:[d  ..5>P r   c                   ^  T R                   R                  S5        U(       a  T R                   R                  SU 35        SSKJn  [	        [
        5      R                  R                  R                  R                  n	U	S-  T R                  -  S-  n
U
R                  SSS9  U" T R                  [        U
5      U 4S	 jT R                  US
9nUR                  5       (       d  SSS.$ UR                  5       nT R                   R                  SUS    SUS    S35        UR                  UUUUUT R                  U=(       d    0 T R                  S9$ )u   使用 API 模式生成u   使用 API 模式生成题目u   使用指定的 AI 配置 ID: r   )	AIServicege10outputT)parentsexist_okc                    > TR                   R                  [        [        U R	                  5       [        R
                  5      U5      $ N)r   loggetattrr   upperINFO)levelmsgr   s     r   <lambda>>ChallengeGeneratorService._generate_with_api.<locals>.<lambda>   s*    DKKOO=s-r   )r   
output_dirlog_callbackr   r$   r5   u(   AI 服务不可用，请检查 AI 配置r)   messageu   已创建 AI 服务实例: namez (model)r   r   r   r    r!   r   r#   r   )r   r/   app.services.ai.servicerF   r   __file__parentr   mkdirr   r6   is_availableget_provider_infogenerate_ctf_challenger   )r   r   r   r   r    r!   r#   r$   rF   ctf_dircategory_output_dir
ai_serviceprovider_infos   `            r   rA   ,ChallengeGeneratorService._generate_with_api~   sV    	89KK=l^LM5 x.''..55<<%.1A1AAHL!!$!>LL./ ((%

 &&((!E 
 #4466}V7L6MRP]^ePfOgghij00+!1((o2LL 1 	
 		
r   router_typec                 |   U R                   R                  SU S35        SSKJn  [        R
                  R                  SS5      R                  5       S:H  n	U" UU R                  U	S9n
U R                   R                  S	U S
U R                   35        U
R                  UUUUUU R                  UU R                  S9$ )u%   使用 Claude Router CLI 模式生成u   使用 u    CLI 模式生成题目r   )ClaudeRouterServiceCLAUDE_VERBOSEfalsetrue)ri   r   verboseu
   已创建 u    服务实例，用户ID: r\   )r   r/   *app.services.ai.core.claude_router_servicerk   osenvirongetlowerr   rc   r   r   )r   ri   r   r   r   r    r!   r#   rk   verbose_modeclaude_services              r   rB   6ChallengeGeneratorService._generate_with_claude_router   s     	7;-/FGHRzz~~&6@FFHFR,#LL 

 	:k]2LT\\N[\44+!1((LL 5 	
 		
r   c                 ~   U R                   R                  S5        SSKJn  [        R
                  R                  SS5      R                  5       S:H  nU" U R                  US9n	U R                   R                  SU R                   S	U 35        U	R                  UUUUUU R                  UU R                  S
9n
XS'   U
$ )u   使用 Augment CLI 模式生成u%   使用 Augment CLI 模式生成题目r   )AugmentServiceAUGMENT_VERBOSErm   rn   )r   ro   u+   已创建 Augment 服务实例，用户ID: u   ，详细模式: r\   _augment_service)r   r/   $app.services.ai.core.augment_servicery   rq   rr   rs   rt   r   rc   r   r   )r   r   r   r   r    r!   r#   ry   ru   augment_servicer9   s              r   rC   0ChallengeGeneratorService._generate_with_augment   s     	@AGzz~~&7AGGIVS(|TFt||nTefrestu 77+!1((LL 8 	
 &5!"r   r9   c           	         U R                   R                  S5        U R                  5       u  p#nU R                  5       nU(       a  U(       a   SSKJn  U" 5       nUR                  XR5      nU(       ae  UnU R                   R                  SU 35        U R                  (       a4  SSKJ	n	J
n
  U
   U R                  U	;   a  XU R                     S'   SSS5        UR                  S	5      nS
nSnU(       aN  [        US5      (       a=  UR                  (       a,  SnUR                   nU R                   R                  SU 35        U R#                  UUUUUUS9nU(       a  U(       a   UR%                  U5        SUUUUS.$ ! , (       d  f       N= f! [         a(  nU R                   R                  SU 35         SnANSnAff = f! [         a(  nU R                   R                  SU 35         SnAN{SnAff = f)u   处理生成成功的情况u   题目生成成功!r   
LogManageru&   日志文件已移动到题目目录: )generation_statusesgeneration_locklog_fileNu)   移动日志文件到题目目录失败: r{   	completedtimeout_recoveredu   检测到超时恢复: )rU   r   challenge_infoestimated_timegeneration_statusgeneration_warningu   移动会话历史失败: r*   )r)   challenge_idrU   r   r   )r   r/   _find_output_directory_get_log_file_pathapp.services.storager   move_log_to_challenger   r0   r   r   r4   warningrs   hasattrr   timeout_warning_create_challenge_record_move_session_to_challenge_dir)r   r9   rU   r   r   r   r   log_managermoved_log_filer   r   r:   r}   generation_status_valuer   r   s                   r   r2   )ChallengeGeneratorService._handle_success   s   ./ 6:5P5P5R2
N **, 
U;(l!,!B!B8!X!-HKK$$'MnM]%^_||c,#||/BBP^DLL A* M - !**%78"-!w8KLLQ`QrQr&9#!0!@!@KK"9:L9M NO 44!))51 5 
 /F>>zJ
  ($ ,
 	
A -_  U##&OPQs$STTU4  F##&@$DEEFsO   A F ."E>F %G >
FF F 
GF<<G
G6G11G6c                 2   UR                  S5      =(       d    UR                  S5      =(       d    SnU R                  R                  SU 35        U R                  5       nU(       aN   SSKJn  U" 5       nUR                  X0R                  5      nU(       a  U R                  R                  SU 35        U R                  (       a  SS
KJn  U" U R                  SUS9  SUS.$ ! [         a(  nU R                  R                  SU 35         S	nAN[S	nAff = f)u   处理生成失败的情况rX   r5   u   未知错误u   生成失败: r   r   &   日志文件已移动到失败目录: )   移动日志文件到失败目录失败: Nupdate_taskfailedr)   r5   rW   )rs   r   r5   r   r   r   move_log_to_failedr   r/   r4   r   app.routes.generator.tasksr   )	r   r9   	error_msgr   r   r   r   r:   r   s	            r   r3   )ChallengeGeneratorService._handle_failure3  s    JJy)RVZZ-@RN	N9+67 **,U;(l!,!?!?,,!W!KK$$'MnM]%^_
 <<>XYG  
 	
  U##&OPQs$STTUs   )AC$ $
D.DD	exceptionc                    [        U5      nU R                  R                  SU 3SS9  U R                  5       nU(       aN   SSKJn  U" 5       nUR                  X0R                  5      nU(       a  U R                  R                  SU 35        U R                  (       a  SS	KJn  U" U R                  S
US9  SSU 3S.$ ! [         a(  nU R                  R                  SU 35         SnAN^SnAff = f)u   处理异常情况u   生成出错: Tr+   r   r   r   r   Nr   r   r   r5   rW   )r6   r   r5   r   r   r   r   r   r/   r4   r   r   r   )	r   r   r   r   r   r   r   r:   r   s	            r   r7   +ChallengeGeneratorService._handle_exceptionN  s    	N	N9+6F **,U;(l!,!?!?,,!W!KK$$'MnM]%^_
 <<>XYG '	{3
 	
  U##&OPQs$STTUs   AB? ?
C1	C,,C1c                    SSK Jn  SSKJn  Sn0 nSnU R                  R                  S5        U" [        5      R                  R                  R                  R                  nUS-  U R                  -  S-  nUR                  5       (       Ga  [        UR                  S5       Vs/ s H  oR                  5       (       d  M  UPM     snS	 S
S9n	U	(       Ga  [        U	S   5      nU R                  R                  SU 35        SSKn
U	S   R                  nU
R!                  SU5      nU(       a3  UR#                  S5      nXS'   U R                  R                  SU 35        U	S   S-  nUR                  5       (       a  [%        USSS9 nUR'                  5       nSSS5        U" WU5      nUR)                  S5      (       a)  UR)                  S5      S:w  a  UR)                  S5      US'   SU;  d  UR)                  S5      (       d  UR)                  SS5      US'   SU;  d  UR)                  S5      (       d  UR)                  SS5      US'   UR)                  SS5      nX4U4$ s  snf ! , (       d  f       N= f)u   查找输出目录r   r   )$_extract_challenge_info_from_writeupNu   查找输出目录...rG   rH   *c                 6    U R                  5       R                  $ rL   )statst_mtime)xs    r   rS   BChallengeGeneratorService._find_output_directory.<locals>.<lambda>y  s    affh//r   T)keyreverseu   找到输出目录: \d{8}_\d{6}_(.+)   rY   u    从目录名提取题目名称: z
writeup.mdrzutf-8)encoding   未命名题目description r   	   1-2小时)pathlibr   app.routes.generator.corer   r   r/   r^   r_   r   existssortedglobis_dirr6   rerY   searchgroupopenreadrs   )r   r   r   rU   r   r   rd   re   r   output_dirsr   dir_name
name_matchchallenge_namewriteup_filefwriteup_contentwriteup_infos                     r   r   0ChallengeGeneratorService._find_output_directoryi  sI    R
01x.''..55<<%.1A1AAHL%%'' /44S9H9qXXZ9H/K
  Q0
  #7
|!DE &q>..YY':HE
%/%5%5a%8N-;6*KK$$'GGW%XY  +1~<&&((lC'Ba*+&&( C#GYa#bL#''//L4D4DV4LPa4a1=1A1A&1Iv.$N:.BTBTUbBcBc8D8H8HXZ8[}5'~=^EWEWXhEiEi;G;K;KL\^i;j'78%3%7%78H+%VN>99A I( CBs   %I#I#
I((
I6c                     SSK Jn  U R                  (       d  gU" U R                  5      nU(       a  UR                  S5      (       a  US   $ g)u   获取日志文件路径r   )get_generation_statusNr   )r0   r   r   rs   )r   r   task_statuss      r   r   ,ChallengeGeneratorService._get_log_file_path  s<    D||+DLL9;??:66z**r   rU   c                     U(       d  g SSK Jn  U" U5      $ ! [         a1  nU R                  R	                  S[        U5       35         SnAgSnAff = f)u   检查题目是否可部署Nr   )check_challenge_deployableu   检测部署能力失败: ),app.services.deployment.deployment_validatorr   r4   r   r   r6   )r   rU   r   r:   s       r   _check_deployable+ChallengeGeneratorService._check_deployable  sL    	_-j99 	KK"<SVH EF	s    
A'AAr   r   r   r   r   c                 `    SSK Jn  UUUU=(       d    SUU[        R                  R                  5       S.nU(       a  UR	                  S5      n	U	(       a  U	S:X  aM  U(       aF  SSKn
SSKJn  U" U5      R                  nU
R                  S	U5      nU(       a  UR                  S
5      n	U	=(       d0    S[        R                  R                  5       R                  S5       3US'   UR	                  SS5      US'   U R                  R                  SUR	                  S5       35        U R                  U5      nUb"  XS'   U R                  R                  SU 35        U" XR                  5      nU(       a  U R                  R                  SU 35        U R                   (       a  SSKJn  Sn	U(       aF  SSKn
SSKJn  U" U5      R                  nU
R                  S	U5      nU(       a  UR                  S
5      n	U	(       a3  U" U R                   USSU	S9  U R                  R                  SU	 35        OU" U R                   USSS9  SSKJn  U" U5        U$ U R                  R+                  S5        g! [,         a0  nU R                  R+                  S[/        U5       3SS9   SnAgSnAff = f)u   创建题目记录r   )save_challenge_recordr   )rU   r   r   r   r   r   	timestamprY   r   Nr   r   r   u
   CTF题目-z%Y%m%d%H%M%Sr   r   u   准备创建题目记录: name=
deployableu   检测部署能力: deployable=u"   已成功创建题目记录，ID: r   r   d   )r   r)   progressrY   u   已更新任务名称为: )r   r)   r   )"update_conversation_logs_challengeu   创建题目记录失败u   创建题目记录失败: Tr+   )app.models.database.operationsr   datetimenowrs   r   r   r   rY   r   r   strftimer   r/   r   r   r   r   r   r0   r   r5   r4   r6   )r   rU   r   r   r   r   r   r   generation_resultr   r   r   r   r   r   r   r   r   r:   s                      r   r   2ChallengeGeneratorService._create_challenge_record  s~   Y	L )$"0"0"?K%6&8%..224! !/!3!3F!;%;L)L!!0#'
#3#8#8%'YY/BH%M
%-7-=-=a-@N,:,}
8K\K\K`K`KbKkKklzK{J|>}!&)3A3E3EmUW3X!-0KK>?P?T?TU[?\>]^_ //
;J%2<,/  #B:,!OP 11BLLQL  #El^!TU <<F &*N!!0#'
#3#8#8%'YY/BH%M
%-7-=-=a-@N &# LL)5#.%(!/ ((+EnEU)VW $ LL)5#.%(	 Z2<@##!!"<= 	KK :3q6(CdS	s   II3 I3 3
J-=&J((J-)r   r   r   r   rL   )r   augmentNNN)NN)r   
__module____qualname____firstlineno____doc__intr6   r   r   r   r   r   r;   r1   rA   rB   rC   r2   r3   r4   r7   tupler   r   boolr   r   __static_attributes__ r   r   r   r      s   
2 
2# 
2 
2$ #% .2&*A13-A1 "$A1 S#X'	A1
 A1  A1 A1 DcN+A1 smA1 
c3hA1V /3&*3- "$ S#X'	
     DcN+ sm 
c3h@ /3&*1
3-1
 "$1
 S#X'	1

 1
  1
 DcN+1
 sm1
 
c3h1
v /3 
 
 3- 
 "$	 

 S#X' 
  
   
 DcN+ 
 
c3h 
R /3 3-  "$  S#X'	 
      DcN+  
c3h D<
d38n <
c3h <
|
d38n 
c3h 
6
9 
c3h 
6/: /:b
HSM 

HSM 
htn 
cSMc 3-c S#X	c
 !c c %SMc 
#cr   r   )r   rq   r   	traceback	threadingr   typingr   r   r   r   r   r   flaskr	   app.core.exceptionsr
   r   r   r   r   r   r   <module>r      s9   
 
     , ,   T TB Br   