
    R7_ifL                     (   S r SSKJrJrJrJr  SSKJr  SSKJ	r	J
r
  SSKJrJr  SSKrSSKrSSKr\" S\5      rSS	 jr\R)                  S
S/S9\S 5       5       r\R)                  SS/S9\S 5       5       r\R)                  SS/S9\S 5       5       rg)u:   
任务API模块

提供任务状态和日志的API接口
    )	Blueprintjsonifyrequestg)login_required   )tasks_statusget_task)generation_statusget_generation_statusNgenerate_tasks_apic                    U (       d  / S4$ [         R                  R                  U 5      (       d  SSKJn  U" [
        5      R                  R                  R                  R                  nX0-  nUR                  5       (       a  [        U5      n OQ[         R                  R                  U 5      (       d  / S4$ O([         R                  R                  U 5      (       d  / S4$ U R                  SS5      n[         R                  R                  U5      (       a  UOU n/ nUn [        USSS9 n	US:X  a3  U	R                  5       n
U	R                  SS5        U	R                  5       nO1U	R                  U5        U	R                  5       n
U	R                  5       nU
(       a&  U
R                  S	5      nU(       a  US
   S:X  a  USS
 nSSS5        Xx4$ ! , (       d  f       Xx4$ = f! [         a"  n[!        S[        U5       3SS9   SnAXx4$ SnAff = f)u   读取日志文件的新内容r   Pathz.txtz_readable.txtrzutf-8)encoding   
 Nu   读取日志文件失败: T)flush)ospathisabspathlibr   __file__parentexistsstrreplaceopenreadseektellsplit	Exceptionprint)log_filepositionr   project_rootabs_log_filereadable_log_fileactual_log_filenew_logsnew_positionfcontentes               =/Users/yu22x/Desktop/ge/ctf/app/routes/generator/tasks_api.pyread_log_filer4      s   1u 77=="" H~,,33::AA#.  <(H 77>>(++1u ,WW^^H%%1u !((A+-77>>:K+L+L'RZOHLA/39Q1}&&(q! vvxx &&( vvx"==. 2'}H# :* !!+ :9* !!  A*3q6(34@!!As7   G  *BGG  
GG  G   
H*HHz/api/tasks/<task_id>/logGET)methodsc                 	  ^ [        [        S5      (       a/  [        R                  (       a  [        R                  R                  OSnU(       d  [	        SSS.5      S4$ [        U 5      nU(       d  U R                  S5      (       a   [        U R                  SS5      5      nS	S
K	J
n  U" U5      nU(       a  UR                  S5      n[        U5      [        U5      :w  aX  [        [        S5      (       a3  [        R                  (       a  [        R                  R                  S;   d  [	        SSS.5      S4$ [        U5      UUR                  S5      S.nU(       d  [	        SSS.5      S4$ [        UR                  S5      5      [        U5      :w  aX  [        [        S5      (       a3  [        R                  (       a  [        R                  R                  S;   d  [	        SSS.5      S4$ UR                  S5      nU(       d#  [!        U 5      n	U	(       a  U	R                  S5      nU(       Gd  SU ;   a  U R#                  S5      S   SS OU SS n
S	SKJm  T" [(        5      R*                  R*                  R*                  R*                  nS	SKnUR                  S5      nUR                  S5      nU(       a.  U(       d'   S	S
K	J
n  U" U5      nU(       a  UR                  S5      nU(       a}  T" U5      S-  nUR/                  5       (       a]  [        USU
 S3-  5      nUR-                  U5      nU(       a3  [1        UU4S jS9nS S!KJn  U" XS"9  U(       a   S	S#K	Jn  U" USU05        U(       d^  US-  nUR/                  5       (       aD  [        USU
 S3-  5      nUR-                  U5      nU(       a  [1        UU4S% jS9nS S!KJn  U" XS"9  U(       d  [	        S&/ SS	S'.5      $ [8        R:                  R                  S([        S)9nUc'  [!        U 5      n	U	(       a  U	R                  S*S	5      nOS	n[=        UU5      u  nn[	        S&UUUS'.5      $ ! [         a"  n[        S[        U5       35         SnAGN"SnAff = f! [         a"  n[        S[        U5       35         SnAGNSnAff = f! [         a"  n[        S$[        U5       35         SnAGNlSnAff = f)+u-   直接读取任务日志文件（不轮询）userNerror	   未登录statusmessage  
challenge-r   r   get_challenge_recorduser_idadmin	moderator   无权访问  r(   )rB   challenge_idr(       从数据库读取题目失败:    任务不存在  -r      r   rH   
output_diru&   从数据库获取 output_dir 失败: logsai_service_z_*.txtc                 D   > T" U 5      R                  5       R                  $ Nstatst_mtimepr   s    r3   <lambda>get_task_log.<locals>.<lambda>       aAXAX    )keyr   update_task)r(   )update_challengeu#   更新数据库日志路径失败: c                 D   > T" U 5      R                  5       R                  $ rR   rS   rV   s    r3   rX   rY      rZ   r[   success)r<   rO   r(   log_positionr)   )typerb   )hasattrr   r8   idr   r
   
startswithintr    app.models.database.operationsrA   getr   roler&   r'   r   r%   r   r   r   r   globr   maxtasksr^   r_   r   argsr4   )task_idrB   taskrH   rA   challenge_datachallenge_user_idr2   r(   task_statustask_suffixr*   rk   rN   challenge_logs_dirpatternmatching_filesr^   r_   logs_dirrequest_positionr.   r/   r   s                          @r3   get_task_logrz   F   s<    #1f--!&&affiidG'kBCSHH GD l++C"7??<#DEO!5l!C!(6(:(:9(E%,-W= '6 2 2qvv!&&++QgBg#*g.+Y#Z\_#__ $'w<(4$2$6$6z$BD '6GHI3NN 488I3w</6""qvv!&&++AW2Wg.IJCOO xx
#H+G4"z2H 477NgmmC(,Ra0PRQR H~,,33::AA xx/XXl+

IO!5l!C!!/!3!3L!AJ !%j!1F!:!((**0[V3TTU!%7!3!">7XYH2;#RW,\J;QR
 #f,H  h;{m6)JJK!%7!3!">7XYH2;	
  	 ||''
'=+G4*~qA  +85EFHl$	    C8QABBCL  I>s1vhGHHI(  ) R!$GAx"PQQRsO   B0Q 9Q &R R0 
Q>Q99Q>
R-R((R-0
S:SSz/api/tasks/<task_id>/statusc                    [        [        S5      (       a/  [        R                  (       a  [        R                  R                  OSnU(       d  [	        SSS.5      S4$ [        U 5      nU(       Gd  U R                  S5      (       Ga   [        U R                  SS5      5      nS	S
K	J
n  U" U5      nU(       Ga  UR                  S5      n[        U5      [        U5      :w  aX  [        [        S5      (       a3  [        R                  (       a  [        R                  R                  S;   d  [	        SSS.5      S4$ UR                  SS5      nU(       a  UOSnUR                  S5      n	[        U	[        5      (       a1   [        R                  R!                  U	R                  SS5      5      n	O!U	c  [        R                  R#                  5       n	UR                  SU	5      n
[        U
[        5      (       a1   [        R                  R!                  U
R                  SS5      5      n
OU
c  U	n
[        U5      UUR                  SS5      SU	U
UUR                  S5      UR                  S5      S.	nU(       d  [	        SSS.5      S4$ [        UR                  S5      5      [        U5      :w  aX  [        [        S5      (       a3  [        R                  (       a  [        R                  R                  S;   d  [	        SSS.5      S4$ SU UR                  SS5      UR                  SS 5      [        UR                  S5      [        R                  5      (       a  UR                  S5      R-                  5       OUR                  S5      [        UR                  S5      [        R                  5      (       a  UR                  S5      R-                  5       OUR                  S5      UR                  S!S5      UR                  S"5      UR                  S5      UR                  S5      S#.	S$.n[/        U 5      nU(       Ga  UR                  S%5      U :X  Ga  UR                  S&UR                  S&S5      5      US'   S&'   UR                  S(0 5      US'   S('   UR                  S)S	5      US'   S)'   UR                  S5      (       ac  UR                  S5      S :X  aN  S*S+KJn  U" U SUR                  S&S,5      UR                  S"5      S-9  SUS'   S'   UR                  S"5      US'   S"'   O2UR                  S5      S :X  a  S*S+KJn  U" U UR                  S&S5      S.9  [	        U5      $ !   [        R                  R#                  5       n	 GN= f!   U	n
 GNa= f! [$         a6  n['        S[        U5       35        S	SKnUR+                  5          SnAGN\SnAff = f)/uH   获取任务状态（不包含日志，日志通过 /log 端点获取）r8   Nr9   r:   r;   r>   r?   r   r   r@   rB   rC   rF   rG   challenge_typeweb
created_atZ+00:00
updated_atname   未命名题目	completedrN   r(   	rB   category_idr   r<   r~   r   rH   rN   r(   rI   rJ   rK   ra   r<   runningr   rH   )	re   r   r<   r~   r   r   rH   r9   r(   )r<   rp   ro   r=   rp   stage_namestotal_stagesr   r]   u   生成完成)r<   r=   rH   r=   )rd   r   r8   re   r   r
   rf   rg   r    rh   rA   ri   r   rj   
isinstancedatetimefromisoformatnowr&   r'   	traceback	print_exc	isoformatr   rm   r^   )ro   rB   rp   rH   rA   rq   rr   r|   r   r~   r   r2   r   response_datars   r^   s                   r3   get_task_statusr      s    #1f--!&&affiidG'kBCSHH GD l++0&"7??<#DEO!5l!C!(6(:(:9(E%,-W= '6 2 2qvv!&&++QgBg#*g.+Y#Z\_#__ &4%7%78H%%PN4B.K!/!3!3L!AJ!*c22A)1):):)H)HI[I[\_aiIj)kJ $+%-%6%6%:%:%<
!/!3!3L*!MJ!*c224)1):):)H)HI[I[\_aiIj)kJ $+%/
 $'w<'2 . 2 26;L M"-&0&0(4&4&8&8&F$2$6$6z$B
D  '6GHI3NN 488I3w</6""qvv!&&++AW2Wg.IJCOO HHVR(hhx3@J488T`Kackctct@u@u$((<0::<{  |D  |D  EQ  |R@J488T`Kackctct@u@u$((<0::<{  |D  |D  EQ  |R88M26 HH^4XXg&,

M" (0K{y1W<+6??9dhhyZ\F]+^fi(/:}b/Qfm,0;PQ0Rfn- ??;''DHHX,>),K +)*y.I$/OON$CE /:M&!(+4?OON4SM&!.1XXh9,**y"=? =!!aA)1):):)>)>)@J4)3J  &8QAB ##%%&sR   	B1V ;AV ?/U! .A	V 8/V 'A	V ! VV VV 
W+WWz
/api/tasksc                  .
   SSK Jn   [        [        S5      (       a/  [        R                  (       a  [        R                  R
                  OSnU(       d  [        SSS.5      S4$ U " [        U5      5      n S	S
KJ	n  U" U5      nU Vs1 s H+  oUR                  S5      (       d  M  UR                  S5      iM-     nnUR                  5        VVs0 s H4  u  pxUR                  S5      (       a  UR                  S5      U;   d  M2  Xx_M6     nnnUR                  5        Vs1 s H,  nUR                  S5      (       d  M  UR                  S5      iM.     n	nU GH  nUR                  S5      n
U
(       d  M  X;  d  M%  SU
 3nX;  d  M1  UR                  SS5      nU(       a  UOSnUR                  S5      n[        U[        5      (       a1   [        R                  R                  UR!                  SS5      5      nO!Uc  [        R                  R#                  5       n[        U5      UUR                  SS5      SUUR                  SU5      U
UR                  S5      UR                  S5      S.	X+'   GM     / nUR                  5        GH  u  pxUR)                  5       n[+        U5      nU(       a  UR                  S5      U:X  a  UR                  SUR                  SS5      5      US'   UR                  S5      (       aL  UR                  S5      S:X  a7  SUS'   UR                  S5      US'   SS K Jn  U" USUR                  S5      S!9  O2UR                  S5      S:X  a  SS K Jn  U" UUR                  SS5      S"9  UR/                  UUR                  SS5      UR                  SS5      [        UR                  S5      [        R                  5      (       a  UR                  S5      R1                  5       OUR                  S5      [        UR                  S5      [        R                  5      (       a  UR                  S5      R1                  5       OUR                  S5      UR                  S#S5      UR                  S5      S$.5        GM	     UR3                  S% S&S'9  [        S(US).5      $ s  snf s  snnf s  snf !   [        R                  R#                  5       n GN= f! [$         a"  n['        S[        U5       35         SnAGNSnAff = f)*u!   获取当前用户的任务列表r   )get_user_tasksr8   Nr9   r:   r;   r>   r   )get_challenges_by_userre   rH   r?   r|   r}   r~   r   r   r   r   r   r   rN   r(   r   u   验证 challenge_id 失败: ro   r=   r   r<   r   r]   )r<   rH   r   r   )re   r   r<   r~   r   r   rH   c                 &    U R                  SS5      $ )Nr~   r   )ri   )xs    r3   rX   list_tasks.<locals>.<lambda>  s    !%%b"9r[   T)r\   reversera   )r<   rm   )rm   r   rd   r   r8   re   r   r   rh   r   ri   itemsvaluesr   r   r   r    r   r&   r'   copyr   r^   appendr   sort)r   rB   
user_tasksr   db_challenges	challengeexisting_challenge_idsro   rp   existing_task_challenge_idsrH   virtual_task_idr|   r   r~   r2   
tasks_listrs   r^   s                      r3   
list_tasksr   A  s    &"1f--!&&affiidG'kBCSHH  G-J87I.w7GT!l})XeXefjXk"5)--"5}!l
 ",!1!1!3
!388N++txx/GKa/a GM!3 	 
 #))+'
+xx' %DHH^$+ 	$ '
 'I$==.L| O$.|n"= #4%.]]3CU%KN4B.K "+|!<J!*c22A)1):):)H)HI[I[\_aiIj)kJ $+%-%6%6%:%:%<
 $'w<'2 )f6G H"-&0&/mmL*&M(4&/mmL&A$-MM*$=
3J// 'N J#))+yy{ ,G4;??95@)ooi)R9PQDO {++0Bi0O!,X'2~'F^$.G"-(3(GI (#y0.G#.??9b#AC 	HHVR(hhx3@J488T`Kackctct@u@u$((<0::<{  |D  |D  EQ  |R@J488T`Kackctct@u@u$((<0::<{  |D  |D  EQ  |R88M26 HH^4
 	1 ,F OO94OH   "m
'
2A)1):):)>)>)@J   7,SVH5667s   6S( R2%R2:S( 1R7R7
S( R==R=S( 4S( ;S( AS( /S:A<S( 2S(  S%"S( (
T2TT)r   )__doc__flaskr   r   r   r   app.services.auth.decoratorsr   rm   r	   r
   utilsr   r   r   jsonr   __name__bp_tasks_apir4   routerz   r   r    r[   r3   <module>r      s    1 0 7 ) ; 	  -x81"h .@@  A@F 1E7Cq"  Dq"h L5'2q  3qr[   