
    AҐi                     b    d Z ddlZddlZddlmZmZ  G d de      Z G d d      Zde	d	e
fd
Zy)zR
Control Socket Client

Client library for connecting to gunicorn control socket.
    N)ControlProtocolmake_requestc                       e Zd ZdZy)ControlClientErrorzControl client error.N)__name__
__module____qualname____doc__     L/var/www/descvideos/venv/lib/python3.12/site-packages/gunicorn/ctl/client.pyr   r      s    r   r   c                   P    e Zd ZdZddedefdZd Zd Zdded	e	d
e
fdZd Zd Zy)ControlClientz
    Client for connecting to gunicorn control socket.

    Can be used as a context manager:

        with ControlClient('/path/to/gunicorn.ctl') as client:
            result = client.send_command('show workers')
    socket_pathtimeoutc                 <    || _         || _        d| _        d| _        y)z
        Initialize control client.

        Args:
            socket_path: Path to the Unix socket
            timeout: Socket timeout in seconds (default 30)
        Nr   )r   r   _sock_request_id)selfr   r   s      r   __init__zControlClient.__init__"   s"     '
r   c                    | j                   ry	 t        j                  t        j                  t        j                        | _         | j                   j	                  | j
                         | j                   j                  | j                         y# t        j                  $ r'}d| _         t        d| j                   d|       d}~ww xY w)zq
        Connect to control socket.

        Raises:
            ControlClientError: If connection fails
        NzFailed to connect to z: )
r   socketAF_UNIXSOCK_STREAM
settimeoutr   connectr   errorr   )r   es     r   r   zControlClient.connect/   s     ::	Vv~~v7I7IJDJJJ!!$,,/JJt//0|| 	VDJ$'<T=M=M<NbQRPS%TUU	Vs   BB C$"CCc                     | j                   r#	 | j                   j                          d| _         yy# t        $ r Y w xY w)zClose connection.N)r   close	Exceptionr   s    r   r    zControlClient.closeA   s@    ::

  " DJ   s   1 	==Ncommandargsreturnc                    | j                   s| j                          | xj                  dz  c_        t        | j                  ||      }	 t	        j
                  | j                   |       t	        j                  | j                         }|j                  d      dk(  rt        |j                  dd            |j                  di       S # t        $ r#}| j                          t        d|       d}~ww xY w)a.  
        Send command and wait for response.

        Args:
            command: Command string (e.g., "show workers")
            args: Optional additional arguments

        Returns:
            Response data dictionary

        Raises:
            ControlClientError: If communication fails
           zCommunication error: Nstatusr   zUnknown errordata)r   r   r   r   r   write_messageread_messager!   r    r   get)r   r#   r$   requestresponser   s         r   send_commandzControlClient.send_commandJ   s     zzLLNAt//$?	B))$**g>&33DJJ?H
 <<!W,$X\\'?%KLL||FB''  	BJJL$'<QC%@AA	Bs   
?C
 
	C6C11C6c                 &    | j                          | S N)r   r"   s    r   	__enter__zControlClient.__enter__j   s    r   c                 $    | j                          y r1   )r    )r   r$   s     r   __exit__zControlClient.__exit__n   s    

r   )g      >@r1   )r   r   r	   r
   strfloatr   r   r    listdictr/   r2   r4   r   r   r   r   r      sJ    C % V$(C (t (t (@r   r   liner%   c                     t        j                  |       }|sdg fS g }g }|D ]H  }|s3|j                         s#|j                  d      s|j	                  |       8|j	                  |       J dj                  |      |fS )z
    Parse a command line into command and args.

    Args:
        line: Command line string

    Returns:
        Tuple of (command_string, args_list)
     - )shlexsplitisdigit
startswithappendjoin)r9   partscommand_partsr$   parts        r   parse_commandrG   r   s     KKE2v MD DLLN4??33G  &KK 88M"D((r   )r
   r>   r   gunicorn.ctl.protocolr   r   r!   r   r   r5   tuplerG   r   r   r   <module>rJ      sC   
     W Wt) ) )r   