????

Your IP : 3.138.117.11


Current Path : /opt/cloudlinux/venv/lib/python3.11/site-packages/clwpos/__pycache__/
Upload File :
Current File : //opt/cloudlinux/venv/lib/python3.11/site-packages/clwpos/__pycache__/daemon.cpython-311.opt-1.pyc

�

��9,����ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZm
Z
mZddlmZddlmZddlmZmZddlmZddlmZmZmZmZmZmZddl m!Z!m"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/m0Z0ddl1m2Z2dd
l3m4Z4edgd���Z5ej6e7��Z8ed���Z9dejfd�Z:edefd���Z;dde<deee<e<ffd�Z=Gd�de.��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_nginx_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 �py/clwpos/daemon.py�_umask_0r)4s/����
�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_socketr2>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_lockr9Ksj����
�<�<��<�'�'�`�!�!�,]�*^�*^�_�_�_�_���
�
�
�������������������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>Ys*��\�\�\�Z�S�%�3� 0� 0�� 0� 0�\�\�\r*z/usr/sbin/whmapi1z
--output=jsonT)�capture_output�data)�items�
subprocess�run�json�loads�stdout�decode)r:r;�input_parameters_as_list�results    r(�whmapi1rOXs}��`p�x�\�\�CS�CY�CY�C[�C[�\�\�\�\�vx��
�^�0�/�8�g�Nf�g�+/�1�1�1�F��:�f�m�*�*�,�,�-�-�f�5�5r*c���eZdZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZ
dZd
ZdZdZdZeeeee	e
eee
eeeeegZeee
eeeegZdZdZ�fd�ZdAdedededefd�Zdedefd�Zd�Zd�Zd�Z d�Z!d�Z"d �Z#d!�Z$dBd$efd%�Z%e&de'fd&���Z(e&de'fd'���Z)e&de'fd(���Z*d)e+j+de,eee-ee-e'effd*�Z.d)e+j+d+ed,efd-�Z/d.edefd/�Z0		dCd)e+j+d+ed,ed0eded1efd2�Z1e&dDd4ede2fd5���Z3d)e+j+fd6�Z4d)e+j+fd7�Z5d)e+j+fd8�Z6d)e+j+d4efd9�Z7d)e+j+fd:�Z8d)e+j+fd;�Z9d)e+j+fd<�Z:d)e+j+fd=�Z;d)e+j+fd>�Z<d)e+j+dd3fd?�Z=d@�Z>�xZ?S)E�
WposDaemonzW
    AccelerateWP daemon main class. Socket operations, redis process control, etc
    z/var/lve/wpos_reload�reloadzget-redis-statuszget-litespeed-statuszget-nginx-statuszget-apache2nginx-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�&daemon_get_supported_suites_by_license�daemon_is_owned_by_reseller��c����t�����i|_g|_d|_d|_d|_d|_t��|_	dS)NrT)
�super�__init__�_monitoring_users_dict�_username_list_to_process�_socket�_reload_uid�_socket_thread�_socket_thread_workr�_suite_watcher)�self�	__class__s �r(r`zWposDaemon.__init__�s^���
��������
=?��#�)+��&�04������04���#'�� �8�:�:����r*�no�user_uid�is_store_last_reload_time�force_reloadr+c�V�	|j�|��}|�d}n|j}tj|��j}t�d||��t|||��\}}|ddkrCt�d|��t|t��d���|j|<|S|rv|jjr|sd}	ntj
��}	t|t��|	���}
|
|j|<t�d|t|
����n,||jvr#t�d	|��|j|=nB#t$r5}t�|��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: %srN�successz^Redis reloading failed for user: %s, adding to monitoring list to try again in several minutesrr z)Saving user=%s to monitoring with data=%sz Removing user=%s from monitoring)ra�getr!�pwd�getpwuid�pw_name�logger�inforrr	�_config�enable_reload_rate_limit�time�str�	Exception�	exception)rhrkrlrm�userdata�
old_redis_pid�username�
new_redis_pid�result_dictr#�user_redis_data�es            r(�_reload_redis_for_userz!WposDaemon._reload_redis_for_user�s���%	&��2�6�6�x�@�@�H��� $�
�
� (� 2�
��|�H�-�-�5�H��K�K�H� �,�
0�
0�
0�)E��-��*7�*7�&�M�;��8�$�	�1�1����C�DL�N�N�N�9B�+�$�&�&�1�9N�9N�9N��+�H�5�"�"��
>��|�<�3�D]�3�'(�$�$�'+�y�{�{�$�"+�m�$�&�&�Sc�#e�#e�#e��8G��+�H�5����G��SV�Wf�Sg�Sg�h�h�h�h��t�:�:�:��K�K� B�H�M�M�M��3�H�=����	&�	&�	&����Q�����c�!�f�f�%�%�%�%�%�%�%�����	&�����)�$�$s%�B=E%�B$E%�%
F$�/*F�F$�F$c���|j|}d}	t|j��5t|��\}}}|s	ddd��dS|r	ddd��dSt	j|��j}t�d|��t||j|j
��\}}|�|ddkr	ddd��dSt||jd�	��|j|<ddd��n#1swxYwYne#t$r,}	t�
d
|	j||��Yd}	~	n4d}	~	wt$r$}	t�|	��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
        �NTFz/Redis instance died for username=%s, restartingrNrorr zSLock error: %s. User %s (uid=%d) is working with his redis, skip monitoring actions)rar9r"rrqrrrsrtrurr!rr�debugr5rzr{)
rhrk�	user_datar~�is_redis_alive�is_user_presentr7r!r�r�s
          r(�_user_monitoringzWposDaemon._user_monitoring�s�� $�:�8�D�	���	 �"�9�>�2�2�
V�
V�5H��5R�5R�2����&� ��
V�
V�
V�
V�
V�
V�
V�
V�"�!� �
V�
V�
V�
V�
V�
V�
V�
V��<��1�1�9�����M�x�X�X�X�)E���/��9�C�*E�*E�&�	�;��$��X�)>�)�)K�)K��
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�L�n� �y�(�H�
>�
>�
>�
>�
>�
>�
>�
>������	 �	 �	 ����Q�������������	 �����usj�D�C7�D�	C7�D�A&C7�?D�C7�+D�7C;�;D�>C;�?D�
E%�
"D4�4
E%�E � E%c��g}t�dt|j�������t|j�����D].}|�|��}|r|�|���/|D];}||jvr0t�dt|����|j|=�<dS)z,
        Working redises monitoring
        z-Those users are currently being monitored: %sz%Removing user=%s from monitoring listN)	rtruryrarF�list�keysr��append)rh�user_ids_list_to_remove�user_id�	is_removes    r(�_redises_monitoringzWposDaemon._redises_monitoring�s���#%�����C���3�9�9�;�;�<�<�	>�	>�	>��D�7�<�<�>�>�?�?�	8�	8�G��-�-�g�6�6�I��
8�'�.�.�w�7�7�7��.�	9�	9�G��$�5�5�5����C�S��\�\�R�R�R��/��8��	9�	9r*c��|jr�d|_t��}t�dt	|����|D]�}	tj|��j}n#t$rY�)wxYw|j	�
|��}t�dt	|����|r|js|�|d����dSdS)zC
        Process all requests - start/stop redis for users
        Fz*Checking redis instance for those users=%sz2Current user data for redis instance monitoring=%sN)
�_reload_config_needrrtruryrq�getpwnam�pw_uid�KeyErrorrarpr!r�)rh�	all_usersr~r��monitored_user_datas     r(�_reload_all_userszWposDaemon._reload_all_userss���#�	@�',�D�$��	�	�I��K�K�D�c�)�n�n�U�U�U�%�	
@�	
@���!�l�8�4�4�;�G�G�������H�����'+�&A�&E�&E�g�&N�&N�#����P�RU�Vi�Rj�Rj�k�k�k�*�@�2E�2O�@��/�/���?�?�?��	@�	@�	
@�	
@s�
A$�$
A1�0A1c	�J�d}t��}t�d|��|D]F}|j�|dt|dt
��d���i���G|js�	|���|�	��|jrdStjd��|dz
}||jj
kr|���d}n,#t$rt�dd���YnwxYw|j��dSdS)NrzFound existing redises: %s�r z,Cloudlinux AccelerateWP daemon general errorT��exc_info)rrtrura�updaterr	�
_is_terminate�
_force_reloadr�rx�sleeprv�monitoring_intervalr�rzr{)rh�i�existing_redises�items    r(�_main_cyclezWposDaemon._main_cycle sa��
��(�?�?�����0�2B�C�C�C�$�	y�	y�D��'�.�.��Q���T�RS�W�[_�[a�[a�tu�9v�9v�9v�/w�x�x�x�x��$�	`�

`��"�"�$�$�$��&�&�(�(�(��%���E��
�1�
�
�
��Q����t�|�7�7�7��,�,�.�.�.��A����
`�
`�
`�� � �!O�Z^� �_�_�_�_�_�
`�����$�	`�	`�	`�	`�	`s�=/C.�.?C.�.&D�Dc�l�t|j���|_|j���dS)z;
        Create and start socket processing thread
        )�targetN)r
�_process_socket_connectionsre�start�rhs r(�_create_and_start_socket_threadz*WposDaemon._create_and_start_socket_thread7s5��%�D�,L�M�M�M�����!�!�#�#�#�#�#r*c�^�t|j���"t�d|j��dStj�t��r|���	t��|_
nI#ttf$r5}d}t�|t|����Yd}~dSd}~wwxYwt�d��|���t!|j��|���|���|���d|_|j���|���t/|j��t�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_FILENAMErt�warningr%�path�existsr�_remove_socketr2rc�OSError�IOErrorryru�_setup_signalsrrRr�r�rfre�joinr)rhr�r5s   r(rHzWposDaemon.run>s����4�-�.�.�:��N�N�`�bf�bt�u�u�u��F�
�7�>�>�1�2�2�	"����!�!�!�	�)�+�+�D�L�L����!�	�	�	�M�G��N�N�7�C��F�F�+�+�+��F�F�F�F�F�����		����
	���<�=�=�=��������t�)�*�*�*����
�
�
��,�,�.�.�.�������#(�� ��� � �"�"�"���������*�+�+�+����?�@�@�@�@�@s�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_FILErR�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��	t�dt��|j�|j���tjt��t�dt��dS#ttf$r9}t�	dtt|����Yd}~dSd}~wwxYw)z-
        Remove daemon's socket file
        zRemoving socket %sNzSocket %s removedz!Can't remove socket %s. Error: %s)rtrurrc�closer%r�r�r�r�ry)rhr�s  r(r�zWposDaemon._remove_socketms���	a��K�K�,�.E�F�F�F��|�'���"�"�$�$�$��I�-�.�.�.��K�K�+�-D�E�E�E�E�E����!�	a�	a�	a��N�N�>�@W�Y\�]^�Y_�Y_�`�`�`�`�`�`�`�`�`�����	a���s�A9A=�=C�.C�CFr��gracefulc�~�t|j��}|�rG	t�d|��t	j|tj��n3#t$r&}t�d||��Yd}~nd}~wwxYwd}||kra	t	j|d��n+#t$rt�d|��Yn�wxYw||z
}tj
|��||k�at�d|��	t	j|tj��n3#t$r&}t�d||��Yd}~nd}~wwxYw|r.t�d��tt��t|j��t�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 itz7Graceful shutdown, killing all existing redis processesz&Cloudlinux AccelerateWP daemon stopped)rr�rtrur%�kill�signal�SIGTERMr�rxr��SIGKILLrr)rhr��timeout�interval�pidr�r�s       r(�stopzWposDaemon.stopzs����d�0�1�1���	`�
\����9�3�?�?�?����V�^�,�,�,�,���
\�
\�
\����R�TW�YZ�[�[�[�[�[�[�[�[�����
\�����A��g�+�+���G�C��O�O�O�O�������K�K� E�s�K�K�K��E������X�
���
�8�$�$�$��g�+�+����X�Z]�^�^�^�`��G�C���0�0�0�0���`�`�`��K�K� V�X[�]^�_�_�_�_�_�_�_�_�����`�����	+��K�K�Q�R�R�R�"�6�*�*�*���*�+�+�+����<�=�=�=�=�=sA�: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
        ro�rN�	timestamp�status)rxrr?r*r(�_get_litespeed_statusz WposDaemon._get_litespeed_status�s!��$�$�)�+�+�I]�I_�I_�`�`�`r*c�H�dtj��t��d�S)zu
        Get nginx webserver status: running or not.
        :return: Dict to send to clwpos-user via socket
        ror�)rxrr?r*r(�_get_nginx_statuszWposDaemon._get_nginx_status�s!��$�$�)�+�+�IY�I[�I[�\�\�\r*c�L�ddlm}dtj��|��d�S)z|
        Get apache2nginx webserver status: running or not.
        :return: Dict to send to clwpos-user via socket
        r��is_apache2nginx_runningror�)�clcommon.utilsr�rxr�s r(�_get_apache2nginx_statusz#WposDaemon._get_apache2nginx_status�s6��	;�:�:�:�:�:�#�$�)�+�+�I`�I`�Ib�Ib�c�c�cr*�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)rN�contextr�)F���NNFNz>User %(username)s sent invalid query to CL AccelerateWP daemonr~�rNr��commandz0Daemon received malformed query (command absent))rNr�zDaemon received invalid commandrz)Root request to daemon should contain uidTF)�socket_utils�get_uid_from_socketrr��(send_dict_to_socket_connection_and_closerx�'read_unpack_response_from_socket_daemonr-�errorr�rI�JSONDecodeError�struct�AttributeError�UnicodeDecodeError�_DAEMON_VALID_COMMANDS�_DAEMON_VALID_COMMANDS_FOR_ROOT)rhr��_uidr~�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
r~r�c�*�|j�|d��}|�tj|dd|id���dS|j5t|��\}}}|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 yetr~r�rNror�)rarpr�r�r"r)rhr�r~r�r�r�r7r�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�S�1I�1I�.���;��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�:B�B�Br#c�L�|dkptj��|z
|jkS)zv
        Checks is reload available by checking time
        :return: True - available, False - not available
        r)rx�_MIN_ALLOWED_RELOAD_PERIOD)rhr#s  r(�_is_reload_availablezWposDaemon._is_reload_availables(��
 �1�$�h��	���6F�(F��Ih�(h�hr*�
is_root_query�skip_last_time_checkc� �|j�|��}t�dt	|��t	|����|�|j�a|�|d|���}tj��|d<tj	||��t�
d||��dS|j}	|sM|sK|�|	��s6tj��d||j
d�d	�}tj	||��dS|j5|�|d��}tj��|d<tj	||��t�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
        z.[Redis reload request] Current user=%s data=%sNT)rmr�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�rNr�zT[Redis user data found] Cloudlinux AccelerateWP daemon reloaded for user %s (uid=%d))rarprtruryr!r�rxr�r�r�r#r�r�r")
rhr�r~r�r�rmr�r�r�r#s
          r(�_socket_user_redis_reloadz$WposDaemon._socket_user_redis_reload&s
�� $�:�>�>�s�C�C�	����D�c�(�m�m�UX�Yb�Uc�Uc�d�d�d���	� 3� ;��5�5�c�4�l�5�[�[�K�'+�y�{�{�K��$��A�BS�U`�a�a�a��L�L�^�_g�il�
n�
n�
n��F�$�5��#�	�M�	�$�B[�B[�\l�Bm�Bm�	�)-�	���&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��K�K�^�_g�il�
n�
n�
n�		n�	n�	n�	n�	n�	n�	n�	n�	n�	n�	n�	n����	n�	n�	n�	n�	n�	ns�AF�F�
FN�accountc���dtdtdtfd�}|p
t��}|r#|�dt|������ �fd�|���D��}g}|���D]~\}}	|�||d|d||d	|d
��t|��dd����W#t$r|r|�d
|��Y�{wxYw|S)N�handler_name�
version_idr+c�2�|dkrdSd|vrdS|rd|vrdS|S)N�fpmzphp-fpmz
x-httpd-lsphp�lsapi�lsphpr?)r�r�s  r(�_castz1WposDaemon._php_get_vhost_versions.<locals>._castUs?���u�$�$� �y� �J�.�.��w��
�'�\�"9�"9��w��r*z[PHP vhost info]: %sc�4��i|]\}}|d�k�||��S)r~r?)r@rArBr�s   �r(�
<dictcomp>z6WposDaemon._php_get_vhost_versions.<locals>.<dictcomp>es8���<�<�<�*�#�u�#�J�/�7�:�:���:�:�:r*r~�display_version�handler_type�php_version_idr)�vhostr��version�handler�documentrootz)Error on getting php version for %s, skip)ryr
rurFr�rrzr{)r�rt�php_vhost_datar��vhosts_datarNrArBs`       r(�_php_get_vhost_versionsz"WposDaemon._php_get_vhost_versionsRsr���		 ��		 ��		 ��		 �		 �		 �		 �%�>�(<�(>�(>���	B��K�K�.��K�0@�0@�A�A�A���<�<�<�<��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�AC�"D�Dc�X�|���}tj||��dS)z/
        Get litespeed status for user
        N)r�r�r��rhr�rNs   r(�_socket_user_litespeed_statusz(WposDaemon._socket_user_litespeed_statusxs0��
�1�1�3�3���=�>O�QW�X�X�X�X�Xr*c�X�|���}tj||��dS)z+
        Get nginx status for user
        N)r�r�r�r
s   r(�_socket_user_nginx_statusz$WposDaemon._socket_user_nginx_status�s0��
�-�-�/�/���=�>O�QW�X�X�X�X�Xr*c�X�|���}tj||��dS)z2
        Get apache2nginx status for user
        N)r�r�r�r
s   r(� _socket_user_apache2nginx_statusz+WposDaemon._socket_user_apache2nginx_status�s0��
�4�4�6�6���=�>O�QW�X�X�X�X�Xr*c���	|�|t���}d|d�}n)#t$r}dt|��d�}Yd}~nd}~wwxYwt	j||��dS)N)rtro�rNrEz)Daemon cannot get vhosts data: %(reason)sr�)rrtrzryr�r�)rhr�r��
vhost_data�responser�s      r(�#_socket_user_php_get_vhost_versionsz.WposDaemon._socket_user_php_get_vhost_versions�s���	��5�5�g�f�5�M�M�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)Nror)rr�r�)rhr�rs   r(�'_socket_user_php_get_installed_versionsz2WposDaemon._socket_user_php_get_installed_versions�s7���.�0�0�
�
��	�=�>O�QY�Z�Z�Z�Z�Zr*c��ddlm}|��}d|�|t|d���dd|���d�}t	j||��dS)Nr)�get_server_wide_optionsro)�dns)�keyls)r~�domain�feature)rN�upgrade_url)�clwpos.utilsr�get_upgrade_url_for_userrr�r�)rhr�r~rr�server_optionsrs       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_identifierro)rN�	unique_idN)�clwpos.billingr#r�r�)rhr�r~r#rs     r(�_get_unique_idzWposDaemon._get_unique_id�sQ��	C�B�B�B�B�B��8�8��B�B�
�
��	�=�>O�QY�Z�Z�Z�Z�Zr*c�b�ddlm}|��\}}d||d�}tj||��dS)Nr)�get_suites_status_from_licensero)rN�accelerate_wp_premium�accelerate_wp_cdn)rr(r�r�)rhr�r(�awp_premium_status�awp_cdn_statusrs      r(� _get_supported_suites_by_licensez+WposDaemon._get_supported_suites_by_license�sZ��?�?�?�?�?�?�-K�-K�-M�-M�*��N��%7�!/�
�
��
	�=�>O�QY�Z�Z�Z�Z�Zr*c�`�ddlm}||d���}d|d�}tj||��dS)Nr)�is_user_owned_by_resellerT)�
force_as_rootro)rN�is_owned_by_reseller)rr/r�r�)rhr�r~r/r1rs      r(�_get_is_user_owned_by_resellerz)WposDaemon._get_is_user_owned_by_reseller�sZ��:�:�:�:�:�:�8�8��QU�V�V�V���$8�
�
��	�=�>O�QY�Z�Z�Z�Z�Zr*c�>�	|�|��\}}}}}|sdSt�dt|����|d|jkr|�|||��dS|d|jkrL|�dd��}|�dd��dk}|�||||||��dS|d|j	kr|�
|��dS|d|jkr|�|��dS|d|j
kr|�|��dS|d|jkr|�||��dS|d|jkr|�|��dS|d|jkr-|�|||�dd	����dS|d|jkr|�||��dS|d|jkr|j�|��dS|d|jkr|j�|||��dS|d|jkr2|j�|||�dd	����dS|d|jkr|�|��dS|d|j kr|�!||��dSdS#tD$r t�#d
d���YdSwxYw)
z�
        Process client's socket connection (Works in thread)
        :param client_socket_obj: Client socket connection
        NzIncome user request=%sr�rmrj�skip_last_reload_time�yesr�object_cachez"Socket connection processing errorTr�)$r�rtrury� _DAEMON_GET_REDIS_STATUS_COMMANDr��_DAEMON_RELOAD_COMMANDrpr��$_DAEMON_GET_LITESPEED_STATUS_COMMANDr� _DAEMON_GET_NGINX_STATUS_COMMANDr
�'_DAEMON_GET_APACHE2NGINX_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_CALLBACKrgrW�DAEMON_REGISTER_UPGRADE_ATTEMPT�add_pending_upgrade_task�!DAEMON_GET_UPGRADE_ATTEMPT_STATUS�get_upgrade_task_status�&DAEMON_GET_SUPPORTED_SUITES_BY_LICENSEr-� DAEMON_IS_USER_OWNED_BY_RESELLERr2rzr{)	rhr��is_connection_validr�r~r�r�rmr�s	         r(� _handle_client_socket_connectionz+WposDaemon._handle_client_socket_connection�s���
2	R��0�0�1B�C�C�
L���h��m�&�
����K�K�0�#�l�2C�2C�D�D�D��I�&�$�*O�O�O��2�2�3D�h�PS�T�T�T�T�T��i�(�D�,G�G�G�+�/�/���E�E��'3�'7�'7�8O�QU�'V�'V�Z_�'_�$��.�.�/@�/7�/2�/<�/;�/C�E�E�E�E�E��i�(�D�,U�U�U��2�2�3D�E�E�E�E�E��i�(�D�,Q�Q�Q��.�.�/@�A�A�A�A�A��i�(�D�,X�X�X��5�5�6G�H�H�H�H�H��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��i�(�D�,W�W�W��5�5�6G�H�H�H�H�H��i�(�D�,Q�Q�Q��3�3�4E�x�P�P�P�P�P�R�Q���	R�	R�	R����A�D��Q�Q�Q�Q�Q�Q�	R���sg�K2�AK2�3AK2�&K2�8&K2� &K2�'K2�1&K2�<K2�'K2�+K2�--K2�AK2�&K2�'K2�2&L�Lc��t�d��|jr�tj|jgggd��\}}}|D]v}	|���\}}t
|j|f���}|����F#tj
$rt�dd���Y�swxYw|j��t�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)rtrurf�selectrc�acceptr
rHr�r-r�r{)rh�readabler7�_sock_objectr��ts      r(r�z&WposDaemon._process_socket_connectionss��	���J�K�K�K��&�	O�#�]�D�L�>�2�r�1�E�E�N�H�a�� (�
O�
O��O�+7�+>�+>�+@�+@�(�%�q��d�&K�Sd�Rf�g�g�g�A��G�G�I�I�I�I���|�O�O�O��$�$�%>��$�N�N�N�N�N�O�����&�	O�	���J�K�K�K�K�Ks�AB�+B9�8B9)rj)Fr\r�)rjF)NNN)@�__name__�
__module__�__qualname__�__doc__r�r8r7r9r:r;r<r=r>r?r@rArCrErFr�r�r��_REDIS_SOCKET_WAIT_TIMEOUTr`�int�boolryrr�r�r�r�r�r�rHr�r�r��staticmethod�dictr�r�r�r-rrr�r�r�r�r�rrr
rrrr!r&r-r2rHr��
__classcell__)ris@r(rQrQ`s9��������� 6��%��'9�$�+A�(�'9�$�.G�+�,D�)�0L�-�&8�#�#2� �$<�!�&?�#�(C�%�-U�*�'D�$��(�,�(�/�-�1�'�$�'�)�%�.�(���"	�'�$�)�%�.�(�'�#�"$��!#��;�;�;�;�;� 0%�0%�s�0%�t�0%�cf�0%�rv�0%�0%�0%�0%�d#��#��#�#�#�#�J9�9�9�$@�@�@�*`�`�`�.$�$�$� A� A� A�D���a�a�a�$>�$>�T�$>�$>�$>�$>�R�a�4�a�a�a��\�a��]�t�]�]�]��\�]��d�d�d�d�d��\�d�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�7;�?D�*n�*n�6�=�*n�,/�*n�'*�*n�26�*n�14�	*n�
9=�*n�*n�*n�*n�X�#�#��#�Z^�#�#�#��\�#�JY�v�}�Y�Y�Y�Y�Y�6�=�Y�Y�Y�Y�Y�&�-�Y�Y�Y�Y�
[�V�]�
[�]`�
[�
[�
[�
[�[���[�[�[�[�[�6�=�[�[�[�[�"	[��
�	[�	[�	[�	[�[�&�-�[�[�[�[�[��
�[�[�[�[�7R�&�-�7R�TX�7R�7R�7R�7R�rL�L�L�L�L�L�Lr*rQ)N)?�loggingr%r�rGrxrIr-rKrqr��typingrrrr�
contextlibr�collectionsr�	threadingr	r
�clwposrr7�clcommon.cpapirr
rrrrr�rrrrr�clwpos.daemon_redis_librrrr�clwpos.socket_utilsr��clwpos.daemon_baser�clwpos.constantsr�clwpos.cl_wpos_exceptionsr�"clwpos.daemon_subscription_handlerrr�	getLoggerrPrtr)r2r9ryrOrQr?r*r(�<module>rhs	������	�	�	�	�
�
�
�
�������������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�.�.�.�.�.�.�.�.�.�.�.�.�%�%�%�%�%�%�"�"�"�"�"�"�"�"�"�"�"�"�"�"�������������������������������������������������+�*�*�*�*�*�-�-�-�-�-�-�4�4�4�4�4�4�9�9�9�9�9�9�I�I�I�I�I�I��J�{�$M�$M�$M�N�N�	�	��	�8�	$�	$��������
��
�
�
�
�
��	�D�	�	�	���	�6�6�c�6�X�d�3��8�n�-E�6�6�6�6�|
L�|
L�|
L�|
L�|
L��|
L�|
L�|
L�|
L�|
Lr*