Current File : //opt/cloudlinux/venv/lib64/python3.11/site-packages/clwpos/__pycache__/daemon.cpython-311.pyc
�

�m_e�|����ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
mZmZm
Z
ddlmZddlmZddlmZmZddlmZddlmZmZmZmZmZmZddlm Z m!Z!m"Z"m#Z#dd	l$m%Z%m&Z&m'Z'm(Z(ddl)m*Z*dd
l+m,Z,ddl-m.Z.ddl/m0Z0dd
l1m2Z2edgd���Z3ed���Z4dejfd�Z5edefd���Z6dde7de
ee7e7ffd�Z8Gd�de,��Z9d�Z:dS)�N)�Optional�Dict�Tuple�List)�contextmanager)�
namedtuple)�Lock�Thread)�gettext)�cpusers�get_domains_php_info�docroot�get_installed_php_versions�get_main_username_by_uid�cpinfo)�get_process_pid�remove_pid_file�write_pid_file�is_litespeed_running)�is_user_redis_alive�kill_all_users_redises�reload_redis_for_user_thread�
parse_redises)�WposDaemonBase)�WPOS_DAEMON_SOCKET_FILE)�WposDaemonLockError)�PendingSubscriptionWatcher�	User_data��	redis_pid�lock�last_reload_timec#�bK�tjd��}dV�tj|��dS)z,
    Context manager for dropping umask
    rN)�os�umask)�prevs �D/opt/cloudlinux/venv/lib64/python3.11/site-packages/clwpos/daemon.py�_umask_0r(1s/����
�8�A�;�;�D�	�E�E�E��H�T�N�N�N�N�N��returnc���t��5tjtj��}|�t��|���|cddd��S#1swxYwYdS)zr
    Create world-writable socket in given sock_location
    or reuse existing one
    :return: socket object
    N)r(�socket�AF_UNIX�bindr�listen)�sockobjs r'�_create_socketr1;s���
������-���/�/�����,�-�-�-��������	��������������������s�AA*�*A.�1A.r!c#��K�|�d���sttd������	|V�|���dS#|���wxYw)z=
    Non-blocking lock implementation for with statement
    F)�blockingz/Can't acquire lock. May be it already acquired.)�messageN)�acquirer�_�release)r!s r'�non_blocking_lockr8Hsj����
�<�<��<�'�'�`�!�!�,]�*^�*^�_�_�_�_���
�
�
�������������������s�A�A'�function�input_parametersc���|rd�|���D��ng}tjdd|g|�d���}tj|j�����dS)Nc�"�g|]\}}|�d|����
S)�=�)�.0�key�values   r'�
<listcomp>zwhmapi1.<locals>.<listcomp>Vs*��\�\�\�Z�S�%�3� 0� 0�� 0� 0�\�\�\r)z/usr/sbin/whmapi1z
--output=jsonT)�capture_output�data)�items�
subprocess�run�json�loads�stdout�decode)r9r:�input_parameters_as_list�results    r'�whmapi1rNUs}��`p�x�\�\�CS�CY�CY�C[�C[�\�\�\�\�vx��
�^�0�/�8�g�Nf�g�+/�1�1�1�F��:�f�m�*�*�,�,�-�-�f�5�5r)c�N��eZdZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZ
dZeeeee	e
ee
eeg
Zee
eeegZd
ZdZ�fd�Zd6dedededefd�Zdedefd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z d7d efd!�Z!e"de#fd"���Z$d#e%j%de&eee'ee'e#effd$�Z(d#e%j%d%ed&efd'�Z)d(edefd)�Z*	d6d#e%j%d%ed&ed*edef
d+�Z+e"d8d-ede,fd.���Z-d#e%j%fd/�Z.d#e%j%d-efd0�Z/d#e%j%fd1�Z0d#e%j%fd2�Z1d#e%j%fd3�Z2d#e%j%dd,fd4�Z3d5�Z4�xZ5S)9�
WposDaemonzW
    AccelerateWP daemon main class. Socket operations, redis process control, etc
    z/var/lve/wpos_reload�reloadzget-redis-statuszget-litespeed-status�php_get_vhost_versions�php_get_installed_versions�get_upgrade_link�
get_unique_id�suite_allowed_callback�daemon_register_upgrade�daemon_get_upgrade_status��c����t�����i|_g|_d|_d|_d|_d|_t|j	��|_
dS)NrT)�super�__init__�_monitoring_users_dict�_username_list_to_process�_socket�_reload_uid�_socket_thread�_socket_thread_workr�_logger�_suite_watcher)�self�	__class__s �r'r]zWposDaemon.__init__�sb���
��������
=?��#�)+��&�04������04���#'�� �8���F�F����r)�no�user_uid�is_store_last_reload_time�force_reloadr*c�J�	|j�|��}|�d}n|j}tj|��j}|j�d||��t|j|||��\}}|ddkr|S|rF|j	r|sd}	ntj
��}	t|t��|	���|j|<n||jvr|j|=nB#t$r5}
|j�|
��dt|
��icYd}
~
Sd}
~
wwxYwddiS)aP
        Starts/stops redis for user and updates dict for monitoring (self._monitoring_users_dict)
        :param user_uid: uid to reload redis
        :param is_store_last_reload_time: True -  write last reload time to user data, False - write 0
        :return: dict {"result": "success"} / {"result": "error", "context": {}}
        Nz.Reloading redis for user: %s, force reload: %srM�successrr)r^�getr �pwd�getpwuid�pw_namerd�infor�_is_reload_interval_enabled�timerr	�	Exception�	exception�str)rfrirjrk�userdata�
old_redis_pid�username�
new_redis_pid�result_dictr"�es           r'�_reload_redis_for_userz!WposDaemon._reload_redis_for_user�s|��	&��2�6�6�x�@�@�H��� $�
�
� (� 2�
��|�H�-�-�5�H��L���N�PX�Zf�g�g�g�)E�d�l�T\�FS�Ua�*c�*c�&�M�;��8�$�	�1�1�"�"��
>��7�3�?X�3�'(�$�$�'+�y�{�{�$�8A�M�`d�`f�`f�Sc�9e�9e�9e��+�H�5�5��t�:�:�:��3�H�=����	&�	&�	&��L�"�"�1�%�%�%��c�!�f�f�%�%�%�%�%�%�%�����	&�����)�$�$s%�BC�AC�
D�)*D�D�Dc��|j|}d}	t|j��5t|j|��\}}}|s	ddd��dS|r	ddd��dStj|��j}t|j||j|j	��\}}|�	ddd��dSt||jd���|j|<ddd��n#1swxYwYne#t$r,}|j�d|j
||��Yd}~n4d}~wt$r$}|j�|��Yd}~nd}~wwxYwdS)a"
        One user monitoring actions
        :param user_uid: uid to reload redis
        :return: User remove flag:
         True - user has stopped his redis (or user absent in system), remove it from monitoring list
         False - redis still active, should be monitored again
        �NTFrrzSLock error: %s. User %s (uid=%d) is working with his redis, skip monitoring actions)r^r8r!rrdrorprqrr rr�debugr4rurv)	rfri�	user_datarz�is_redis_alive�is_user_presentr6r r}s	         r'�_user_monitoringzWposDaemon._user_monitoring�sg�� $�:�8�D�	���	&�"�9�>�2�2�
V�
V�5H���W_�5`�5`�2����&� ��
V�
V�
V�
V�
V�
V�
V�
V�"�!� �
V�
V�
V�
V�
V�
V�
V�
V��<��1�1�9��;�D�L�(�<@�<W�X`�<a�<k� m� m��	�1��$��
V�
V�
V�
V�
V�
V�
V�
V�9B�I�\e�\j�ST�9V�9V�9V��+�H�5�
V�
V�
V�
V�
V�
V�
V�
V�
V�
V�
V����
V�
V�
V�
V��� #�	>�	>�	>��L���t� �y�(�H�
>�
>�
>�
>�
>�
>�
>�
>������	&�	&�	&��L�"�"�1�%�%�%�%�%�%�%�%�����	&�����usk�C(�C�C(�C�C(�AC�$C(�1C�C(�C � C(�#C �$C(�(
E
�2"D�
E
�&E�E
c���g}t|j�����D].}|�|��}|r|�|���/|D]}||jvr|j|=�dS)z,
        Working redises monitoring
        N)�listr^�keysr��append)rf�user_ids_list_to_remove�user_id�	is_removes    r'�_redises_monitoringzWposDaemon._redises_monitoring�s���#%���D�7�<�<�>�>�?�?�	8�	8�G��-�-�g�6�6�I��
8�'�.�.�w�7�7�7��.�	9�	9�G��$�5�5�5��/��8��	9�	9r)c���|jrbd|_t��D]N}	tj|��j}n#t
$rY�)wxYw||jvr|�|d���MdSdS)zC
        Process all requests - start/stop redis for users
        FN)�_reload_config_needrro�getpwnam�pw_uid�KeyErrorr^r~)rfrzr�s   r'�_reload_all_userszWposDaemon._reload_all_users�s����#�
	@�',�D�$�#�I�I�
@�
@���!�l�8�4�4�;�G�G�������H������$�"=�=�=��/�/���?�?�?��
	@�
	@�
@�
@s�:�
A�Ac	�@�d}t��}|j�d|��|D]F}|j�|dt|dt
��d���i���G|js�	|���|�	��|jrdStjd��|dz
}||jkr|�
��d}n,#t$r|j�dd���YnwxYw|j��dSdS)NrzFound existing redises: %s�rz,Cloudlinux AccelerateWP daemon general errorT��exc_info)rrdr�r^�updaterr	�
_is_terminate�
_force_reloadr�rt�sleep�_monitoring_intervalr�rurv)rf�i�existing_redises�items    r'�_main_cyclezWposDaemon._main_cyclese��
��(�?�?������7�9I�J�J�J�$�	y�	y�D��'�.�.��Q���T�RS�W�[_�[a�[a�tu�9v�9v�9v�/w�x�x�x�x��$�	f�

f��"�"�$�$�$��&�&�(�(�(��%���E��
�1�
�
�
��Q����t�0�0�0��,�,�.�.�.��A����
f�
f�
f���&�&�'U�`d�&�e�e�e�e�e�
f�����$�	f�	f�	f�	f�	fs�=/C)�.:C)�)&D�Dc�l�t|j���|_|j���dS)z;
        Create and start socket processing thread
        )�targetN)r
�_process_socket_connectionsrb�start�rfs r'�_create_and_start_socket_threadz*WposDaemon._create_and_start_socket_threads5��%�D�,L�M�M�M�����!�!�#�#�#�#�#r)c�^�t|j���"|j�d|j��dStj�t��r|���	t��|_
nI#ttf$r5}d}|j�|t|����Yd}~dSd}~wwxYw|j�d��|���t!|j��|���|���|���d|_|j���|���t/|j��|j�d��dS)z+
        Main work daemon function
        NzCPID file %s existing. Cloudlinux AccelerateWP daemon already works?z5Can't create AccelerateWP daemon socket. Error is: %sz&Cloudlinux AccelerateWP daemon startedFz)Cloudlinux AccelerateWP daemon terminated)r�
_PID_FILENAMErd�warningr$�path�existsr�_remove_socketr1r`�OSError�IOErrorrwrr�_setup_signalsrrQr�r�rcrb�joinr)rfr}r4s   r'rGzWposDaemon.runs����4�-�.�.�:��L� � �!f�hl�hz�{�{�{��F�
�7�>�>�1�2�2�	"����!�!�!�	�)�+�+�D�L�L����!�	�	�	�M�G��L� � ��#�a�&�&�1�1�1��F�F�F�F�F�����		����
	
����B�C�C�C��������t�)�*�*�*����
�
�
��,�,�.�.�.�������#(�� ��� � �"�"�"���������*�+�+�+�����E�F�F�F�F�Fs�0B�C
�*C�C
c���tj�|j��rH|���	tj|j��dS#ttf$rYdSwxYwdS)z%
        Force reload daemon
        N)r$r��isfile�_WPOS_DAEMON_RELOAD_FILErQ�remover�r�r�s r'r�zWposDaemon._force_reload@sy��
�7�>�>�$�7�8�8�	��K�K�M�M�M�
��	�$�7�8�8�8�8�8���W�%�
�
�
����
����	�	s�A�A*�)A*c��	|j�dt��|j�|j���tjt��|j�dt��dS#ttf$r9}|j�	dtt|����Yd}~dSd}~wwxYw)z-
        Remove daemon's socket file
        zRemoving socket %sNzSocket %s removedz!Can't remove socket %s. Error: %s)rdrrrr`�closer$r�r�r�r�rw)rfr}s  r'r�zWposDaemon._remove_socketMs���	g��L���2�4K�L�L�L��|�'���"�"�$�$�$��I�-�.�.�.��L���1�3J�K�K�K�K�K����!�	g�	g�	g��L� � �!D�F]�_b�cd�_e�_e�f�f�f�f�f�f�f�f�f�����	g���s�A9A=�=C�.C�CFr��gracefulc�J�t|j��}|�rG	|j�d|��t	j|tj��n3#t$r&}|j�d||��Yd}~nd}~wwxYwd}||kra	t	j|d��n+#t$r|j�d|��Yn�wxYw||z
}tj
|��||k�a|j�d|��	t	j|tj��n3#t$r&}|j�d||��Yd}~nd}~wwxYw|rt|j��t|j��|j�d��dS)z0
        Stops a working daemon process
        zKilling process with PID %sz4Process with pid %s is not possible to be killed: %sNrz#Process with pid %s is finally deadz:Process with pid %s did not exit in timeout, sigkilling itz&Cloudlinux AccelerateWP daemon stopped)rr�rdrrr$�kill�signal�SIGTERMr�rtr��SIGKILLrr)rfr��timeout�interval�pidr}r�s       r'�stopzWposDaemon.stopZs����d�0�1�1���	f�
b���!�!�"?��E�E�E����V�^�,�,�,�,���
b�
b�
b���!�!�"X�Z]�_`�a�a�a�a�a�a�a�a�����
b�����A��g�+�+���G�C��O�O�O�O�������L�%�%�&K�S�Q�Q�Q��E������X�
���
�8�$�$�$��g�+�+���!�!�"^�`c�d�d�d�f��G�C���0�0�0�0���f�f�f��L�%�%�&\�^a�cd�e�e�e�e�e�e�e�e�����f�����	1�"�4�<�0�0�0���*�+�+�+�����B�C�C�C�C�CsA�:A�
B�A?�?B�B&�&%C�
C�D,�,
E�6E�Ec�H�dtj��t��d�S)zy
        Get litespeed webserver status: running or not.
        :return: Dict to send to clwpos-user via socket
        rm)rM�	timestamp�status)rtrr>r)r'�_get_litespeed_statusz WposDaemon._get_litespeed_status�s!��$�$�)�+�+�I]�I_�I_�`�`�`r)�client_socket_objc�0�tj|��}	t|��}n=#t$r0tj|dd|itj��d���YdSwxYw	tj|��}nE#tjtj	tjtjttf$rd}YnwxYw|�tj|dd|id���dSd	|vr+tj|d
tj��d���dS|d	|jvr+tj|dtj��d���dS|d
kr�d|vr+tj|dtj��d���dS|d}	t|��}n=#t$r0tj|dd|itj��d���YdSwxYw|d	|jvr+tj|dtj��d���dSd|||dfSd|||dfS)a,
        Validate socket connection. Check:
         - root connections
         - connection user presense
         - command validity
        :return: tuple(is_connection_valid, uid, username, user_request_dict, is_root_query)
          is_connection_valid:
           True - Socket connection valid, should be processed. uid, username and user_request_dict filled
           False - invalid connection, should be skipped. uid == -1, username and user_request_dict = None
          is_root_query - True - root query, do not check reload interval
        zNo user uid=%(uid)d�uid)rM�contextr�)F���NNFNz>User %(username)s sent invalid query to CL AccelerateWP daemonrz�rMr��commandz0Daemon received malformed query (command absent))rMr�zDaemon received invalid commandrz)Root request to daemon should contain uidTF)�socket_utils�get_uid_from_socketrr��(send_dict_to_socket_connection_and_closert�'read_unpack_response_from_socket_daemonr,�errorr�rH�JSONDecodeError�struct�AttributeError�UnicodeDecodeError�_DAEMON_VALID_COMMANDS�_DAEMON_VALID_COMMANDS_FOR_ROOT)rfr��_uidrz�user_requests     r'�_validate_socket_connectionz&WposDaemon._validate_socket_connection�s ���/�0A�B�B��	0�/��5�5�H�H���	0�	0�	0��A�BS�Mb�OT�VZ�m�PT�PY�P[�P[�C]�C]�
^�
^�
^�0�/�/�	0����	 �+7�+_�`q�+r�+r�L�L����f�n�d�.B�F�L�R`�bt�u�	 �	 �	 ��L�L�L�	 �������A�BS�Nf�OY�[c�Nd�Cf�Cf�
g�
g�
g�0�/��L�(�(��A�BS�N_�PT�PY�P[�P[�C]�C]�
^�
^�
^�0�/��	�"�$�*E�E�E��A�BS�Mn�PT�PY�P[�P[�C]�C]�
^�
^�
^�0�/��1�9�9��L�(�(��E�FW�R_�TX�T]�T_�T_�Ga�Ga�b�b�b�4�3���&�D�
4�3�D�9�9�����
4�
4�
4��E�FW�Qf�SX�Z^�R_�TX�T]�T_�T_�Ga�Ga�b�b�b�4�3�3�
4�����I�&�d�.R�R�R��E�FW�Qr�TX�T]�T_�T_�Ga�Ga�b�b�b�4�3���x��t�;�;��T�8�\�5�8�8s3�&�6A �A �$A9�9?B;�:B;�F�6G
�G
rzr�c�6�|j�|d��}|�tj|dd|id���dS|j5t|j|��\}}}|ddkr||d<tj||��ddd��dS#1swxYwYdS)z�
        Get redis status for user (socket query)
        :param client_socket_obj: Client socket connection
        :param username: User name
        :param uid: User uid
        Nz"User %(username)s has no redis yetrzr�rMrmr�)r^rnr�r�r!rrd)rfr�rzr�r�r�r6r|s        r'�_socket_user_get_redis_statusz(WposDaemon._socket_user_get_redis_status�s-�� $�:�>�>�s�D�I�I�	����A�BS�Mq�OY�[c�Nd�Cf�Cf�
g�
g�
g�
g�
g���
f�
f�1D�T�\�SV�1W�1W�.���;��x�(�I�5�5�,:�K��)��E�FW�Yd�e�e�e�
f�
f�
f�
f�
f�
f�
f�
f�
f�
f�
f�
f����
f�
f�
f�
f�
f�
fs�AB�B�Br"c�L�|dkptj��|z
|jkS)zv
        Checks is reload available by checking time
        :return: True - available, False - not available
        r)rt�_MIN_ALLOWED_RELOAD_PERIOD)rfr"s  r'�_is_reload_availablezWposDaemon._is_reload_available�s(��
 �1�$�h��	���6F�(F��Ih�(h�hr)�
is_root_queryc��|j�|��}|�a|�|d|���}tj��|d<t	j||��|j�d||��dS|j}|sK|�	|��s6tj��d||j
d�d�}t	j||��dS|j5|�|d��}tj��|d<t	j||��|j�d	||��ddd��dS#1swxYwYdS)
a>
        Reload redis for user (socket query)
        :param client_socket_obj: Client socket connection
        :param username: User name
        :param uid: User uid
        :param is_root_query: True - reload redis by root, do not check reload interval
          False - user reload, check reload interval
        NT)rkr�zX[Redis user data not found] Cloudlinux AccelerateWP daemon reloaded for user %s (uid=%d)zSCan't reload redis for user %(user)s. Last reload was less than %(sec)s seconds ago)�user�sec)r�rMr�zT[Redis user data found] Cloudlinux AccelerateWP daemon reloaded for user %s (uid=%d))r^rnr~rtr�r�rdr�r"r�r�r!)	rfr�rzr�r�rkr�r|r"s	         r'�_socket_user_redis_reloadz$WposDaemon._socket_user_redis_reload�s��� $�:�>�>�s�C�C�	����5�5�c�4�l�5�[�[�K�'+�y�{�{�K��$��A�BS�U`�a�a�a��L��� ^�_g�il�
n�
n�
n��F�$�5���	�T�%>�%>�?O�%P�%P�	�)-�	���&3�/7��@_�&`�&`�b�b�K�
�A�BS�U`�a�a�a��F�
�^�	n�	n��5�5�c�4�@�@�K�'+�y�{�{�K��$��A�BS�U`�a�a�a��L��� ^�_g�il�
n�
n�
n�		n�	n�	n�	n�	n�	n�	n�	n�	n�	n�	n�	n����	n�	n�	n�	n�	n�	ns�AE�E�EN�accountc����dtdtdtfd�}t��}�� �fd�|���D��}g}|���D]~\}}	|�||d|d||d|d	��t	|��d
d����W#t
$r|r|�d|��Y�{wxYw|S)
N�handler_name�
version_idr*c�.�|dkrdSd|vrdSd|vrdS|S)N�fpmzphp-fpmz
x-httpd-lsphp�lsapi�lsphpr>)r�r�s  r'�_castz1WposDaemon._php_get_vhost_versions.<locals>._casts8���u�$�$� �y� �J�.�.��w��L�(�(��w��r)c�4��i|]\}}|d�k�||��S)rzr>)r?r@rAr�s   �r'�
<dictcomp>z6WposDaemon._php_get_vhost_versions.<locals>.<dictcomp>+s8���<�<�<�*�#�u�#�J�/�7�:�:���:�:�:r)rz�display_version�handler_type�php_version_idr)�vhostr��version�handler�documentrootz)Error on getting php version for %s, skip)rwr
rEr�rrurv)r��loggerr��vhosts_datarMr@rAs`      r'�_php_get_vhost_versionsz"WposDaemon._php_get_vhost_versionssF���		 ��		 ��		 ��		 �		 �		 �		 �+�,�,����<�<�<�<��8I�8I�8K�8K�<�<�<�K���%�+�+�-�-�	�	�J�C��

��
�
�!�e�J�.?� %�&7� 8� %��e�N�&;�U�CS�=T� U� U�%,�S�\�\�!�_�6�6�7�7�7�7��
�
�
�
��W��$�$�%P�RU�V�V�V���	
�����
s�'AB8�8"C�Cc�X�|���}tj||��dS)z/
        Get litespeed status for user
        N)r�r�r�)rfr�rMs   r'�_socket_user_litespeed_statusz(WposDaemon._socket_user_litespeed_status>s0��
�1�1�3�3���=�>O�QW�X�X�X�X�Xr)c���	|�||j���}d|d�}n)#t$r}dt|��d�}Yd}~nd}~wwxYwt	j||��dS)N)r�rm�rMrDz)Daemon cannot get vhosts data: %(reason)sr�)r�rdrurwr�r�)rfr�r��
vhost_data�responser}s      r'�#_socket_user_php_get_vhost_versionsz.WposDaemon._socket_user_php_get_vhost_versionsFs���	��5�5�g�d�l�5�S�S�J�$�"���H�H��
�	�	�	�E��q�6�6���H�H�H�H�H�H�����	����	�=�>O�QY�Z�Z�Z�Z�Zs�$�
A
�A�A
c�R�dt��d�}tj||��dS)Nrmr�)rr�r�)rfr�r�s   r'�'_socket_user_php_get_installed_versionsz2WposDaemon._socket_user_php_get_installed_versionsUs7���.�0�0�
�
��	�=�>O�QY�Z�Z�Z�Z�Zr)c��ddlm}|��}d|�|t|d���dd|���d�}t	j||��dS)Nr)�get_server_wide_optionsrm)�dns)�keyls)rz�domain�feature)rM�upgrade_url)�clwpos.utilsr�get_upgrade_url_for_userrr�r�)rfr�rzrr�server_optionsr�s       r'�_get_upgrade_linkzWposDaemon._get_upgrade_link\s���	9�8�8�8�8�8�0�0�2�2���)�B�B�!��h�h�7�7�7��:�1�=��C���
�
��	�=�>O�QY�Z�Z�Z�Z�Zr)c�X�ddlm}d||��d�}tj||��dS)zI
        Get unique identifier which we use as user's auth token
        r)�get_or_create_unique_identifierrm)rM�	unique_idN)�clwpos.billingrr�r�)rfr�rzrr�s     r'�_get_unique_idzWposDaemon._get_unique_idmsQ��	C�B�B�B�B�B��8�8��B�B�
�
��	�=�>O�QY�Z�Z�Z�Z�Zr)c�v�	|�|��\}}}}}|sdS|d|jkr|�|||��dS|d|jkr1|�dd��}|�|||||��dS|d|jkr|�|��dS|d|jkr|�	||��dS|d|j
kr|�|��dS|d|jkr-|�
|||�dd����dS|d|jkr|�||��dS|d|jkr|j�|��dS|d|jkr|j�|||��dS|d|jkr2|j�|||�dd����dSdS#t.$r |j�dd�	��YdSwxYw)
z�
        Process client's socket connection (Works in thread)
        :param client_socket_obj: Client socket connection
        Nr�rkrhr�object_cachez"Socket connection processing errorTr�)r�� _DAEMON_GET_REDIS_STATUS_COMMANDr��_DAEMON_RELOAD_COMMANDrnr��$_DAEMON_GET_LITESPEED_STATUS_COMMANDr��%DAEMON_PHP_GET_VHOST_VERSIONS_COMMANDr��)DAEMON_PHP_GET_INSTALLED_VERSIONS_COMMANDr�DAEMON_GET_UPGRADE_LINK_COMMANDr�DAEMON_GET_UNIQUE_ID_COMMANDr�DAEMON_SUITE_ALLOWED_CALLBACKrerV�DAEMON_REGISTER_UPGRADE_ATTEMPT�add_pending_upgrade_task�!DAEMON_GET_UPGRADE_ATTEMPT_STATUS�get_upgrade_task_statusrurdrv)rfr��is_connection_validr�rzr�r�rks        r'� _handle_client_socket_connectionz+WposDaemon._handle_client_socket_connectionxs���
!	X��0�0�1B�C�C�
L���h��m�&�
����I�&�$�*O�O�O��2�2�3D�h�PS�T�T�T�T�T��i�(�D�,G�G�G�+�/�/���E�E���.�.�/@�(�C�Q^�`l�m�m�m�m�m��i�(�D�,U�U�U��2�2�3D�E�E�E�E�E��i�(�D�,V�V�V��8�8�9J�H�U�U�U�U�U��i�(�D�,Z�Z�Z��<�<�=N�O�O�O�O�O��i�(�D�,P�P�P��&�&�'8�(�'3�'7�'7�	�>�'R�'R�T�T�T�T�T��i�(�D�,M�M�M��#�#�$5�x�@�@�@�@�@��i�(�D�,N�N�N��#�:�:�;L�M�M�M�M�M��i�(�D�,P�P�P��#�<�<�=N�P\�^a�b�b�b�b�b��i�(�D�,R�R�R��#�;�;�<M�s�<H�<L�<L�Y�Xf�<g�<g�i�i�i�i�i�S�R���	X�	X�	X��L�"�"�#G�RV�"�W�W�W�W�W�W�	X���sN�H�(H�AH�
&H�5'H�&H�<H�'H�-+H�-H�	AH�&H8�7H8c��|j�d��|jr�tj|jgggd��\}}}|D]v}	|���\}}t
|j|f���}|����F#tj
$r|j�dd���Y�swxYw|j��|j�d��dS)	z>
        Process socket connections (works in thread)
        z4Cloudlinux AccelerateWP daemon socket thread startedr�)r��argszSocket connection errorTr�z4Cloudlinux AccelerateWP daemon socket thread stoppedN)rdrrrc�selectr`�acceptr
r!r�r,r�rv)rf�readabler6�_sock_objectr��ts      r'r�z&WposDaemon._process_socket_connections�s��	
����P�Q�Q�Q��&�	U�#�]�D�L�>�2�r�1�E�E�N�H�a�� (�
U�
U��U�+7�+>�+>�+@�+@�(�%�q��d�&K�Sd�Rf�g�g�g�A��G�G�I�I�I�I���|�U�U�U��L�*�*�+D�t�*�T�T�T�T�T�U�����&�	U�	
����P�Q�Q�Q�Q�Qs�AB�+B9�8B9)rh)FrYr�)NN)6�__name__�
__module__�__qualname__�__doc__r�rrrrrrrrrrr�r�r��_REDIS_SOCKET_WAIT_TIMEOUTr]�int�boolrwrr~r�r�r�r�r�rGr�r�r��staticmethod�dictr�r,rrr�r�r�r�r�r�r�r�rrrr!r��
__classcell__)rgs@r'rPrP]s)��������� 6��%��'9�$�+A�(�,D�)�0L�-�&8�#�#2� �$<�!�&?�#�(C�%��(�,�-�1�'�$�'�)�%���	�'�$�)�%�'�#�"$��!#��G�G�G�G�G� '%�'%�s�'%�t�'%�cf�'%�rv�'%�'%�'%�'%�R!��!��!�!�!�!�F
9�
9�
9�@�@�@� f�f�f�.$�$�$� G� G� G�D���g�g�g�#D�#D�T�#D�#D�#D�#D�P�a�4�a�a�a��\�a�K9�V�]�K9�u�UY�[^�`h�il�`m�U]�^b�Uc�ei�Vj�Pk�K9�K9�K9�K9�Zf�v�}�f�X[�f�be�f�f�f�f�,i�S�i�T�i�i�i�i�ei�$n�$n�6�=�$n�,/�$n�69�$n�JN�$n�^a�$n�$n�$n�$n�L�!�!��!�T�!�!�!��\�!�FY�v�}�Y�Y�Y�Y�
[�V�]�
[�]`�
[�
[�
[�
[�[���[�[�[�[�[�6�=�[�[�[�[�"	[��
�	[�	[�	[�	[�&X�&�-�&X�TX�&X�&X�&X�&X�PR�R�R�R�R�R�Rr)rPc�^�t��}|jdkr|���|jdkr,|�d���|���dS|jdkr|�|j��dS|jdkr|���dSdS)Nr��restartF)r�r�rQ)rP�actionrGr�r�rQ)�_opts�daemons  r'�daemon_mainr8�s���
�\�\�F��|�w����
�
�����|�y� � ����U��#�#�#��
�
������	���	�	����E�N�#�#�#�#�#�	���	!�	!��
�
������
"�	!r))N);r$r�rFrtrHr,r$ror��typingrrrr�
contextlibr�collectionsr�	threadingr	r
�clwposrr6�clcommon.cpapirr
rrrr�clcommon.utilsrrrr�clwpos.daemon_redis_librrrr�clwpos.socket_utilsr��clwpos.daemon_baser�clwpos.constantsr�clwpos.cl_wpos_exceptionsr�"clwpos.daemon_subscription_handlerrrr(r1r8rwrNrPr8r>r)r'�<module>rFs���
�	�	�	�
�
�
�
�������������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�.�.�.�.�.�.�.�.�.�.�.�.�%�%�%�%�%�%�"�"�"�"�"�"�"�"�"�"�"�"�"�"�����������������������������������������������+�*�*�*�*�*�-�-�-�-�-�-�4�4�4�4�4�4�9�9�9�9�9�9�I�I�I�I�I�I��J�{�$M�$M�$M�N�N�	�������
��
�
�
�
�
��	�D�	�	�	���	�6�6�c�6�X�d�3��8�n�-E�6�6�6�6�Q	R�Q	R�Q	R�Q	R�Q	R��Q	R�Q	R�Q	R�h
�
�
�
�
r)