
    Gi$                     \    S r SSKrSSKrSSKrSSKrSSKJr  SSKJrJ	r	J
r
   " S S5      rg)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                       \ rS rSrSrSS jrS rS rS rS r	S r
S	 rS
\S\4S jrS\S\4S jrS\S\4S jrS\S\4S jrS\S\4S jrSrg)ControlSocketServer   z
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                     Xl         X l        X0l        [        U5      U l        SU l        SU l        SU l        SU l        g)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       ]/var/www/fortnox.synktek.com/backend/venv/lib/python3.13/site-packages/gunicorn/ctl/server.py__init__ControlSocketServer.__init__!   s=     &&'0
    c                     U R                   (       a  gSU l         [        R                  " U R                  SS9U l        U R                  R                  5         g)z:Start server in background thread with asyncio event loop.NT)targetdaemon)r   	threadingThread	_run_loopr   startr   s    r   r   ControlSocketServer.start4   s;    == ''t~~dKr   c                    U R                   (       d  gSU l         U R                  (       a6  U R                  (       a%  U R                  R                  U R                  5        U R
                  (       a   U R
                  R                  SS9  SU l        [        R                  R                  U R                  5      (       a"   [        R                  " U R                  5        gg! [         a     gf = f)zStop server and cleanup socket.NFg       @timeout)r   r   r   call_soon_threadsafe	_shutdownr   joinospathexistsr   unlinkOSErrorr   s    r   stopControlSocketServer.stop=   s    }}::$,,JJ++DNN;<<LLc*DL 77>>$**++		$**+ ,  s    C# #
C0/C0c                 \    U R                   (       a  U R                   R                  5         gg)z0Shutdown server (called from event loop thread).N)r   closer   s    r   r%   ControlSocketServer._shutdownS   s    <<LL  r   c                     [         R                  " U R                  5       5        g! [         aP  nU R                  R
                  (       a+  U R                  R
                  R                  SU5         SnAg SnAgSnAff = f)z0Run the asyncio event loop in background thread.zControl server error: %sN)asynciorun_serve	Exceptionr   logerror)r   es     r   r   ControlSocketServer._run_loopX   s\    	FKK& 	F||  &&'A1EE  	Fs   $' 
BAA<<Bc                   #    [         R                  " 5       U l        [        R                  R                  U R                  5      (       a   [        R                  " U R                  5        [         R                  " U R                  U R                  S9I Sh  vN U l
        [        R                  " U R                  U R                  5        U R                  R                  (       a0  U R                  R                  R                  SU R                  5         U R                   ISh  vN   U R                  R!                  5       I Sh  vN   SSS5      ISh  vN   [        R                  R                  U R                  5      (       a"   [        R                  " U R                  5        gg GN N Nj N\! , ISh  vN  (       d  f       Nq= f! [         R"                   a     Nf = f! [$         a     gf = f! [        R                  R                  U R                  5      (       a2   [        R                  " U R                  5        f ! [$         a     f f = ff = f7f)zMain async server loop.)r(   NzControl socket listening at %s)r2   get_running_loopr   r'   r(   r)   r   r*   start_unix_server_handle_clientr   chmodr   r   r6   infoserve_foreverCancelledErrorr+   r   s    r   r4   ControlSocketServer._serve`   s    --/
 77>>$**++IId&&' %66!!
 
 	!!4#3#34<<LL!!"B"&"2"24
	|||ll00222 $|
 ww~~d..//IId../ 0%
 $2 $|||%% 		   ww~~d..//IId../  0s   BI"F0A?I"G (F3)G ,F9
F5F9G F7G .I" G- .I"3G 5F97G 9G?G GG G= G G*'G= )G**G= -
G:7I"9G::I"=/I- II
IIIII"c                 R  #     U R                   (       a|   [        R                  " [        R                  " U5      SS9I Sh  vN nU R                  U5      I Sh  vN n[        R                  " X$5      I Sh  vN   U R                   (       a  M|  UR                  5          UR                  5       I Sh  vN   g Nx! [        R
                   a     MC  [        R                   a     MY  [         a     Me  f = f N N! [         aK  nU R                  R                  (       a&  U R                  R                  R                  SU5         SnANSnAff = f N! [         a     gf = f! UR                  5          UR                  5       I Sh  vN    f ! [         a     f f = f= f7f)zd
Handle client connection.

Args:
    reader: asyncio StreamReader
    writer: asyncio StreamWriter
g     r@r"   NzControl client error: %s)r   r2   wait_forr   read_message_asyncTimeoutErrorIncompleteReadErrorr5   	_dispatchwrite_message_asyncr   r6   debugr/   wait_closed)r   readerwritermessageresponser8   s         r   r=   "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> ,B= B;B= C> C:C> 9C<:C> F'"E 5E6E :F';B= =C7C> E( C7'C> (E( *	C73C> 4E( 6C77C> <C> >
EAE	E( EE( E 
E%"F'$E%%F'(F$:FFFF$
F!F$ F!!F$$F'rN   returnc                   #    UR                  SS5      nUR                  SS5      R                  5       nUR                  S/ 5      nU(       d  [        US5      $  [        R                  " U5      nU(       a  UR                  S U 5       5        U(       d  [        US5      $ U R                  U5      n[        X&5      $ ! [         a  n[        USU 35      s S	nA$ S	nAf[         aY  nU R                  R                  (       a%  U R                  R                  R                  S
5        [        USU 35      s S	nA$ S	nAff = f7f)zu
Dispatch command to appropriate handler.

Args:
    message: Request message dict

Returns:
    Response dictionary
idr   command argsEmpty commandc              3   8   #    U  H  n[        U5      v   M     g 7f)N)str).0as     r   	<genexpr>0ControlSocketServer._dispatch.<locals>.<genexpr>   s     2TSVVTs   zInvalid argument: NzCommand errorzCommand failed: )getstripr   shlexsplitextend_execute_commandr   
ValueErrorr5   r   r6   	exception)r   rN   
request_idrT   rV   partsresultr8   s           r   rH   ControlSocketServer._dispatch   s     [[q)
++i,224{{62&&z?CC	KKK(E2T22*:GG **51F 44 	M&z5Gs3KLL 	K||  **?;&z5EaS3IJJ	Ks\   AEAB? "E#B? >E?
E	CEEE*AD>8E9E>EErg   c                    U(       d  [        S5      eUS   R                  5       nUSS nUS:X  a  U R                  U5      $ US:X  a  U R                  U5      $ US:X  a  U R	                  U5      $ US:X  a  U R
                  R                  5       $ US	:X  a  U R
                  R                  5       $ US
:X  a)  U(       a  US   OSnU R
                  R                  U5      $ US:X  a  U R
                  R                  5       $ [        SU 35      e)z
Execute a parsed command.

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

Returns:
    Handler result dictionary
rW   r      NshowworkerdirtyreloadreopenshutdowngracefulhelpzUnknown command: )
rd   lower_handle_show_handle_worker_handle_dirtyr   ro   rp   rq   rs   )r   rg   cmdrestmodes        r   rc   $ControlSocketServer._execute_command   s    _--AhnnQRy &=$$T**H_&&t,,G^%%d++H_==''))H_==''))J"47
D==))$//F]==%%''0677r   rV   c                    U(       d  [        S5      eUS   R                  5       nUS:X  a  U R                  R                  5       $ US:X  a  U R                  R	                  5       $ US:X  a  U R                  R                  5       $ US:X  a  U R                  R                  5       $ US:X  a  U R                  R                  5       $ US:X  a  U R                  R                  5       $ [        S	U 35      e)
zHandle 'show' commands.z>Missing show target (all|workers|dirty|config|stats|listeners)r   allworkersrn   configstats	listenerszUnknown show target: )	rd   rt   r   show_allshow_workers
show_dirtyshow_config
show_statsshow_listeners)r   rV   r   s      r   ru    ControlSocketServer._handle_show   s    ]^^aU?==))++y ==--//w==++--x==,,..w==++--{"==//114VH=>>r   c                    U(       d  [        S5      eUS   R                  5       nUSS nUS:X  a2  U(       a  [        US   5      OSnU R                  R	                  U5      $ US:X  a2  U(       a  [        US   5      OSnU R                  R                  U5      $ US:X  a;  U(       d  [        S5      e[        US   5      nU R                  R                  U5      $ [        S	U 35      e)
zHandle 'worker' commands.z'Missing worker action (add|remove|kill)r   rk   NaddremovekillzMissing PID for worker killzUnknown worker action: )rd   rt   intr   
worker_addworker_removeworker_kill)r   rV   actionaction_argscountpids         r   rv   "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                 R   U(       d  [        S5      eUS   R                  5       nUSS nUS:X  a2  U(       a  [        US   5      OSnU R                  R	                  U5      $ US:X  a2  U(       a  [        US   5      OSnU R                  R                  U5      $ [        SU 35      e)zHandle 'dirty' commands.z!Missing dirty action (add|remove)r   rk   Nr   r   zUnknown dirty action: )rd   rt   r   r   	dirty_adddirty_remove)r   rV   r   r   r   s        r   rw   !ControlSocketServer._handle_dirty  s    @AAa12hU?+6CA'AE==**511x+6CA'AE==--e445fX>??r   )r   r   r   r   r   r   r   r   N)i  )__name__
__module____qualname____firstlineno____doc__r   r   r,   r%   r   r4   r=   dictrH   listrc   ru   rv   rw   __static_attributes__ 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   r2   r'   r`   r   gunicorn.ctl.handlersr   gunicorn.ctl.protocolr   r   r   r   r   r   r   <module>r      s3   
  	   1 T@ T@r   