
    AҐi$                     \    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
  G d d      Zy)z
Control Socket Server

Runs in the arbiter process and accepts commands via Unix socket.
Uses asyncio in a background thread to handle client connections.
    N)CommandHandlers)ControlProtocolmake_responsemake_error_responsec                       e Zd ZdZd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y)ControlSocketServerz
    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.
    c                     || _         || _        || _        t        |      | _        d| _        d| _        d| _        d| _        y)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)selfr
   r   r   s       L/var/www/descvideos/venv/lib/python3.12/site-packages/gunicorn/ctl/server.py__init__zControlSocketServer.__init__!   sC     &&'0
    c                     | j                   ryd| _         t        j                  | j                  d      | _        | j                  j                          y)z:Start server in background thread with asyncio event loop.NT)targetdaemon)r   	threadingThread	_run_loopr   startr   s    r   r   zControlSocketServer.start4   s;    == ''t~~dKr   c                    | j                   syd| _         | j                  r1| j                  r%| j                  j                  | j                         | j
                  r#| j
                  j                  d       d| _        t        j                  j                  | j                        r!	 t        j                  | j                         yy# t        $ r Y yw xY w)zStop server and cleanup socket.NFg       @timeout)r   r   r   call_soon_threadsafe	_shutdownr   joinospathexistsr   unlinkOSErrorr   s    r   stopzControlSocketServer.stop=   s    }}::$,,JJ++DNN;<<LLc*DL 77>>$**+		$**+ ,  s   +C 	CCc                 R    | j                   r| j                   j                          yy)z0Shutdown server (called from event loop thread).N)r   closer   s    r   r"   zControlSocketServer._shutdownS   s    <<LL  r   c                     	 t        j                  | j                                y# t        $ rK}| j                  j
                  r+| j                  j
                  j                  d|       Y d}~yY d}~yd}~ww xY w)z0Run the asyncio event loop in background thread.zControl server error: %sN)asynciorun_serve	Exceptionr
   logerror)r   es     r   r   zControlSocketServer._run_loopX   s\    	FKK& 	F||  &&'A1EE  	Fs   #& 	A:<A55A:c                   K   t        j                         | _        t        j                  j                  | j                        rt        j                  | j                         t        j                  | j                  | j                         d{   | _
        t        j                  | j                  | j                         | j                  j                  r0| j                  j                  j                  d| j                         	 | j                  4 d{    | j                  j!                          d{    ddd      d{    t        j                  j                  | j                        r!	 t        j                  | j                         yy7 7 7 d7 V# 1 d{  7  sw Y   fxY w# t         j"                  $ r Y ~w xY w# t$        $ r Y yw xY w# t        j                  j                  | j                        r0	 t        j                  | j                         w # t$        $ r Y w w xY ww xY ww)zMain async server loop.)r%   NzControl socket listening at %s)r-   get_running_loopr   r$   r%   r&   r   r'   start_unix_server_handle_clientr   chmodr   r
   r1   infoserve_foreverCancelledErrorr(   r   s    r   r/   zControlSocketServer._serve`   s    --/
 77>>$**+IId&&' %66!!
 
 	!!4#3#34<<LL!!"B"&"2"24
	|| 3 3ll002223 3
 ww~~d../IId../ 0%
323 3 3 3%% 		   ww~~d../IId../  0s   BIFA9IF= F"F= !F(?F$ F(F= F&F= )I>G I"F= $F(&F= (F:.F1/F:6F= =GG% GG% 	G"I!G""I%*I H0/I 0	H<9I ;H<<I  Ic                 "  K   	 | j                   rw	 t        j                  t        j                  |      d       d{   }| j                  |       d{   }t        j                  ||       d{    | j                   rw|j                          	 |j                          d{    y7 r# t        j
                  $ r Y At        j                  $ r Y Ut        $ r Y _w xY w7 7 v# t        $ rF}| j                  j                  r&| j                  j                  j                  d|       Y d}~d}~ww xY w7 # t        $ r Y yw xY w# |j                          	 |j                          d{  7   w # t        $ r Y w w xY wxY ww)z
        Handle client connection.

        Args:
            reader: asyncio StreamReader
            writer: asyncio StreamWriter
        g     r@r   NzControl client error: %s)r   r-   wait_forr   read_message_asyncTimeoutErrorIncompleteReadErrorr0   	_dispatchwrite_message_asyncr
   r1   debugr+   wait_closed)r   readerwritermessageresponser3   s         r   r7   z"ControlSocketServer._handle_client   s_    	--$+$4$4'::6B %% G "&!88 &99&(KKK) --4 LLN((***5 ++ 22   
 9 L 	F||  &&'A1E	F +  LLN((*** s	  FC. -B3 B1B3 C. C*C. 5C,6C. FE +E ,E 0F1B3 3C'C. C'C. C'$C. &C''C. ,C. .	D=7<D83E 8D==E  E 	EFEFF#E=6E97E=<F=	F	FF		FFrG   returnc                 d  K   |j                  dd      }|j                  dd      j                         }|j                  dg       }|st        |d      S 	 t        j                  |      }|r|j                  d |D               |st        |d      S | j                  |      }t        ||      S # t        $ r}t        |d|       cY d	}~S d	}~wt        $ rT}| j                  j                  r%| j                  j                  j                  d
       t        |d|       cY d	}~S d	}~ww xY ww)z
        Dispatch command to appropriate handler.

        Args:
            message: Request message dict

        Returns:
            Response dictionary
        idr   command argsEmpty commandc              3   2   K   | ]  }t        |        y w)N)str).0as     r   	<genexpr>z0ControlSocketServer._dispatch.<locals>.<genexpr>   s     2SV2s   zInvalid argument: NzCommand errorzCommand failed: )getstripr   shlexsplitextend_execute_commandr   
ValueErrorr0   r
   r1   	exception)r   rG   
request_idrL   rN   partsresultr3   s           r   rA   zControlSocketServer._dispatch   s     [[q)
++i,224{{62&&z?CC	KKK(E2T22*:GG **51F V44 	M&z5Gs3KLL 	K||  **?;&z5EaS3IJJ	Ks[   AD0<B0 D0B0 /D00	D-9CD-D0D-A	D("D-#D0(D--D0r^   c                    |st        d      |d   j                         }|dd }|dk(  r| j                  |      S |dk(  r| j                  |      S |dk(  r| j	                  |      S |dk(  r| j
                  j                         S |d	k(  r| j
                  j                         S |d
k(  r$|r|d   nd}| j
                  j                  |      S |dk(  r| j
                  j                         S t        d|       )z
        Execute a parsed command.

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

        Returns:
            Handler result dictionary
        rO   r      NshowworkerdirtyreloadreopenshutdowngracefulhelpzUnknown command: )
r[   lower_handle_show_handle_worker_handle_dirtyr   re   rf   rg   ri   )r   r^   cmdrestmodes        r   rZ   z$ControlSocketServer._execute_command   s    _--AhnnQRy &=$$T**H_&&t,,G^%%d++H_==''))H_==''))J"47
D==))$//F]==%%''0677r   rN   c                    |st        d      |d   j                         }|dk(  r| j                  j                         S |dk(  r| j                  j	                         S |dk(  r| j                  j                         S |dk(  r| j                  j                         S |dk(  r| j                  j                         S |dk(  r| j                  j                         S t        d	|       )
zHandle 'show' commands.z>Missing show target (all|workers|dirty|config|stats|listeners)r   allworkersrd   configstats	listenerszUnknown show target: )	r[   rj   r   show_allshow_workers
show_dirtyshow_config
show_statsshow_listeners)r   rN   r   s      r   rk   z ControlSocketServer._handle_show   s    ]^^aU?==))++y ==--//w==++--x==,,..w==++--{"==//114VH=>>r   c                    |st        d      |d   j                         }|dd }|dk(  r-|rt        |d         nd}| j                  j	                  |      S |dk(  r-|rt        |d         nd}| j                  j                  |      S |dk(  r6|st        d      t        |d         }| j                  j                  |      S t        d	|       )
zHandle 'worker' commands.z'Missing worker action (add|remove|kill)r   ra   NaddremovekillzMissing PID for worker killzUnknown worker action: )r[   rj   intr   
worker_addworker_removeworker_kill)r   rN   actionaction_argscountpids         r   rl   z"ControlSocketServer._handle_worker  s    FGGa12hU?+6CA'AE==++E22x+6CA'AE==..u55v !>??k!n%C==,,S116vh?@@r   c                 0   |st        d      |d   j                         }|dd }|dk(  r-|rt        |d         nd}| j                  j	                  |      S |dk(  r-|rt        |d         nd}| j                  j                  |      S t        d|       )zHandle 'dirty' commands.z!Missing dirty action (add|remove)r   ra   Nr~   r   zUnknown dirty action: )r[   rj   r   r   	dirty_adddirty_remove)r   rN   r   r   r   s        r   rm   z!ControlSocketServer._handle_dirty  s    @AAa12hU?+6CA'AE==**511x+6CA'AE==--e445fX>??r   N)i  )__name__
__module____qualname____doc__r   r   r)   r"   r   r/   r7   dictrA   listrZ   rk   rl   rm    r   r   r   r      s    &,!
FB'R#Kt #K #KJ!8d !8t !8F? ?$ ?,A4 AD A,@$ @4 @r   r   )r   r-   r$   rW   r   gunicorn.ctl.handlersr   gunicorn.ctl.protocolr   r   r   r   r   r   r   <module>r      s3   
  	   1 T@ T@r   