?I@ddlmZddlZddlZddlZddlmZddlmZddl m Z ddl m Z ddlmZmZmZmZddlmZdd lmZmZmZmZmZdd lmZdd lmZdd lm Z dd l!m"Z"m#Z#m$Z$m%Z%e e&Z'dZ(dZ)dZ*GddZ+Gdde+Z,Gdde+Z-Gdde+Z.deedeefdZ/d!de0de1de1fd Z2dS)")absolute_importN)Path)List)parse)write_file_via_tempfile) getCPName CPANEL_NAME PLESK_NAMEDIRECTADMIN_NAME) is_ubuntu)RedisRequiredConstants EA_PHP_PREFIXPLESK_PHP_PREFIXDIRECTADMIN_PREFIX CAGEFSCTL)!get_cached_php_installed_versions)PHP) setup_logging)daemon_communicaterun_in_cagefs_if_neededcreate_pid_file acquire_lockz /opt/cpanelz/opt/plesk/phpct}|tkrtS|tkrt S|t krt Std)z$Instantiate appropriate configuratorz)No PHP Redis configurator currently found)rr EaPhpRedisConfiguratorr PleskPhpRedisConfiguratorr DirectAdminPhpRedisConfigurator Exception)panels %py/clwpos/object_cache/redis_utils.py configuratorr .sb KKE %''' *  (*** " " ".000 ? @ @@ceZdZdZdZdZdZedZedZ de e fdZ d e de fd Zd e defd Zd S)RedisConfiguratorcttjd|jd5|ddddS#1swxYwYdS)Nz/var/run)attempts)rospathjoin PHP_PREFIXconfigure_redis_extensionselfs r configurezRedisConfigurator.configure>s "',,z4?CC#$&&& - -  * * , , , - - - - - - - - - - - - - - - - - -sAAAc|r|rtjtr t jtdgtjtjdt jtddgtjtjdS#tj$rt dYdSwxYwdSdSdS)Nz--check-cagefs-initializedT)stdoutstderrcheckz --wait-lockz--force-update)r0r1z.CageFS in uninitialized, skipping force-update) r'r(isfiler subprocessrunDEVNULLCalledProcessError_loggerinfo)r-need_cagefs_updatewait_child_processs r_update_cagefsz RedisConfigurator._update_cagefsCs   /"4 /:: / / +GH&0&8&0&8%)++++ /?@%-%-////// 0 F F F DFFFFFF F / / / / / /s3B)B?>B?c d}ttjd}g}|D]M}|dr!t d|j8| |N|st ddStj }t|j 5|D]P}| ds ||}ddd g|j|}t!rd dd |g}|d d it d |t%|t'j|dd|}|jdkr>d|jvr5d|jvr,t d||jd|jt d||d}$|ds||d}R|||ddddS#1swxYwYdS)zh Sets up redis if needed: - installing package - enables in .ini file FCL_WPOS_WAIT_CHILD_PROCESSredisz:Redis extension is already installed and configured for %sz3All ea-php versions have redis installed and activeNyumz-yinstallzapt-getDEBIAN_FRONTENDnoninteractivez+Trying to install package=%s via command=%sT)capture_outputtextenvrz Nothing to dozis already the newest versionz/Failed to install package %s, due to reason: %s z-Package successfully installed, activating it)boolr'environgetget_supported_phpis_extension_loadedr8r9 identifierappendcopyrr*is_extension_installed redis_package_additional_reposr updatestrr4r5 returncoder0errorr1enable_redis_extensionr<) r-r:r;php_versions_to_enable_redisphprFrQcommand_to_installresults rr+z+RedisConfigurator.configure_redis_extensionTs #!"*..1M"N"NOO')$))++ 5 5C&&w//  Y[^[ijjj ( / / 4 4 4 4+  LLN O O O Fjoo T_ - - H H3 . .11'::.$($6$6s$;$;M*/y)i4CY)i[h)i& {{J.7y--X* $57G#HIIILL!N!.!$%7!8!8:::(^*'+! F (A--?&-3W3W7V^d^k7k7k M)%}?? ??AAA!LL!PQQQ//444)-&&0099.//444)-&    24F G G G? H H H H H H H H H H H H H H H H H Hs#E+II"Ic ||}d}tj|s>tdt |||dSt|5}| }dddn #1swxYwYtj d|}tj d|}d|d}d} g} |D]^} | | rdS| s-| | r| |d } I| | _| s| |td | |d dS) zD Enables (if needed) redis extension in .ini config zredis.sozWRedis extension config: %s is not found, ensure corresponding rpm package installed: %sNz^\s*extension\s*=\s*z^\s*;\s*extension\s*=\s*z extension = rGFTi) redis_inir'r(existsr8rVrTrQopen readlinesrecompilematchrNrr)) r- php_versionr(keywordfextension_datauncommented_patterncommented_pattern enabled_line was_enabledlineslines rrWz(RedisConfigurator.enable_redis_extensions~~k**w~~d##  MMiD 4--k:: < < < F $ZZ +1[[]]N + + + + + + + + + + + + + + +!j)J)J)JKKJ'L7'L'LMM1g111  " # #D"((..  ##4#:#:4#@#@ # \***"  T"""" ' LL & & &e<<<<> 2':;; 2%o&@&H&HSU&V&VWW[lll  111r!c|jdS)Nz -php-redisrMrys rrQz$EaPhpRedisConfigurator.redis_packages.,,,,r!recPt|jdS)Nzetc/php.d/50-redis.inirdirjoinpathr|s rr^z EaPhpRedisConfigurator.redis_inis!KO$$--.FGGGr!N) r}r~r__doc__rr*rrrKrQrr^rr!rrrsX49 ---HSHTHHHHHHr!rcLeZdZdZedZdZdZdee fdZ dS)rz Installs and configure redis extensions for DirectAdmin php NOTE: directadmin enables redis for all compiled versions or for none https://docs.directadmin.com/webservices/php/php-extensions.html#installing-extensions ctSrp)rr,s rr*z*DirectAdminPhpRedisConfigurator.PHP_PREFIXs!!r!ch|}|D]}|dsdSdS)zR If at least for 1 supported version redis is not loaded -> False r?FT)rKrL)r-supported_versions version_items ris_redis_already_enabledz8DirectAdminPhpRedisConfigurator.is_redis_already_enabledsL"3355.  L33G<< uu tr!cttjd}t |j5 |sItjgdddtjddgdd| d|n*#t$rt dYnwxYwddddS#1swxYwYdS) Nr>)(/usr/local/directadmin/custombuild/buildset_phpr?yesT)rDrEr php_redis)r:r;z4Error on configuring redis extension for DirectAdmin) rHr'rIrJrr*rr4r5r<rr8 exception)r-r;s rr+z9DirectAdminPhpRedisConfigurator.configure_redis_extensionsk!"*..1M"N"NOO T_ - - Z Z Z4466hN#j#j#j26(,....N$NP[#\26(,....''4Tf'ggg Z Z Z!!"XYYYYY Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Zs7CAB! C!$CCCCCCrvct}td}g}|D]b}|jtrAt|jdd|kr||c|S)Nr.r])rrrMrrversionrrNrs rrKz1DirectAdminPhpRedisConfigurator.get_supported_phps8:: )$// + 2 2O*556HII 2!/"9"A"A#r"J"JKKO```  111r!N) r}r~rrrr*rr+rrrKrr!rrrsy""X" Z Z Z 49      r!rcbeZdZdZedZedZdeefdZ dZ dZ dS) rz> Install and configure redis extensions for Plesk php cdS)N)z --enablerepozPLESK*rr,s rrRz+PleskPhpRedisConfigurator._additional_reposs''r!ctSrp)rr,s rr*z$PleskPhpRedisConfigurator.PHP_PREFIXsr!rvcLt}td}g}|D]}|jdretj|jrAt|jdd|kr| ||S)z Looks through /opt/plesk/php and gets installed phps. /opt/plesk/php contains plain version directories, e.g. 7.4; 8.0; 8.1 rz plesk-phpr]rrs rrKz+PleskPhpRedisConfigurator.get_supported_phps 9:: )$// + 2 2O)44[AA 2':;; 2%o&@&H&HVX&Y&YZZ^ooo  111r!c|jdS)Nz-redisrrys rrQz'PleskPhpRedisConfigurator.redis_package,s.((((r!cPt|jdS)Nzetc/php.d/redis.inirr|s rr^z#PleskPhpRedisConfigurator.redis_ini/s!KO$$--.DEEEr!N) r}r~rrrrRr*rrrKrQr^rr!rrrs((X(  X 49")))FFFFFr!rrrvcg}|D]A}|ds*|dr||B|S)zr Filter list of given php versions to find out for which redis extension is presented but not loaded. r?)rLrPrN)r"php_versions_with_not_loaded_redisrs r)filter_php_versions_with_not_loaded_redisr3s` *,&??**733 ?8V8VW^8_8_ ? . 5 5g > > > --r!nouidforceskip_last_reload_timec>d||d}|r||d<t|dS)z Make redis reload via CLWPOS daemon :param uid: User uid (optional) :param force: force reload w/o config check :param skip_last_reload_time: skip check of last redis reload for user reload)command force_reloadrrN)r)rrrcmd_dicts r reload_redisr?sB$ %)>@@H x     r!)Nrr)3 __future__rr'rbr4pathlibrtypingrpackaging.versionrrsecureiorclcommon.cpapirr r r clcommon.utilsr clwpos.constantsr rrrrclwpos.data_collector_utilsrclwpos.php.baserclwpos.logsetupr clwpos.utilsrrrrr}r8BASE_CPANEL_EA_PHP_DIRBASE_PLESK_PHP_DIRr r#rrrrintrTrrr!rrs'&&&&& 444444,,,,,,OOOOOOOOOOOO$$$$$$JIIIII)))))) - ! !&% A A A""""""""DHHHHH.HHH>.....&7...b"F"F"F"F"F 1"F"F"FJ .DI .$s) . . . . ! !c ! !C ! ! ! ! ! !r!