Ë
    Û�ðiG  ã                   ó<   — d Z ddlZddlZddlZddlZ G d„ d«      Zy)zn
Control Interface Command Handlers

Provides handlers for all control commands with access to arbiter state.
é    Nc                   ó  — e Zd ZdZd„ Zdefd„Zdefd„Zdefd„Zdefd„Z	defd„Z
dd	edefd
„Zdd	edefd„Zdedefd„Zdd	edefd„Zdd	edefd„Zded	edefd„Zdefd„Zdefd„Zddedefd„Zdefd„Zdefd„Zdefd„Zy)ÚCommandHandlersz‘
    Command handlers with access to arbiter state.

    All handler methods return dictionaries that will be sent
    as the response data.
    c                 ó   — || _         y)z
        Initialize handlers with arbiter reference.

        Args:
            arbiter: The Gunicorn arbiter instance
        N)Úarbiter)Úselfr   s     úP/var/www/html/Extract/venv/lib/python3.12/site-packages/gunicorn/ctl/handlers.pyÚ__init__zCommandHandlers.__init__   s   € ð ˆ�ó    Úreturnc           	      ó´  — g }t        j                  «       }| j                  j                  j	                  «       D ]d  \  }}	 |j
                  j                  «       }t        ||z
  d«      }|j                  ||j                  |j                  |j                  |dœ«       Œf |j                  d„ ¬«       |t        |«      dœS # t        t        f$ r d}Y Œkw xY w)a}  
        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                 ó   — | d   S ©Nr   © ©Úws    r   ú<lambda>z.CommandHandlers.show_workers.<locals>.<lambda>A   s
   €  1 U¡8€ r
   ©Ú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_workerszCommandHandlers.show_workers"   sÌ   € ð ˆÜ�n‰nÓˆàŸ<™<×/Ñ/×5Ñ5Ó7ò 	‰KˆC�ð&Ø$Ÿj™j×4Ñ4Ó6�Ü!& s¨[Ñ'8¸!Ó!<�ð �N‰NØØ—z‘zØ Ÿ-™-Ø!Ÿ>™>Ø"0ñõ ð	ð  	�‰Ñ+ˆÔ,à"¬S°«\Ñ:Ð:øô œZÐ(ò &Ø!%’ð&ús   Á)CÃCÃCc                 ó0  — | j                   j                  sddg g dœS t        | j                   dd«      }g }g }|�r%t        |d«      �rt	        j
                  «       }|j                  j                  «       D ]f  \  }}	 |j                  j                  «       }t        ||z
  d«      }|j                  ||j                  t        |dg «      t        |dd«      |d	œ«       Œh t        |d
«      ru|j                   j                  «       D ]X  \  }	}
t#        |j$                  j'                  |	g «      «      }|j                  |	|
j'                  d«      t)        |«      |dœ«       ŒZ d| j                   j                  ||dœS # t        t        t        f$ r d}Y Œíw xY w)a%  
        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   r.   r   r   Ú	app_specsÚworker_count)Úimport_pathr2   Úcurrent_workersÚworker_pidsT)r   Údirty_arbiter_pidÚgetattrÚhasattrr   r   r   r    r!   r"   r#   r$   r%   ÚAttributeErrorr&   r   r1   ÚlistÚapp_worker_mapÚgetr(   )r   r/   r   r.   r)   r   r*   r"   r   ÚpathÚspecr5   s               r   Ú
show_dirtyzCommandHandlers.show_dirtyE   s”  € ð �|‰|×-Ò-à ØØØñ	ð ô   §¡¨o¸tÓDˆàˆØˆâœW ]°IÕ>Ü—.‘.Ó"ˆCØ,×4Ñ4×:Ñ:Ó<ò ‘��Vð*Ø"(§*¡*×"8Ñ"8Ó":�KÜ%*¨3°Ñ+<¸aÓ%@�Nð —‘ØØ!Ÿ:™:Ü# F¨K¸Ó<Ü% f¨h¸Ó>Ø&4ñ õ ðô  �} kÔ2Ø"/×"9Ñ"9×"?Ñ"?Ó"Aò ‘J�D˜$Ü"& }×'CÑ'C×'GÑ'GÈÈbÓ'QÓ"R�KØ—K‘KØ'+Ø(,¯©°Ó(@Ü+.¨{Ó+;Ø'2ñ	!õ ðð Ø—<‘<×1Ñ1ØØñ	
ð 	
øô-  ¤¬^Ð<ò *Ø%)’Nð*ús   Á>)E<Å<FÆFc                 óR  — | j                   j                  }i }g d¢}|D ]v  }	 t        ||«      }t        |«      rt	        |«      }nKt        |d«      r?t        |t        t        t        t        t        t        t        d«      f«      st	        |«      }|||<   Œx |S # t        $ r Y Œ†w xY w)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   Úcfgr7   ÚcallableÚstrr8   Ú
isinstanceÚintÚfloatÚboolr:   ÚdictÚtyper9   )r   rU   ÚconfigÚconfig_keysr   Úvalues         r   Úshow_configzCommandHandlers.show_config�   s¨   € ð �l‰l×ÑˆØˆò
ˆð ò 	ˆCð
Ü  SÓ)�ä˜E”?Ü ›J‘EÜ˜U KÔ0¼Ø¤¤S¬%´´t¼TÄ4ÈÃ:ÐNô:Pä ›J�EØ#��s’ð	ð ˆøô "ò Ùðús   £A3BÂ	B&Â%B&c           
      óÌ  — t        | j                  di «      }|j                  d«      }d}|r!t        t	        j                  «       |z
  d«      }|| j                  j
                  t        | j                  j                  «      | j                  j                  |j                  dd«      |j                  dd«      |j                  dd«      | j                  j                  xs dd	œS )
a‘  
        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_targetre   rf   rg   r6   )
r7   r   r<   r#   r   r   r(   r   Únum_workersr6   )r   Ústatsrd   rh   s       r   Ú
show_statszCommandHandlers.show_stats¤   s¼   € ô ˜Ÿ™ h°Ó3ˆØ—Y‘Y˜|Ó,ˆ
àˆÙÜœ4Ÿ9™9›;¨Ñ3°QÓ7ˆFð Ø—<‘<×#Ñ#Ü" 4§<¡<×#7Ñ#7Ó8Ø"Ÿl™l×6Ñ6Ø$Ÿy™yÐ):¸AÓ>Ø#Ÿi™iÐ(8¸!Ó<Ø—y‘y ¨AÓ.Ø!%§¡×!?Ñ!?Ò!GÀ4ñ	
ð 		
r
   c                 óÈ  — g }| j                   j                  D ]¦  }t        |«      }||j                  «       dœ}	 |j                  }|j
                  t        j                  k(  rd|d<   nE|j
                  t        j                  k(  rd|d<   n"|j
                  t        j                  k(  rd|d<   |j                  |«       Œ¨ |t        |«      dœS # t        $ r d|d<   Y Œ1w xY w)zo
        Return bound socket information.

        Returns:
            Dictionary with listeners list
        )ÚaddressÚfdÚunixr]   ÚtcpÚtcp6Úunknown)Ú	listenersr   )r   Ú	LISTENERSrW   ÚfilenoÚsockÚfamilyÚsocketÚAF_UNIXÚAF_INETÚAF_INET6Ú	Exceptionr&   r(   )r   ru   ÚlnrÚaddrÚlistener_inforx   s         r   Úshow_listenerszCommandHandlers.show_listenersÃ   sÖ   € ð ˆ	à—<‘<×)Ñ)ò 	,ˆCÜ�s“8ˆDàØ—j‘j“lñˆMð	2Ø—x‘x�Ø—;‘;¤&§.¡.Ò0Ø,2�M &Ò)Ø—[‘[¤F§N¡NÒ2Ø,1�M &Ò)Ø—[‘[¤F§O¡OÒ3Ø,2�M &Ñ)ð ×Ñ˜]Õ+ð'	,ð* '´°Y³Ñ@Ð@øô ò 2Ø(1�˜fÓ%ð2ús   »A4CÃC!Ã C!r   c                 óþ   — t        dt        |«      «      }| j                  j                  }| j                  xj                  |z  c_        | j                  j	                  «        ||| j                  j                  dœ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©ÚmaxrY   r   rk   Úwakeup)r   r   Ú	old_counts      r   Ú
worker_addzCommandHandlers.worker_addã   si   € ô �A”s˜5“zÓ"ˆØ—L‘L×,Ñ,ˆ	Ø�‰× Ò  EÑ)Õ ð 	�‰×ÑÔð Ø!Ø—\‘\×-Ñ-ñ
ð 	
r
   c                 óâ   — t        dt        |«      «      }| j                  j                  }t        d||z
  «      }||z
  }|| j                  _        | j                  j	                  «        |||dœ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_removezCommandHandlers.worker_removeú   ss   € ô �A”s˜5“zÓ"ˆØ—L‘L×,Ñ,ˆ	ô ˜˜9 uÑ,Ó-ˆ	Ø" YÑ.ˆà#,ˆ�‰Ô ð 	�‰×ÑÔð &Ø!Øñ
ð 	
r
   r   c                 óö   — t        |«      }|| j                  j                  vr	dd|› d�dœS 	 t        j                  |t
        j                  «       d|dœS # t        $ r}dt        |«      dœcY d}~S d}~ww xY w)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)	rY   r   r   ÚosÚkillÚsignalÚSIGTERMr$   rW   )r   r   Úes      r   Úworker_killzCommandHandlers.worker_kill  s…   € ô �#‹hˆà�d—l‘l×*Ñ*Ñ*à Ø" 3 % zÐ2ñð ð

	Ü�G‰G�CœŸ™Ô(àØñð øô ò 	à Ü˜Q›ñõ ûð	ús   ®(A Á	A8Á A3Á-A8Á3A8c                 ó†   — | j                   j                  sdddœS t        dt        |«      «      }| j	                  d|«      S )a  
        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   r6   r‰   rY   Ú_send_manage_message©r   r   s     r   Ú	dirty_addzCommandHandlers.dirty_add4  sF   € ð �|‰|×-Ò-à Ø4ñð ô
 �A”s˜5“zÓ"ˆØ×(Ñ(¨°Ó6Ð6r
   c                 ó†   — | j                   j                  sdddœS t        dt        |«      «      }| j	                  d|«      S )a  
        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_removezCommandHandlers.dirty_removeI  sF   € ð �|‰|×-Ò-à Ø4ñð ô
 �A”s˜5“zÓ"ˆØ×(Ñ(¨°5Ó9Ð9r
   Ú	operationc                 ó¾  — d}t        | j                  d«      r7| j                  j                  r!t        | j                  j                  dd«      }|st        j
                  j                  d«      }|sdddœS 	 dd	lm}m	}m
} |d
k(  r|n|}t        j                  t        j                  t        j                  «      }|j                  d«       |j                  |«       |j                   d||dœ}	|j#                  ||	«       |j%                  |«      }
|j'                  «        |
j                  d«      |j(                  k(  r|
j                  dddi«      S |
j                  d«      |j*                  k(  r0|
j                  di «      }d|j                  dt-        |«      «      dœS dd|
j                  d«      › �dœS # t.        $ r}dt-        |«      dœcY d}~S d}~ww xY w)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
        Nr/   Úsocket_pathÚGUNICORN_DIRTY_SOCKETFz%Cannot find dirty arbiter socket pathr“   r   )ÚDirtyProtocolÚMANAGE_OP_ADDÚMANAGE_OP_REMOVErŸ   g      $@r„   )r]   ÚidÚopr   r]   Úresultr”   Tr•   ÚmessagezUnexpected response type: )r8   r   r/   r7   r—   Úenvironr<   Úgunicorn.dirty.protocolr«   r¬   r­   rz   r{   ÚSOCK_STREAMÚ
settimeoutÚconnectÚMSG_TYPE_MANAGEÚwrite_messageÚread_messageÚcloseÚMSG_TYPE_RESPONSEÚMSG_TYPE_ERRORrW   r~   )r   r§   r   Údirty_socket_pathr«   r¬   r­   r¯   rx   ÚrequestÚresponser•   r›   s                r   r¡   z$CommandHandlers._send_manage_message^  sÃ  € ð !ÐÜ�4—<‘< Ô1°d·l±l×6PÒ6PÜ 'Ø—‘×*Ñ*¨M¸4ó!Ðñ !Ü "§
¡
§¡Ð/FÓ GÐÙ à Ø@ñð ð
*	÷ñ ð #,¨uÒ"4‘Ð:JˆBä—=‘=¤§¡´×1CÑ1CÓDˆDØ�O‰O˜DÔ!Ø�L‰LÐ*Ô+ð &×5Ñ5ØØØñ	ˆGð ×'Ñ'¨¨gÔ6ð %×1Ñ1°$Ó7ˆHØ�J‰JŒLà�|‰|˜FÓ# }×'FÑ'FÒFØ—|‘| H¨y¸$Ð.?Ó@Ð@Ø—‘˜fÓ%¨×)EÑ)EÒEØ Ÿ™ W¨bÓ1�à$Ø"ŸY™Y y´#°e³*Ó=ñð ð  %Ø9¸(¿,¹,ÀvÓ:NÐ9OÐPñð øô
 ò 	à Ü˜Q›ñõ ûð	ús,   Á9CF; ÅAF; Æ$F; Æ;	GÇGÇGÇGc                 óz   — t        j                  | j                  j                  t        j
                  «       ddiS )zv
        Trigger graceful reload (equivalent to SIGHUP).

        Returns:
            Dictionary with status
        ÚstatusÚ	reloading)r—   r˜   r   r   r™   ÚSIGHUP©r   s    r   rN   zCommandHandlers.reload£  s+   € ô 	�‰�—‘× Ñ ¤&§-¡-Ô0Ø˜+Ð&Ð&r
   c                 óz   — t        j                  | j                  j                  t        j
                  «       ddiS )zp
        Reopen log files (equivalent to SIGUSR1).

        Returns:
            Dictionary with status
        rÁ   Ú	reopening)r—   r˜   r   r   r™   ÚSIGUSR1rÄ   s    r   ÚreopenzCommandHandlers.reopen®  s+   € ô 	�‰�—‘× Ñ ¤&§.¡.Ô1Ø˜+Ð&Ð&r
   Úmodec                 óø   — |dk(  r9t        j                  | j                  j                  t        j
                  «       n8t        j                  | j                  j                  t        j                  «       d|dœS )z£
        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   ÚshutdownzCommandHandlers.shutdown¸  sN   € ð �7Š?Ü�G‰G�D—L‘L×$Ñ$¤f§m¡mÕ4ä�G‰G�D—L‘L×$Ñ$¤f§n¡nÔ5à)°4Ñ8Ð8r
   c           	      óv  — t        j                  «       }| j                  j                  dddœ}g }| j                  j                  j                  «       D ]Z  \  }}	 |j                  j                  «       }t        ||z
  d«      }|j                  |d|j                  |j                  |dœ«       Œ\ |j                  d„ ¬	«       d}g }	| j                  j                  r*| j                  j                  d
ddœ}| j!                  «       }	||t#        |«      ||	t#        |	«      dœS # t        t        f$ r d}Y Œ²w xY w)z±
        Return overview of all processes (arbiter, web workers, dirty arbiter, dirty workers).

        Returns:
            Dictionary with complete process hierarchy
        r   Úmaster)r   r]   Úroler   NÚweb)r   r]   r   r   r   c                 ó   — | d   S r   r   r   s    r   r   z*CommandHandlers.show_all.<locals>.<lambda>ë  s
   €  q¨¡x€ r
   r   r/   zdirty master)r   Úweb_workersÚweb_worker_countr/   rO   Údirty_worker_count)r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r   r   r'   r6   Ú_query_dirty_workersr(   )
r   r)   Úarbiter_inforÔ   r   r*   r"   r   Údirty_arbiter_inforO   s
             r   Úshow_allzCommandHandlers.show_allÉ  sI  € ô �n‰nÓˆð —<‘<×#Ñ#ØØñ
ˆð ˆØŸ<™<×/Ñ/×5Ñ5Ó7ò 	‰KˆC�ð&Ø$Ÿj™j×4Ñ4Ó6�Ü!& s¨[Ñ'8¸!Ó!<�ð ×ÑØØØ—z‘zØ Ÿ-™-Ø"0ñ õ ð	ð  	×ÑÑ/ÐÔ0ð "ÐØˆà�<‰<×)Ò)à—|‘|×5Ñ5Ø'Ø&ñ"Ðð !×5Ñ5Ó7ˆMð $Ø&Ü # KÓ 0Ø/Ø*Ü"% mÓ"4ñ
ð 	
øô9 œZÐ(ò &Ø!%’ð&ús   Á)D$Ä$D8Ä7D8c                 óÎ  — d}t        | j                  d«      r7| j                  j                  r!t        | j                  j                  dd«      }|st        j
                  j                  d«      }|sg S 	 ddlm} t        j                  t        j                  t        j                  «      }|j                  d«       |j                  |«       |j                  dd	œ}|j                  ||«       |j!                  |«      }|j#                  «        |j                  d
«      |j$                  k(  r$|j                  di «      }|j                  dg «      S 	 g S # t&        $ r Y g S w xY w)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
        Nr/   r©   rª   r   )r«   g       @zctl-status-1)r]   r®   r]   r°   r   )r8   r   r/   r7   r—   r²   r<   r³   r«   rz   r{   r´   rµ   r¶   ÚMSG_TYPE_STATUSr¸   r¹   rº   r»   r~   )r   r½   r«   rx   r¾   r¿   r°   s          r   r×   z$CommandHandlers._query_dirty_workers  s8  € ð !ÐÜ�4—<‘< Ô1°d·l±l×6PÒ6PÜ '¨¯©×(BÑ(BÀMÐSWÓ XÐÙ Ü "§
¡
§¡Ð/FÓ GÐÙ ØˆIð	Ý=ä—=‘=¤§¡´×1CÑ1CÓDˆDØ�O‰O˜CÔ Ø�L‰LÐ*Ô+ð &×5Ñ5Ø$ñˆGð ×'Ñ'¨¨gÔ6ð %×1Ñ1°$Ó7ˆHØ�J‰JŒLà�|‰|˜FÓ# }×'FÑ'FÒFØ!Ÿ™ h°Ó3�Ø—z‘z )¨RÓ0Ð0ð Gð ˆ	øô ò 	Øàˆ	ð	ús   Á6CE Å	E$Å#E$c                 ó.   — ddddddddd	d
ddddddœ}d|iS )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]rN   rÈ   zshutdown [graceful|quick]ÚhelpÚcommandsr   )r   rß   s     r   rÞ   zCommandHandlers.help1  sF   € ð SØAØ7ØAØ2Ø2Ø;Ø!?Ø!GØ@Ø DØ-Ø/Ø)EØ,ñ
ˆð" ˜HÐ%Ð%r
   N)r„   )Úgraceful)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r\   r+   r?   ra   rm   r‚   rY   rŒ   r‘   rœ   r£   r¦   rW   r¡   rN   rÈ   rÎ   rÚ   r:   r×   rÞ   r   r
   r   r   r      s  „ ñòð!;˜dó !;ðF:
˜Dó :
ðx!˜Tó !ðF
˜Dó 
ð>A ó Añ@
 ð 
¨Dó 
ñ.
 3ð 
¨tó 
ð8˜sð  tó ñ<7˜sð 7¨4ó 7ñ*: #ð :¨dó :ð*C¨cð C¸#ð CÀ$ó CðJ	'˜ó 	'ð'˜ó 'ñ9˜Sð 9°$ó 9ð"9
˜$ó 9
ðv+ dó +ðZ&�dô &r
   r   )rä   r—   r™   rz   r   r   r   r
   r   ú<module>rå      s$   ðñ
ó 
Û Û Û ÷x&ò x&r
   