73 ~ d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl m Z mZmZ d dl mZ d dlmZmZmZ d dlmZ d dlmZ d dlmZ d d lmZ d d lmZmZmZmZ d dlm Z d dl!m"Z# ej$ e% Z&d Z'de(de e) fdZ*de(de e) fdZ+de(de(de e) fdZ,dede)fdZ-dede(fdZ.defdZ/de)de0fdZ1de)dee0e0e2f fdZ3de(dee) fd Z4 d(de(d"ee) d#e(deee) e2f fd$Z5de ee)e)f fd%Z6d&ej7 deee)e)f fd'Z8dS )) 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 py/clwpos/daemon_redis_lib.py_get_pids_for_filer. 1 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 Q 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> q 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&