§
    Ÿj1  ã                   ó˜   — d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
  e¦   «         ZddiZd„ Zd„ Zd	„ Zd
„ Z G d„ d¦  «        ZdS )aÉ  
Control Socket Server

Runs in the arbiter process and accepts commands via Unix socket.
Uses asyncio in a background thread to handle client connections.

Fork Safety:
    This server uses os.register_at_fork() to properly handle fork() calls.
    Before fork: the asyncio thread is stopped to prevent lock issues.
    After fork in parent: the server is restarted.
    After fork in child: references are cleared (workers don't need the control server).
é    N)ÚCommandHandlers)ÚControlProtocolÚmake_responseÚmake_error_responseÚfork_handlers_registeredFc                  ó„   — t           d         rdS dt           d<   t          j        t          t          t
          ¬¦  «         dS )z,Register fork handlers once at module level.r   NT)ÚbeforeÚafter_in_parentÚafter_in_child)Ú_module_stateÚosÚregister_at_forkÚ_before_forkÚ_after_fork_parentÚ_after_fork_child© ó    ú`/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/gunicorn/ctl/server.pyÚ_register_fork_handlersr   %   sM   € åÐ/Ô0ð ØˆØ04…MÐ,Ñ-åÔÝÝ*Ý(ðñ ô ð ð ð r   c                  ó\   — t          t          ¦  «        D ]} |                      ¦   «          ŒdS )z7Called before fork() - stop all active control servers.N)ÚlistÚ_active_serversÚ_stop_for_fork©Úservers    r   r   r   2   s8   € å•Ñ'Ô'ð  ð  ˆØ×ÒÑÔÐÐð ð  r   c                  ó\   — t          t          ¦  «        D ]} |                      ¦   «          ŒdS )z<Called in parent after fork() - restart all control servers.N)r   r   Ú_restart_after_forkr   s    r   r   r   8   s8   € å•Ñ'Ô'ð %ð %ˆØ×"Ò"Ñ$Ô$Ð$Ð$ð%ð %r   c                  ó8   — t                                ¦   «          dS )z2Called in child after fork() - cleanup references.N)r   Úclearr   r   r   r   r   >   s   € õ ×ÒÑÔÐÐÐr   c                   óš   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zdedefd„Zdedefd„Zdedefd„Zdedefd„Zdedefd„ZdS )ÚControlSocketServeraG  
    Control socket server running in arbiter process.

    The server runs an asyncio event loop in a background thread,
    accepting connections and dispatching commands to handlers.

    Fork safety is handled via os.register_at_fork() - the server
    automatically stops before fork and restarts after in the parent.
    é€  c                 óº   — || _         || _        || _        t          |¦  «        | _        d| _        d| _        d| _        d| _        d| _	        t          ¦   «          dS )zë
        Initialize control socket server.

        Args:
            arbiter: The Gunicorn arbiter instance
            socket_path: Path for the Unix socket
            socket_mode: Permission mode for socket (default 0o600)
        NF)ÚarbiterÚsocket_pathÚsocket_moder   ÚhandlersÚ_serverÚ_loopÚ_threadÚ_runningÚ_was_running_before_forkr   )Úselfr$   r%   r&   s       r   Ú__init__zControlSocketServer.__init__P   sb   € ð ˆŒØ&ˆÔØ&ˆÔå'¨Ñ0Ô0ˆŒØˆŒØˆŒ
ØˆŒØˆŒØ(-ˆÔ%õ 	 Ñ!Ô!Ð!Ð!Ð!r   c                 óÌ   — | j         rdS d| _         t          j        | j        d¬¦  «        | _        | j                             ¦   «          t                               | ¦  «         dS )z:Start server in background thread with asyncio event loop.NT©ÚtargetÚdaemon)r+   Ú	threadingÚThreadÚ	_run_loopr*   Ústartr   Úadd©r-   s    r   r6   zControlSocketServer.startg   sa   € àŒ=ð 	ØˆFàˆŒÝ Ô'¨t¬~ÀdÐKÑKÔKˆŒØŒ×ÒÑÔÐõ 	×Ò˜DÑ!Ô!Ð!Ð!Ð!r   c                 ó¨  — t                                | ¦  «         | j        sdS d| _        | j        r&| j        r| j                             | j        ¦  «         | j        r"| j                             d¬¦  «         d| _        t          j
                             | j        ¦  «        r-	 t          j        | j        ¦  «         dS # t          $ r Y dS w xY wdS )zStop server and cleanup socket.NFç       @©Útimeout)r   Údiscardr+   r)   r(   Úcall_soon_threadsafeÚ	_shutdownr*   Újoinr   ÚpathÚexistsr%   ÚunlinkÚOSErrorr8   s    r   ÚstopzControlSocketServer.stops   sè   € õ 	×Ò Ñ%Ô%Ð%àŒ}ð 	ØˆFàˆŒàŒ:ð 	<˜$œ,ð 	<àŒJ×+Ò+¨D¬NÑ;Ô;Ð;àŒ<ð 	 ØŒL×Ò cÐÑ*Ô*Ð*ØˆDŒLõ Œ7�>Š>˜$Ô*Ñ+Ô+ð 	ðÝ”	˜$Ô*Ñ+Ô+Ð+Ð+Ð+øÝð ð ð Ø��ðøøøð	ð 	s   Â&C Ã
CÃCc                 ó.  — | j         s	d| _        dS d| _        d| _         | j        r8| j        r1	 | j                             | j        ¦  «         n# t          $ r Y nw xY w| j        r"| j                             d¬¦  «         d| _        d| _        d| _        dS )z1Stop server before fork (called by fork handler).FNTr:   r;   )	r+   r,   r)   r(   r>   r?   ÚRuntimeErrorr*   r@   r8   s    r   r   z"ControlSocketServer._stop_for_forkŒ   s¹   € àŒ}ð 	Ø,1ˆDÔ)ØˆFà(,ˆÔ%ØˆŒàŒ:ð 	˜$œ,ð 	ðØ”
×/Ò/°´Ñ?Ô?Ð?Ð?øÝð ð ð à�ðøøøð Œ<ð 	 ØŒL×Ò cÐÑ*Ô*Ð*ØˆDŒLàˆŒ
ØˆŒˆˆs   ®A Á
AÁAc                 ó¦   — | j         sdS d| _         d| _        t          j        | j        d¬¦  «        | _        | j                             ¦   «          dS )z=Restart server in parent after fork (called by fork handler).NFTr0   )r,   r+   r3   r4   r5   r*   r6   r8   s    r   r   z'ControlSocketServer._restart_after_fork£   sT   € àÔ,ð 	ØˆFà(-ˆÔ%ØˆŒÝ Ô'¨t¬~ÀdÐKÑKÔKˆŒØŒ×ÒÑÔÐÐÐr   c                 óJ   — | j         r| j                              ¦   «          dS dS )z0Shutdown server (called from event loop thread).N)r(   Úcloser8   s    r   r?   zControlSocketServer._shutdown­   s0   € àŒ<ð 	!ØŒL×ÒÑ Ô Ð Ð Ð ð	!ð 	!r   c                 ó  — 	 t          j        |                      ¦   «         ¦  «         dS # t          $ rJ}| j        r2| j        j        r,| j        j                             d|¦  «         Y d}~dS Y d}~dS Y d}~dS d}~ww xY w)z0Run the asyncio event loop in background thread.zControl server error: %sN)ÚasyncioÚrunÚ_serveÚ	Exceptionr+   r$   ÚlogÚerror)r-   Úes     r   r5   zControlSocketServer._run_loop²   s×   € ð	FÝŒK˜Ÿš™œÑ&Ô&Ð&Ð&Ð&øÝð 	Fð 	Fð 	FØŒ}ð F ¤Ô!1ð FØ”Ô ×&Ò&Ð'AÀ1ÑEÔEÐEÐEÐEÐEÐEÐEÐEðFð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Føøøøð	Føøøs   ‚&* ª
A>´3A9Á9A>c              ƒ   óx  K  — t          j        ¦   «         | _        t          j                             | j        ¦  «        }|r5t          j                             |¦  «        st          j        |d¬¦  «         t          j                             | j        ¦  «        rt          j	        | j        ¦  «         t          j
        | j        | j        ¬¦  «        ƒ d{V —†| _        t          j        | j        | j        ¦  «         | j        j        r%| j        j                             d| j        ¦  «         	 | j        4 ƒd{V —† | j                             ¦   «         ƒ d{V —† ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   n# t           j        $ r Y nw xY wt          j                             | j        ¦  «        r-	 t          j	        | j        ¦  «         dS # t(          $ r Y dS w xY wdS # t          j                             | j        ¦  «        r+	 t          j	        | j        ¦  «         w # t(          $ r Y w w xY ww xY w)zMain async server loop.iÀ  )Úmode)rA   NzControl socket listening at %s)rL   Úget_running_loopr)   r   rA   Údirnamer%   rB   ÚmakedirsrC   Ústart_unix_serverÚ_handle_clientr(   Úchmodr&   r$   rP   ÚinfoÚserve_foreverÚCancelledErrorrD   )r-   Ú
socket_dirs     r   rN   zControlSocketServer._serveº   sç  è è € åÔ-Ñ/Ô/ˆŒ
õ ”W—_’_ TÔ%5Ñ6Ô6ˆ
Øð 	0�bœgŸnšn¨ZÑ8Ô8ð 	0ÝŒK˜
¨Ð/Ñ/Ô/Ð/õ Œ7�>Š>˜$Ô*Ñ+Ô+ð 	(ÝŒI�dÔ&Ñ'Ô'Ð'õ %Ô6ØÔØÔ!ð
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆŒõ 	Œ�Ô! 4Ô#3Ñ4Ô4Ð4àŒ<Ôð 	4ØŒLÔ×!Ò!Ð"BØ"&Ô"2ñ4ô 4ð 4ð
	Ø”|ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3Ø”l×0Ò0Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3øøåÔ%ð 	ð 	ð 	ØˆDð	øøøõ Œw�~Š~˜dÔ.Ñ/Ô/ð ðÝ”I˜dÔ.Ñ/Ô/Ð/Ð/Ð/øÝð ð ð Ø�D�Dðøøøðð ø�rŒw�~Š~˜dÔ.Ñ/Ô/ð ðÝ”I˜dÔ.Ñ/Ô/Ð/Ð/øÝð ð ð Ø�Dðøøøðøøøs„   Ä/F  Ä< E.ÅF  Å.
E8Å8F  Å;E8Å<F  Å?G( Æ FÆG( ÆFÆG( Æ:G Ç
G#Ç"G#Ç(%H9ÈH(È'H9È(
H5È2H9È4H5È5H9c              ƒ   óä  K  — 	 | j         r�	 t          j        t          j        |¦  «        d¬¦  «        ƒ d{V —†}n0# t          j        $ r Y n\t          j        $ r Y nLt          $ r Y nAw xY w|                      |¦  «        ƒ d{V —†}t          j	        ||¦  «        ƒ d{V —† | j         °�nC# t          $ r6}| j
        j        r | j
        j                             d|¦  «         Y d}~nd}~ww xY w|                     ¦   «          	 |                     ¦   «         ƒ d{V —† dS # t          $ r Y dS w xY w# |                     ¦   «          	 |                     ¦   «         ƒ d{V —† w # t          $ r Y w w xY wxY w)zŒ
        Handle client connection.

        Args:
            reader: asyncio StreamReader
            writer: asyncio StreamWriter
        g     Àr@r;   NzControl client error: %s)r+   rL   Úwait_forr   Úread_message_asyncÚTimeoutErrorÚIncompleteReadErrorrO   Ú	_dispatchÚwrite_message_asyncr$   rP   ÚdebugrJ   Úwait_closed)r-   ÚreaderÚwriterÚmessageÚresponserR   s         r   rY   z"ControlSocketServer._handle_clientà   s&  è è € ð	Ø”-ð LðÝ$+Ô$4Ý'Ô:¸6ÑBÔBØ %ð%ñ %ô %ð ð ð ð ð ð �G�Gøõ Ô+ð ð ð à�EÝÔ2ð ð ð à�EÝ ð ð ð à�Eðøøøð
 "&§¢°Ñ!8Ô!8Ð8Ð8Ð8Ð8Ð8Ð8�õ &Ô9¸&À(ÑKÔKÐKÐKÐKÐKÐKÐKÐKð) ”-ð Løøõ, ð 	Fð 	Fð 	FØŒ|Ôð FØ”Ô ×&Ò&Ð'AÀ1ÑEÔEÐEøøøøøøøøøð	Føøøð �LŠL‰NŒNˆNðØ×(Ò(Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*øÝð ð ð Ø��ðøøøøð �LŠL‰NŒNˆNðØ×(Ò(Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*øÝð ð ð Ø�ðøøøøøøsž   „B) Œ.; ºB) »A(Á
B) ÁA(ÁB) Á	A(Á%B) Á'A(Á(A B) Â(D. Â)
C)Â3,C$ÃD. Ã$C)Ã)D. ÄD Ä
D+Ä*D+Ä.E/ÅEÅE/Å
E,Å)E/Å+E,Å,E/rj   Úreturnc              ƒ   ó   K  — |                      dd¦  «        }|                      dd¦  «                             ¦   «         }|                      dg ¦  «        }|st          |d¦  «        S 	 t          j        |¦  «        }|r|                     d„ |D ¦   «         ¦  «         |st          |d¦  «        S |                      |¦  «        }t          ||¦  «        S # t          $ r}t          |d|› �¦  «        cY d	}~S d	}~wt          $ rH}| j
        j        r| j
        j                             d
¦  «         t          |d|› �¦  «        cY d	}~S d	}~ww xY w)z¥
        Dispatch command to appropriate handler.

        Args:
            message: Request message dict

        Returns:
            Response dictionary
        Úidr   ÚcommandÚ ÚargsúEmpty commandc              3   ó4   K  — | ]}t          |¦  «        V — Œd S )N)Ústr)Ú.0Úas     r   ú	<genexpr>z0ControlSocketServer._dispatch.<locals>.<genexpr>  s(   è è € Ð2Ð2¨�S ™VœVÐ2Ð2Ð2Ð2Ð2Ð2r   zInvalid argument: NzCommand errorzCommand failed: )ÚgetÚstripr   ÚshlexÚsplitÚextendÚ_execute_commandr   Ú
ValueErrorrO   r$   rP   Ú	exception)r-   rj   Ú
request_idro   rq   ÚpartsÚresultrR   s           r   rd   zControlSocketServer._dispatch	  s”  è è € ð —[’[  qÑ)Ô)ˆ
Ø—+’+˜i¨Ñ,Ô,×2Ò2Ñ4Ô4ˆØ�{Š{˜6 2Ñ&Ô&ˆàð 	DÝ& z°?ÑCÔCÐCð	Kå”K Ñ(Ô(ˆEØð 3Ø—’Ð2Ð2¨TÐ2Ñ2Ô2Ñ2Ô2Ð2àð HÝ*¨:°ÑGÔGÐGð ×*Ò*¨5Ñ1Ô1ˆFÝ  ¨VÑ4Ô4Ð4øåð 	Mð 	Mð 	MÝ& zÐ3KÈÐ3KÐ3KÑLÔLÐLÐLÐLÐLÐLÐLøøøøÝð 	Kð 	Kð 	KØŒ|Ôð <Ø”Ô ×*Ò*¨?Ñ;Ô;Ð;Ý& zÐ3IÀaÐ3IÐ3IÑJÔJÐJÐJÐJÐJÐJÐJøøøøð	Køøøs7   Á*AC Â1$C Ã
EÃ C8Ã2EÃ8EÄ=EÅEÅEr�   c                 óD  — |st          d¦  «        ‚|d                              ¦   «         }|dd…         }|dk    r|                      |¦  «        S |dk    r|                      |¦  «        S |dk    r|                      |¦  «        S |dk    r| j                             ¦   «         S |d	k    r| j                             ¦   «         S |d
k    r&|r|d         nd}| j                             |¦  «        S |dk    r| j         	                    ¦   «         S t          d|› �¦  «        ‚)z¯
        Execute a parsed command.

        Args:
            parts: Command parts (e.g., ["show", "workers"])

        Returns:
            Handler result dictionary
        rr   r   é   NÚshowÚworkerÚdirtyÚreloadÚreopenÚshutdownÚgracefulÚhelpzUnknown command: )
r~   ÚlowerÚ_handle_showÚ_handle_workerÚ_handle_dirtyr'   rˆ   r‰   rŠ   rŒ   )r-   r�   ÚcmdÚrestrT   s        r   r}   z$ControlSocketServer._execute_command.  s4  € ð ð 	.Ý˜_Ñ-Ô-Ð-à�AŒh�nŠnÑÔˆØ�Q�R�RŒyˆð �&Š=ˆ=Ø×$Ò$ TÑ*Ô*Ð*Ø�HŠ_ˆ_Ø×&Ò& tÑ,Ô,Ð,Ø�GŠ^ˆ^Ø×%Ò% dÑ+Ô+Ð+Ø�HŠ_ˆ_Ø”=×'Ò'Ñ)Ô)Ð)Ø�HŠ_ˆ_Ø”=×'Ò'Ñ)Ô)Ð)Ø�JÒÐØ"Ð2�4˜”7�7¨
ˆDØ”=×)Ò)¨$Ñ/Ô/Ð/Ø�FŠ]ˆ]Ø”=×%Ò%Ñ'Ô'Ð'åÐ6°Ð6Ð6Ñ7Ô7Ð7r   rq   c                 óð  — |st          d¦  «        ‚|d                              ¦   «         }|dk    r| j                             ¦   «         S |dk    r| j                             ¦   «         S |dk    r| j                             ¦   «         S |dk    r| j                             ¦   «         S |dk    r| j                             ¦   «         S |dk    r| j                             ¦   «         S t          d	|› �¦  «        ‚)
zHandle 'show' commands.z>Missing show target (all|workers|dirty|config|stats|listeners)r   ÚallÚworkersr‡   ÚconfigÚstatsÚ	listenerszUnknown show target: )	r~   r�   r'   Úshow_allÚshow_workersÚ
show_dirtyÚshow_configÚ
show_statsÚshow_listeners)r-   rq   r1   s      r   rŽ   z ControlSocketServer._handle_showQ  sú   € àð 	_ÝÐ]Ñ^Ô^Ð^à�a”—’‘”ˆà�UŠ?ˆ?Ø”=×)Ò)Ñ+Ô+Ð+Ø�yÒ Ð Ø”=×-Ò-Ñ/Ô/Ð/Ø�wÒÐØ”=×+Ò+Ñ-Ô-Ð-Ø�xÒÐØ”=×,Ò,Ñ.Ô.Ð.Ø�wÒÐØ”=×+Ò+Ñ-Ô-Ð-Ø�{Ò"Ð"Ø”=×/Ò/Ñ1Ô1Ð1åÐ=°VÐ=Ð=Ñ>Ô>Ð>r   c                 ó   — |st          d¦  «        ‚|d                              ¦   «         }|dd…         }|dk    r3|rt          |d         ¦  «        nd}| j                             |¦  «        S |dk    r3|rt          |d         ¦  «        nd}| j                             |¦  «        S |dk    r@|st          d¦  «        ‚t          |d         ¦  «        }| j                             |¦  «        S t          d	|› �¦  «        ‚)
zHandle 'worker' commands.z'Missing worker action (add|remove|kill)r   r„   Nr7   ÚremoveÚkillzMissing PID for worker killzUnknown worker action: )r~   r�   Úintr'   Ú
worker_addÚworker_removeÚworker_kill)r-   rq   ÚactionÚaction_argsÚcountÚpids         r   r�   z"ControlSocketServer._handle_workerg  s  € àð 	HÝÐFÑGÔGÐGà�a”—’‘”ˆØ˜1˜2˜2”hˆà�UŠ?ˆ?Ø+6Ð=•C˜ AœÑ'Ô'Ð'¸AˆEØ”=×+Ò+¨EÑ2Ô2Ð2Ø�xÒÐØ+6Ð=•C˜ AœÑ'Ô'Ð'¸AˆEØ”=×.Ò.¨uÑ5Ô5Ð5Ø�vÒÐØð @Ý Ð!>Ñ?Ô?Ð?Ý�k !”nÑ%Ô%ˆCØ”=×,Ò,¨SÑ1Ô1Ð1åÐ?°vÐ?Ð?Ñ@Ô@Ð@r   c                 ót  — |st          d¦  «        ‚|d                              ¦   «         }|dd…         }|dk    r3|rt          |d         ¦  «        nd}| j                             |¦  «        S |dk    r3|rt          |d         ¦  «        nd}| j                             |¦  «        S t          d|› �¦  «        ‚)zHandle 'dirty' commands.z!Missing dirty action (add|remove)r   r„   Nr7   r    zUnknown dirty action: )r~   r�   r¢   r'   Ú	dirty_addÚdirty_remove)r-   rq   r¦   r§   r¨   s        r   r�   z!ControlSocketServer._handle_dirty}  sÅ   € àð 	BÝÐ@ÑAÔAÐAà�a”—’‘”ˆØ˜1˜2˜2”hˆà�UŠ?ˆ?Ø+6Ð=•C˜ AœÑ'Ô'Ð'¸AˆEØ”=×*Ò*¨5Ñ1Ô1Ð1Ø�xÒÐØ+6Ð=•C˜ AœÑ'Ô'Ð'¸AˆEØ”=×-Ò-¨eÑ4Ô4Ð4åÐ>°fÐ>Ð>Ñ?Ô?Ð?r   N)r"   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r.   r6   rE   r   r   r?   r5   rN   rY   Údictrd   r   r}   rŽ   r�   r�   r   r   r   r!   r!   E   so  € € € € € ðð ð"ð "ð "ð "ð.
"ð 
"ð 
"ðð ð ð2ð ð ð.ð ð ð!ð !ð !ð
Fð Fð Fð$ð $ð $ðL'ð 'ð 'ðR#K tð #K°ð #Kð #Kð #Kð #KðJ!8 dð !8¨tð !8ð !8ð !8ð !8ðF? ð ?¨$ð ?ð ?ð ?ð ?ð,A 4ð A¨Dð Að Að Að Að,@ $ð @¨4ð @ð @ð @ð @ð @ð @r   r!   )r°   rL   r   rz   r3   Úgunicorn.ctl.handlersr   Úgunicorn.ctl.protocolr   r   r   Úsetr   r   r   r   r   r   r!   r   r   r   ú<module>rµ      s  ðð
ð ð €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð à 1Ð 1Ð 1Ð 1Ð 1Ð 1ðð ð ð ð ð ð ð ð ð ð �#‘%”%€Ø+¨UÐ3€ð
ð 
ð 
ð ð  ð  ð%ð %ð %ðð ð ðG@ð G@ð G@ð G@ð G@ñ G@ô G@ð G@ð G@ð G@r   