C!Mjx7 d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm Z d dl mZmZm Z d dlmZ d dlmZmZmZ d dlmZ d dlmZ d dlmZ d d lmZ d d lmZmZmZmZ d dl m!Z! d dl"m#Z$ ej% e& Z'd Z(de)dee* fdZ+de)dee* fdZ,de)de)dee* fdZ-de de*fdZ.de de)fdZ/de fdZ0de*de1fdZ2de*de e1e1e3f fdZ4dZ5d e)d!ee* de*fd"Z6 d+d e)d!ee* dee* fd#Z7 d,de)d%ee* d&e)de ee* e3f fd'Z8dee e*e*f fd(Z9d)ej: dee e*e*f fd*Z;dS )- N)Logger)ListOptionalTuple)drop_privileges)run_commandExternalProgramFailedis_user_present)cpusers)get_main_username_by_uid)REDIS_SERVER_BIN_FILE) WposError) USER_WPOS_DIRis_run_under_userdrop_permissions_if_neededrun_in_cagefs_if_needed) NoPackage)gettextz/opt/alt/redis/bin/redis-cli file_pathreturnc d}t j | sd} t || gd }| d }|d d d }g }| d D ]G} | t | 8# t $ r Y Dw xY w|S # t t f$ r Y nw xY wg S ) z Retrieves list of PID list processes, which uses file (using fuser utility) This can find any process (for example php), not only redis service process :param file_path: Filename to check :return: PID list z/usr/bin/fuserz/sbin/fuserFreturn_full_output r : )ospathexistsr splitstripappendint ValueErrorr IndexError)r fuser_binarystd_out lines_list s_pid_listpid_lists_pids N/opt/cloudlinux/venv/lib64/python3.11/site-packages/clwpos/daemon_redis_lib.py_get_pids_for_filer. 2 s $L 7>>,'' %$ |Y7ERRR]]4(( ]((--a06688 %%c** E EKKMM 2 23333 !:. Is6 A4C! 4CC! CC! CC! !C54C5usernamec t dddd| gd }n# t $ r g cY S w xY w| d }t | dk rg S g }|d d }|D ]^}| }|rF | t | N# t $ r Y Zw xY w_|S )zz Update PID list in cache for user using /bin/ps utility :param: username: Username to scan :return: None z/bin/psz-opidz-uFr r r N)r r r! lenr" r# r$ r% )r/ r( r) user_pid_listlines r- _get_user_pidsr6 R s y$tXF[`aaa t$$J : MABBJ zz|| $$S%6%67777 s ((<4B11 B>=B>home_dirc t j |t d }t | }t | }g }|D ]}||v r| | |S )z Get redis PID list for user :param username: user name :param home_dir: User's homedir :return: PID list or [] if user has no redis redis.sock)r r joinr r. r6 r# )r/ r7 redis_socket_file pid_list_sock user_pidsr+ r1 s r- _get_user_redis_pidsr> r sn X}lKK&'899Mx((IH ! !)OOC O _loggerr1 c t st d t j |t j t j d t j |t j n# t $ r Y nw xY wn;# t $ r.}| d|t | Y d}~nd}~ww xY w| dt | dS )zj Kill process by pid :param _logger: Logger to log errors :param pid: Process pid to kill z;Internal error! Trying to kill process with root privileges z+Can't kill redis process, pid %s; error: %sNzKilled process with pid=%s) r r r killsignalSIGTERMtimesleepSIGKILLOSErrorwarningstrinfo)r@ r1 es r- kill_process_by_pidrN s WUVVVT V^$$$ 1 GC(((( D T T TEsCPQFFSSSSSSSST LL-s3xx88888s; 3B A3 2B 3 B =B ?B B B<$B77B<loggerc H t | sdS t j | }t |j |j }| dt | | t | 5 |D ]}t | | ddd dS # 1 swxY w Y dS )zq Kill all user's redice processes :param logger: Logger to log errors :param username: User name Nz%Killing redis with pid=%s for user=%s) r pwdgetpwnamr> pw_namepw_dirrL rK r rN )rO r/ user_pwdredis_pid_list redis_pids r- _kill_all_redises_for_userrX s 8$$ |H%%H)(*:HOLLN KK7^9L9LhWWW " " 3 3' 3 3I 2222 33 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3s 3BBBc t }nN# t t t t f$ r.}| dt | Y d}~dS d}~ww xY w|D ]}t | | dS )z[ Find and kill lost redices for all panel users :param logger: Daemon's logger z"Can't get user list from panel: %sN)r rI IOErrorr&