o
    Á¿i–  ã                   @   sX   d Z ddlZddlZddlmZmZ G dd„ deƒZG dd„ dƒZde	d	e
fd
d„ZdS )zR
Control Socket Client

Client library for connecting to gunicorn control socket.
é    N)ÚControlProtocolÚmake_requestc                   @   s   e Zd ZdZdS )ÚControlClientErrorzControl client error.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r	   r	   úG/home/ubuntu/.local/lib/python3.10/site-packages/gunicorn/ctl/client.pyr      s    r   c                   @   s\   e Zd ZdZddedefdd„Zdd„ Zd	d
„ Zddede	de
fdd„Zdd„ Zdd„ ZdS )Ú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                 C   s   || _ || _d| _d| _dS )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   r	   r	   r
   Ú__init__"   s   
zControlClient.__init__c              
   C   sv   | j rdS zt tjtj¡| _ | j  | j¡ | j  | j¡ W dS  tjy: } zd| _ t	d| j› d|› ƒ‚d}~w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   Úer	   r	   r
   r   /   s   €þzControlClient.connectc                 C   s6   | j rz| j  ¡  W n	 ty   Y nw d| _ dS dS )zClose connection.N)r   ÚcloseÚ	Exception©r   r	   r	   r
   r   A   s   ÿ
ûzControlClient.closeNÚcommandÚargsÚreturnc              
   C   s¢   | j s|  ¡  |  jd7  _t| j||ƒ}zt | j |¡ t | j ¡}W n ty; } z|  ¡  t	d|› ƒ‚d}~ww | 
d¡dkrKt	| 
dd¡ƒ‚| 
di ¡S )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   r	   r	   r
   Úsend_commandJ   s   €þzControlClient.send_commandc                 C   s   |   ¡  | S ©N)r   r   r	   r	   r
   Ú	__enter__j   s   zControlClient.__enter__c                 G   s   |   ¡  d S r)   )r   )r   r   r	   r	   r
   Ú__exit__n   s   zControlClient.__exit__)r   r)   )r   r   r   r   ÚstrÚfloatr   r   r   ÚlistÚdictr(   r*   r+   r	   r	   r	   r
   r      s    		 r   Úliner   c                 C   sb   t  | ¡}|sdg fS g }g }|D ]}|s$| ¡ s$| d¡s$| |¡ q| |¡ qd |¡|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)r0   ÚpartsÚcommand_partsr   Úpartr	   r	   r
   Úparse_commandr   s   

r=   )r   r4   r   Úgunicorn.ctl.protocolr   r   r   r   r   r,   Útupler=   r	   r	   r	   r
   Ú<module>   s   Z