%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /opt/alt/python37/lib/python3.7/site-packages/clwpos/__pycache__/
Upload File :
Create Path :
Current File : //opt/alt/python37/lib/python3.7/site-packages/clwpos/__pycache__/daemon.cpython-37.pyc

B

�4Lb i�@sxddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
mZmZm
Z
ddlmZddlmZddlmZmZddlmZddlmZddlmZmZmZmZdd	lm Z m!Z!m"Z"m#Z#ddl$m%Z%dd
l&m'Z'ddl(m)Z)ddl*m+Z+ed
dddg�Z,edd��Z-ejd�dd�Z.eed�dd��Z/d e0e
ee0e0fd�dd�Z1Gdd�de'�Z2dd�Z3dS)!�N)�Optional�Dict�Tuple�List)�contextmanager)�
namedtuple)�Lock�Thread)�gettext)�cpusers)�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�	User_data�	redis_pid�lock�last_reload_timeccst�d�}dVt�|�dS)z,
    Context manager for dropping umask
    rN)�os�umask)�prev�r�>/opt/alt/python37/lib/python3.7/site-packages/clwpos/daemon.py�_umask_0(s
r )�returnc	Cs4t��$t�tj�}|�t�|��|SQRXdS)zr
    Create world-writable socket in given sock_location
    or reuse existing one
    :return: socket object
    N)r �socketZAF_UNIXZbindrZlisten)Zsockobjrrr�_create_socket2s

r#)rccs4|jdd�sttd�d��z
|VWd|��XdS)z=
    Non-blocking lock implementation for with statement
    F)Zblockingz/Can't acquire lock. May be it already acquired.)�messageN)�acquirer�_�release)rrrr�non_blocking_lock?s

r()�function�input_parameterscCsF|rdd�|��D�ng}tjdd|f|�dd�}t�|j���dS)NcSsg|]\}}|�d|���qS)�=r)�.0�key�valuerrr�
<listcomp>Mszwhmapi1.<locals>.<listcomp>z/usr/sbin/whmapi1z
--output=jsonT)Zcapture_output�data)�items�
subprocess�run�json�loads�stdout�decode)r)r*Zinput_parameters_as_list�resultrrr�whmapi1Lsr9cs~eZdZdZdZdZdZdZdZdZ	eeeee	gZ
egZdZd	Z
�fd
d�Zeeed�d
d�Zeed�dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd@ed!�d"d#�Zeed$�d%d&��Zeje eee!e"e!eefd'�d(d)�Z#eje"ed*�d+d,�Z$eed-�d.d/�Z%eje"eed0�d1d2�Z&ejd3�d4d5�Z'eje"d6�d7d8�Z(ejd3�d9d:�Z)ejd;d'�d<d=�Z*d>d?�Z+�Z,S)A�
WposDaemonzW
    AccelerateWP daemon main class. Socket operations, redis process control, etc
    z/var/lve/wpos_reload�reloadzget-redis-statuszget-litespeed-statusZphp_get_vhost_versionsZphp_get_installed_versions��cs2t���i|_g|_d|_d|_d|_d|_dS)NrT)�super�__init__�_monitoring_users_dictZ_username_list_to_process�_socketZ_reload_uid�_socket_thread�_socket_thread_work)�self)�	__class__rrr?ks
zWposDaemon.__init__)�user_uid�is_store_last_reload_timer!c

Cs�y�|j�|�}|dkrd}n|j}t�|�j}t|j||�\}}|ddkrP|S|r�|jr^|sdd}nt	�	�}t
|t�|d�|j|<n||jkr�|j|=Wn6tk
r�}	z|j�
|	�dt|	�iSd}	~	XYnXddiS)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": {}}
        Nr8�successr)rrr)r@�getr�pwd�getpwuid�pw_namer�_loggerZ_is_reload_interval_enabled�timerr�	Exception�	exception�str)
rDrFrGZuserdataZ
old_redis_pid�usernameZ
new_redis_pid�result_dictr�errr�_reload_redis_for_userys*


z!WposDaemon._reload_redis_for_user)rFr!c	
Cs�|j|}d}y�t|j��pt|j|�\}}}|s6dS|r>dSt�|�j}t|j||j|j	�\}}|dkrpdSt
||jdd�|j|<WdQRXWnbtk
r�}z|j�d|j
||�Wdd}~XYn.tk
r�}z|j�|�Wdd}~XYnXdS)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
        �TFNr)rrrzSLock error: %s. User %s (uid=%d) is working with his redis, skip monitoring actions)r@r(rrrMrJrKrLrrrr�debugr$rOrP)	rDrF�	user_datarR�is_redis_aliveZis_user_presentr&rrTrrr�_user_monitoring�s,
zWposDaemon._user_monitoringcCsXg}x.t|j���D]}|�|�}|r|�|�qWx|D]}||jkr:|j|=q:WdS)z,
        Working redises monitoring
        N)�listr@�keysrZ�append)rDZuser_ids_list_to_remove�user_idZ	is_removerrr�_redises_monitoring�s


zWposDaemon._redises_monitoringc	Cs^|jrZd|_xLt�D]B}yt�|�j}Wntk
r>wYnX||jkr|�|d�qWdS)zC
        Process all requests - start/stop redis for users
        FN)Z_reload_config_needrrJ�getpwnamZpw_uid�KeyErrorr@rU)rDrRr^rrr�_reload_all_users�s
zWposDaemon._reload_all_usersc	Cs�d}t�}|j�d|�x0|D](}|j�|dt|dt�dd�i�qWxt|js�yD|��|�	�|jrlPt
�d�|d7}||jkr�|�
�d}WqLtk
r�|jjddd�YqLXqLWdS)NrzFound existing redises: %s�)rrrz,Cloudlinux AccelerateWP daemon general errorT)�exc_info)rrMrWr@�updaterrZ
_is_terminate�
_force_reloadrbrN�sleepZ_monitoring_intervalr_rOrP)rD�iZexisting_redises�itemrrr�_main_cycle�s$
(

zWposDaemon._main_cyclecCst|jd�|_|j��dS)z;
        Create and start socket processing thread
        )�targetN)r	�_process_socket_connectionsrB�start)rDrrr�_create_and_start_socket_thread�sz*WposDaemon._create_and_start_socket_threadc
Cs�t|j�dk	r"|j�d|j�dStj�t�r6|��yt	�|_
Wn<ttfk
r~}zd}|j�|t
|��dSd}~XYnX|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_FILENAMErM�warningr�path�existsr�_remove_socketr#rA�OSError�IOErrorrQ�infoZ_setup_signalsrr;rnrjrCrB�joinr
)rDrTr$rrrr3s,


zWposDaemon.runc	CsDtj�|j�r@|��yt�|j�Wnttfk
r>YnXdS)z%
        Force reload daemon
        N)rrq�isfile�_WPOS_DAEMON_RELOAD_FILEr;�removertru)rDrrrrf"szWposDaemon._force_reloadc
Cs~y>|j�dt�|jdk	r$|j��t�t�|j�dt�Wn:ttfk
rx}z|j�	dtt
|��Wdd}~XYnXdS)z-
        Remove daemon's socket file
        zRemoving socket %sNzSocket %s removedz!Can't remove socket %s. Error: %s)rMrvrrA�closerrzrtrurprQ)rDrTrrrrs/s


zWposDaemon._remove_socketF)�gracefulc
Cs>t|j�}|�ry |j�d|�t�|tj�Wn2tk
rb}z|j�d||�Wdd}~XYnXd}x�||kr�yt�|d�Wn$tk
r�|j�d|�PYnX|d7}t	�
d�qjW|j�d|�yt�|tj�Wn4tk
�r}z|j�d||�Wdd}~XYnX|�r$t|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 deadrcz:Process with pid %s did not exit in timeout, sigkilling itz&Cloudlinux AccelerateWP daemon stopped)rrorMrvr�kill�signal�SIGTERMrtrNrg�SIGKILLrr
)rDr|�timeout�pidrTrhrrr�stop<s2
"
"

zWposDaemon.stop)r!cCsdt��t�d�S)zy
        Get litespeed webserver status: running or not.
        :return: Dict to send to clwpos-user via socket
        rH)r8�	timestamp�status)rNrrrrr�_get_litespeed_statusdsz WposDaemon._get_litespeed_status)�client_socket_objr!c
Cs�t�|�}yt�|�j}Wn0tk
rJt�|dd|it��d��dSXyt�|�}Wn,t	j
t	jtj
tj
ttfk
r�d}YnX|dkr�t�|dd|id��dSd	|kr�t�|d
t��d��dS|d	|jkr�t�|dt��d��dS|d
k�r�d|k�rt�|dt��d��|d}yt�|�j}Wn2tk
�rht�|dd|it��d��dSX|d	|jk�r�t�|dt��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)r8�contextr�)F���NNFNz5User %(username)s sent invalid query to CLWPOS daemonrR)r8r��commandz0Daemon received malformed query (command absent))r8r�zDaemon received invalid commandrz)Root request to daemon should contain uidTF)�socket_utilsZget_uid_from_socketrJrKrLra�(send_dict_to_socket_connection_and_closerNZ'read_unpack_response_from_socket_daemonr"�errorr�r4�JSONDecodeError�struct�AttributeError�UnicodeDecodeError�_DAEMON_VALID_COMMANDS�_DAEMON_VALID_COMMANDS_FOR_ROOT)rDr�Z_uidrR�user_requestrrr�_validate_socket_connectionlsb
"


z&WposDaemon._validate_socket_connection)r�rRr�c	Csv|j�|d�}|dkr.t�|dd|id��nD|j�8t|j|�\}}}|ddkr\||d<t�||�WdQRXdS)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 yetrR)r8r�r8rHr�)r@rIr�r�rrrM)rDr�rRr�rXrYr&rSrrr�_socket_user_get_redis_status�sz(WposDaemon._socket_user_get_redis_status)rr!cCs|dkpt��||jkS)zv
        Checks is reload available by checking time
        :return: True - available, False - not available
        r)rN�_MIN_ALLOWED_RELOAD_PERIOD)rDrrrr�_is_reload_available�szWposDaemon._is_reload_available)r�rRr��
is_root_queryc	Cs�|j�|�}|dkrL|�|d�}t��|d<t�||�|j�d||�dS|j}|s�|�	|�s�t��d||j
d�d�}t�||�dS|j�:|�|d�}t��|d<t�||�|j�d||�WdQRXdS)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
        NTr�z<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)�userZsec)r�r8r�)r@rIrUrNr�r�rMrWrr�r�r)rDr�rRr�r�rXrSrrrr�_socket_user_redis_reload�s&	z$WposDaemon._socket_user_redis_reload)r�cCs|��}t�||�dS)z/
        Get litespeed status for user
        N)r�r�r�)rDr�r8rrr�_socket_user_litespeed_status�sz(WposDaemon._socket_user_litespeed_status)r��accountcs2d�fdd�t|j�dD�d�}t�||�dS)NrHcsg|]}|d�kr|�qS)r�r)r,r.)r�rrr/szBWposDaemon._socket_user_php_get_vhost_versions.<locals>.<listcomp>�versions)r8r0)r9�%DAEMON_PHP_GET_VHOST_VERSIONS_COMMANDr�r�)rDr�r��responser)r�r�#_socket_user_php_get_vhost_versions�s z.WposDaemon._socket_user_php_get_vhost_versionscCs$dt|j�dd�}t�||�dS)NrHr�)r8r0)r9�)DAEMON_PHP_GET_INSTALLED_VERSIONS_COMMANDr�r�)rDr�r�rrr�'_socket_user_php_get_installed_versions	sz2WposDaemon._socket_user_php_get_installed_versionsNcCs�y�|�|�\}}}}}|sdS|d|jkr<|�|||�nn|d|jkr\|�||||�nN|d|jkrv|�|�n4|d|jkr�|�||�n|d|j	kr�|�
|�Wn4tjt
jttjtfk
r�|jjddd�YnXdS)z�
        Process client's socket connection (Works in thread)
        :param client_socket_obj: Client socket connection
        Nr�z"Socket connection processing errorT)rd)r�� _DAEMON_GET_REDIS_STATUS_COMMANDr��_DAEMON_RELOAD_COMMANDr��$_DAEMON_GET_LITESPEED_STATUS_COMMANDr�r�r�r�r�r"r�r4r�r�r�r�rMrP)rDr�Zis_connection_validr�rRr�r�rrr� _handle_client_socket_connections z+WposDaemon._handle_client_socket_connectionc	Cs�|j�d�x�|jr�t�|jgggd�\}}}x\|D]T}y(|��\}}t|j|fd�}|��Wq4t	j
k
r�|jjddd�Yq4Xq4WqW|j�d�dS)	z>
        Process socket connections (works in thread)
        z4Cloudlinux AccelerateWP daemon socket thread startedrc)rk�argszSocket connection errorT)rdz4Cloudlinux AccelerateWP daemon socket thread stoppedN)rMrvrC�selectrAZacceptr	r�rmr"r�rP)rD�readabler&Z_sock_objectr��trrrrl+s
z&WposDaemon._process_socket_connections)Fr<)-�__name__�
__module__�__qualname__�__doc__ryr�r�r�r�r�r�r�r�Z_REDIS_SOCKET_WAIT_TIMEOUTr?�int�boolrrUrZr_rbrjrnr3rfrsr��staticmethod�dictr�r"rrrQr�r�r�r�r�r�r�r�rl�
__classcell__rr)rErr:TsL'#"

(J#
r:cCsft�}|jdkr|��|jdkr8|jdd�|��n*|jdkrP|�|j�n|jdkrb|��dS)NrmZrestartF)r|r�r;)r:�actionr3r�r|r;)Z_optsZdaemonrrr�daemon_main<s




r�)N)4rr~r2rNr4r"r�rJr��typingrrrr�
contextlibr�collectionsrZ	threadingrr	Zclwposr
r&Zclcommon.cpapirZclcommon.utilsrr
rrZclwpos.daemon_redis_librrrrZclwpos.socket_utilsr�Zclwpos.daemon_baserZclwpos.constantsrZclwpos.cl_wpos_exceptionsrrr r#r(rQr9r:r�rrrr�<module>s>

k

Zerion Mini Shell 1.0