§ 1êÄj�9ãó,—ddlZddlZddlZddlZddlZddlmZddlmZm Z ddl m Z ddl m Z ddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZmZdd lmZmZddl m!Z!m"Z"ddl#m$Z$ddl%m&Z&ddl'm(Z(m)Z)m*Z*ddl+m,Z,ddl-m.Z.dZ/e,¦«Z0de1de1fd„Z2de1de1de1de1de1de1de1fd„Z3dede1de1d ee1dee1f d!„Z4dede1d"e5de1d#e6de7f d$„Z8d%e7de1ddfd&„Z9d'ede1de1de6fd(„Z:d)e5de7fd*„Z; d0de1d)e5d'e ed-e7d.e1de6f d/„ZError happened while writing redis config for user '%(user)s' )Úuserr<)r.r&Ú fullmatchÚstrÚ IGNORECASErÚintr)rrÚDEFAULT_MAX_CACHE_MEMORYÚ_USER_REDIS_CONF_PATTERNÚformatr!r"ÚjoinÚdirnamerÚmakedirsÚOSErrorÚIOErrorr Ú_r) r/r0r1r2rr3r4r6Ú_maxmemory_matchÚredis_config_contentr<s r-Ú_write_redis_config_for_userrPOsÝ€õ.Ð.?Ñ@Ô@€Jå”| Mµ3°y±>´>Å2Ä=ÑQÔQÐØÐ Ý+­sÐ3C×3IÒ3IÈ!Ñ3LÔ3LÑ/MÔ/MÐiÐiÒiÐiÕQiÒiÐiÐiÐiÝÔ7ˆ å3×:Ò:ØÝ”— ’ �RœWŸ_š_Ð->Ñ?Ô?ÀÑMÔMØ%بØð ;ñôÐð RÝ”W—\’\ ,µ Ñ>Ô>ˆ ð ]Ý ŒK˜ ¨TÐ 2Ñ 2Ô 2Ð 2Ð 2øÝ�Ð"ð ]ð ]ð ]Ý¥AÐ&NÑ$OÔ$OÝ$%Ð&]Ñ$^Ô$^Ø2<ÈlÐ$[Ð$[ð]ñ]ô]ð ]øøøøð ]øøøõ Ð 4Ð6GÈÑOÔOÐOÐOÐOøÝ •WÐ ðRðRðRÝ¥Ð"bÑ cÔ cÝ !Ð"YÑ ZÔ ZØ)1À<Ð PÐ PðRñRôRð RøøøøðRøøøs<à %E8ÄDÄE8ÄE"Ä./EÅE"Å"E8Å8F=Æ /F8Æ8F=ÚloggerÚdocroot_list_to_validatecó—|sgS t|¦«}nO#ttttf$r/}| dt |¦«¦«gcYd}~Sd}~wwxYwg}|D]7\}}| tj   |¦«¦«Œ8g} |D]X} tj   tj   || ¦«¦«} | |vr|  | ¦«ŒY| S)z÷ Validates docroots from list :param logger: Logger to log errors :param username: User name :param user_homedir: User's homedir :param docroot_list_to_validate: Docroot list to validate :return: List of valid docroots z"Can't get user list from panel: %sN) rrKrLÚ IndexErrorrÚwarningrBÚappendr!r"ÚnormpathrH) rQr/r0rRÚuserdomains_data_listÚeÚdocroots_from_panelÚ _domain_ownerÚ document_rootÚvalid_docroot_listÚ_drÚtempnames r-Ú_get_valid_docroots_from_configr`ys€ð $ðàˆ ðå +¨HÑ 5Ô 5ÐÐøÝ •W�j­)Ð 4ðððà�ŠÐ;½SÀ¹V¼VÑDÔDÐD؈ ˆ ˆ ˆ ˆ ˆ øøøøðøøøð ÐØ(=ðDðDÑ$ˆ �}Ø×"Ò"¥2¤7×#3Ò#3°MÑ#BÔ#BÑCÔCÐCÐCà$&ÐØ'ð+ð+ˆÝ”7×#Ò#¥B¤G§L¢L°¸sÑ$CÔ$CÑDÔDˆØ Ð*Ð *Ð *Ø × %Ò % cÑ *Ô *Ð *øØ Ðs†–A"³$AÁA"ÁA"ÚuidÚuser_config_dictcót—t|¦«}t|vrdS| di¦«}t| ¦«¦«}t ||||¦«}|D]Q} | | i¦«} |  ¦«D]$} t| t¦«r t| vrdSŒ%ŒRdS)a* Get redis status according to user's and admin's configs :param logger: Logger to log errors :param username: User name :parem uid: User uid :param user_homedir: User's homedir :param user_config_dict: User's config :return: True - module enabled, False - disabled FÚdocrootsT)rrÚgetÚlistÚkeysr`ÚvaluesÚ isinstance) rQr/rar0rbÚallowed_modules_listÚtarget_docrootsÚdocroots_to_validateÚvalid_wp_docrootsÚ wp_docrootÚwp_dataÚ module_lists r-Ú_is_redis_plugin_enabledrqšsÙ€õ/¨sÑ3Ô3ÐÝÐ#7Ð7Ð7؈uð'×*Ò*¨:°rÑ:Ô:€OÝ!% o×&:Ò&:Ñ&<Ô&<Ñ!=Ô!=ÐÝ7¸ÀÈ,ÐXlÑmÔmÐØ'ððˆ Ø!×%Ò% j°"Ñ5Ô5ˆØ"Ÿ>š>Ñ+Ô+ð ð ˆKݘ+¥tÑ,Ô,ð Õ1EÈÐ1TÐ1Tà�t�t�tøð ð ˆ5óÚis_cagefs_missingcó—tj|¦«}|r t|g}n dt|g}| dt |¦«¦«d\}}t j|t|j|j ¦«t j t j ¬¦«} |  d¬¦«\}}n#t j $rYnwxYw| dt |  ¦«¦«t |  ¦«¦«¦«tj |jt$d¦«} t'| ¦«} | d t | ¦«¦«| €t)d ¦«‚d S) z# Run subprocess with redis z/bin/cagefs_enter.proxiedz"[Start redis] Executing command=%s)rrrr)Ú preexec_fnÚstdoutÚstderré)ÚtimeoutzCaptured stdout=%s, stderr=%sú redis.pidz[Start redis] Redis pid=%sNz'Redis instance was not started for user)ÚpwdÚgetpwnamrÚinforBÚ subprocessÚPopenr Úpw_uidÚpw_gidÚPIPEÚ communicateÚTimeoutExpiredÚdecoder!r"rHÚpw_dirrrrK) rsrr/Ú_loggerÚuser_pwdÚcommandrvrwÚprocessr4Ú redis_pids r-Ú __start_redisrŒÀsj€õŒ|˜HÑ%Ô%€HØðZÝ(Ð*;Ð<ˆˆð/Õ0EÐGXÐYˆà ‡L‚LÐ5µs¸7±|´|ÑDÔDÐDà�N€FˆFÝÔØÝ˜(œ/¨8¬?Ñ;Ô;݌݌ð ñô€Gð Ø ×,Ò,°QÐ,Ñ7Ô7‰ˆ��øÝ Ô $ð ð ð Ø ˆð øøøð ‡L‚LÐ0µ#°f·m²m±o´oÑ2FÔ2FÍÈFÏMÊMÉOÌOÑH\ÔH\Ñ]Ô]Ð]å”7—<’< ¤µÀ ÑLÔL€LÝ6°|ÑDÔD€IØ ‡L‚LÐ-­s°9©~¬~Ñ>Ô>Ð>ØÐÝÐ?Ñ@Ô@Ð@Ø ˆ4sÂB2Â2CÃCr‡c ó—tj|¦«}| d|¦«tj |jt¦«}tj |d¦«}tj |d¦«}tj |d¦«}t||j|||||¦«| d||||¦« ttj ¦«}t| |||¦«dddœS#ttf$rU} tj¦«} | d || ¦«t%d ¦«d t'| ¦«id œcYd } ~ Sd } ~ wwxYw)al Start redis server for supplied user (calls under user) :param _logger: Daemon's logger :param username: Username to setup redis :param maxmemory: maxmemory value to write to redis config :return: dict If redis was started for user - {"result": "success"} else - redis was not started - {"result": "error", "context": "...."} úStarting redis for username=%sz redis.sockz redis.confrzzaRedis config for user=%s is saved with parameters:socket_path=%s, config_path=%s, pidfile_path=%sÚsuccessT©ÚresultÚ redis_enabledz;Error while starting redis server for user %s. Error is: %sz,Error while starting redis server: %(error)sÚerror©r‘r?N)r{r|r}r!r"rHr†rrPr r ÚCAGEFSrŒrKrLÚ tracebackÚ format_excrUrMrB) r‡r/r3rˆÚwpos_dirr2rr4Úis_cagefs_availablerYÚstr_excs r-Ú_start_redis_server_for_userr›æs—€õŒ|˜HÑ%Ô%€Hà ‡L‚LÐ1°8Ñ<Ô<Ð<ÝŒw�|Š|˜HœO­]Ñ;Ô;€HÝœŸ š  X¨|Ñ<Ô<ÐÝœŸ š  X¨|Ñ<Ô<ÐÝ”7—<’< ¨+Ñ6Ô6€LÝ  ¨8¬?¸HÐFWÐYjØ!*¨Lñ:ô:ð:à ‡L‚Lð#ðØ"Ø"Øñôðð.Ý8½¼ÑHÔHÐÝÐ-Ð-Ð/@À(ÈGÑTÔTÐTØ#°dÐ;Ð;Ð;øÝ •WÐ ð.ð.ð.ÝÔ&Ñ(Ô(ˆØ�ŠÐUÐW_ÐahÑiÔiÐiÝÐJÑKÔKØ#¥S¨¡V¤VÐ,ð.ð.ð .ð .ð .ð .ð .ð .øøøøð.øøøsÃ)0DÄFÄ+A E;Å5FÅ;FÚ old_redis_pidcóà—|dkrdSt¦«std¦«‚ tj|d¦«n#t$rYdSt $rYnwxYwt t|¦«dS)a  Check existing process by PID and kill it: - If old_redis_pid == -1, nothing will kill, return False - else check process existance. if exi :param old_redis_pid: PID to check and kill :return: True - Can't kill process not owned by current user, this is error, continue work not allowed False - Process absent or was killed succesfully, continue work allowed éÿÿÿÿFz;Internal error! Trying to kill process with root privilegesrT)rr r!ÚkillÚPermissionErrorÚProcessLookupErrorrrQ)rœs r-Ú_check_redis_process_and_killr¢ sœ€ð˜ÒÐàˆuå Ñ Ô ðWÝÐUÑVÔVÐVð Ý Œ� ˜qÑ!Ô!Ð!Ð!øÝ ðððàˆtˆtÝ ð ð ð à ˆð øøøõ�  Ñ.Ô.Ð.à ˆ5s§=½ AÁ AÁAFÚnoÚis_log_debug_levelÚ force_reloadcóL—|€t}| d|t|¦«t|¦«¦«t|dd¬¦«t |¦«rt d¦«||dœdœS t |¦«}| ¦«}no#t$rb}|r$|  d|t|¦«¦«|st d ¦«d |idœcYd}~S| d ¦«i}Yd}~nd}~wwxYwtj |¦«}t|||j |j|¦«} |d kott!|j ¦«v} | s| rE| d |¦«t#||| dt j¦«¦«SdddœS)a% Reloads redis for supplied user without logging and killing old redis process Calls only from redis_reloader.py script :param username: Username to setup redis :param old_redis_pid: Redis PID to kill, -1 - no PID to kill :param _logger: Daemon's logger :param is_log_debug_level: True - log messages/ False - no :param force_reload: reload redis w/o conditions :return: dict If redis was started for user - {"result": "success"} else - redis was not started - {"result": "error", "context": "...."} Nz_[Reload redis for user]: Request to reload redis for username=%s, old redis pid=%s,force_reloadF)Úeffective_or_realÚset_envz@Can't kill old redis process for user '%(user)s'. PID is %(pid)s)r@Úpidr”z unconditional reloadÚyesrŽÚmax_cache_memoryr�r�)rQr}rBrr¢rMrÚ read_configrrUr{r|rqr€r†rrr›rerE) r/rœr‡r¤r¥Úuser_config_classÚ user_configrYÚpw_userÚis_redis_enableÚ force_alloweds r-Úreload_redis_for_userr²*s1€ð€Ýˆà ‡L‚Lð ðÝ�]Ñ#Ô#Ý�\Ñ"Ô"ñ $ô$ð$õ˜°UÀEÐJÑJÔJÐJÝ$ ]Ñ3Ô3ðEÝÐ^Ñ_Ô_Ø$,°]ÐCÐCðEðEð Eð Ý& xÑ0Ô0ÐØ'×3Ò3Ñ5Ô5ˆ ˆ øÝ ð ð ð à ð nØ �OŠOÐZÐ\dÕfiÐjkÑflÔflÑ mÔ mÐ mØð ÝÐ bÑcÔcØ &¨Ð1ð3ð3ð 3ð 3ð 3ð 3ð 3ð 3ð �LŠLÐiÑ jÔ jÐ j؈KˆKˆKˆKˆKˆKøøøøð øøøõŒl˜8Ñ$Ô$€GÝ.¨w¸Ø/6¬~¸w¼~È{ñ\ô\€Oð " UÒ*ðUÝ-Õ1DÀWÄ^Ñ1TÔ1TÐTðàðb˜-ðbØ� Š Ð5°xÑ@Ô@Ð@å+¨G°XØ,7¯OªOÐÃDÃ"C>Ã>D)NFr£)=r{r!r&r–r~ÚloggingrÚtypingrrÚsecureiorÚclcommon.clpwdrÚclcommon.cpapirÚclcommon.constr r Úclcommon.utilsr Úclwposr rMÚclwpos.cl_wpos_exceptionsr Úclwpos.daemon_redis_librrÚ clwpos.utilsrrÚclwpos.user.configrrÚclwpos.optimization_featuresrÚclwpos.feature_suitesrÚclwpos.constantsrrrÚclwpos.logsetuprÚclcommon.cpapi.cpapiexceptionsrrFrQrBr.rPr`rDÚdictÚboolrqrŒr›r¢r²©rrr-úrÇs’ðð € € € Ø € € € Ø € € € ØÐÐÐØÐÐÐØÐÐÐÐÐØ!Ð!Ð!Ð!Ð!Ð!Ð!Ð!à,Ð,Ð,Ð,Ð,Ð,Ø/Ð/Ð/Ð/Ð/Ð/Ø&Ð&Ð&Ð&Ð&Ð&Ø"Ð"Ð"Ð"Ð"Ð"Ø5Ð5Ð5Ð5Ð5Ð5Ø!Ð!Ð!Ð!Ð!Ð!àÐÐÐÐÐØ/Ð/Ð/Ð/Ð/Ð/Ø_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ø9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ø6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ø=Ð=Ð=Ð=Ð=Ð=Ø5Ð5Ð5Ð5Ð5Ð5ØfÐfÐfÐfÐfÐfÐfÐfÐfÐfØ&Ð&Ð&Ð&Ð&Ð&Ø4Ð4Ð4Ð4Ð4Ð4ðÐð$ ˆ‰Œ€ð°Cð¸Cððððð$'R¨3ð'R¸cð'RÈsð'RÐgjð'RØ47ð'RØDGð'RØWZð'Rð'Rð'Rð'RðT¨Fð¸cðÐQTðØ>BÀ3¼iðØLPÐQTÌIðððððB# Vð#°sð#Àð#ÐTWð#Ø/3ð#Ø8<ð#ð#ð#ð#ðL# Tð#¸cð#ÐY]ð#ð#ð#ð#ðL#.¨&ð#.¸Cð#.ÈCð#.ÐTXð#.ð#.ð#.ð#.ðL°ð¸ððððð<Z^ØPTð89ð89 Cð89¸ð89ÀhÈvÔFVð89Ø.2ð89ØJMð89ØY]ð89ð89ð89ð89ð89ð89rr