
    dJjgW                    &   % S SK Jr  S SKJr  S SKJrJr  S SKJrJ	r	J
r
  S SKJrJrJrJrJrJr  S SKJrJrJr  S SKJrJrJrJr  S SKJrJrJr  S S	KJ r   S S
K!J"r"J#r#  S SK$J%r%  S SK&J'r'J(r(J)r)J*r*J+r+J,r,  S SK-J.r.J/r/J0r0J1r1  S SK2J3r3  S SK4J5r5  S SK6J7r7J8r8  S SK9J:r:  S SK;J<r<  S SK=J>r>  \>" S5      r?0 S\_S\_S\_S\	_S\
_S\_S\_S\_S\_S\_S\_S \_S!\_S"\_S#\_S$\_S%\_0 S&\_S'\_S(\_S)\_S*\ _S+\"_S,\#_S-\%_S.\'_S/\(_S0\)_S1\*_S2\+_S3\,_S4\._S5\/_S6\0_E\1\3\5S7.Er@S S8KArAS S8KBrBS S8KCrCS S8KDrDS S8KErES S9KFJFrF  S S:KGJHrH  \BR                  " 5       rJS8qKS;\LS<'   SFS= jrMSGS> jrNSHS? jrOSIS@ jrPSJSA jrQ " SB SC5      rR\ER                  SKSD j5       rTSJSE jrUg8)L    )annotations)Any)handle_cron_createhandle_cron_delete)handle_sftp_createhandle_sftp_deletehandle_sftp_reset_password)handle_database_createhandle_database_drophandle_database_user_createhandle_database_user_delete#handle_database_user_reset_password"handle_database_user_update_grants)handle_nginx_config_readhandle_nginx_config_writehandle_nginx_service_reload)handle_service_starthandle_service_stophandle_service_restarthandle_service_status)handle_ssl_generatehandle_ssl_renewhandle_ssl_delete)handle_pipeline_run)handle_site_createhandle_site_delete)handle_log_read)handle_file_listhandle_file_readhandle_file_writehandle_file_deletehandle_file_renamehandle_file_create)handle_backup_createhandle_backup_deletehandle_backup_listhandle_backup_restore)handle_agent_update)handle_server_reboot)	ApiClientApiError)Config)load_agent_token)
get_loggerrunnerzcron_job.createzcron_job.deletezsftp_user.createzsftp_user.deletezsftp_user.reset_passwordzdatabase.createzdatabase.dropzdatabase_user.createzdatabase_user.deletezdatabase_user.reset_passwordzdatabase_user.update_grantsznginx.config.readznginx.config.writeznginx.service.reloadzservice.startzservice.stopzservice.statuszservice.restartzssl.generatez	ssl.renewz
ssl.deletepipeline.runsite.createsite.deletezlog.readz	file.listz	file.readz
file.writezfile.deletezfile.renamezfile.createzbackup.createzbackup.deletezbackup.list)zbackup.restoreagent.updateserver.rebootN)datetime)PathzCommandWorkerManager | None_worker_managerc                    U S-  nUR                  5       (       d  0 $  [        R                  " UR                  SS95      $ ! [         a    0 s $ f = f)Ncommand_states.jsonutf-8encoding)is_filejsonloads	read_text	Exception)var_dirpaths     8D:\Programs\laragon\www\wolf\agent\src\command_runner.pyload_command_statesrE   n   sP    **D<<>>	zz$..'.:;; 	s   "A AAc                $   U S-  n UR                   R                  SSS9  UR                  UR                  S-   5      n[	        USSS9 n[
        R                  " XSS	9  UR                  5         [        R                  " UR                  5       5        S S S 5        UR                  U5        [        R                  S
:w  ag   [        R                  " [        UR                   5      [        R                  5      n [        R                  " U5        [        R                  " U5        g g ! , (       d  f       N= f! [        R                  " U5        f = f! [         a     g f = f! [         a   n[         R#                  SU5         S nAg S nAff = f)Nr9   T)parentsexist_okz.tmpwr:   r;      )indentntz$failed to persist command states: %s)parentmkdir	with_namenameopenr>   dumpflushosfsyncfilenoreplacestrO_RDONLYcloserA   logwarning)rB   statesrC   tmpfdir_fdexcs          rD   save_command_statesrb   x   s&   **DA$6nnTYY/0#sW-IIf*GGIHHQXXZ  . 	D77d?T[[!12;;?%HHV$HHV$  .- HHV$  A:C@@Asg   AE% 
A
D)-E% 8E ;D: E )
D73E% :EE 
E"E% !E""E% %
F/F

Fc                D  ^ [            [        U 5      mUT;  a  0 TU'   TU   R                  U5        [        T5      S:  a:  [	        TR                  5       U4S jS9nUS S  H  nTR                  US 5        M     [        U T5        S S S 5        g ! , (       d  f       g = f)Nd   c                .   > TU    R                  SS5      $ )N
updated_at )get)kr]   s    rD   <lambda>&update_command_state.<locals>.<lambda>   s    fQimmLZ\>]    )keyi)_state_lockrE   updatelensortedkeyspoprb   )rB   
command_idchangessorted_keysri   r]   s        @rD   update_command_staterw      s    	$W-V#!#F:z!!'*v; 4]^K $'

1d# (GV, 
s   B B
Bc                    SS K n  [        R                  R                  S5      (       a|  [	        SSSS9 nU Ha  nUR                  S5      (       d  M  UR                  5       R                  5       n[        U5      S:  d  MJ  [        US   5      s  sS S S 5        $    S S S 5        O  [        R                  R                  S	5      (       as  [	        S	SSS9 nUR                  5       R                  5       nU(       a8  [        UR                  5       S   5      nU R                  5       U-
  sS S S 5        $  S S S 5        g  g ! , (       d  f       N= f! [         a     Nf = f! , (       d  f       g = f! [         a     g f = f)
Nr   z
/proc/statrr:   r;   zbtime rJ      z/proc/uptime)timerT   rC   existsrQ   
startswithstripsplitrp   floatrA   readline)r{   r_   linepartsuptime_secondss        rD   get_system_boot_timer      sB   	77>>,''lC':aDx00 $

 2 2 4u:?#(q?2 ;: ;: (77>>.))ncG<zz|))+%*4::<?%;N99;7	 =< =  * ) ;:   =<   s}   /E E+EE	E EE (/E3 AE"+	E3 6E3 
EE E 
EE"
E0,E3 0E3 3
F ?F c                :   [        U 5      nU(       d  g  U R                  n[        U5      n/ nUR	                  5        H-  u  pgUR                  S5      S;   d  M  UR                  U5        M/     U(       d  g [        R                  S[        U5      5        U GH  nUR                  U5      =(       d    0 nUR                  S5      nUS:X  Ga1  UR                  S5      n	[        5       n
SnU	b  U
b
  XS-   :  a  S	nU(       a~  [        R                  S
U5        [        UUS[        R                  " 5       R                  5       S9   UR                  [!        U5      SS	SS.S.U5        [        R                  SU5        M  [        R%                  SXiU
5        [        UUS[        R                  " 5       R                  5       S9   UR                  [!        U5      SSS0S.U5        [        R                  SU5        GMg  [        R                  SU5        [        UUS[        R                  " 5       R                  5       S9   UR                  [!        U5      SSS0S.U5        [        R                  SU5        GM     g ! [         a     g f = f! ["         a"  n[        R%                  SXl5         S nAGM  S nAff = f! ["         a"  n[        R%                  SXl5         S nAGMN  S nAff = f! ["         a"  n[        R%                  SXl5         S nAGM}  S nAff = f)Nstatuspendingrunningz*found %d interrupted command(s) to recovercommand_typer4   pre_reboot_boot_timeFg?TzPrecovering reboot command id=%s, system boot time verified. marking as succeededsuccessr   rf   	succeededzServer rebooted successfully)r   messager   resultz0posted recovery success result for command id=%sz4failed to post recovery result for command id=%s: %szbrecovering reboot command id=%s failed validation: pre_boot=%s, current_boot=%s. marking as failedfailederrorz8Server did not reboot or boot time could not be verifiedz0posted recovery failure result for command id=%sz+recovering command id=%s, marking as failedz(Agent restarted during command execution)r-   rB   AttributeErrorrE   itemsrh   appendr[   inforp   r   rw   r5   utcnow	isoformatpost_command_resultintrA   r\   )config
api_clienttokenrB   r]   interrupted_idscmd_idr   cmd_typepre_bootcurrent_bootis_real_rebootra   s                rD   recover_interrupted_commandsr      s   V$E.. !)FO88H!77""6* ' HH93;OP!zz&!'R88N+&xx 67H/1L"N#(@S.0%)Nkmst$$'0::<	e22F&126Ca&b  HHOQWX   A  CI  Ua  b$#'0::<	e22F&.'.0j&k  HHOQWX HHBFK #??,668	a..K"*#*,V"W  KVTM "  V ! eKK VX^dde( ! eKK VX^dde(  aRTZ``asY   J  8J7J?7K. 
JJ
J<J77J<?
K+	K&&K+.
L8LLc                  P    \ rS rSrS
S jrSS jrSS jrSS jrSS jrSS jr	Sr
g	)CommandWorkerManageri  c                   Xl         X l        SS KnSUR                  ;   =(       d    SUR                  ;   nU(       a  SOSn[        R
                  R                  S5      S:X  a  Sn[        [        R
                  R                  SU5      5      U l        [        R                  " S	S
9U l	        / U l        [        R                  " 5       U l        [        R                  " 5       U l        SU l        [%        5       U l        g )Nr   pytestunittest03WOLFPANEL_TEST_ASYNC1!WOLFPANEL_MAX_CONCURRENT_COMMANDSi  )maxsizeF)r   r   sysmodulesrT   environrh   r   max_workersqueueQueueworkers	threadingLocklockEventshutdown_eventupdatingsetactive_commands)selfr   r   r   is_testdefault_workerss         rD   __init__CommandWorkerManager.__init__  s    $ckk)FZ3;;-F!(#c::>>01S8!Orzz~~.QSbcd[[.
NN$	'oo/"url   c                d   U R                   S:X  a  g U R                     U R                   Vs/ sH  oR                  5       (       d  M  UPM     snU l        U R                   [	        U R                  5      -
  nUS::  a
   S S S 5        g [
        R                  SU5        [        U5       Hf  n[	        U R                  5      n[        R                  " U R                  SU 3SS9nUR                  5         U R                  R                  U5        Mh     S S S 5        g s  snf ! , (       d  f       g = f)Nr   z"starting %d command worker threadszWolfCommandWorker-TtargetrP   daemon)r   r   r   is_aliverp   r[   r   ranger   Thread_worker_loopstartr   )r   tneedediidxs        rD   start_workers"CommandWorkerManager.start_workers(  s    q YY'+||D|!zz|A|DDL%%DLL(99F{	 Y
 HH96B6]$,,'$$,,-cU3
 	##A& # YD Ys)   D!DD1D!BD!D!!
D/c                   U R                   S:X  a   [        S5      nU R                  X5        g [	        UR                  S5      5      nU R                  R                  5       (       a  [        R                  SU5        g  [        U R                  R                  USUR                  S5      [        R                  " 5       R                  5       S	9   U R                  R#                  US
S9  g ! [         a     " S S5      nU" 5       n Nf = f! [          a     NIf = f! [        R$                   a    [        R                  SU5         g f = f)Nr   workerc                  &    \ rS rSrS rS rS rSrg)1CommandWorkerManager.enqueue.<locals>.DummyLoggeriA  c                    g N r   msgargss      rD   r   6CommandWorkerManager.enqueue.<locals>.DummyLogger.infoB  s    rl   c                    g r   r   r   s      rD   r   7CommandWorkerManager.enqueue.<locals>.DummyLogger.errorC  s    rl   c                    g r   r   r   s      rD   r\   9CommandWorkerManager.enqueue.<locals>.DummyLogger.warningD  s    4rl   r   N__name__
__module____qualname____firstlineno__r   r   r\   __static_attributes__r   rl   rD   DummyLoggerr   A  s    457rl   r   idz-command queue is full, skipping command id=%sr   r   )r   r   rf   F)block)r   r.   rA   _execute_commandrX   rh   r   fullr[   r\   rw   r   rB   r5   r   r   r   putFull)r   command
worker_logr   r   s        rD   enqueueCommandWorkerManager.enqueue;  s   q +'1
 !!'6W[[&'::??KKGP		 ## $[[8#??,668	QJJNN7%N03  +8 8 )]
+,  		 zz 	QKKGP	Qs6   C-  AD D -D
D
DD*E
Ec                     [         R                  S5        U R                  R	                  5         U R
                   H  nUR                  SS9  M     U R
                  R                  5         g ! [         a     Ncf = f)Nzshutting down command workers      ?timeout)r[   r   rA   r   r   r   joinclear)r   r   s     rD   shutdownCommandWorkerManager.shutdown]  sh    	HH45 	!AFF3F   		s   A. .
A;:A;c                    [        S5      nSS KnU R                  R	                  5       (       d  U R
                  (       a  UR                  S5        MC   U R                  R                  SS9n U R                  XA5        U R                  R                  5         U R                  R	                  5       (       d  M  g g ! [         a     " S S5      nU" 5       n Nf = f! [        R                   a     M  f = f! [         a1  n UR                  SU5         S nAN! [         a      S nANf = fS nAff = f! U R                  R                  5         f = f)	Nr   c                  &    \ rS rSrS rS rS rSrg)6CommandWorkerManager._worker_loop.<locals>.DummyLoggeril  c                    g r   r   r   s      rD   r   ;CommandWorkerManager._worker_loop.<locals>.DummyLogger.infom  s    Drl   c                    g r   r   r   s      rD   r   <CommandWorkerManager._worker_loop.<locals>.DummyLogger.errorn  s    Trl   c                    g r   r   r   s      rD   r\   >CommandWorkerManager._worker_loop.<locals>.DummyLogger.warningo  s    trl   r   Nr   r   rl   rD   r   r   l  s    013rl   r   r   g      ?r   r   zUnhandled worker error: %s)r.   rA   r{   r   is_setr   sleepr   rh   Emptyr   r   	task_done)r   r   r   r{   r   es         rD   r   !CommandWorkerManager._worker_loopg  s   	'#H-J 	%%,,..}}

3**...5'%%g: 

$$&# %%,,..  	'4 4 %J	' ;; 
  $$%A1EE   

$$&sk   B= C /C9 =CCC65C69
D4DD7 
D,%D/&D7 +D,,D//D44D7 7Ec                
  ^ ^^^^ [        UR                  S5      5      nT R                     T R                  R	                  U5        S S S 5         UR                  S5      mUR                  S5      =(       d    0 m[        T R                  5      n UR                  SUT5         S[        R                  " 5       R                  5       S.nTS:X  a3  [        R                  " 5       R                  5       US'   [        5       US	'   [        T R                  R                  U40 UD6   T R                   R#                  [%        U5      S
S0U5        TS:X  a  [)        T5      mUTS'   [*        R                  T5      mT(       d   UR-                  ST5        SnSST 30nGO0 mUUUUU 4S jn	[.        R0                  " U	SU 3SS9n
U
R3                  5         [%        TR                  SS5      5      nU
R5                  US9  U
R7                  5       (       a   UR-                  SX;5         SS KnU
R:                  (       a  UR<                  R?                  URA                  U
R:                  5      URC                  [D        5      5      nUS:  a5  UR<                  R?                  URA                  U
R:                  5      S 5        OU
R:                  (       a   SnSSU S30nOJST;   a  SnSS [        TS   5       30nO.TR                  S!0 5      nUR                  S"S5      SL a  S#nOSnUn T R                   R#                  [%        U5      XxS$.U5         UR                  S%X75        US#:X  a  S"OSn [        T R                  R                  UU[        R                  " 5       R                  5       S9  T R                     T R                  RG                  U5        S S S 5        g ! , (       d  f       GN= f! [         a     GNZf = f! [         a     GNf = f! [         a3  n UR'                  SX65         S nAGN! [         a      S nAGNf = fS nAff = f! [         a     GNf = f! [         a     GNLf = f! [         a3  n UR'                  SU5         S nAGN! [         a      S nAGNf = fS nAff = f! [         a     GN`f = f! [         a3  n UR-                  S&X65         S nAGN! [         a      S nAGNf = fS nAff = f! [         a     GNef = f! , (       d  f       g = f! T R                     T R                  RG                  U5        S S S 5        f ! , (       d  f       f = f= f)'Nr   r   payloadz processing command id=%s type=%sr   r   r4   
started_atr   r   z3failed to post running status for command id=%s: %sr3   job_idzunsupported command type: %sr   r   zUnsupported command type: c                    >  TS;   a  T" TTR                   TR                  5      n OT" T5      n U TS'   g ! [         a  nUTS'    S nAg S nAff = f)N)r0   r1   r2   r3   r   	exception)r   r   rA   )resra   r   handlerr  result_containerr   s     rD   run_handler:CommandWorkerManager._execute_command.<locals>.run_handler  sW    <#'ee")'4;;"PC")'"2C58(2$ <8;(5<s   26 
A A

AzCommandHandler-Tr   r   iX  r   z(command id=%s timed out after %s secondsr   rz   z1failed to raise exception in timed out thread: %sz"Command execution timed out after z secondsr  zHandler exception: r   r   r   r   z)posted command result for id=%s status=%sz+failed to post command result for id=%s: %s)$rX   rh   r   r   addr-   r   r   rA   r5   r   r   r   rw   rB   r   r   r   r   r\   dictHANDLERSr   r   r   r   r   r   ctypesident	pythonapiPyThreadState_SetAsyncExcc_long	py_object
SystemExitdiscard)r   r   r   r   r   state_changesra   
status_strpayload_resultr  handler_threadr   r  r  exlocal_statusr   r  r  r  s   `               @@@@rD   r   %CommandWorkerManager._execute_command  s
   W[[&'YY  $$V, N	5{{>2Hkk),2G$T[[1E BFHU'"*//"3"="="?! .2://2C2M2M2OM,/<P<RM"89$KK'' $
33Ky) >)w-$*! ll8,G$$%CXN &
")-Gz+R!S#% < < "+!1!1&*6(3"
 $$&gkk)S9:##G#4!**,,"(()SU[e!%)//"("2"2"L"L &n.B.B C & 0 0 <#C  #Qw & 0 0 J J6==YgYmYmKnpt u+11  "*J&-1ST[S\\d/e%fN"&66%-
*15HM]^iMjIkHl3m)n.228R@779d3t;)4J)1J),33K)D
OO$OQWd )3k(A9xL$KK''''0::<	 $$,,V4 _ Y  " "   &&'\^djj   ! < %  % !!&../bdfgg( ! !!: !  $$%RTZ``   "  $$,,V4 s  O A T) O2 &B P '(P 2T) Q A?T) Q% 'BQ6 ?T)  Q6 AT) ((S R6 #
T) .AT ;T 
O/2
P <T) ?P  T) 
PT) PT) 
QP71T) 7
Q	QT) Q		QQT) 
Q"T) !Q""T) %
Q3/T) 2Q33T) 6
R3RT) 
R+#R.$T) *R++R..R33T) 6
S S T) SS 
TS*$T) *
S<4S?5T) ;S<<S??TT) 
TT) TT) 
T&)U,6U	U,
U)%U,)	r   r   r   r   r   r   r   r   r   Nr   r,   r   r*   returnNoner*  r+  )r   dict[str, Any]r*  r+  )r   r   r   r   r   r   r   r   r   r   r   r   rl   rD   r   r     s#    %"'& QD'>R5rl   r   c                 <    [         b  [         R                  5         g g r   )r7   r   r   rl   rD   shutdown_workersr/    s     "  " #rl   c                   U R                   S:X  a  [        R                  S5        g[        U 5      nU R                  (       a  U(       d  [        R                  S5        g[        c,   [        X5        [        X5      q[        R                  5         OU [        l        U[        l        SSKnSUR                  ;   =(       d    SUR                  ;   nU(       a  S	OS
n[         R"                  R%                  S5      S:X  a  S
n['        [         R"                  R%                  SU5      5      [        l        [        R                  5          UR+                  U5      nU(       d  g[        R/                  S[1        U5      5        U H  n UR%                  S5      n	UR%                  S5      n
U	(       a  U
(       d  [        R                  SU5        ML  [3        U	5      n[4           [7        U R8                  5      nX;   a:  X   R%                  S5      nUS;   a!  [        R/                  SX5         SSS5        M  SSS5        [        R;                  U5        M     g! [         a!  n[        R                  SU5         SnAGN
SnAff = f! [,         a   n[        R                  SU5         SnAgSnAff = f! , (       d  f       N= f! [         a"  n[        R                  SU5         SnAGMg  SnAff = f)zQFetch pending commands from Central API and dispatch them to worker manager.
    revokedz)Command runner skipped: Agent is revoked.Nz+Command runner skipped: Unregistered agent.z*failed to recover interrupted commands: %sr   r   r   r   r   r   r   r   z$failed to fetch pending commands: %szfetched %d pending command(s)r   r   zskipped malformed command: %sr   r   z%command id=%s is already %s, skippingzfailed to queue command: %s)r   r[   r\   r-   	server_iddebugr7   r   rA   r   r   r   r   r   r   r   rT   r   rh   r   r   get_pending_commandsr+   r   rp   rX   rn   rE   rB   r   )r   r   r   ra   r   r   r   commandsr   rt   r   
cmd_id_strr]   current_statuss                 rD   process_commandsr8  "  s?    }}	!?@V$E		?@ 	I(< /vB%%'!'%/"ckk)FZ3;;-F!(#c::>>01S8!O&)"**..9\^m*n&o#%%'2259
 HH,c(m<	: T*J";;~6L\;WE ZJ,V^^<'%+%7%;%;H%EN%)??!H*e   ##G,% 5  	IIIBCHH	I"  :C@&   	:II3S99	:sn   (I 	J AKK AJ2+K5K
J!I==J
J/J**J/2
K 	<K
K/K**K/)rB   r6   r*  r-  )rB   r6   r]   r-  r*  r+  )rB   r6   rt   rX   ru   r   r*  r+  )r*  zfloat | Noner)  r,  )V
__future__r   typingr   actions.cronr   r   actions.sftpr   r   r	   actions.databaser
   r   r   r   r   r   actions.nginxr   r   r   actions.servicer   r   r   r   actions.sslr   r   r   actions.pipeliner   actions.siter   r   actions.logsr   actions.file_managerr   r   r    r!   r"   r#   actions.backupr$   r%   r&   r'   actions.agentr(   actions.powerr)   r   r*   r+   r   r,   identityr-   loggerr.   r[   r  r   r   rT   r>   atexitr5   pathlibr6   r   rn   r7   __annotations__rE   rb   rw   r   r   r   registerr/  r8  r   rl   rD   <module>rN     s   "  ? [ [  
  
 1 ? (   . . *  % &)&)& *& *	&
  :& -& )& 7& 7& #$G& "#E& 1& 3& 7& )&  '!&" +#&$ -%&& ''&( !)&* #+&, '-&. %/&0 %1&2 3&4 !5&6 !7&8 #9&: %;&< %=&> %?&@ )A&B )C&D %E&F ,')K&R   	    nn/3, 3A.-8ZazB5 B5J # #>:rl   