HEX
Server: LiteSpeed
System: Linux l24.yourwebhosting.net 5.14.0-611.54.3.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Thu May 7 16:31:24 EDT 2026 x86_64
User: turkishi (1582)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: //opt/cloudlinux/venv/lib/python3.11/site-packages/clwpos/__pycache__/daemon.cpython-311.opt-1.pyc
�

�:��r ����ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZm
Z
ddlmZddlmZddlmZmZmZddlmZddlmZmZmZmZmZmZddl 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)�contextmanager)�
namedtuple)�BoundedSemaphore�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_lockr:Ksj����
�<�<��<�'�'�`�!�!�,]�*^�*^�_�_�_�_���
�
�
�������������������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(�whmapi1rPXs}��`p�x�\�\�CS�CY�CY�C[�C[�\�\�\�\�vx��
�^�0�/�8�g�Nf�g�+/�1�1�1�F��:�f�m�*�*�,�,�-�-�f�5�5r*c�R��eZdZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZ
dZd
ZdZdZdZdZeeeee	e
eee
eeeeegZeee
eeeeegZdZdZdZdZ�fd�ZdGdedededefd�Zdedefd�Z d�Z!d�Z"d �Z#d!�Z$d"�Z%d#�Z&d$�Z'dHd'efd(�Z(e)de*fd)���Z+e)de*fd*���Z,e)de*fd+���Z-d,e.j.de/eee0ee0e*effd-�Z1d,e.j.d.ed/efd0�Z2d1edefd2�Z3		dId,e.j.d.ed/ed3eded4efd5�Z4e)dJd7ede5fd8���Z6d,e.j.fd9�Z7d,e.j.fd:�Z8d,e.j.fd;�Z9d,e.j.d7efd<�Z:d,e.j.fd=�Z;d,e.j.fd>�Z<d,e.j.fd?�Z=d,e.j.fd@�Z>d,e.j.fdA�Z?d,e.j.fdB�Z@d,e.j.dd6fdC�ZAdD�ZBd/edd6fdE�ZCd,e.j.d/edd6fdF�ZD�xZES)K�
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�daemon_is_wp2_environment���2�c�(��t�����i|_g|_d|_d|_d|_d|_t|j	��|_
i|_t��|_
t��|_dS)NrT)�super�__init__�_monitoring_users_dict�_username_list_to_process�_socket�_reload_uid�_socket_thread�_socket_thread_workr�_MAX_CONCURRENT_CONNECTIONS�_connection_semaphore�_uid_connection_countsr	�_uid_connection_lockr�_suite_watcher)�self�	__class__s �r(rdzWposDaemon.__init__�s����
��������
=?��#�)+��&�04������04���#'�� �%5�d�6V�%W�%W��"�68��#�$(�F�F��!�8�:�:����r*�no�user_uid�is_store_last_reload_time�force_reloadr+c�B�	|j�|��}|�d}n|j}t|��}t�d||��t
|||��\}}|ddkrCt�d|��t|t��d���|j|<|S|rv|j	j
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: %srO�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)re�getr!r�logger�inforrr	�_config�enable_reload_rate_limit�time�str�	Exception�	exception)rprsrtru�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�
�/��9�9�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%�B3E�6B$E�
F�%*F�F�Fc��|j|}d}	t|j��5t|��\}}}|s	ddd��dS|r	ddd��dSt	|��}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, restartingrOrwrr zSLock error: %s. User %s (uid=%d) is working with his redis, skip monitoring actions)rer:r"rrryrzrr!rr�debugr6rr�)
rprs�	user_datar��is_redis_alive�is_user_presentr8r!r�r�s
          r(�_user_monitoringzWposDaemon._user_monitoring�sz�� $�:�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�4�H�=�=�����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�C9�C-�C9�	C-�C9�AC-�5C9�C-�!C9�-C1�1C9�4C1�5C9�9
E�"D*�*
E�7E�Ec��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)	ryrzr~rerG�list�keysr��append)rp�user_ids_list_to_remove�user_id�	is_removes    r(�_redises_monitoringzWposDaemon._redises_monitorings���#%�����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ryrzr~�pwd�getpwnam�pw_uid�KeyErrorrerxr!r�)rp�	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)rryrzre�updaterr	�
_is_terminate�
_force_reloadr�r}�sleepr{�monitoring_intervalr�rr�)rp�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_connectionsri�start�rps r(�_create_and_start_socket_threadz*WposDaemon._create_and_start_socket_threadBs5��%�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_FILENAMEry�warningr%�path�existsr�_remove_socketr2rg�OSError�IOErrorr~rz�_setup_signalsrrSr�r�rjri�joinr)rpr�r6s   r(rIzWposDaemon.runIs����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_FILErS�remover�r�r�s r(r�zWposDaemon._force_reloadksy��
�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)ryrzrrg�closer%r�r�r�r�r~)rpr�s  r(r�zWposDaemon._remove_socketxs���	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�ryrzr%�kill�signal�SIGTERMr�r}r��SIGKILLrr)rpr��timeout�interval�pidr�r�s       r(�stopzWposDaemon.stop�s����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
        rw�rO�	timestamp�status)r}rr@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
        rwr�)r}rr@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_runningrwr�)�clcommon.utilsr�r}r�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kr�d|vr+tj|d
tj��d���dS|d}	t|��}n=#t$r0tj|dd|itj��d���YdSwxYw|d	|jvr+tj|dtj��d���dSd|||dfS|d	|jvr+tj|dtj��d���dSd|||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)rO�contextr�)F���NNFNz>User %(username)s sent invalid query to CL AccelerateWP daemonr��rOr��commandz0Daemon received malformed query (command absent)�rOr�rz)Root request to daemon should contain uidzDaemon received invalid commandTF)�socket_utils�get_uid_from_socketrr��(send_dict_to_socket_connection_and_closer}�'read_unpack_response_from_socket_daemonr-�errorr�rJ�JSONDecodeError�struct�AttributeError�UnicodeDecodeError�_DAEMON_VALID_COMMANDS_FOR_ROOT�_DAEMON_VALID_COMMANDS)rpr��_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�/��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�;�;��	�"�$�*E�E�E��A�BS�Mn�PT�PY�P[�P[�C]�C]�
^�
^�
^�0�/��T�8�\�5�8�8s3�&�6A �A �$A9�9?B;�:B;�	E�6F�Fr�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�rOrwr�)rerxr�r�r"r)rpr�r�r�r�r�r8r�s        r(�_socket_user_get_redis_statusz(WposDaemon._socket_user_get_redis_statuss(�� $�:�>�>�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)r}�_MIN_ALLOWED_RELOAD_PERIOD)rpr#s  r(�_is_reload_availablezWposDaemon._is_reload_available*s(��
 �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)rur�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�rOr�zT[Redis user data found] Cloudlinux AccelerateWP daemon reloaded for user %s (uid=%d))rerxryrzr~r!r�r}r�r�r�r#r�r�r")
rpr�r�r�r�rur�r�r�r#s
          r(�_socket_user_redis_reloadz$WposDaemon._socket_user_redis_reload1s
�� $�:�>�>�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>._cast`s?���u�$�$� �y� �J�.�.��w��
�'�\�"9�"9��w��r*z[PHP vhost info]: %sc�4��i|]\}}|d�k�||��S)r�r@)rArBrCr�s   �r(�
<dictcomp>z6WposDaemon._php_get_vhost_versions.<locals>.<dictcomp>ps8���<�<�<�*�#�u�#�J�/�7�:�:���:�:�:r*r��display_version�handler_type�php_version_idr)�vhostr��version�handler�documentrootz)Error on getting php version for %s, skip)r~r
rzrGr�rrr�)r�ry�php_vhost_datar�vhosts_datarOrBrCs`       r(�_php_get_vhost_versionsz"WposDaemon._php_get_vhost_versions]sr���		 ��		 ��		 ��		 �		 �		 �		 �%�>�(<�(>�(>���	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��rpr�rOs   r(�_socket_user_litespeed_statusz(WposDaemon._socket_user_litespeed_status�s0��
�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�rs   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�rs   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)ryrw�rOrFz)Daemon cannot get vhosts data: %(reason)sr�)rryrr~r�r�)rpr�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)Nrwr)rr�r�)rpr�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_optionsrw)�dns)�keyls)r��domain�feature)rO�upgrade_url)�clwpos.utilsr�get_upgrade_url_for_userrr�r�)rpr�r�r#r�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_identifierrw)rO�	unique_idN)�clwpos.billingr*r�r�)rpr�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_licenserw)rO�accelerate_wp_premium�accelerate_wp_cdn)r%r/r�r�)rpr�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_rootrw)rO�is_owned_by_reseller)r%r6r�r�)rpr�r�r6r8rs      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�Z�ddlm}|��}d|d�}tj||��dS)Nr)�is_wp2_environmentrw)rO�is_wp2)�clcommon.cpapir;r�r�)rpr�r;r<rs     r(�_get_is_wp2_environmentz"WposDaemon._get_is_wp2_environment�sQ��5�5�5�5�5�5�#�#�%�%����
�
��	�=�>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|�!||��dS|d|j"kr|�#|��dSdS#tH$rvt�%d
d���	tMj'|d
tQj(��d���YdS#tR$rt�*d��YYdSwxYwwxYw)z�
        Process client's socket connection (Works in thread)
        :param client_socket_obj: Client socket connection
        NzIncome user request=%sr�rurr�skip_last_reload_time�yesr#�object_cachez"Socket connection processing errorTr�zInternal daemon errorr�z!Broken pipe during error response)+r�ryrzr~� _DAEMON_GET_REDIS_STATUS_COMMANDr��_DAEMON_RELOAD_COMMANDrxr��$_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_CALLBACKrorX�DAEMON_REGISTER_UPGRADE_ATTEMPT�add_pending_upgrade_task�!DAEMON_GET_UPGRADE_ATTEMPT_STATUS�get_upgrade_task_status�&DAEMON_GET_SUPPORTED_SUITES_BY_LICENSEr4� DAEMON_IS_USER_OWNED_BY_RESELLERr9�DAEMON_IS_WP2_ENVIRONMENTr>rr�r�r�r}�BrokenPipeErrorr�)	rpr��is_connection_validr�r�r�r�rur�s	         r(� _handle_client_socket_connectionz+WposDaemon._handle_client_socket_connection�s���
8	D��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��i�(�D�,J�J�J��,�,�->�?�?�?�?�?�K�J���	D�	D�	D����A�D��Q�Q�Q�
D��E�FW�d{�KO�KT�KV�KV�ZW�ZW�X�X�X�X�X�X��"�
D�
D�
D����B�C�C�C�C�C�C�C�
D����		D���s��L�AL�3AL�&L�8&L� &L�'L�1&L�<L�'L�+L�--L�AL�&L�'L�0&L�&N�)M-�-$N�N�N�Nc��t�d��|j�rtj|jgggd��\}}}|D�]�}	|���\}}	t
j|��}n$#t$r|�	��Y�QwxYw|j
5|j�|d��|j
kr!|�	��	ddd����|j�|d��dz|j|<ddd��n#1swxYwY|j�d���s+|�|��|�	����%	t#|j||f���}|���nl#t$r_t�d��|j���|�|��|�	��YnwxYw���#t,j$r t�d	d
���Y���wxYw|j��t�d��dS)
z>
        Process socket connections (works in thread)
        z4Cloudlinux AccelerateWP daemon socket thread startedr�rNFr4)r��argszFailed to start handler threadzSocket connection errorTr�z4Cloudlinux AccelerateWP daemon socket thread stopped)ryrzrj�selectrg�acceptr�r�rr�rnrmrx�_MAX_CONNECTIONS_PER_UIDrlr7�_release_uid_connectionr
�(_handle_client_socket_connection_trackedr�r�r9r-r�)rp�readabler8�_sock_objectr�r��ts       r(r�z&WposDaemon._process_socket_connections(s��	���J�K�K�K��&�	O�#�]�D�L�>�2�r�1�E�E�N�H�a�� (�
O�
O��O�+7�+>�+>�+@�+@�(�%�q�!�*�>�?P�Q�Q����$�!�!�!�)�/�/�1�1�1� ��!�����2�g�g��6�:�:�3��B�B�d�Fc�c�c�-�3�3�5�5�5�$�g�g�g�g�g�g�g�<@�;V�;Z�;Z�[^�`a�;b�;b�ef�;f��3�C�8�	g�g�g�g�g�g�g�g�g�g�g����g�g�g�g�
 �5�=�=�u�=�M�M�!��4�4�S�9�9�9�)�/�/�1�1�1� �2�"�$�*W�):�C�(@�B�B�B�����	�	�	�	��$�2�2�2��(�(�)I�J�J�J��2�:�:�<�<�<��4�4�S�9�9�9�)�/�/�1�1�1�1�1�	2������
�|�O�O�O��$�$�%>��$�N�N�N�N�N�O����9�&�	O�<	���J�K�K�K�K�Ks��
H�"A7�6H�7B�H�B�
H�":D�H�(&D�H�D	�H�!D	�"AH�,,F�H�A&H�?H�H�H�+H6�5H6c���|j5|j�|d��dz
}|dkr|j�|d��n
||j|<ddd��dS#1swxYwYdS)zYDecrement the per-UID active connection counter and remove the entry if it drops to zero.r�rN)rnrmrx�pop)rpr��counts   r(r\z"WposDaemon._release_uid_connectionMs���
�
&�	9�	9��/�3�3�C��;�;�a�?�E���z�z��+�/�/��T�:�:�:�:�38��+�C�0�	9�	9�	9�	9�	9�	9�	9�	9�	9�	9�	9�	9����	9�	9�	9�	9�	9�	9s�AA � A$�'A$c���	|�|��|j���|�|��dS#|j���|�|��wxYw)zn
        Wrapper around _handle_client_socket_connection that tracks per-UID active connection counts
        N)rVrlr9r\)rpr�r�s   r(r]z3WposDaemon._handle_client_socket_connection_trackedVs}��	.��1�1�2C�D�D�D��&�.�.�0�0�0��(�(��-�-�-�-�-��
�&�.�.�0�0�0��(�(��-�-�-�-���s�A�0A7)rr)Fr^r�)rrF)NNN)F�__name__�
__module__�__qualname__�__doc__r�rDrCrErFrGrHrIrJrKrLrMrOrQrRrSr�r�r��_REDIS_SOCKET_WAIT_TIMEOUTrkr[rd�int�boolr~rr�r�r�r�r�r�rIr�r�r��staticmethod�dictr�r�r�r-rrr�r�r�r�r�rrrrrrr(r-r4r9r>rVr�r\r]�
__classcell__)rqs@r(rRrR`s���������� 6��%��'9�$�+A�(�'9�$�.G�+�,D�)�0L�-�&8�#�#2� �$<�!�&?�#�(C�%�-U�*�'D�$� ;���(�,�(�/�-�1�'�$�'�)�.�(�!���"	�'�$�)�%�.�(�!�	'�#�"$��!#��"$�� ��;�;�;�;�;�&2%�2%�s�2%�t�2%�cf�2%�rv�2%�2%�2%�2%�h#��#��#�#�#�#�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�=�[�[�[�[�"	[��
�	[�	[�	[�	[�[�&�-�[�[�[�[�[��
�[�[�[�[�[���[�[�[�[�=D�&�-�=D�TX�=D�=D�=D�=D�~#L�#L�#L�J9�3�9�4�9�9�9�9�.�&�-�.�^a�.�fj�.�.�.�.�.�.�.�.r*rR)N)?�loggingr%r�rHr}rJr-rYr�r��typingrrr�
contextlibr�collectionsr�	threadingrr	r
�clwposrr8r=rr
rrrrr�rrrrr�clwpos.daemon_redis_librrrr�clwpos.socket_utilsr��clwpos.daemon_baser�clwpos.constantsr�clwpos.cl_wpos_exceptionsr�"clwpos.daemon_subscription_handlerrr�	getLoggerreryr)r2r:r~rPrRr@r*r(�<module>r|s�������	�	�	�	�
�
�
�
�������������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�(�(�(�(�(�(�(�(�(�(�%�%�%�%�%�%�"�"�"�"�"�"�4�4�4�4�4�4�4�4�4�4�������������������������������������������������+�*�*�*�*�*�-�-�-�-�-�-�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�~.�~.�~.�~.�~.��~.�~.�~.�~.�~.r*