
     iG                     <    S r SSKrSSKrSSKrSSKr " S S5      rg)zn
Control Interface Command Handlers

Provides handlers for all control commands with access to arbiter state.
    Nc                   @   \ rS rSrSrS rS\4S jrS\4S jrS\4S jr	S\4S jr
S\4S	 jrSS
\S\4S jjrSS
\S\4S jjrS\S\4S jrSS
\S\4S jjrSS
\S\4S jjrS\S
\S\4S jrS\4S jrS\4S jrSS\S\4S jjrS\4S jrS\4S jrS\4S jrSrg)CommandHandlers   z
Command handlers with access to arbiter state.

All handler methods return dictionaries that will be sent
as the response data.
c                     Xl         g)z_
Initialize handlers with arbiter reference.

Args:
    arbiter: The Gunicorn arbiter instance
Narbiter)selfr   s     G/var/www/ias/venv/lib/python3.13/site-packages/gunicorn/ctl/handlers.py__init__CommandHandlers.__init__   s	         returnc           	         / n[         R                  " 5       nU R                  R                  R	                  5        Hc  u  p4 UR
                  R                  5       n[        X%-
  S5      nUR                  UUR                  UR                  UR                  US.5        Me     UR                  S S9  U[        U5      S.$ ! [        [        4 a    Sn Nkf = f)a5  
Return list of HTTP workers.

Returns:
    Dictionary with workers list containing:
    - pid: Worker process ID
    - age: Worker age (spawn order)
    - requests: Number of requests handled (if available)
    - booted: Whether worker has finished booting
    - last_heartbeat: Seconds since last heartbeat
   N)pidagebootedabortedlast_heartbeatc                     U S   $ Nr    ws    r
   <lambda>.CommandHandlers.show_workers.<locals>.<lambda>A   s    1U8r   key)workerscount)time	monotonicr   WORKERSitemstmplast_updateroundOSError
ValueErrorappendr   r   r   sortlen)r	   r   nowr   workerr&   r   s          r
   show_workersCommandHandlers.show_workers"   s     nn<<//557KC&$jj446!&s'8!!< NNzz --!>>"0  8  	+,"S\:: Z( &!%&s   (CCCc                 ^   U R                   R                  (       d  SS/ / S.$ [        U R                   SS5      n/ n/ nU(       Ga1  [        US5      (       Ga  [        R
                  " 5       nUR                  R                  5        He  u  pV UR                  R                  5       n[        XG-
  S5      nUR                  UUR                  [        US/ 5      [        USS5      US	.5        Mg     [        US
5      (       av  UR                   R                  5        HX  u  p[#        UR$                  R'                  U	/ 5      5      nUR                  U	U
R'                  S5      [)        U5      US.5        MZ     SU R                   R                  UUS.$ ! [        [        [        4 a    Sn Nf = f)z
Return dirty workers and apps information.

Returns:
    Dictionary with:
    - enabled: Whether dirty arbiter is running
    - pid: Dirty arbiter PID
    - workers: List of dirty worker info
    - apps: List of dirty app specs
FN)enabledr   r   appsdirty_arbiterr   r   	app_pathsr   )r   r   r3   r   r   	app_specsworker_count)import_pathr7   current_workersworker_pidsT)r   dirty_arbiter_pidgetattrhasattrr!   r"   r   r$   r%   r&   r'   r(   r)   AttributeErrorr*   r   r6   listapp_worker_mapgetr,   )r	   r4   r   r3   r-   r   r.   r&   r   pathspecr:   s               r
   
show_dirtyCommandHandlers.show_dirtyE   s    ||-- 	   otDW]I>>.."C,44::<*"(**"8"8":K%*3+<a%@N !::#FK<%fh>&4    =  }k22"/"9"9"?"?"AJD"&}'C'C'G'Gb'Q"RKKK'+(,(@+.{+;'2	!  #B <<11	
 	
-  ^< *%)N*s   (FF,+F,c                 t   U R                   R                  n0 n/ SQnU H  n [        X5      n[        U5      (       a  [	        U5      nOU[        US5      (       aD  [        U[        [        [        [        [        [        [        S5      45      (       d  [	        U5      nXRU'   M     U$ ! [         a     M  f = f)zZ
Return current effective configuration.

Returns:
    Dictionary of configuration values
)bindr   worker_classthreadstimeoutgraceful_timeout	keepalivemax_requestsmax_requests_jitterworker_connectionspreload_appdaemonpidfile	proc_namereloaddirty_workers
dirty_appsdirty_timeoutcontrol_socketcontrol_socket_disable	__class__N)r   cfgr<   callablestrr=   
isinstanceintfloatboolr?   dicttyper>   )r	   r[   configconfig_keysr   values         r
   show_configCommandHandlers.show_config   s     ll
 C
)E??JEUK00S%tT4:N:P :PJE#s   " s   B B))
B76B7c           
         [        U R                  S0 5      nUR                  S5      nSnU(       a"  [        [        R                  " 5       U-
  S5      nUU R                  R
                  [        U R                  R                  5      U R                  R                  UR                  SS5      UR                  SS5      UR                  SS5      U R                  R                  =(       d    SS	.$ )
aA  
Return server statistics.

Returns:
    Dictionary with:
    - uptime: Seconds since arbiter started
    - pid: Arbiter PID
    - workers_current: Current number of workers
    - workers_spawned: Total workers spawned
    - workers_killed: Total workers killed (if tracked)
    - reloads: Number of reloads (if tracked)
_stats
start_timeNr   workers_spawnedr   workers_killedreloads)uptimer   workers_currentworkers_targetrl   rm   rn   r;   )
r<   r   rA   r'   r!   r   r,   r#   num_workersr;   )r	   statsrk   ro   s       r
   
show_statsCommandHandlers.show_stats   s     h3YY|,
499;3Q7F <<##"4<<#7#78"ll66$yy):A>#ii(8!<yyA.!%!?!?!G4	
 		
r   c                    / nU R                   R                   H  n[        U5      nUUR                  5       S.n UR                  nUR
                  [        R                  :X  a  SUS'   OGUR
                  [        R                  :X  a  SUS'   O#UR
                  [        R                  :X  a  SUS'   UR                  U5        M     U[        U5      S.$ ! [         a    SUS'    N4f = f)zO
Return bound socket information.

Returns:
    Dictionary with listeners list
)addressfdunixrc   tcptcp6unknown)	listenersr    )r   	LISTENERSr]   filenosockfamilysocketAF_UNIXAF_INETAF_INET6	Exceptionr*   r,   )r	   r}   lnraddrlistener_infor   s         r
   show_listenersCommandHandlers.show_listeners   s     	<<))Cs8DjjlM	2xx;;&..0,2M&)[[FNN2,1M&)[[FOO3,2M&) ]+' ** 'Y@@  2(1f%2s   /C+#C#CC'&C'r    c                     [        S[        U5      5      nU R                  R                  nU R                  =R                  U-  sl        U R                  R	                  5         UUU R                  R                  S.$ )z
Increase worker count.

Args:
    count: Number of workers to add (default 1)

Returns:
    Dictionary with added count and new total
   )addedprevioustotalmaxr_   r   rr   wakeup)r	   r    	old_counts      r
   
worker_addCommandHandlers.worker_add   si     As5z"LL,,	  E)  	 !\\--
 	
r   c                     [        S[        U5      5      nU R                  R                  n[        SX!-
  5      nX#-
  nX0R                  l        U R                  R	                  5         UUUS.$ )z
Decrease worker count.

Args:
    count: Number of workers to remove (default 1)

Returns:
    Dictionary with removed count and new total
r   )removedr   r   r   )r	   r    r   	new_countactual_removeds        r
   worker_removeCommandHandlers.worker_remove   sm     As5z"LL,,	 9,-	".#,  	 &!
 	
r   r   c                     [        U5      nXR                  R                  ;  a	  SSU S3S.$  [        R                  " U[
        R                  5        SUS.$ ! [         a  nS[        U5      S.s SnA$ SnAff = f)z}
Gracefully terminate a specific worker.

Args:
    pid: Worker process ID

Returns:
    Dictionary with killed PID or error
FzWorker z
 not foundsuccesserrorT)r   killedN)	r_   r   r#   oskillsignalSIGTERMr(   r]   )r	   r   es      r
   worker_killCommandHandlers.worker_kill  s     #hll*** "3%z2 

	GGC(   	 Q 	s   )A 
A;#A60A;6A;c                     U R                   R                  (       d  SSS.$ [        S[        U5      5      nU R	                  SU5      $ )z
Spawn additional dirty workers.

Sends a MANAGE message to the dirty arbiter to spawn workers.

Args:
    count: Number of dirty workers to add (default 1)

Returns:
    Dictionary with added count or error
FDirty arbiter not runningr   r   addr   r;   r   r_   _send_manage_messager	   r    s     r
   	dirty_addCommandHandlers.dirty_add4  sF     ||-- 4 
 As5z"((66r   c                     U R                   R                  (       d  SSS.$ [        S[        U5      5      nU R	                  SU5      $ )z
Remove dirty workers.

Sends a MANAGE message to the dirty arbiter to remove workers.

Args:
    count: Number of dirty workers to remove (default 1)

Returns:
    Dictionary with removed count or error
Fr   r   r   remover   r   s     r
   dirty_removeCommandHandlers.dirty_removeI  sF     ||-- 4 
 As5z"((599r   	operationc                    Sn[        U R                  S5      (       a<  U R                  R                  (       a!  [        U R                  R                  SS5      nU(       d  [        R
                  R                  S5      nU(       d  SSS.$  SS	KJnJ	nJ
n  US
:X  a  UOUn[        R                  " [        R                  [        R                  5      nUR                  S5        UR                  U5        UR                   SUUS.n	UR#                  X5        UR%                  U5      n
UR'                  5         U
R                  S5      UR(                  :X  a  U
R                  SSS05      $ U
R                  S5      UR*                  :X  a0  U
R                  S0 5      nSUR                  S[-        U5      5      S.$ SSU
R                  S5       3S.$ ! [.         a  nS[-        U5      S.s SnA$ SnAff = f)z
Send a worker management message to the dirty arbiter.

Args:
    operation: "add" or "remove"
    count: Number of workers to add/remove

Returns:
    Dictionary with result or error
Nr4   socket_pathGUNICORN_DIRTY_SOCKETFz%Cannot find dirty arbiter socket pathr   r   )DirtyProtocolMANAGE_OP_ADDMANAGE_OP_REMOVEr   g      $@r   )rc   idopr    rc   resultr   Tr   messagezUnexpected response type: )r=   r   r4   r<   r   environrA   gunicorn.dirty.protocolr   r   r   r   r   SOCK_STREAM
settimeoutconnectMSG_TYPE_MANAGEwrite_messageread_messagecloseMSG_TYPE_RESPONSEMSG_TYPE_ERRORr]   r   )r	   r   r    dirty_socket_pathr   r   r   r   r   requestresponser   r   s                r
   r   $CommandHandlers._send_manage_message^  s    !4<<11dll6P6P '**M4! ! "

/F G  @ 
*	  #,u"4:JB==1C1CDDOOD!LL*+ &55	G ''6 %11$7HJJL||F#}'F'FF||Hy$.?@@f%)E)EE Wb1$"YYy#e*=   %9(,,v:N9OP 
  	 Q 	s,   CG ,AG ;G 
G4G/)G4/G4c                 |    [         R                  " U R                  R                  [        R
                  5        SS0$ )zV
Trigger graceful reload (equivalent to SIGHUP).

Returns:
    Dictionary with status
status	reloading)r   r   r   r   r   SIGHUPr	   s    r
   rT   CommandHandlers.reload  s+     	  &--0+&&r   c                 |    [         R                  " U R                  R                  [        R
                  5        SS0$ )zP
Reopen log files (equivalent to SIGUSR1).

Returns:
    Dictionary with status
r   	reopening)r   r   r   r   r   SIGUSR1r   s    r
   reopenCommandHandlers.reopen  s+     	  &..1+&&r   modec                     US:X  a:  [         R                  " U R                  R                  [        R
                  5        O9[         R                  " U R                  R                  [        R                  5        SUS.$ )zs
Initiate shutdown.

Args:
    mode: "graceful" (SIGTERM) or "quick" (SIGINT)

Returns:
    Dictionary with status
quickshutting_down)r   r   )r   r   r   r   r   SIGINTr   )r	   r   s     r
   shutdownCommandHandlers.shutdown  sN     7?GGDLL$$fmm4GGDLL$$fnn5)488r   c           	      ~   [         R                  " 5       nU R                  R                  SSS.n/ nU R                  R                  R                  5        HY  u  pE UR                  R                  5       n[        X-
  S5      nUR                  USUR                  UR                  US.5        M[     UR                  S S	9  Sn/ n	U R                  R                  (       a*  U R                  R                  S
SS.nU R!                  5       n	UU[#        U5      UU	[#        U	5      S.$ ! [        [        4 a    Sn Nf = f)z
Return overview of all processes (arbiter, web workers, dirty arbiter, dirty workers).

Returns:
    Dictionary with complete process hierarchy
r   master)r   rc   roler   Nweb)r   rc   r   r   r   c                     U S   $ r   r   r   s    r
   r   *CommandHandlers.show_all.<locals>.<lambda>  s    qxr   r   r4   zdirty master)r   web_workersweb_worker_countr4   rU   dirty_worker_count)r!   r"   r   r   r#   r$   r%   r&   r'   r(   r)   r*   r   r   r+   r;   _query_dirty_workersr,   )
r	   r-   arbiter_infor   r   r.   r&   r   dirty_arbiter_inforU   s
             r
   show_allCommandHandlers.show_all  s@    nn <<##
 <<//557KC&$jj446!&s'8!!< zz --"0   8  	/0 "<<))||55'&" !557M $& #K 0/*"%m"4
 	
9 Z( &!%&s   (D''D<;D<c                    Sn[        U R                  S5      (       a<  U R                  R                  (       a!  [        U R                  R                  SS5      nU(       d  [        R
                  R                  S5      nU(       d  / $  SSKJn  [        R                  " [        R                  [        R                  5      nUR                  S5        UR                  U5        UR                  SS	.nUR                  X45        UR!                  U5      nUR#                  5         UR                  S
5      UR$                  :X  a$  UR                  S0 5      nUR                  S/ 5      $  / $ ! [&         a     / $ f = f)z
Query the dirty arbiter for worker information.

Connects to the dirty arbiter socket and sends a status request.

Returns:
    List of dirty worker info dicts, or empty list on error
Nr4   r   r   r   )r   g       @zctl-status-1)rc   r   rc   r   r   )r=   r   r4   r<   r   r   rA   r   r   r   r   r   r   r   MSG_TYPE_STATUSr   r   r   r   r   )r	   r   r   r   r   r   r   s          r
   r   $CommandHandlers._query_dirty_workers  s9    !4<<11dll6P6P '(B(BMSW X  "

/F G I	===1C1CDDOOC LL*+ &55$G ''6 %11$7HJJL||F#}'F'FF!h3zz)R00 G 	  			s   
CE, ,
E:9E:c                 .    SSSSSSSSS	S
SSSSSS.nSU0$ )z\
Return list of available commands.

Returns:
    Dictionary with commands and descriptions
z8Show all processes (arbiter, web workers, dirty workers)z#List HTTP workers with their statuszList dirty workers and appsz$Show current effective configurationzShow server statisticszShow bound socketszSpawn N workers (default 1)zRemove N workers (default 1)z$Gracefully terminate specific workerz!Spawn N dirty workers (default 1)z"Remove N dirty workers (default 1)zGraceful reload (HUP)zReopen log files (USR1)zShutdown server (TERM/INT)zShow this help message)zshow allzshow workersz
show dirtyzshow configz
show statszshow listenerszworker add [N]zworker remove [N]zworker kill <PID>zdirty add [N]zdirty remove [N]rT   r   zshutdown [graceful|quick]helpcommandsr   )r	   r   s     r
   r   CommandHandlers.help1  sF     SA7A22;!?!G@ D-/)E,
" H%%r   r   N)r   )graceful)__name__
__module____qualname____firstlineno____doc__r   rb   r/   rD   rg   rt   r   r_   r   r   r   r   r   r]   r   rT   r   r   r   r?   r   r   __static_attributes__r   r   r
   r   r      s   !;d !;F:
D :
x!T !F
D 
>A A@
 
D 
.
3 
t 
8s t <7s 74 7*:# :d :*Cc C# C$ CJ	' 	'' '9S 9$ 9"9
$ 9
v+d +Z&d &r   r   )r   r   r   r   r!   r   r   r   r
   <module>r      s$   
 
   x& x&r   