§ À•¿júgãóº—ddlmZddlmZddlmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlmZddlmZddlZddlZddlZddlZddlZddlZddlZddl m!Z!ddl"m#Z#dd l$m%Z%m&Z&dd l'm(Z(m)Z)m*Z*dd l+m,Z,dd lm-Z-dd lm.Z.ddlm/Z/m0Z0m1Z1ddl2m3Z3m4Z4m5Z5m6Z6ddlm7Z7ddl8m9Z9m:Z:ddlm;Z<ddl=m>Z>ddl?m@Z@ddlAmBZBddlCmDZDmEZEddlFmGZGddlHmIZJddlKmIZLddlMmNZNmOZOmPZPmQZQmRZRmSZSddlTmUZUddlVmWZWmXZXGd„de!¦«Z;Gd„de;¦«ZYd d!iZZe j[e\¦«Z]d"Z^Gd#„d$e_¦«Z`dS)%é)Úprint_function)Údivision)Úabsolute_importN)ÚSet)Ú iteritems)ÚFormattedException)Úresolve_username_and_doc_root)ÚCP_NAMEÚdocroot)ÚNoDomainÚ NotSupportedÚ IncorrectData)Ú exec_utility)Ú clselectctl)Ú clpassenger)Ú ClUserSelectÚClSelectÚ ClExtSelect)ÚAPP_STARTED_CONSTÚENABLED_STATUSÚDISABLED_STATUSÚBaseSelectorError)Úvalidate_env_vars)Úformat_summaryÚAPI_1©ÚClSelectExcept)ÚNodeJSConfigError)ÚWebsite)Ú NodeManager)ÚPythonAppFormatVersionÚget_venv_rel_path)Ú PythonManager)Ú Environment)Úmkdir_pÚ file_readÚ file_writeÚget_using_realpath_keysÚ get_abs_relÚdelete_using_realpath_keys)Úget_perm)Ú_set_ui_configÚUIConfigExceptioncó—eZdZdS)rN)Ú__name__Ú __module__Ú __qualname__©óúM/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselector/selectorlib.pyrrKs€€€€€Ø€Dr3rcó—eZdZdZdS)ÚClSelectDomainNotFoundzK Custom exception in case if user doesn't have the specific domain N)r/r0r1Ú__doc__r2r3r4r6r6Os€€€€€ððð €Dr3r6ÚstatusÚokiÐc óâ—eZdZd„Zd„Zd„ZedVd„¦«Zed„¦«Zed„¦«Z edWd„¦«Z edVd „¦«Z ed „¦«Z edWd „¦«Z ed „¦«ZedXd„¦«Zd„Zed„¦«Zd„Zd„Zed„¦«Zed„¦«Zd„ZdWd„Zed„¦«ZedWd„¦«ZdWd„Zed„¦«Zd„ZdVd„Zd„Zd„Zd„Z d „Z!d!„Z"d"„Z#d#„Z$d$„Z%d%„Z&dWd&e'd'e(dzd(e)fd)„Z*d*„Z+d+„Z,dWd,e)e'e'fd&e'd'e(dzd(e)fd-„Z-dWd.„Z.d/„Z/ dYd0„Z0ed1„¦«Z1dWd2„Z2dWd3„Z3ed4„¦«Z4dZd6„Z5 d[d8„Z6d9„Z7d:„Z8d;„Z9d<„Z:ed=„¦«Z;d>„ZdA„Z?edB„¦«Z@dWdC„ZAdVdD„ZBdE„ZCedF„¦«ZDd\dG„ZEdH„ZFdI„ZGdJ„ZHdK„ZIdWdL„ZJdM„ZKdN„ZLdO„ZMedP„¦«ZNedQ„¦«ZOePdR„¦«ZQdS„ZRedT„¦«ZS d]dU„ZTdS)^ÚCloudlinuxSelectorLibcól—||_d|_d|_d|_d|_d|_d|_d|_d|_d|_ d|_ d|_ |j|jkrLdd l m }|¦«|_ t¦«|_tj|_ tj|_ dS|j|jkrLdd lm }|¦«|_ t'¦«|_tj|_ tj|_ dS|j|jkrdd lm}|¦«|_dSdS) Nz/usr/bin/selectorctlz+/usr/share/l.v.e-manager/utils/dynamicui.pyú/usr/sbin/cloudlinux-selectorÚnodejsÚpythonÚrubyÚphpr)ÚApplicationsManager)Ú PhpManager)Ú interpreterÚ_SELECTORCTL_UTILITYÚDYNAMIC_UI_CTL_CMDÚCLOUDLINUX_SELECTOR_UTILITYÚNODEJS_INTERPRETERÚPYTHON_INTERPRETERÚRUBY_INTERPRETERÚPHP_INTERPRETERÚselector_managerÚ apps_managerÚselector_user_libÚselector_old_libÚ$clselect.clselectnodejs.apps_managerrBr ÚclselectÚclselectnodejsuserÚclselectctlnodejsuserÚ$clselect.clselectpython.apps_managerr#ÚclselectpythonuserÚclselectctlpythonÚ clselect.clselectphp.php_managerrC)ÚselfrDrBrCs r4Ú__init__zCloudlinuxSelectorLib.__init__`s[€Ø&ˆÔØ$:ˆÔ!Ø"OˆÔØ+JˆÔ(Ø"*ˆÔØ"*ˆÔØ &ˆÔØ$ˆÔð !%ˆÔØ ˆÔØ!%ˆÔØ $ˆÔØ Ô ˜tÔ6Ò 6Ð 6Ø PÐ PÐ PÐ PÐ PÐ PØ 3Ð 3Ñ 5Ô 5ˆDÔ Ý$/¡M¤MˆDÔ !Ý%-Ô%@ˆDÔ "Ý$,Ô$BˆDÔ !Ð !Ð !Ø Ô  Ô!8Ò 8Ð 8Ø PÐ PÐ PÐ PÐ PÐ PØ 3Ð 3Ñ 5Ô 5ˆDÔ Ý$1¡O¤OˆDÔ !Ý%-Ô%@ˆDÔ "Ý$,Ô$>ˆDÔ !Ð !Ð !Ø Ô  Ô!5Ò 5Ð 5Ø CÐ CÐ CÐ CÐ CÐ CØ$. J¡L¤LˆDÔ !Ð !Ð !ð6Ð 5r3cóf—|j|jkrdS|jj ¦«dS)za Checks that selector is able to work on current os environment :return: N)rDrKrLÚ cl_select_libÚcheck_requirements©rXs r4Úcheck_selector_is_availablez1CloudlinuxSelectorLib.check_selector_is_available‚s:€ð Ô ˜tÔ3Ò 3Ð 3Ø ˆFð ÔÔ+×>Ò>Ñ@Ô@Ð@Ð@Ð@r3cón—|j ||¦«}| ||¦«\}}|S)z7Get doc_root from application config or raise exception)rMÚget_app_domainÚ$safely_resolve_username_and_doc_root)rXÚusernameÚapp_rootÚdomainÚ_Údoc_roots r4Úsafely_resolve_doc_root_for_appz5CloudlinuxSelectorLib.safely_resolve_doc_root_for_app�s8€àÔ"×1Ò1°(¸HÑEÔEˆØ×?Ò?ÀÈ&ÑQÔQ‰ ˆˆ8؈r3Ncó— t||¬¦«\}}ng#t$rt|�dnd||dœdœ¦«‚t$rt ddt idœ¦«‚t $rt d ||dœdœ¦«‚wxYw||fS) a8 Safely resolve username and doc_root by domain, or resolve document root by username, or resolve document root and username by effective uid :param user: str -> name of unix user :param domain: str -> domain of panel user :return: tuple -> user, doc_root ©ÚuserrdNzNo such domain: %(domain)szNo such user: %(user)s)rdrj©ÚmessageÚcontextz+Nodejs selector not supported for %(panel)sÚpanelz3Domain %(domain)s is not owned by the user %(user)s)r r r6r rr r)rjrdÚ result_userÚresult_doc_roots r4raz:CloudlinuxSelectorLib.safely_resolve_username_and_doc_root“s€ð" Ý+HØØð,ñ,ô,Ñ (ˆK˜˜øõð ð ð Ý(ðÐ)ð <Ð;Ø/Gà"(Ø $ð ð ððñ ô ð õð ð ð Ý àLà¥ð ððñôð õð ð ð Ý àTà"(Ø $ð ð ððñôð ð øøøð˜OÐ+Ð+s ‚—A$A;cóÆ—d}t¦«\}}|€d}nHt|t¦«sd}n0|d€ |d€d}n|dkr |dkrd}n|ddkrd}|S) z» Check whether selector should be run through "su - user" :param opts: dict of parsed cli params :return: True if should be run through su or False if not TNFú--userú--domainrú --interpreterrA)r+Ú isinstanceÚdict)ÚoptsÚresultÚeuidÚegids r4Úshould_be_runned_as_userz.CloudlinuxSelectorLib.should_be_runned_as_userÄsˆ€ðˆÝ‘Z”Z‰ ˆˆdà ˆ<؈FˆFݘD¥$Ñ'Ô'ð ØˆFˆFØ �(Œ^Ð #¨¨ZÔ(8Ð(@àˆFˆFØ �QŠYˆY˜4 1š9˜9؈FˆFØ �/Ô " eÒ +Ð +؈Fàˆ r3có\—|ddko |dduotj¦«dkS)NrtrArrr)ÚosÚgeteuid)rws r4Úshould_run_user_without_cagefsz4CloudlinuxSelectorLib.should_run_user_without_cagefsÜs8€à�OÔ$¨Ò-ð!Ø�HŒ~ TÐ)ð!åŒz‰|Œ|˜qÒ ð !r3có.—tj|¦«}|S)zÇ Resolves user eigher with passed username or with getting current user ID :param user: str or None -> username to be resolved :return: obj -> pwd user object )ÚpwdÚgetpwnam)rjÚuserdatas r4Ú_get_user_pwd_dataz(CloudlinuxSelectorLib._get_user_pwd_dataâs€õ”< Ñ%Ô%ˆØˆr3có6—|€|€tdidœ¦«‚dSdS)zœ Check if user and domain are None :param user: name of unix user :param domain: domain of panel user :return: None NúBUser or domain parameter must be specified if current user is rootrkrris r4Úuser_and_domain_checkerz-CloudlinuxSelectorLib.user_and_domain_checkerís:€ð ˆ<˜F˜NÝ àcØ!ððñôð ð ˆ<˜N˜Nr3c ód—dd|zi}t|¦«dkr| |¦«|S)Nr8z ERROR: %sr)ÚlenÚupdate)rxÚkwargsÚerrs r4Ú _return_errorz#CloudlinuxSelectorLib._return_errorýs7€à˜ vÑ-Ð.ˆÝ ˆv‰;Œ;˜Š?ˆ?Ø �JŠJ�vÑ Ô Ð Øˆ r3cóB—d|dœ}|r| d|i¦«|S)z• Construct error dict in one place :param result: error string :return: dict with 'status':'error' and error message Úerror)r8rxÚdetails)rŠ)rxr�rŒs r4Ú_return_with_status_errorz/CloudlinuxSelectorLib._return_with_status_errors<€ðØð ð ˆð ð -Ø �JŠJ˜  7Ð+Ñ ,Ô ,Ð ,؈ r3cóp—|pgD]0}|r|dvsd|vsd|vs d|vsd|vsd|vrtdd|id œ¦«‚Œ1dS) N©ú.ú..ú/ú\ú,úr•ú)Invalid configuration file path: %(path)sÚpathrkr)Ú config_filesÚ config_files r4Úvalidate_config_file_namesz0CloudlinuxSelectorLib.validate_config_file_namess“€à'Ð-¨2ð ð ˆKØð  ;°+Ð#=Ð#=ؘ;Ð&Ð&¨$°+Ð*=Ð*=ؘ;Ð&Ð&¨&°KÐ*?Ð*?ؘKÐ'Ð'Ý$à#NØ$*¨KÐ#8ððñôðð(ð ð r3é€cóH—ttdd¦«}|€td¦«‚tj |¦«std¦«‚d„tj |¦« tj¦«D¦«}|r |ddvrtd¦«‚ttdtj¦«|z}dD]}|tt|d ¦«z}Œ||zttd d ¦«z}tj tj|¦«} |dd…D]š} tj | ||¬ ¦«} tj tj | ¦«j ¦«sttjd | ¦«‚n##t $rtj| ¦«‚wxYwtj|¦«| }Œ›tj |d|||¬ ¦«tj|¦«S#tj|¦«wxYw) NÚ O_NOFOLLOWzO_NOFOLLOW is not supportedzInvalid configuration file pathcó—g|]}|¯|‘ŒSr2r2)Ú.0Úparts r4ú zECloudlinuxSelectorLib._open_config_file_no_follow..)s.€ð ð ð ØØð Ø ð ð ð r3éÿÿÿÿr“ÚO_PATH)Ú O_DIRECTORYÚ O_CLOEXECrr©)Údir_fdzNot a directory)Úgetattrr}ÚOSErrorr›ÚisabsÚnormpathÚsplitÚsepÚO_RDONLYÚopenÚstatÚS_ISDIRÚfstatÚst_modeÚerrnoÚENOTDIRÚ ExceptionÚclose) Úfull_config_pathÚflagsÚmodeÚ no_followÚ path_partsÚ dir_flagsÚ optional_flagÚ file_flagsÚ parent_fdÚ path_partÚnext_fds r4Ú_open_config_file_no_followz1CloudlinuxSelectorLib._open_config_file_no_follow!s€å�B  ¨dÑ3Ô3ˆ Ø Ð ÝÐ7Ñ8Ô8Ð 8ÝŒw�}Š}Ð-Ñ.Ô.ð =ÝÐ;Ñ<Ô<Ð <ð ð ÝœW×-Ò-Ð.>Ñ?Ô?×EÒEÅbÄfÑMÔMð ñ ô ˆ ðð =˜Z¨œ^¨{Ð:Ð:ÝÐ;Ñ<Ô<Ð <å�B ­"¬+Ñ6Ô6¸ÑBˆ Ø9ð 7ð 7ˆMØ �¥ ]°AÑ6Ô6Ñ 6ˆIˆIà˜YÑ&­µ°[À!Ñ)DÔ)DÑDˆ Ý”G�BœF IÑ.Ô.ˆ ð Ø'¨¨¨œ_ð $ð $� Ýœ' )¨Y¸yÐIÑIÔI�ðÝœ<­¬°Ñ(9Ô(9Ô(AÑBÔBðSÝ%¥e¤mÐ5FÈ ÑRÔRÐRðSøå ðððÝ”H˜WÑ%Ô%Ð%Øðøøøõ”˜Ñ#Ô#Ð#Ø#� � Ý”7˜: bœ>¨:°tÀIÐNÑNÔNå ŒH�YÑ Ô Ð Ð ø�BŒH�YÑ Ô Ð Ð øøøs%Ä4#H ÅAFÆH Æ F?Æ?7H È H!cóF—|ttfvr(| d |¦«¦«S |tk|j_n,#t $r}| |¦«cYd}~Sd}~wwxYw|j|jkr6dd|tkii} t|¦«tS#t$rYnwxYw|j|j kr6dd|tkii} t|¦«tS#t$rYnwxYw|  ¦«tS)zŠ Set CL selector status in it's config :param status: set status of selector :return: error or ok message zKUnknown selector status provided: "{}". Can be only 'enabled' or 'disabled'NÚ uiSettingsÚ hidePythonAppÚ hideNodeJsApp)rrr�ÚformatrLÚselector_enabledrrDrIr,Ú OK_RES_DICTr-rHÚ update_ui)rXr8ÚeÚ config_dicts r4Ú_change_selector_statusz-CloudlinuxSelectorLib._change_selector_statusEso€ð �.­/Ð;Ð ;Ð ;Ø×%Ò%ð6ß6<²f¸V±n´nñFôFð Fð )Ø5;½~Ò5MˆDÔ !Ô 2Ð 2øÝ ð )ð )ð )Ø×%Ò% aÑ(Ô(Ð (Ð (Ð (Ð (Ð (Ð (øøøøð )øøøð Ô ˜tÔ6Ò 6Ð 6à'¨/¸6Å^Ò;SÐ)TÐUˆKð å˜{Ñ+Ô+Ð+å"Ð"øÝ$ð ð ð Ø�ð øøøð Ô ˜tÔ6Ò 6Ð 6Ø'¨/¸6Å^Ò;SÐ)TÐUˆKð ݘ{Ñ+Ô+Ð+Ý"Ð"øÝ$ð ð ð Ø�ð øøøà �ŠÑÔÐÝÐsAºAÁ A9ÁA4Á.A9Á4A9ÂB2Â2 B?Â>B?Ã"C8Ã8 DÄDcó>—ddi}t¦«jrd|d<|S©NrÌFT)r rÌ©Úress r4Úget_nodejs_selector_statusz0CloudlinuxSelectorLib.get_nodejs_selector_statusis+€à! 5Ð)ˆÝ ‰=Œ=Ô )ð +Ø&*ˆCÐ"Ñ #؈ r3có:—d|jjrtntiS)NÚ PHPSelector)rLrÌrrr]s r4Úget_php_selector_statusz-CloudlinuxSelectorLib.get_php_selector_statusps€Ø°Ô1FÔ1WÐl�~˜~Õ]lÐmÐmr3cóà— |j ¦«}| | ¦«¦«|S#t$r}| |¦«cYd}~Sd}~wwxYw©N)rLÚ get_summaryrŠÚget_selector_statusrr�)rXrÕrÏs r4rÜz!CloudlinuxSelectorLib.get_summaryss€€ð )ØÔ'×3Ò3Ñ5Ô5ˆCØ �JŠJ�t×/Ò/Ñ1Ô1Ñ 2Ô 2Ð 2؈JøÝ ð )ð )ð )Ø×%Ò% aÑ(Ô(Ð (Ð (Ð (Ð (Ð (Ð (øøøøð )øøøs‚AAÁ A-ÁA(Á"A-Á(A-có>—ddi}t¦«jrd|d<|SrÓ)r#rÌrÔs r4Úget_python_selector_statusz0CloudlinuxSelectorLib.get_python_selector_status{s+€à! 5Ð)ˆÝ ‰?Œ?Ô +ð +Ø&*ˆCÐ"Ñ #؈ r3cót— tj|¦«jS#t$rt ddi¦«‚wxYw)NrlzNo such user: `%(user)s`)r�r‚Úpw_dirÚKeyErrorr)rjs r4Ú get_user_homez#CloudlinuxSelectorLib.get_user_home‚sR€ð Ý”< Ñ%Ô%Ô,Ð ,øÝð ð ð Ý ØÐ5ð"ñôð ð øøøs‚›7có”—t¦« ¦«}| | ¦«¦«|SrÛ)r rÜrŠrÝ)rXrÕs r4Úget_nodejs_summaryz(CloudlinuxSelectorLib.get_nodejs_summary‹s:€Ý‰mŒm×'Ò'Ñ)Ô)ˆØ � Š �4×+Ò+Ñ-Ô-Ñ.Ô.Ð.؈ r3c óŒ—| |¦«}|j|jkr|j |||d¦«}n<|j|jkr|j |||d¦«}nt ¦«‚|g}|j|jkr| d¦«| |¦«|�:|j|jkr| d¦«| |¦«tj |¦«}|  ||||  |j |j¦«¬¦«} | S)aD Runs script to execute other script inside user app environment :param user: str -> owner of application :param app_root: str -> application directory :param script_name: str -> name of script :param script_args: list of str -> arguments for the script :return: dict Únpmr?z run-scriptNz--)Ú preexec_fn)rãrDrHrMÚget_binary_pathrIÚNotImplementedErrorÚappendÚextendr�r‚Ú_run_interpreterÚ _make_demoteÚpw_uidÚpw_gid) rXrjrcÚ script_nameÚ script_argsÚ user_homeÚinterpreter_pathÚcmdÚpwrxs r4Ú run_scriptz CloudlinuxSelectorLib.run_script�s[€ð×&Ò& tÑ,Ô,ˆ Ø Ô ˜tÔ6Ò 6Ð 6Ø#Ô0×@Ò@Ø�h  ¨5ñ 2ô 2Ð Ð à Ô  Ô!8Ò 8Ð 8Ø#Ô0×@Ò@Ø�h  ¨8ñ 5ô 5Ð Ð õ&Ñ'Ô'Ð 'ØÐ ˆØ Ô ˜tÔ6Ò 6Ð 6Ø �JŠJ�|Ñ $Ô $Ð $Ø � Š �;ÑÔÐØ Ð "ØÔ 4Ô#:Ò:Ð:Ø— ’ ˜4Ñ Ô Ð Ø �JŠJ�{Ñ #Ô #Ð #õŒ\˜$Ñ Ô ˆØ×&Ò&Ø �˜HØ×(Ò(¨¬°B´IÑ>Ô>ð'ñ@ô@ˆðˆ r3c󇇗ˆˆfd„}|S)Ncó®•—tj¦«dkrtjg¦«tj‰¦«tj‰¦«dS)Nr)r}r~Ú setgroupsÚsetgidÚsetuid)ÚgidÚuids€€r4Ú_demotez3CloudlinuxSelectorLib._make_demote.._demote¹sDø€õŒz‰|Œ|˜qÒ Ð Ý” ˜RÑ Ô Ð Ý ŒI�c‰NŒNˆNÝ ŒI�c‰NŒNˆNˆNˆNr3r2)rþrýrÿs`` r4rîz"CloudlinuxSelectorLib._make_demote·s)øø€ð ð ð ð ð ð ðˆr3có<—tj|tj ||¦«tjtjd|¬¦«} | ¦«\}}n'#t$r}td||dœdœ¦«‚d}~wwxYwd  |j |  ¦«|  ¦«¦«}td„||fD¦«¦«rKtj ¦«} d | ›d �} tj| ¦« ¦«} |d | ›d | ›d �z }dt#j| ¦«¦« ¦«i} |  ddi¦«|j dkr d|j ›�| d<| S)a& Run interpreter in users environment :param cmd: list -> command to execute :param user_home: -> user home directory :param app_root: -> app path :param preexec_fn: callable -> defence-in-depth demote hook (see run_script) :return: dict T)ÚargsÚcwdÚstdoutÚstderrÚtextrèz6run-script call: `%(args)s` failed with error: %(err)s)rrŒrkNz%returncode: {} stdout: {} stderr: {} c3óBK—|]}d| ¦«vV—ŒdS)z out of memoryN)Úlower)r£Úoutputs r4ú z9CloudlinuxSelectorLib._run_interpreter..às/èè€ÐPÐP°Vˆ &§,¢,¡.¤.Ð0ÐPÐPÐPÐPÐPÐPr3z/proc/z/limitsaD Out of memory error may be caused by hitting LVE limits or "Max data size", "Max address space" or "Max resident set" process limits Please check LVE limits and process limits. Readjust them if necessary More info: https://docs.cloudlinux.com/shared/cloudlinux_os_components/#known-restrictions-and-issues process limits "z": ú Údatar8ÚsuccessrzScript exit code: Úwarning)Ú subprocessÚPopenr}r›ÚjoinÚPIPEÚ communicater¬rrËÚ returncodeÚstripÚanyÚgetpidÚpathlibÚPathÚ read_textÚbase64Ú b64encodeÚencodeÚdecoderŠ) rõrórcrèÚprrrÏÚ output_stringÚpidÚproc_limits_pathÚprocess_limitsrxs r4ríz&CloudlinuxSelectorLib._run_interpreterÂsÚ€õ Ô Ø�"œ'Ÿ,š, y°(Ñ;Ô;Ý”?­:¬?ÀØ!ð #ñ #ô #ˆð ØŸ]š]™_œ_‰NˆF�F�FøÝð ð ð Ý ð2à$'°Ð2Ð2ð"ð"ñôð øøøøð øøøð ÷ Š&Ø ŒLØ �LŠL‰NŒNØ �LŠL‰NŒNñ ô ð õ ÐPÐPÀÈÐ?OÐPÑPÔPÑ PÔ Pð Ý”)‘+”+ˆCØ4¨Ð4Ð4Ð4Ð Ý$œ\Ð*:Ñ;Ô;×EÒEÑGÔGˆNØ ðPð(8ð PðPð>Lð PðPðPñ ˆMð�&Ô*¨=×+?Ò+?Ñ+AÔ+AÑBÔB×IÒIÑKÔKÐLˆØ� Š �x Ð+Ñ,Ô,Ð,Ø Œ<˜1Ò Ð Ø C°Q´\Ð CÐ CˆF�9Ñ Øˆ sÁA&Á& B Á0BÂB có®—|j|jkr|j |¬¦«S|j|jkr|j ¦«SdS©N©Úwebsite)rDrKrLrÜrH)rXr&s r4Úget_fullzCloudlinuxSelectorLib.get_fullñs[€Ø Ô ˜tÔ3Ò 3Ð 3ØÔ(×4Ò4¸WÐ4ÑEÔEÐ EØ Ô ˜tÔ6Ò 6Ð 6ØÔ(×4Ò4Ñ6Ô6Ð 6ð 7Ð 6r3cóâ—t¦« ¦«}tj¦«}t |¦«D]\}}||xxdz cc<Œ|D]}||d|d<Œ|S)a_ Add selector usage statistics (amount of domains that use some version, etc) Fist parameter is an array with such format: [{'version': '5.6'}, {'version': '7.6'}] Output is an array with such format: [{'version': '5.6', 'users': 10}, ...] :type versions_list: list :rtype: list éÚversionÚ total_users)rÚget_user_version_mapÚ collectionsÚCounterr)Ú versions_listÚuser_version_mapÚversion_user_maprjr*Úitems r4Ú_add_statistics_fieldz+CloudlinuxSelectorLib._add_statistics_field÷s‘€õ(™>œ>×>Ò>Ñ@Ô@Ðå&Ô.Ñ0Ô0ÐÝ&Ð'7Ñ8Ô8ð +ð +‰MˆD�'Ø ˜WÐ %Ð %Ô %¨Ñ *Ð %Ð %Ñ %Ð %à!ð Dð DˆDØ"2°4¸ ´?Ô"CˆD�Ñ Ð ØÐr3có^—|j|jkrSt|j¦« d¦«}t |dt ¬¦«}t j|¦«}n#|j�|j ¦«}ni}|  d¦«dkr d|di}n|}|S)zG Retrieves supported versions list and default version FÚjson)rËÚ api_versionNr8ÚERRORrl) rDrKrrÜrrr5ÚloadsrLÚget)rXr Ú json_dataÚselectorctl_resultrxs r4Úget_supported_versionsz,CloudlinuxSelectorLib.get_supported_versions s¶€ð Ô ˜tÔ3Ò 3Ð 3å˜DÔ,Ñ-Ô-×9Ò9¸%Ñ@Ô@ˆDÝ& t°FÍÐNÑNÔNˆIÝ!%¤¨IÑ!6Ô!6Ð Ð à Ô "Ð .Ø!%Ô!6×!BÒ!BÑ!DÔ!DÐ Ð à!#Ð Ø × !Ò ! (Ñ +Ô +¨wÒ 6Ð 6àÐ 2°9Ô =Ð>ˆFˆFà'ˆF؈ r3có�—|r|gnd}|j|jkr|j ||¦«S| d¦«S)z3 Retrives current version for user NzSupported only by php selector)rDrKrLÚget_current_versionr�)rXrjrds r4r>z)CloudlinuxSelectorLib.get_current_version"sS€ðÐ'�ˆvˆv 4ˆØ Ô ˜tÔ3Ò 3Ð 3ØÔ(×<Ò<¸TÀ6ÑJÔJÐ Jà×%Ò%Ð&FÑGÔGÐ Gr3có²—| ¦«} |d}n6#t$r)d|vr| |d¦«cYSd|dœcYSwxYwd|iS)NÚdefault_versionrlr7)r8r )r<râr�)rXÚ json_dictr@s r4Úget_default_versionz)CloudlinuxSelectorLib.get_default_version-s‹€Ø×/Ò/Ñ1Ô1ˆ ð >Ø'Ð(9Ô:ˆOˆOøÝð >ð >ð >ؘIÐ%Ð%Ø×)Ò)¨)°IÔ*>Ñ?Ô?Ð?Ð?Ð?à")°9Ð=Ð=Ð=Ð=Ð=ð  >øøøð " ?Ð3Ð3s–Ÿ)AÁ AÁAcóÞ—|j|jkr| ¦«S|j|jkr| ¦«S|j|jkr| ¦«SdSrÛ)rDrHrÖrIrßrKrÙr]s r4rÝz)CloudlinuxSelectorLib.get_selector_status8ss€Ø Ô ˜tÔ6Ò 6Ð 6Ø×2Ò2Ñ4Ô4Ð 4Ø Ô  Ô!8Ò 8Ð 8Ø×2Ò2Ñ4Ô4Ð 4Ø Ô  Ô!5Ò 5Ð 5Ø×/Ò/Ñ1Ô1Ð 1ð6Ð 5r3có—|jj SrÛ©rLrÌr]s r4Úphp_selector_is_disabledz.CloudlinuxSelectorLib.php_selector_is_disabled@s€ØÔ(Ô9Ð9Ð9r3có—|jjSrÛrEr]s r4Úphp_selector_is_enabledz-CloudlinuxSelectorLib.php_selector_is_enabledCs€ØÔ$Ô5Ð5r3có—|j|jkrdS ddlm}m}n#t $rYdSwxYw|¦«rQ| ¦«s=|¦«}|r1 |d}| d¦«sdSn#t$rYnwxYwdS)zž Returns True when MultiPHP system default PHP version is alt-php and PHP Selector is NOT disabled For details please see LVEMAN-1170 Fr)Úis_ea4_enabledÚread_cpanel_ea4_php_confÚdefaultzea-phpT) rDrKÚclcagefslib.selector.configurerJrKÚ ImportErrorrFÚ startswithrâ)rXrJrKÚconfÚ default_phps r4Úcheck_multiphp_system_defaultz3CloudlinuxSelectorLib.check_multiphp_system_defaultFsê€ð Ô ˜tÔ3Ò 3Ð 3Ø�5ð Ø _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _øÝð ð ð Ø�5�5ð øøøð ˆ>Ñ Ô ð  D×$AÒ$AÑ$CÔ$Cð Ø+Ð+Ñ-Ô-ˆDØð ðà"& y¤/�KØ&×1Ò1°(Ñ;Ô;ð$Ø#˜tð$øåðððØ�Dðøøøàˆus”� +ª+ÁA9Á9 BÂBc ó¾—|j|j|jfvrqt|¦«D]Z\}} | ||¦«}n.#t $r!}| |¦«cYd}~cSd}~wwxYw|tkr|cSŒ[tS| ¦«} |d}n5#t$r(| d|j ›d|j›�¦«cYSwxYwd„|D¦«}t|  ¦«¦«|z r^| dd  t|  ¦«¦«|z ¦«›d|j ›d|j›d �¦«Sd } g} t|¦«D]u\}} | r5t|j¦« t!|¦«¦«n4t|j¦« t!|¦«¦«| d z } Œv| t%|¦«krtS| d kr&d d  | t%|¦«| ¦«iS| d | ¦«¦«S)NÚavailable_versionszcorrupted answer from z --json --summary --interpreter có—h|] }|d’Œ S©r*r2)r£Úxs r4ú z?CloudlinuxSelectorLib.set_supported_versions..os€Ð IÐ IÐ I°!  9¤Ð IÐ IÐ Ir3zinvalid alternative versions (z, z), see z --summary --interpreter z for valid versionsrr)r8z>WARNING: only {} of {} commands was successful. Errors was: {}z&All commands were failedErrors was: {})rDrHrIrÚset_version_statusrr�rÍr<rârEÚsetÚkeysrrÚenable_versionÚstrÚdisable_versionr‰rË) rXÚversionsr*Úenable_disablerxrÏrAÚalternatives_listÚalternatives_versionsr Ú errors_listÚ to_enables r4Úset_supported_versionsz,CloudlinuxSelectorLib.set_supported_versions^sÑ€Ø Ô  Ô 7¸Ô9PÐRÐ RÐ RÝ+4°XÑ+>Ô+>ð "ð "Ñ'�˜ð1Ø!×4Ò4°^ÀWÑMÔM�F�FøÝ(ð1ð1ð1Ø×-Ò-¨aÑ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð1øøøà�[Ò(Ð(Ø!�M�M�Mð)åÐ Ø×/Ò/Ñ1Ô1ˆ ð >Ø )Ð*>Ô ?Ð Ð øÝð >ð >ð >Ø×%Ò%Ð%ØÔ)Ð)Ð)¨4Ô+;Ð+;ð'=ñ>ô>ð >ð >ð >ð >øøøð!JÐ IÐ7HÐ IÑ IÔ IÐå ˆx�}Š}‰ŒÑ Ô Ð"7Ñ 7ð 'Ø×%Ò%Ð%à—I’I�c (§-¢-¡/¤/Ñ2Ô2Ð5JÑJÑKÔKÐKÐKÈTÔMfÐMfÐMfØÔ$Ð$Ð$ð&ñ'ô'ð 'ð ˆØˆ Ý"+¨HÑ"5Ô"5ð ð Ñ ˆG�YØð IݘÔ)Ñ*Ô*×9Ò9½#¸g¹,¼,ÑGÔGÐGÐGå˜Ô)Ñ*Ô*×:Ò:½3¸w¹<¼<ÑHÔHÐHØ �q‰LˆGˆGØ •c˜(‘m”mÒ #Ð #ÝÐ Ø �qŠ[ˆ[àð+ß+1ª6°'½3¸x¹=¼=È+Ñ+VÔ+Vðð ð ×%Ò%ð'7ß7=²v¸kÑ7JÔ7JñLôLð Ls/«AÁ A-Á A(Á A-Á(A-ÂB%Â%/CÃCcóB— |j�|j |¦«nv#tjjj$rt dd|idœ¦«‚tjjtf$r,}| t|¦«¦«cYd}~Sd}~wwxYwtS©NúNo such php version: %(ver)sÚverrk) rLÚswitch_default_versionrQÚclselectexceptrÚNoSuchAlternativeVersionÚBaseClSelectExceptionrr‘r]rÍ)rXr*rÏs r4Úset_default_versionz)CloudlinuxSelectorLib.set_default_versionŠsÊ€ð :ØÔ$Ð0ØÔ%×<Ò<¸WÑEÔEÐEøøÝÔ&Ô5ÔNð @ð @ð @å Ð-KØ.3°WÐ-=ð"?ð"?ñ@ô@ð @åÔ'Ô=Õ?PÐQð :ð :ð :Ø×1Ò1µ#°a±&´&Ñ9Ô9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9øøøøð :øøøåÐs‚!$¤ABÁ+!B BÂBcó–—|r!|j |t¦«n |j |t¦«tS)zÒ Disable or enable version of selector :param target_version_status: disable or enable version of interpreter :param version: version of interpreter :return: OK_RES_DICT )rLrYrrrÍ)rXÚtarget_version_statusr*s r4rYz(CloudlinuxSelectorLib.set_version_status–sH€ð !ð OØ Ô !× 4Ò 4°W½nÑ MÔ MÐ MÐ Mà Ô !× 4Ò 4°W½oÑ NÔ NÐ NåÐr3cóH— |j|jkr|j ||¦«no#tjjj$rt dd|idœ¦«‚tjj$r,}|  t|¦«¦«cYd}~Sd}~wwxYwtSrg) rDrKrLÚswitch_current_versionrQrkrrlrmr‘r]rÍ)rXr*rdrÏs r4Úset_current_versionz)CloudlinuxSelectorLib.set_current_version¥s΀ð :ØÔ 4Ô#7Ò7Ð7ØÔ%×<Ò<¸WÀfÑMÔMÐMøøÝÔ&Ô5ÔNð @ð @ð @å Ð-KØ.3°WÐ-=ð"?ð"?ñ@ô@ð @åÔ&Ô<ð :ð :ð :Ø×1Ò1µ#°a±&´&Ñ9Ô9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9øøøøð :øøøåÐs‚+.®ABÁ.!BÂBÂBr*r&ÚreturncóD—i} |j|jkr|j ||¬¦«}no#tjjj$rt dd|idœ¦«‚tjj$r,}|  t|¦«¦«cYd}~Sd}~wwxYw|S)z1Reset extensions to default for selected version.r%rhrirkN) rDrKrLÚreset_extensionsrQrkrrlrmr‘r])rXr*r&Ú extensionsrÏs r4rvz&CloudlinuxSelectorLib.reset_extensions±sÖ€àˆ ð :ØÔ 4Ô#7Ò7Ð7Ø!Ô2×CÒCÀGÐU\ÐCÑ]Ô]� øøÝÔ&Ô5ÔNð @ð @ð @å Ð-KØ.3°WÐ-=ð"?ð"?ñ@ô@ð @åÔ&Ô<ð :ð :ð :Ø×1Ò1µ#°a±&´&Ñ9Ô9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9øøøøð :øøøàÐs„,1±ABÁ1!BÂBÂBcóf—|j|j|j|jfvr| |¦«SdSrÛ)rDrHrIrKrÑ)rXr8s r4Úset_selector_statusz)CloudlinuxSelectorLib.set_selector_status¿s>€Ø Ô  Ô 7¸Ô9PÐRVÔRfÐgÐ gÐ gØ×/Ò/°Ñ7Ô7Ð 7ð hÐ gr3có—tj¦«s&tj¦«stj¦«rKt |jdgd¬¦«\}}}|dkr)| d ||¦«¦«SdS)Nz--sync-conf=allT)rrz"Can not sync UI with reason: {} {})ÚdetectÚ is_cpanelÚis_pleskÚis_darrFr�rË)rXÚretcodeÚoutrŒs r4rÎzCloudlinuxSelectorLib.update_uiÃsš€Ý Ô Ñ Ô ð K¥¤Ñ!2Ô!2ð Kµf´l±n´nð KÝ ,ØÔ'Ð*;Ð)<ÀTð!Kñ!Kô!KÑ ˆG�S˜#à˜!Š|ˆ|Ø×)Ò)Ø8×?Ò?ÀÀSÑIÔIñKôKðKàˆtr3rwcóN—t ¦«}|j|jkr{ |j |||¬¦«}|r| |¦«nC#tjj $r,}|  t|¦«¦«cYd}~Sd}~wwxYw|SdS)z$Set extensions for selected version.r%N) rÍÚcopyrDrKrLÚset_extensionsrŠrQrkrmr‘r])rXrwr*r&rxr rÏs r4rƒz$CloudlinuxSelectorLib.set_extensionsÌs½€å×!Ò!Ñ#Ô#ˆØ Ô ˜tÔ3Ò 3Ð 3ð >ØÔ,×;Ò;¸GÀZÐY`Ð;ÑaÔa�Øð(Ø—M’M $Ñ'Ô'Ð'øøÝÔ*Ô@ð >ð >ð >Ø×5Ò5µc¸!±f´fÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=øøøøð >øøøàˆMð 4Ð 3s«4A Á B Á4!BÂB ÂB cóô—|j|jkrb |j |||¬¦«nC#tjj$r,}| t|¦«¦«cYd}~Sd}~wwxYwtSr$) rDrKrLÚ set_optionsrQrkrmr‘r]rÍ)rXÚoptionsr*r&rÏs r4r…z!CloudlinuxSelectorLib.set_optionsØs�€Ø Ô ˜tÔ3Ò 3Ð 3ð >ØÔ%×1Ò1°'¸7ÈGÐ1ÑTÔTÐTÐTøÝÔ*Ô@ð >ð >ð >Ø×5Ò5µc¸!±f´fÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=øøøøð >øøøåÐs’0°A0Á!A+Á%A0Á+A0có>—|€©| ¦« dd¦«}|�|dkr'td |j¦«¦«‚|j|jkr@t jd|¦«}|stdd|idœ¦«‚| d ¦«S|St|ttf¦«r;|j|jkrtt|¦«¦«St|¦«S|d krtd d|idœ¦«‚|S) a3 Attempts to get or verify version to be passed to external program Currently supported version is one digit (6 or 8). If version is None, return a default version :param version: str or None -> version to be verified or found :return: str -> digit as string Nr@Úz{} default version not definedz(?P\d+)z#Incorrect selector version: %(ver)srirkr*ÚnativezUnsupported version: %(ver)s) rBr9rrËrDrHÚreÚmatchÚgroupruÚintÚfloatr])rXr*r@Úms r4Úresolve_versionz%CloudlinuxSelectorLib.resolve_versionàsO€ð ˆ?Ø"×6Ò6Ñ8Ô8×<Ò<Ð=NÐPRÑSÔSˆOØÐ&¨/¸RÒ*?Ð*?å$Ð%E×%LÒ%LÈTÔM]Ñ%^Ô%^Ñ_Ô_Ð_ØÔ 4Ô#:Ò:Ð:Ý”HÐ0°/ÑBÔB�ØðPÝ(Ð5ZØ6;¸_Ð5Mð*Oð*OñPôPðPà—w’w˜yÑ)Ô)Ð)à&Ð&Ý �g¥¥U˜|Ñ ,Ô ,ð $ØÔ 4Ô#:Ò:Ð:å�3˜w™<œ<Ñ(Ô(Ð(õ˜7‘|”|Ð#Ø �hÒ Ð Ý Ð-KØ.3°WÐ-=ð"?ð"?ñ@ô@ð @àˆr3c ó¾—| ||¦«| |¦«}|�!ttj|¦«¦«}| ||¦«\}} |j|jkr+|j  ||||| |||| |j | ¬¦ « no|j|j kr%tj   ||||| ¬¦«n:|j|jkr*|j  ||||| |||||j | ¬¦ « nD#tjj$r-} | t%| ¦«¬¦«cYd} ~ Sd} ~ wwxYwt&S)a• Creates application for specified user, interpreter and version If user is None we hope that the external application resolves a user Currently NodeJS supported only :param domain: str -> domain of the application :param app_root: str -> app path relative to user home :param app_uri: str -> URI path of the application :param version: str or None -> version of the interpreter :param user: str or None -> username of user who owns the app :param app_mode: str or None -> application mode (development or production) :param startup_file: str or None -> main application file :param env_vars: json_string or None -> enviroment variables for application :param entry_point: Application entry point (used only for python interpreter). :param passenger_log_file: Passenger log filename :return: dict N)rfÚenv_varsÚ startup_fileÚ domain_nameÚ entry_pointrMÚpassenger_log_file©rf)r*rfÚapp_moder’r“r”rMr–)rx)r‡r�rr5r8rarDrIrOÚcreaterMrJrQÚclselectctlrubyrHrkrmr‘r]rÍ) rXrcÚapp_urir*rjrdr˜r“r’r•r–rfrÏs r4Ú create_appz CloudlinuxSelectorLib.create_apps¨€ð$ ×$Ò$ T¨6Ñ2Ô2Ð2Ø×&Ò& wÑ/Ô/ˆà Ð Ý(­¬°HÑ)=Ô)=Ñ>Ô>ˆHØ×BÒBÀ4ÈÑPÔP‰ˆˆhð AØÔ 4Ô#:Ò:Ð:ØÔ%×,Ò,¨T°8¸WÀgÐX`Ø6>È\Ø9?È[Ø:>Ô:KÐ`rð-ñtôtðtðtðÔ! TÔ%:Ò:Ð:ÝÔ(×/Ò/°°hÀÈÐ[cÐ/ÑdÔdÐdÐdØÔ! TÔ%<Ò<Ð<àÔ%×,Ò,ؘ( G°WÀxØ%°À|Ø &°TÔ5FÐ[mð-ñôðøøõ Ô&Ô<ð Að Að AØ×1Ò1½¸Q¹¼Ð1Ñ@Ô@Ð @Ð @Ð @Ð @Ð @Ð @øøøøð AøøøõÐsÁ)B*DÄEÄ("EÅ EÅEcó´—tj |j|¦«}tj |¦«}tj |j¦«}| |tjz¦«s||krtdd|idœ¦«‚tj |¦«stdd|idœ¦«‚|S)zé Resolve app root to absolute path and checks if it exists :param app_root: str -> relative a user homedir app path :param userdata: obj -> pwd user object :return: str -> absolute path to app zNo such application: %(app)sÚapprk) r}r›rráÚrealpathrOr°rÚisdir)rcrƒÚapp_pathÚ real_app_pathÚ real_homes r4Ú_get_application_pathz+CloudlinuxSelectorLib._get_application_path-så€õ”7—<’< ¤°Ñ:Ô:ˆÝœ×(Ò(¨Ñ2Ô2ˆ Ý”G×$Ò$ X¤_Ñ5Ô5ˆ Ø×'Ò'¨ µB´FÑ(:Ñ;Ô;ð AÀ ÐQZÒ@ZÐ@ZÝ Ð-KØ.3°XÐ->ð"@ð"@ñAôAð AåŒw�}Š}˜]Ñ+Ô+ð AÝ Ð-KØ.3°XÐ->ð"@ð"@ñAôAð AàÐr3có‡—t ¦«}| |d¦«| |¦«}| ||¦«Št j t j ‰|¦«¦«}t j |j ¦«}|  |t j z¦«stdd|idœ¦«‚|j r|j  ||¦«nd}ˆfd„|r| d¦«pgngD¦«} | r|| vrtdd|idœ¦«‚ | |t j¦«} t%| dd¬ ¦«5} |  ¦«} | d t+j| ¦« ¦«i¦«ddd¦«n #1swxYwY|S#t0$rW} | jt2jkrtdd|idœ¦«‚| t9| d d ¦«¦«cYd} ~ Sd} ~ wt:$r.} | t9| d d ¦«¦«cYd} ~ Sd} ~ wwxYw) a  Reads file and returns its content as Base64 string :param app_root: str -> path to app relative to user home :param user: str -> username to resolve app path :param config_path: str -> file to be read (relative to app path) :return: dict Nz&Configuration file not found: %(path)sr›rkcóŠ•—h|]?}tj tj ‰|¦«¦«’Œ@Sr2©r}r›rŸr©r£Úfr¡s €r4rXz8CloudlinuxSelectorLib.read_app_config..VóIø€ð ð ð àõ ŒG× Ò �RœWŸ\š\¨(°AÑ6Ô6Ñ 7Ô 7ð ð ð r3rœÚrbT©Úclosefdr Ústrerrorrˆ)rÍr‚r‡r„r¤r}r›rŸrrárOr°rrMÚget_app_configr9rÆr±r²ÚreadrŠrrrr¬r·ÚENOENTr‘r«r¹)rXrcÚ config_pathrjrxrƒr»r£Ú app_configÚregistered_pathsÚfile_fdr©r rÏr¡s @r4Úread_app_configz%CloudlinuxSelectorLib.read_app_config@s)ø€õ×!Ò!Ñ#Ô#ˆØ ×$Ò$ T¨4Ñ0Ô0Ð0Ø×*Ò*¨4Ñ0Ô0ˆØ×-Ò-¨h¸ÑAÔAˆÝœ7×+Ò+­B¬G¯LªL¸À;Ñ,OÔ,OÑPÔPÐÝ”G×$Ò$ X¤_Ñ5Ô5ˆ Ø×*Ò*¨9µr´vÑ+=Ñ>Ô>ð Ý àGØ &¨ Ð4ððñôð ð JNÔIZÐd�TÔ&×5Ò5°d¸HÑEÔEÐEÐ`dˆ ð ð ð ð à@JÐR�z—~’~ nÑ5Ô5Ð;¸øÐPRð ñ ô Ðð ð Ð 0Ð8HÐ HÐ HÝ àGØ &¨ Ð4ððñôð ð  NØ×6Ò6Ð7GÍÌÑUÔUˆGÝ�g˜t¨TÐ2Ñ2Ô2ð I°aØ—v’v‘x”x�Ø— ’ ˜v¥vÔ'7¸Ñ'=Ô'=×'DÒ'DÑ'FÔ'FÐGÑHÔHÐHð Ið Ið Iñ Iô Ið Ið Ið Ið Ið Ið Iøøøð Ið Ið Ið IðˆMøÝð Nð Nð NØŒw�%œ,Ò&Ð&Ý$à#KØ$*Ð,<Ð#=ððñôðð ×1Ò1µ'¸!¸ZÈÑ2LÔ2LÑMÔMÐ MÐ MÐ MÐ MÐ MÐ MøøøøÝð Nð Nð NØ×1Ò1µ'¸!¸ZÈÑ2LÔ2LÑMÔMÐ MÐ MÐ MÐ MÐ MÐ Møøøøð NøøøsVÅ2G4Æ AG'Ç G4Ç'G+Ç+G4Ç.G+Ç/G4Ç4 J Ç>A IÉ J É J É#JÊJ ÊJ có ‡—| |d¦«| |¦«}| ||¦«Štj tj ‰|¦«¦«}tj |j¦«}| |tj z¦«stdd|idœ¦«‚|j r|j   ||¦«nd}ˆfd„|r|  d¦«pgngD¦«} | r|| vrtdd|idœ¦«‚ tj|¦«} | |tjtjztjzd¦«} t)| dd ¬ ¦«5} |  | ¦«ddd¦«n #1swxYwYt,S#t.$r.} | t3| d d ¦«¦«cYd} ~ Sd} ~ wwxYw) aŽ Saves data passed as Base64 string to specified file :param content: data for saving in app's config :param app_root: str -> path to app relative to user home :param user: str -> username to resolve app path :param config_path: str -> file to be read (relative to app path) :param content: str -> Base64-encoded string :return: dict Nršr›rkcóŠ•—h|]?}tj tj ‰|¦«¦«’Œ@Sr2r§r¨s €r4rXz8CloudlinuxSelectorLib.save_app_config..�rªr3rœrŸÚwbTr¬r®rˆ)r‡r„r¤r}r›rŸrrárOr°rrMr¯r9rÚ b64decoderÆÚO_WRONLYÚO_CREATÚO_TRUNCr²ÚwriterÍr¹r‘r«)rXrcr²Úcontentrjrƒr»r£r³r´Údecoded_contentrµr©rÏr¡s @r4Úsave_app_configz%CloudlinuxSelectorLib.save_app_configxs…ø€ð ×$Ò$ T¨4Ñ0Ô0Ð0Ø×*Ò*¨4Ñ0Ô0ˆØ×-Ò-¨h¸ÑAÔAˆÝœ7×+Ò+­B¬G¯LªL¸À;Ñ,OÔ,OÑPÔPÐÝ”G×$Ò$ X¤_Ñ5Ô5ˆ Ø×*Ò*¨9µr´vÑ+=Ñ>Ô>ð Ý àJØ &¨ Ð4ððñôð ð JNÔIZÐd�TÔ&×5Ò5°d¸HÑEÔEÐEÐ`dˆ ð ð ð ð à@JÐR�z—~’~ nÑ5Ô5Ð;¸øÐPRð ñ ô Ðð ð Ð 0Ð8HÐ HÐ HÝ àJØ &¨ Ð4ððñôð ð NÝ$Ô.¨wÑ7Ô7ˆOØ×6Ò6Ø Ý” �bœjÑ(­2¬:Ñ5ØñôˆGõ �g˜t¨TÐ2Ñ2Ô2ð )°aØ—’˜Ñ(Ô(Ð(ð )ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )åÐ øÝð Nð Nð NØ×1Ò1µ'¸!¸ZÈÑ2LÔ2LÑMÔMÐ MÐ MÐ MÐ MÐ MÐ Møøøøð NøøøsCÅA!GÆ!GÆ7 GÇGÇGÇ GÇ GÇ H Ç#HÈH ÈH cóª—t|¦«}|�| d|g¦«n)|�| d|g¦«ntd¦«‚|S)Nrsrrr†)Úlistrìr)rjrdrÚ result_argss r4Ú_add_user_or_domainz)CloudlinuxSelectorLib._add_user_or_domain©sf€å˜4‘j”jˆ Ø Ð Ø × Ò   ¨FÐ3Ñ 4Ô 4Ð 4Ð 4Ø Ð Ø × Ò  ¨$Ð/Ñ 0Ô 0Ð 0Ð 0å Ð!eÑfÔfÐ fØÐr3FcóZ—| ||¦«|j|jkrtdd|jidœ¦«‚ |D]}|j |||¦«Œ t S#tjj $r,}|  t|¦«¦«cYd}~Sd}~wwxYw)an Uninstall described modules for user's webapp :param app_root: directory with webapp :param modules: comma-separated list of modules to uninstall :param user: name of unix user :param domain: domain of user :param skip_web_check: skip check web application after changing its properties :return: None zJUninstall command is available only for python interpreter, not %(interp)sÚinterprkN) r‡rDrIrrOÚ uninstallrÍrQrkrmr‘r])rXrcÚmodulesrjrdÚskip_web_checkÚmodulerÏs r4Úuninstall_modulesz'CloudlinuxSelectorLib.uninstall_modules´sé€ð ×$Ò$ T¨6Ñ2Ô2Ð2Ø Ô ˜tÔ6Ò 6Ð 6Ý Øgà˜dÔ.ðð"ð"ñôð ð  Ø!ð Hð H�ØÔ%×/Ò/°°hÀÑGÔGÐGÐGð Hõ Ð øõÔ&Ô<ð :ð :ð :Ø×1Ò1µ#°a±&´&Ñ9Ô9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9øøøøð :øøøsÁ!A*Á*B*Á>!B%ÂB*Â%B*r2c óò—| ||¦«|j|jkrr |j ||||j||¬¦«t S#tjj $r.} |  t| ¦«pd¦«cYd} ~ Sd} ~ wwxYw|j|j kr· |r+|D]'} |j ||| d||j¬¦«Œ(n?|r&|j ||d|||j¬¦«nd} |  | ¦«St S#tjj $r,} |  t| ¦«¦«cYd} ~ Sd} ~ wwxYwtdd|jidœ¦«‚) aF Install described modules for user's webapp :type domain: domain of user :param user: name of unix user :param app_root: directory with webapp :param skip_web_check: skip check web application after change it's properties :param spec_file: file containing modules and their versions to install :param modules: list of installed modules :param before_install: optionally expose the held Node.js app-lock fd to npm :param after_install: optionally finish that fd handoff after npm :return: None )rÊrMÚbefore_installÚ after_installz7Node.js module installation failed without a diagnosticN)rÊrMz9Please, specify modules or requirements file with modulesúUnknown interpreter: %(interp)srÇrk)r‡rDrHrOÚinstallrMrÍrQrkrmr‘r]rIr) rXrcrjrdrÊÚ spec_filerÉrÎrÏrÏrËrŒs r4Úinstall_modulesz%CloudlinuxSelectorLib.install_modulesÎs9€ð ×$Ò$ T¨6Ñ2Ô2Ð2Ø Ô ˜tÔ6Ò 6Ð 6ð #ØÔ%×-Ò-¨d°HÈ^Ø;?Ô;LØ=KØÔ>Ð>õ#Ð"øõÔ*Ô@ð >ð >ð >Ø×5Ò5µc¸!±f´fÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=øøøøð >øøøõ !Ø<à˜dÔ.ðð"ð"ñôð s<¨%AÁBÁ(#B BÂBÂ*A+DÄEÄ1!EÅEÅEcój—| |d¦« |j|jkr!tj ||¦«n¡ | ||¦«}n3#t$rtj dd|i¬¦«‚t$rd}YnwxYw|j|j |j fvr$|j  ||||j¬¦«ntjdd|ji¬¦«‚nC#tjj$r,}| t'|¦«¦«cYd}~Sd}~wwxYwt(S)z¸ Destroy specified application root directory and user name :param app_root: Application directory :param user: name of unix user :return: dict Nz\No such application or it's broken. Unable to find app-root folder by this path %(app_root)srcrk)rfrMrÐrÇ)r‡rDrJrQršÚdestroyrgÚ TypeErrorÚClSelectExceptionsÚ WrongDatar6rHrIrOrMÚInterpreterErrorrkrmr‘r]rÍ©rXrcrjrfrÏs r4Ú destroy_appz!CloudlinuxSelectorLib.destroy_apps�€ð ×$Ò$ T¨4Ñ0Ô0Ð0ð :ØÔ 4Ô#8Ò8Ð8ÝÔ(×0Ò0°°xÑ@Ô@Ð@Ð@ð $Ø#×CÒCÀDÈ(ÑSÔS�H�HøÝ ðððÝ,Ô6ð![ð'¨ð!ðñôðõ.ð$ð$ð$à#�H�H�Hð$øøøðÔ#¨Ô(?ÀÔAXÐ'YÐYÐYØÔ)×1Ò1°$¸È8Ø?CÔ?Pð2ñRôRðRðRõ-Ô=Ø AØ!)¨4Ô+;Ð <ð>ñ>ô>ð>øøõÔ&Ô<ð :ð :ð :Ø×1Ò1µ#°a±&´&Ñ9Ô9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9øøøøð :øøøåÐsB˜1C+Á A!Á C+Á!-BÂC+ÂBÂAC+Ã+D+Ã?!D&Ä D+Ä&D+cóš—| |d¦« | ||¦«}|j|j|jfvr#|j ||||j¦«ntj dd|ji¬¦«‚tS#tj j $r,}| t|¦«¦«cYd}~Sd}~wwxYw)zº Start specified application root directory and user name :param app_root: Application directory :param username: name of unix user :return: dict NrÐrÇrk)r‡rgrDrHrIrOÚstartrMr×rÙrÍrQrkrmr‘r]©rXrcrbrfrÏs r4Ú start_appzCloudlinuxSelectorLib.start_app)sî€ð ×$Ò$ X¨tÑ4Ô4Ð4ð :Ø×;Ò;¸HÀhÑOÔOˆHØÔ DÔ$;¸TÔ=TÐ#UÐUÐUØÔ%×+Ò+¨H°hÀÈ$ÔJ[Ñ\Ô\Ð\Ð\å(Ô9Ø=Ø% tÔ'7Ð8ð:ñ:ô:ð:õÐ øÝÔ&Ô<ð :ð :ð :Ø×1Ò1µ#°a±&´&Ñ9Ô9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9øøøøð :øøøs˜A1B  C Â!CÂ?C ÃC cóö—| |d¦« | ||¦«}|j|jkr#|j ||||j¦«nP|j|jkr#|j ||||j¦«ntj dd|ji¬¦«‚tS#tj j $r,}| t|¦«¦«cYd}~Sd}~wwxYw)z¼ Destroy specified application root directory and user name :param app_root: Application directory :param username: name of unix user :return: dict NrÐrÇrk)r‡rgrDrHrOÚrestartrMrIr×rÙrÍrQrkrmr‘r]rÞs r4Ú restart_appz!CloudlinuxSelectorLib.restart_app=s€ð ×$Ò$ X¨tÑ4Ô4Ð4ð :Ø×;Ò;¸HÀhÑOÔOˆHØÔ 4Ô#:Ò:Ð:ØÔ%×-Ò-¨h¸À(ÈDÔL]Ñ^Ô^Ð^Ð^ØÔ! TÔ%<Ò<Ð<ØÔ%×-Ò-¨h¸À(ÈDÔL]Ñ^Ô^Ð^Ð^å(Ô9Ø=Ø% tÔ'7Ð8ð:ñ:ô:ð:õÐ øÝÔ&Ô<ð :ð :ð :Ø×1Ò1µ#°a±&´&Ñ9Ô9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9øøøøð :øøøó˜BB8Â8C8à !C3Ã-C8Ã3C8cóö—| |d¦« | ||¦«}|j|jkr#|j ||||j¦«nP|j|jkr#|j ||||j¦«ntj dd|ji¬¦«‚tS#tj j $r,}| t|¦«¦«cYd}~Sd}~wwxYw)z¶ Start specified application root directory and user name :param app_root: Application directory :param user: name of unix user :return: dict NrÐrÇrk)r‡rgrDrHrOÚstoprMrIr×rÙrÍrQrkrmr‘r]rÚs r4Ústop_appzCloudlinuxSelectorLib.stop_appSs€ð ×$Ò$ T¨4Ñ0Ô0Ð0ð :Ø×;Ò;¸DÀ(ÑKÔKˆHØÔ 4Ô#:Ò:Ð:ØÔ%×*Ò*¨4°¸8ÀTÔEVÑWÔWÐWÐWØÔ! TÔ%<Ò<Ð<ØÔ%×*Ò*¨4°¸8ÀTÔEVÑWÔWÐWÐWå(Ô9Ø=Ø% tÔ'7Ð8ð:ñ:ô:ð:õÐ øÝÔ&Ô<ð :ð :ð :Ø×1Ò1µ#°a±&´&Ñ9Ô9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9øøøøð :øøørãc ó—d|zdz ¦«}d|zdz ¦«}tjtj |ddd¦«¦«D�]}tj |¦«sô t |d¬¦«}| ¦«|vs||vra| | ¦«| ¦«¦«}| ||¦«} t|| d¦«Œ°#t$rYtj ¦«\} } } tj   ttj| ¦«¦«¦«Y�ŒwxYw�ŒdS) z‰ Replace old prompt and env_var in binaries in new environment Working with bytes here, because of python binary ú(ú:Ú*Úbinr«)r½r¹N)rÚglobr}r›rr r&Úreplacer'ÚIOErrorÚsysÚexc_inforr¾r]Ú tracebackÚprint_tb) Únew_envÚold_envÚnew_relÚold_relÚ old_promptÚ new_promptÚ venv_bin_fileÚ old_activateÚ _new_activateÚ new_activatereÚ traceback_s r4Ú6_replace_old_env_and_prompt_in_binaries_in_environmentzLCloudlinuxSelectorLib._replace_old_env_and_prompt_in_binaries_in_environmentisx€ð˜G‘m cÑ)×1Ò1Ñ3Ô3ˆ ؘG‘m cÑ)×1Ò1Ñ3Ô3ˆ å!œY¥r¤w§|¢|°G¸SÀ%ÈÑ'MÔ'MÑNÔNð Jñ JˆMÝ”7—=’= Ñ/Ô/ð JðJÝ#,¨]ÀÐ#FÑ#FÔ#F�LØ—~’~Ñ'Ô'¨<Ð7Ð7¸:ÈÐ;UÐ;UØ(4×(<Ò(<¸W¿^º^Ñ=MÔ=MÈwÏ~Ê~ÑO_ÔO_Ñ(`Ô(`˜ Ø'4×'<Ò'<¸ZÈÑ'TÔ'T˜ Ý" =°,ÀÑEÔEÐEøøÝðJðJðJÝ'*¤|¡~¤~Ñ$�A�q˜*Ý”J×$Ò$¥S­Ô);¸JÑ)GÔ)GÑ%HÔ%HÑIÔIÐIÐIÑIðJøøøñ Jð Jð Js B DÄAE<Å;E<c ó — t|||¦«}tj|¦«j}t |d¦«d}||jj|j |||¦«|d|d|d ||ddg¦«d ||g¦«|dgdœi}|S#t$ricYSwxYw)a¿ Retrieve application info from user's applications config. Analog of function clpassenger.summary :param username: User name :param app_config_dict_full: Full user's application config. :param app_root: Application root :return: Dictionary with application info Example: { 'binary': '/home/cltest1/virtualenv/new_app_root/2.7/bin/python', # + 'domain': 'cltest1.com', # + 'alias': 'app1', # + 'htaccess': '/home/cltest1/public_html/app1/.htaccess', # + 'interpreter': 'python', # + 'directory': '/home/cltest1/new_app_root', # + 'docroot': '/home/cltest1/public_html', # + 'domains': ['cltest1.com'] } rdrr›r–ú .htaccess)rDÚbinaryÚaliasrdr ÚhtaccessÚ directoryÚdomains) r(r�r‚rár rMÚ INTERPRETERrérrâ)rXrbÚapp_config_dict_fullrcÚapp_config_dictrórfÚ app_info_dicts r4Úget_app_summaryz%CloudlinuxSelectorLib.get_app_summary€sò€ð$ Ý5°hÀÐJ^Ñ_Ô_ˆOÝœ  XÑ.Ô.Ô5ˆIݘ¨xÔ8Ñ9Ô9¸!Ô<ˆHàØ#'Ô#4Ô#@Ø"Ô/×?Ò?ÀÈ(ÐT]Ñ^Ô^Ø,¨YÔ7Ø-¨hÔ7Ø'Ø #§¢¨(°OÀIÔ4NÐP[Ð)\Ñ ]Ô ]Ø!$§¢¨9°hÐ*?Ñ!@Ô!@Ø /°Ô 9Ð:ð ð ð ˆMð!Ð øÝð ð ð àˆIˆIˆIð øøøs‚B;B>Â> C à C cóF—tj |¦«s&t|¦«tj||¦«dStj|¦«D]²}tj ||¦«}tj ||¦«}tj |¦«r’> #Ñ&Ô&ð4Ý”J�rœ{¨3Ñ/Ô/°Ñ5Ô5Ð5Ý”I˜c‘N”N�N�Nå”K  ]Ñ3Ô3Ð3Ð3Ý ŒH�]Ñ #Ô #Ð #Ð #Ð #r3c ó¨ —|j |¦«} t|||¦«}n%#t$rt jd|z¦«‚wxYwt ||¦«\}}t ||¦«\}} tj| ¦«n3#t$r&} t j t| ¦«¦«‚d} ~ wwxYw|  ||| ¦«} t|| | ¦«t j |¦«‚#t$rYnwxYw|  |||¦«} t||| ¦«} n%#t$rt j d|z¦«‚wxYw| d}| d}|j ||| |¬¦«j}|j|jkrPt'||¦«\}}t ||¦«\}}t |t'|||¬¦«d¦«\}}nŸ|j|jkr�t |t*j |jjj|¦«¦«\}}t |t*j |jjj| ¦«¦«\}}nt7¦«‚t*j |d¦«}t*j |d¦«}t*j |¦«}t*j |¦«st+j|¦«t?j ||¦«| !||¦«|j|jkr| "||| |¦«|j|jkrt'||¦«\}}n:|j|jkr|j #||¦«}nt7¦«‚|jj $|||¦«}| ¦«j%}t|||¦«d }|tLkrmtOj(||¦«|| )d d¦«}tOj*||||j|||d |¬ ¦«tOj+||¦«tY|||¦«|||<|j -||¦«dS) a Move user's application from directory to new_directory :param user: application owner. unix like user name :param old_directory: current directory with application :param new_directory: new directory for application :return: None ú8No such application (or application not configured) "%s"Nr r©Ú app_summaryrVr)rˆÚ app_statusr–r“©rfr“r–).rMÚget_user_config_datar(râr×ÚNoSuchApplicationr)rÚcheck_directoryÚ ValueErrorrØr]r Ú AppRootBusyrOÚ_get_environmentÚnamerDrIr"rHr}r›rrNÚ environmentsÚDEFAULT_PREFIXrêÚdirnamer ÚmakedirsrrrrþÚ _get_prefixr$rrrÚ unconfigurer9Ú configurerár*Úwrite_full_user_config_data)rXrjrrÚ full_configr³Úold_absröÚnew_absrõrÏÚnew_user_summaryÚold_user_summaryÚold_user_app_summaryrfrÚenv_nameriÚrel_venvÚ_old_envreÚ_new_envrôróÚ new_env_dirÚprefixÚ environmentrrÚpassenger_log_file_to_sets r4Ú _relocatezCloudlinuxSelectorLib._relocateÊs<€ðÔ'×<Ò<¸TÑBÔBˆ ð Ý0°°}ÀkÑRÔRˆJˆJøÝð ð ð Ý$Ô6ØJØññôð ð øøøõ' t¨]Ñ;Ô;ш�Ý& t¨]Ñ;Ô;ш�ð 7õ Ô '¨Ñ 0Ô 0Ð 0Ð 0øÝð 7ð 7ð 7Ý$Ô.­s°1©v¬vÑ6Ô6Ð 6øøøøð 7øøøð" ×/Ò/°°kÀ7ÑKÔKÐð :Ý # D¨'Ð3CÑ DÔ DÐ Dõ%Ô0°Ñ9Ô9Ð 9øõð ð ð Ø ˆDð øøøð  ×/Ò/°°kÀ7ÑKÔKÐð @Ý#:¸4ÀÐJZÑ#[Ô#[Ð Ð øÝð @ð @ð @Ý$Ô.Ð/kØ1>ñ0?ñ@ô@ð @ð @øøøð(¨ Ô2ˆØ$ WÔ-ˆàÔ(×9Ò9Ø �-Ð-=¸mÔ-Lð:ñNôNÜNRð ð Ô ˜tÔ6Ò 6Ð 6Ý-¨d°MÑBÔB‰MˆC�Ý%Ø�hñ ô ‰KˆH�aõ&ØÕ'¨¨mÀSÐIÑIÔIÈ!ÔLñNôN‰KˆH�a�aà Ô  Ô!8Ò 8Ð 8Ý% d­B¬G¯LªLØÔ&Ô3ÔBÀGñ-Mô-MñNôN‰KˆH�aõ& d­B¬G¯LªLØÔ&Ô3ÔBÀGñ-Mô-MñNôN‰KˆH�a�aõ&Ñ'Ô'Ð 'å”'—,’,˜x¨Ñ,Ô,ˆÝ”'—,’,˜x¨Ñ,Ô,ˆå”g—o’o hÑ/Ô/ˆ åŒw�~Š~˜kÑ*Ô*ð %Ý ŒK˜ Ñ $Ô $Ð $åŒ �G˜WÑ%Ô%Ð%à ×*Ò*¨7°GÑ<Ô<Ð<à Ô ˜tÔ6Ò 6Ð 6Ø × GÒ GÈÐQXÐZaÐcjÑ kÔ kÐ kà Ô ˜tÔ6Ò 6Ð 6Ý)¨$° Ñ>Ô>‰IˆAˆvˆvØ Ô  Ô!8Ò 8Ð 8ØÔ*×6Ò6°t¸]ÑKÔKˆFˆFå%Ñ'Ô'Ð 'ØÔ,Ô9×EÒEÀhÐPTÐV\Ñ]Ô]ˆ Ø×(Ò(Ñ*Ô*Ô1ˆå,¨T°=À+ÑNÔNÈ|Ô\ˆ Ø Õ*Ò *Ð *å Ô # D¨-Ñ 8Ô 8Ð 8Ø(3°MÔ(B×(FÒ(FÐG[Ð]aÑ(bÔ(bÐ %Ý Ô ! $¨ °u¸dÔ>NÐPVÐaiØ/9¸.Ô/IØ5Nð Pñ Pô Pð Põ Ô   mÑ 4Ô 4Ð 4õ # 4¨¸ ÑDÔDÐDØ%/ˆ �MÑ"Ø Ô×5Ò5°d¸KÑHÔHÐHÐHÐHs?œ.®"AÁ:B B?Â!B:Â:B?ÃC?Ã? D Ä D Ä'D9Ä9"EcóX— |j|j|jfvr| |||¦«n2|j|jkr"t j |||d¦«nC#t jj $r,}|  t|¦«¦«cYd}~Sd}~wwxYwtS)a= Call selectorctl to relocate application from old_app_root to new_app_root :param user: application owner :param old_app_root: current application directory (current application name) :param new_app_root: new application directory (new application name) :return: json N) rDrIrHr>rJrQršÚrelocaterkrmr‘r]rÍ)rXrjÚ old_app_rootÚ new_app_rootrÏs r4r@zCloudlinuxSelectorLib.relocate<s½€ð :ØÔ DÔ$;¸TÔ=TÐ#UÐUÐUØ—’˜t \°<Ñ@Ô@Ð@Ð@ØÔ! TÔ%:Ò:Ð:åÔ(×1Ò1°$¸ ÀlÐTXÑYÔYÐYøøÝÔ&Ô<ð :ð :ð :Ø×1Ò1µ#°a±&´&Ñ9Ô9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9øøøøð :øøøåÐs‚AA"Á"B"Á6!BÂB"ÂB"cóú—d}tj |||¦«}tj |||¦«}tj |¦«}tj |¦«}tj |¦«} tj |¦«} | | tjz¦«r"| | tjz¦«st jd¦«‚||krdStj |¦«} tj  | ¦«stj | ¦«tj |tj tj ztjz¦«} tj| ¦«} t!j| j¦«st't(jd|¦«‚t!j| j¦«dz}n##t.$rtj| ¦«‚wxYwtj| d¦«5}tj |tjtjztjztj ztjz|¦«} tj|¦«}t!j|j¦«st't(jd|¦«‚tj||¦«n##t.$rtj|¦«‚wxYwtj|d¦«5}t=j||¦«ddd¦«n #1swxYwYddd¦«dS#1swxYwYdS)a :param old_doc_root: path to old doc root of application :param old_alias: old alias (uri) of application :param new_doc_root: path to new doc root of application :param new_alias: new alias (uri) of application :return: None rzInvalid application aliasNznot a regular fileiÿr«r¹) r}r›rrŸrOr°r×Ú WebAppErrorr*r r+r²r±r¡r©rµr³ÚS_ISREGr¶r¬r·ÚEINVALÚS_IMODEr¹rºÚfdopenr»r¼r½ÚfchmodrÚ copyfileobj)Ú old_doc_rootÚ old_aliasÚ new_doc_rootÚ new_aliasrÚold_htaccess_fileÚnew_htaccess_fileÚreal_oldÚreal_newÚreal_old_doc_rootÚreal_new_doc_rootÚnew_htaccess_pathÚsrc_fdÚsrc_stÚsrc_moderÚdst_fdÚdst_strs r4Ú_transit_htaccess_filez,CloudlinuxSelectorLib._transit_htaccess_filePs¤€ðˆåœGŸLšL¨°yÀ(ÑKÔKÐåœGŸLšL¨°yÀ(ÑKÔKÐå”7×#Ò#Ð$5Ñ6Ô6ˆÝ”7×#Ò#Ð$5Ñ6Ô6ˆÝœG×,Ò,¨\Ñ:Ô:ÐÝœG×,Ò,¨\Ñ:Ô:ÐØ×"Ò"Ð#4µr´vÑ#=Ñ>Ô>ð NØ×*Ò*Ð+<½r¼vÑ+EÑFÔFð Nõ %Ô0Ð1LÑMÔMÐ Mà �xÒ Ð Ø ˆFåœGŸOšOÐ,=Ñ>Ô>ÐÝŒw�}Š}Ð.Ñ/Ô/ð +Ý ŒKÐ)Ñ *Ô *Ð *õ”Ð*Ýœ¥r¤}Ñ4µr´|ÑCñEôEˆð Ý”X˜fÑ%Ô%ˆFÝ”< ¤Ñ/Ô/ð GÝ�eœlØ2Ð4EñGôGðGõ”| F¤NÑ3Ô3°eÑ;ˆHˆHøÝð ð ð Ý ŒH�VÑ Ô Ð Ø ð øøøõŒY�v˜tÑ $Ô $ð -¨Ý”WÐ.Ýœ[­2¬:Ñ5½¼ ÑBÝ!œ}ñ-Ý/1¬|ñ<à%ñ'ô'ˆFð Ýœ &Ñ)Ô)�Ý”| F¤NÑ3Ô3ðKÝ!¥%¤,Ø"6Ð8IñKôKðKõ ” ˜& (Ñ+Ô+Ð+Ð+øÝð ð ð Ý”˜Ñ Ô Ð Øð øøøõ”˜6 4Ñ(Ô(ð -¨CÝÔ" 3¨Ñ,Ô,Ð,ð -ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð# -ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -s]Æ-A$HÈ H2É AM0Ê AK>Ë=M0Ë> LÌM0Ì6MÍ M0ÍM ÍM0ÍM Í M0Í0M4Í7M4c óî—|j |¦«} t|||¦«}n5#t$r(t jd |¦«¦«‚wxYw| |||¦«} t|||¦«} n5#t$r(t jd |¦«¦«‚wxYw| d} | d} |€| ntj |¦«} |j   ||||¬¦«} |   ¦«j}||dtkru|| dd¦«}t#j||| |j |dd ||d |¬ ¦ « t#j||| | | |¬ ¦«t#j||¦«n|€| }| | | || ¦«| |d <|�||d<|j ||¦«dS)a› Change application URI :param user: application owner. unix like user name :param directory: directory with application. (app-root) :param alias: new alias (app-uri) for application or None if change only the domain :param new_doc_root: NEW doc_root to transit application to :param new_domain: NEW domain to transit application to :return: None z8No such application (or application not configured) "{}"rr Nrrr–TÚtransitr“r )rKrMr›rd)rMr!r(râr×r"rËr rØrÚ get_aliasrOr&rDrrr9rr.rrár[r/)rXrjrrMÚ new_domainrr0r³Ú apps_summaryÚold_app_summaryrLrKrNr<rr=s r4Ú_transitzCloudlinuxSelectorLib._transitžsf€ðÔ'×<Ò<¸TÑBÔBˆ ð Ý0°°yÀ+ÑNÔNˆJˆJøÝð ð ð Ý$Ô6ØJ×QÒQØñôñ ô ð ð øøøð ×+Ò+¨D°+¸yÑIÔIˆ ð JÝ5°d¸IÀ|ÑTÔTˆOˆOøÝð Jð Jð JÝ$Ô.ð7ß7=²v¸iÑ7HÔ7HñJôJð Jð Jøøøð$ GÔ,ˆ Ø& yÔ1ˆ Ø!& �I�IµKÔ4IÈ%Ñ4PÔ4Pˆ àÔ+×<Ò<Ø �)¨°iÔ)@ð=ñBôBˆ à×(Ò(Ñ*Ô*Ô1ˆà �yÔ ! ,Ô /Õ3DÒ DÐ DØ(3°IÔ(>×(BÒ(BÐCWÐY]Ñ(^Ô(^Ð %Ý Ô ! $¨ °9¸dÔ>NÐPVÐX\Ð^gØ%°J¸~Ô4NØ#<ð >ñ >ô >ð >õ Ô ˜T 9¨i¸ÐQ]ÐlxÐ yÑ yÔ yÐ yÝ Ô   iÑ 0Ô 0Ð 0Ð 0ðÐ#Ø+� Ø × 'Ò '¨ °iÀÈyÑ YÔ YÐ Yà )ˆ �9ÑØ Ð !Ø#-ˆJ�xÑ Ø Ô×5Ò5°d¸KÑHÔHÐHÐHÐHsœ.®2A Á;B  2B?có¸— |€d}n| ||¦«\}}|j|j|jfvr| |||||¦«nB|j|jkr$t j ||||¬¦«nt¦«‚nC#t j j $r,}|  t|¦«¦«cYd}~Sd}~wwxYwtS)aV Call selectorctl to transit application to new_app_uri :param user: application owner :param app_root: application directory (application name) :param new_app_uri: new uri or None if change only the domain :param new_domain: new domain or None if change only the app_uri :return: json Nr—)rarDrIrHrbrJrQršr]rêrkrmr‘r]rÍ)rXrjrcÚ new_app_urir_rMrerÏs r4r]zCloudlinuxSelectorLib.transitÓsú€ð :ØÐ!Ø#� � à"&×"KÒ"KÈDÐR\Ñ"]Ô"]‘��<ØÔ DÔ$;¸TÔ=TÐ#UÐUÐUØ— ’ ˜d H¨l¸JÈ ÑTÔTÐTÐTØÔ! TÔ%:Ò:Ð:ÝÔ(×0Ò0°°xÀÐWcÐ0ÑdÔdÐdÐdå)Ñ+Ô+Ð+øøÝÔ&Ô<ð :ð :ð :Ø×1Ò1µ#°a±&´&Ñ9Ô9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9øøøøð :øøøåÐs‚BBÂCÂ&!C ÃCà Ccóà—d}|r. | |¦«}n#tj$rd}YnwxYw|dkrtjd¦«‚|j ||j|¦«dS)zâ Install nodejs extensions to new nodejs environment and change symlink //node_modules to new environment. Raise exception `WebAppError` if npm will return non-zero code rr)z• —tj‰‰¦«‰‰ dd¦«}tj‰‰‰‰j‰‰‰d|¬¦«tj‰‰¦«‰ ‰‰d‰jz<‰j ‰‰¦«dS)Nr–r“r ú %s_version)rr-r9r.rDrárMr/) r=rr³rrrfr0rXrjr*s €€€€€€€€€r4Úactionz5CloudlinuxSelectorLib._change_version..actionDs·ø€å Ô # D¨)Ñ 4Ô 4Ð 4Ø(3°IÔ(>×(BÒ(BÐCWÐY]Ñ(^Ô(^Ð %Ý Ô ! $¨ °5¸$Ô:JÈFÐ]eØ/9¸.Ô/IØ5Nð Pñ Pô Pð Põ Ô   iÑ 0Ô 0Ð 0àFMˆK˜ Ô " <°$Ô2BÑ#BÑ CØ Ô × 9Ò 9¸$À Ñ LÔ LÐ LÐ LÐ Lr3)rdrrvz,An error occured during changing version. %sN)rMr!r(râr×r"rOr&r'rDÚas_dictÚ_create_environmentÚ_ensure_version_enabledrZrwrIrrrHrkrÚsummaryrÚ_get_info_about_webappÚcheck_response_from_webapprD)rXrjrr*rÊÚold_environmentÚnew_environmentÚinstalled_extensionsÚuser_summary_datarÚ app_domainrvrŒrr³rrfr0s```` @@@@@r4Ú_change_versionz%CloudlinuxSelectorLib._change_versions§øøøøøøøøø€ðÔ'×<Ò<¸TÑBÔBˆ ð Ý0°°yÀ+ÑNÔNˆJˆJøÝð ð ð Ý$Ô6ØJØññôð ð øøøð Ô/×@Ò@ÀÀyÑQÔQˆàð SØ#Ô(¨/×*EÒ*EÑ*GÔ*G×*OÒ*OÑ*QÔ*QÐRÐ RðÔ/×CÒCÀDÈ)ÐU\Ñ]Ô]ˆØ ×$Ò$ W¨dÑ3Ô3Ð3å" ?×#=Ò#=Ñ#?Ô#?Ñ@Ô@Ðà Ô ˜tÔ6Ò 6Ð 6Ø × ,Ò ,¨_Ð>RÑ SÔ SÐ SÐ SØ Ô  Ô!8Ò 8Ð 8Ø × ,Ò ,¨T°9¸oÐOcÑ dÔ dÐ dõ(Ô/°Ñ5Ô5ÐÝ-¨d°IÐ?PÑQÔQˆ ؘyÔ)ˆØ ×,Ò,Ñ.Ô.Ô5ˆØ Ô1×HÒHÈÐVZÑ[Ô[шˆzð Mð Mð Mð Mð Mð Mð Mð Mð Mð Mð Mð Mð Mðð ð kØÔ%×@Ò@Ø%ØØ!ðAñôðððøõ &Ô1ð kð kð kÝ(Ô4Ð5cÐfiÑ5iÑjÔjÐjøøøøð køøøð ˆF‰HŒHˆHˆHˆHs!¥7·"AÆ<GÇHÇ*HÈHcó4— |j|j|jfvrt‚|j|jkrM|j ||¦« dtj¦«}|tjkrddiS|j  ||¦«tkr|  ||||¬¦«n|  |||¦«tS#tjj$r,}| t%|¦«¦«cYd}~Sd}~wwxYw)ax Call selectorctl to change current interpreter version to new_version for application :param user: application owner :param app_root: application directory (application name) :param new_version: new nodejs interpreter version :param skip_web_check: skip check web application after change it's properties :return: json Ú app_versionr8zíThis application was created by too old version of python selector and we cannot change version without migration to the new application format. To do that you can use `cloudlinux-selector migrate` command or just click button in web UI.)rÊN)rDrHrIrêrMr¯r9r!ÚLEGACYÚget_app_statusrr‚Ú_change_version_for_stopped_apprÍrQrkrmr‘r])rXrjrcÚ new_versionrÊr„rÏs r4Úchange_versionz$CloudlinuxSelectorLib.change_version]s>€ð :ØÔ¨Ô(?ÀÔAXÐ'YÐYÐYÝ)Ð)ðÔ 4Ô#:Ò:Ð:Ø"Ô/×>Ò>¸tÀXÑNÔN×RÒRØ!Õ#9Ô#@ñBôB� àÕ"8Ô"?Ò?Ð?à ð#LðððÔ ×/Ò/°°hÑ?Ô?ÕCTÒTÐTØ×$Ò$ T¨8°[ÐQ_Ð$Ñ`Ô`Ð`Ð`ð×4Ò4°T¸8À[ÑQÔQÐQÝÐ øÝÔ&Ô<ð :ð :ð :Ø×1Ò1µ#°a±&´&Ñ9Ô9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9øøøøð :øøøs%‚A8CÁ;ACÃDÃ+!DÄ DÄDcó$—|j|jks|j|jkro| ||¦«} |j ||||¦«dS#t $r,}tjd  |¦«¦«‚d}~wwxYwdS)NzRUnable to set environment variables in htaccess file for the application.Error: {}) rDrIrHrgrMÚadd_env_vars_for_htaccessr¹r×rDrË)rXrjrcr’rfrŒs r4Úset_variables_for_litespeedz1CloudlinuxSelectorLib.set_variables_for_litespeed�s®€Ø Ô ˜tÔ6Ò 6Ð 6¸$Ô:JÈdÔNeÒ:eÐ:eØ×;Ò;¸DÀ(ÑKÔKˆHð ØÔ!×;Ò;¸DÀ(ÈHÐV^Ñ_Ô_Ð_Ð_Ð_øÝð ð ð Ý(Ô4ð ß &¢ s¡ ¤ ñôðøøøøð øøøð ;fÐ:es¸AÁ B Á!'BÂB c ó:—|j |¦«} t||| ¦«} n%#t$rt jd|z¦«‚wxYw|j|jkr8|�6| d|kr*| dtj krt j d¦«‚|�|| d<|�|| d<|�|| d<|�|  |¦«|| d<|�||   d ¦«ks|��j|�g||   d ¦«krN|| d <|j|jkr9|j  |||¦«} |j  ||| |¦«|� |d krdn|| d <|j  ||¦«} t#j|¦«} t||| ¦«}|d }|  ¦«j}|d }|d}t#j|¬¦«|€6|   d ¦«€!t#j||||j|||¬¦«n4t#j||||j|||   d ¦«|¬¦«t#j||¦«|j || ¦«| |||¦«dS)al Set application mode, environment variables and startup_file for application :param config_files: names of config files (such as requirements.txt or etc) :param entry_point: the specified entrypoint for application :param user: application owner. unix like user name :param directory: directory with application :param app_mode: expected application mode :param env_vars: dict with environment variables for application :param startup_file: main file for application :param passenger_log_file: Passenger log filename :return: None rNr’r„z¥Unable to set environment variables. Application was created too long time ago. Please, migrate your application to newer version before changing interpreter versionr˜r•rœr“rˆr–rr r)r)rfr–r )rMr!r(râr×r"rDrIr!r…rDržr9rOÚ_get_full_path_to_startup_fileÚ setup_wsgir&rrzrÚ _unconfigurer.rár/rŒ)rXrjrr˜r’r“r•rœr–r0Úapp_config_dataÚstartup_file_full_pathÚenvÚ user_summaryÚuser_app_summaryrrrfÚ htaccess_paths r4Ú_set_variablesz$CloudlinuxSelectorLib._set_variablesŒsB€ðÔ'×<Ò<¸TÑBÔBˆ ð Ý5°d¸IÀ{ÑSÔSˆOˆOøÝð ð ð Ý$Ô6ØJØññôð ð øøøð Ô ˜tÔ6Ò 6Ð 6ØÐ(Ø# JÔ/°8Ò;Ð;Ø# MÔ2Õ6LÔ6SÒSÐSÝ$Ô0ð6ñôð ð Ð Ø*2ˆO˜JÑ 'Ø Ð ð+3ˆO˜JÑ 'Ø Ð "Ø-8ˆO˜MÑ *Ø Ð #Ø × +Ò +¨LÑ 9Ô 9Ð 9Ø.:ˆO˜NÑ +Ø Ð #¨ ¸×8KÒ8KÈNÑ8[Ô8[Ò([Ð([Ø"Ñ.ØÐ'¨L¸O×� Ñ/àÔ# tÔ'>Ò>Ð>Ø-1Ô-B×-aÒ-aØØ!Ø$ñ.ô.Ð*ðÔ)×4Ò4°T¸9ÐF\Ð^iÑjÔjÐjà!Ð-ðASÐVXÒ@XÐ@X¸¸Ð^p�Ð 4Ñ5àÔ'×8Ò8¸¸yÑIÔIˆCÝ&Ô.¨tÑ4Ô4ˆLÝ6°t¸YÈ ÑUÔUÐ Ø$ WÔ-ˆEØ—_’_Ñ&Ô&Ô-ˆFØ'¨ Ô2ˆHØ,¨ZÔ8ˆMÝ Ô $¨mÐ <Ñ <Ô <Ð <àÐ#¨×(;Ò(;¸NÑ(KÔ(KÐ(SÝÔ% d¨I°u¸dÔ>NÐPVÐaiØ9KðMñMôMðMðMõÔ% d¨I°u¸dÔ>NÐPVÐaiØ3B×3FÒ3FÀ~Ñ3VÔ3VØ9KðMñMôMðMõ Ô˜D )Ñ,Ô,Ð,à Ô×5Ò5°d¸KÑHÔHÐHØ ×(Ò(¨¨y¸(ÑCÔCÐCÐCÐCs œ.®"Ac ó"—|�O ttj|¦«¦«} n.#ttf$r| d¦«cYSwxYwd} |j|j|jfvrA|j   ||¦«tkr|  |||| ||||¦«n|  |||| ||||¦«tS#tjj$r,} | t%| ¦«¦«cYd} ~ Sd} ~ wwxYw)ak Call selectorctl to set variables for application :param config_files: names of config files (such as requirements.txt or etc) (only for python) :param entry_point: the specified entrypoint for application (only for python) :param user: application owner :param app_root: application directory (application name) :param app_mode: application mode :param env_vars: json_string with environment variables for application :param startup_file: main file for application :param passenger_log_file: Passenger log filename :return: json Nz/wrong json format for environment variable list)rr5r8rÖr$r‘rDrHrIrMr†rr—Ú_set_variables_for_stopped_apprÍrQrkrmr]) rXrjrcr˜r’r“r•rœr–Úenv_dictrÏs r4Ú set_variablesz#CloudlinuxSelectorLib.set_variablesäs`€ð Ð ð iÝ,­T¬Z¸Ñ-AÔ-AÑBÔB��øÝ�zÐ*ð ið ið iØ×5Ò5Ð6gÑhÔhÐhÐhÐhð iøøøðˆHð :ØÔ DÔ$;¸TÔ=TÐ#UÐUÐUØÔ%×4Ò4°T¸8ÑDÔDÕHYÒYÐYØ×#Ò# D¨(°H¸hÈ ÐVaÐcoØ$6ñ8ô8ð8ð8ð×3Ò3°D¸(ÀHÈhÐXdØ4?ÀÐOañcôcðcåÐ øÝÔ&Ô<ð :ð :ð :Ø×1Ò1µ#°a±&´&Ñ9Ô9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9øøøøð :øøøs.„!&¦&AÁAÁA8CÃDÃ"!D ÄDÄ Dcóˆ— |j |¦«}|S#t$r}|j|jdœcYd}~Sd}~wwxYw)zÒ Retrieves info about all installed interpreters and user(s) applictions :param user: User name for read applictions. If None all users will be processed :return: Dict with info )rxrmN)rMÚget_applications_users_inforrlrm)rXrjÚ result_dictrÏs r4Úget_apps_users_infoz)CloudlinuxSelectorLib.get_apps_users_infosc€ð  ?ØÔ+×GÒGÈÑMÔMˆKØÐ øÝ ð ?ð ?ð ?Øœi°A´IÐ>Ð>Ð >Ð >Ð >Ð >Ð >Ð >øøøøð ?øøøs‚ž A¨<¶A¼Acó|—|j |¦«s!tj ||d¦«‚dS)z× Check whether particular interpreter version is enabled and raises exception if not :param username: user to include in exception :param new_version: new interpreter version zversion is not enabledN)rLÚis_version_enabledrQrÚUnableToSetAlternative)rXrˆrbs r4ryz-CloudlinuxSelectorLib._ensure_version_enabledsF€ðÔ$×7Ò7¸ ÑDÔDð rÝÔ)×@Ò@ÀÈ;ÐXpÑqÔqÐ qð rð rr3cót—| ||¦«|j ||¦«}|j |||d¦«}t | ¦«¦«}|j |||d¦«}|j|jkr|  ||||¦«n:|D]7} |  |¦«Œ#tj j j$rYŒ4wxYw|j |¦«} || |d|jz<|j || ¦«dS)z÷ Changes version for stopped application :param username: application owner :param app_root: application directory (application name) :param new_version: new nodejs interpreter version :return: None Nru)ryrMÚget_interpreter_version_for_apprOrxrZrwrDrHrkrorQrkrrnr!r/) rXrbrcrˆÚ old_versionr}rir~rqr³s r4r‡z5CloudlinuxSelectorLib._change_version_for_stopped_apps[€ð ×$Ò$ [°(Ñ;Ô;Ð;àÔ'×GÒGÈÐRZÑ[Ô[ˆ ØÔ/×CÒCÀHÈhÐXcÐeiÑjÔjˆÝ˜_×7Ò7Ñ9Ô9Ñ:Ô:ˆàÔ/×CÒCÀHÈhÐXcÐeiÑjÔjˆØ Ô ˜tÔ6Ò 6Ð 6Ø × ,Ò ,¨X°xÀÐR`Ñ aÔ aÐ aÐ að ,ð ð � ðØ#×5Ò5°iÑ@Ô@Ð@Ð@øÝÔ.Ô=ÔSðððØ�DðøøøðÔ&×;Ò;¸HÑEÔEˆ Ø@Kˆ �8Ô˜\¨DÔ,<Ñ<Ñ=Ø Ô×5Ò5°hÀ ÑKÔKÐKÐKÐKsÂ;CÃC-Ã,C-c óÆ—|j |¦«} |r || |d<|r || |d<|r*|| | d¦«kr || |d<|r || |d<|r | |¦«|| |d<|�|dkr || |d<n d| |d<|j || ¦«| |||¦«dS) a± Sets new app_mode, environment variables and startup file for stopped NodeJS application :param config_files: names of config files (such as requirements.txt or etc) (only for python) :param entry_point: the specified entrypoint for application (only for python) :param str username: application owner :param str app_root: application directory (application name) :param str app_mode: New application mode, can be None :param dict env_vars_dict: New environment variables, can be None :param startup_file: New startup file, can be None :param passenger_log_file: Passenger log filename :return: None r˜r’r“r•rœNrˆr–)rMr!r9ržr/rŒ) rXrbrcr˜Ú env_vars_dictr“r•rœr–r³s r4r™z4CloudlinuxSelectorLib._set_variables_for_stopped_app<s+€ðÔ&×;Ò;¸HÑEÔEˆ Ø ð 8Ø/7ˆJ�xÔ  Ñ ,Ø ð =Ø/<ˆJ�xÔ  Ñ ,Ø ð @˜L¨J°xÔ,@×,DÒ,DÀ^Ñ,TÔ,TÒTÐTØ3?ˆJ�xÔ  Ñ 0Ø ð >Ø2=ˆJ�xÔ  Ñ /Ø ð @Ø × +Ò +¨LÑ 9Ô 9Ð 9Ø3?ˆJ�xÔ  Ñ 0Ø Ð )Ð.@ÀBÒ.FÐ.FØ9KˆJ�xÔ Ð!5Ñ 6Ð 6à9=ˆJ�xÔ Ð!5Ñ 6Ø Ô×5Ò5°hÀ ÑKÔKÐKØ ×(Ò(¨°8¸]ÑKÔKÐKÐKÐKr3cól—tt| d¦«d¦«¦«S)z¯ Retrieves major version from full. If already short, return it with no difference :param version: Full/short :return: Short version as string r”r)r]r�r¯rVs r4Úget_major_version_from_shortz2CloudlinuxSelectorLib.get_major_version_from_short^s+€õ•3�w—}’} SÑ)Ô)¨!Ô,Ñ-Ô-Ñ.Ô.Ð.r3cóÖ—ttd¦« ¦« ¦«¦«}t ¦«}|D]}| |¦«ŒdS)z‘ Replace mysqli extension to nd_mysqli for defaults. Warning: only for PHP. See LVEMAN-1399 for details :return: rAN)rÃrÚget_all_alternatives_datar[rÚlist_extensions)Úalt_php_versions_listÚ cl_ext_selectÚ alt_php_vers r4Úreplace_mysqliz$CloudlinuxSelectorLib.replace_mysqligsi€õ!%¥X¨e¡_¤_×%NÒ%NÑ%PÔ%P×%UÒ%UÑ%WÔ%WÑ XÔ XÐÝ#™ œ ˆ Ø0ð 7ð 7ˆKà × )Ò )¨+Ñ 6Ô 6Ð 6Ð 6ð 7ð 7r3cóÜ—tjddg¦«tjddg¦«tjgd¢¦«tjdg¦«| ¦«dS)zf Setup php selector for work (suggested to use after native php is installed) Ú cagefsctlz--force-updatez --remount-all)r=zmake-defaults-configz--jsonrtrAz//usr/share/l.v.e-manager/utils/cache_phpdata.pyN)rÚ check_outputr°)Úclss r4Úsetup_selectorz$CloudlinuxSelectorLib.setup_selectorvsˆ€õ Ô Ð.>Ð ?Ñ@Ô@Ð@ÝÔ ¨oÐ >Ñ?Ô?Ð?ÝÔð!Cð!Cð!Cñ Dô Dð DåÔÐ!RÐ SÑTÔTÐTØ ×ÒÑÔÐÐÐr3có—|j|jkrt‚tj¦«rt S |j ¦«t S#t$r,}|  t|¦«¦«cYd}~Sd}~wwxYw)zn Scan users home dirs for .htaccess files and import applications to new config file. N) rDrIrêr{r~rÍrMÚ$import_legacy_applications_to_configr¹r‘r])rXrÏs r4Úrun_import_applicationsz-CloudlinuxSelectorLib.run_import_applicationsƒs—€ð Ô ˜tÔ6Ò 6Ð 6Ý%Ð %å Œ\‰^Œ^ð ÝÐ ð :Ø Ô × BÒ BÑ DÔ DÐ DÝÐ øÝð :ð :ð :Ø×1Ò1µ#°a±&´&Ñ9Ô9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9øøøøð :øøøs³AÁ B Á!BÁ>B ÂB cóÖ—|r$| dd¦«t d…nd}|rt d|||¦«nt d||¦«d||dœS) aˆWhat to say when the migration helper said nothing. `ineligible` is a verdict about the application -- it cannot be migrated -- and the caller prints it to the administrator as one. A helper the OOM killer took, one that could not be launched, or one that printed a traceback made no such finding, and reporting its silence as a verdict hides a server fault behind an application one. `unknown` is not in the caller's success set either, so the exit code is unchanged; what changes is that the cause is named and the helper's own stderr reaches the log instead of /dev/null. úutf-8ríNrˆz%s (exit %s): %sz %s (exit %s)Úunknown)ÚstateÚreasonr)rÚMIGRATION_STDERR_TAILÚMIGRATION_LOGGERr�)r½rrÚtails r4Ú_unknown_migration_resultz/CloudlinuxSelectorLib._unknown_migration_result“s…€ððˆv�}Š}˜W iÑ0Ô0Õ2GÐ1GÐ1HÐ1HÔIÐIØð à ð GÝ × "Ò "Ð#5°v¸zÈ4Ñ PÔ PÐ PÐ På × "Ò " >°6¸:Ñ FÔ FÐ FØ"¨fÀJÐOÐOÐOr3có—|j|jk�r;tj¦«dkrdddœSddd|d|g}|r| d ¦«|r| d ¦« t j|t jt j¬ ¦«}n=#tt j f$r$}|  d |zd d¦«cYd }~Sd }~wwxYw tj |j  d¦«¦«}n#tt f$rd }YnwxYwt#|t$¦«r|S|  d|j|j¦«S|j|jkrt-d¦«‚|j ||¦«t2S)z_ Convert applications created in older selector versions to new format rÚ ineligiblez"Node.js migration must run as root)r¼r½z9/usr/share/l.v.e-manager/utils/cloudlinux-bun-delivery.pyÚmigraterrz --app-rootz--skip-web-checkz --dry-run)rrz)Bun migration helper could not be run: %sNr3rºz1Bun migration helper returned no parseable resultz/Migration is only available for python selector)rDrHr}r~rërÚrunrr¬ÚSubprocessErrorrÁr5r8rrÚ UnicodeErrorr$rurvrrrIrêrMÚmigrate_applicationrÍ) rXrjrcrÊÚdry_runÚcommandÚprocessÚexcrxs r4Úrun_migrate_applicationz-CloudlinuxSelectorLib.run_migrate_application¨só€ð Ô ˜tÔ6Ò 6Ñ 6ÝŒz‰|Œ|˜qÒ Ð Ø!-Ø"FðHðHðHàRØ  (¨D°,ÀðJˆGàð 3Ø—’Ð1Ñ2Ô2Ð2Øð ,Ø—’˜{Ñ+Ô+Ð+ð õ%œ.Ø¥J¤OÝ%œ?ð,ñ,ô,��øõ�ZÔ7Ð8ð ð ð Ø×5Ò5Ø?À#ÑEؘ#ñôððððððøøøøð øøøð Ýœ G¤N×$9Ò$9¸'Ñ$BÔ$BÑCÔC��øÝ ¥*Ð-ð ð ð Ø���ð øøøå˜&¥$Ñ'Ô'ð ð� Ø×1Ò1ØCØÔ" G¤Nñ4ô4ð 4ð Ô ˜tÔ6Ò 6Ð 6Ý%ð'<ñ=ô=ð =ð Ô×-Ò-¨d°HÑ=Ô=Ð=ÝÐs0Á%+BÂC Â'CÃC ÃC Ã,C<Ã<DÄD)NNrÛ)rŸ)NNNNNNN)NNF)NNFNr2NN)NF)FF)Ur/r0r1rYr^rgÚ staticmethodrar{rr„r‡r�r‘ržrÆrÑrÖrÙrÜrßrãrår÷rîrír'r3r<r>rBrÝrFrHrRrernrYrsr]rrvrvryrÎrƒr…r�rœr¤r¶rÁrÅrÌrÓrÛrßrârærþr rr>r@r[rbr]rkrrr‚r‰rŒr—r›rŸryr‡r™r©r°Ú classmethodrµr¸rÁrÍr2r3r4r;r;_sø€€€€€ð 1ð 1ð 1ðD Að Að Aðððð ð.,ð.,ð.,ñ„\ð.,ð`ððñ„\ðð.ð!ð!ñ„\ð!ð ðððñ„\ððð ð ð ñ„\ð ðððñ„\ðð ð ð ð ñ„\ð ðð ð ñ„\ð ðð! ð! ð! ñ„\ð! ðF"ð"ð"ðHððñ„\ðð nðnðnð)ð)ð)ðððñ„\ðð ððñ„\ððððð %ð%ð%ð%ðNððñ„\ððð,ð,ð,ñ„\ð,ð\7ð7ð7ð7ð ððñ„\ðð*ððð*HðHðHðHð 4ð 4ð 4ð2ð2ð2ð:ð:ð:ð6ð6ð6ðððð0*Lð*Lð*LðX ð ð ð ð ð ð ð ð ð ð ¨ð °gÀ±nð ÐPTð ð ð ð ð8ð8ð8ðððð 𠨨c°3¨h¬ð À#ð ÐPWÐZ^ÑP^ð Ðjnð ð ð ð ððððððððBHLØimð*ð*ð*ð*ðXððñ„\ðð$6Nð6Nð6Nð6Nðp/Nð/Nð/Nð/Nðbððñ„\ðððððð4PUØCGØ&*ð5ð5ð5ð5ðn"ð"ð"ðH:ð:ð:ð(:ð:ð:ð,:ð:ð:ð,ðJðJñ„\ðJð,%ð%ð%ðNð $ð $ñ„\ð $ðDpIðpIðpIðdððð(ðK-ðK-ñ„\ðK-ðZ3Ið3Ið3Ið3Iðjðððð0\ð\ð\ð&ððñ„\ðð6AðAðAðAðF":ð":ð":ðH ð ð ðVDðVDðVDðp :ð :ð :ðD ?ð ?ð ?ð ?ðrðrðrðLðLðLð@ Lð Lð LðDð/ð/ñ„\ð/ðð 7ð 7ñ„\ð 7ðð ð ñ„[ð ð:ð:ð:ð ðPðPñ„\ðPð(FKØ(-ð*ð*ð*ð*ð*ð*r3r;)aÚ __future__rrrrr-r·rìr5Úloggingr}rr�rŠrr³rrïrñÚtypingrÚ future.utilsrÚ cldetectlibr{Úclselect.clselectctlnodejsuserrQÚclselect.clselectexceptÚclselect.clselectctlpythonÚclselect.clselectctlrubyÚclselect.clselectpythonuserÚclselect.clselectnodejsuserÚclcommon.clexceptionrÚclcommon.clpwdr Úclcommon.cpapir r Úclcommon.cpapi.cpapiexceptionsr r rÚ cllimits.librrrrrrÚclselect.baseclselectrrrrrÚclselect.clselectctlphprrrr×Úclselect.clselectnodejsrÚclselect.modelsrÚ$clselect.clselectnodejs.node_managerr rTr!r"Ú&clselect.clselectpython.python_managerr#Ú(clselect.clselectpythonuser.environmentsr$ÚPythonEnvironmentÚ(clselect.clselectnodejsuser.environmentsÚNodeJsEnvironmentÚclselect.utilsr%r&r'r(r)r*Úsecureior+Úclconfig.ui_config_libr,r-r6rÍÚ getLoggerr/r¿r¾Úobjectr;r2r3r4úrïs ðð&Ð%Ð%Ð%Ð%Ð%ØÐÐÐÐÐØ&Ð&Ð&Ð&Ð&Ð&Ø € € € ØÐÐÐØ € € € Ø € € € Ø € € € Ø€€€Ø € € € Ø€€€Ø € € € Ø € € € Ø € € € Ø € € € ØÐÐÐØ € € € ØÐÐÐàÐÐÐÐÐØ"Ð"Ð"Ð"Ð"Ð"àÐÐÐØ%Ð%Ð%Ð%ØÐÐÐØ!Ð!Ð!Ð!ØÐÐÐØ"Ð"Ð"Ð"Ø"Ð"Ð"Ð"à3Ð3Ð3Ð3Ð3Ð3Ø8Ð8Ð8Ð8Ð8Ð8Ø+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØPÐPÐPÐPÐPÐPÐPÐPÐPÐPØ%Ð%Ð%Ð%Ð%Ð%Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ØgÐgÐgÐgÐgÐgÐgÐgÐgÐgÐgÐgØ<Ð<Ð<Ð<Ð<Ð<Ø9Ð9Ð9Ð9Ð9Ð9Ð9Ð9ØHÐHÐHÐHÐHÐHØ5Ð5Ð5Ð5Ð5Ð5Ø#Ð#Ð#Ð#Ð#Ð#Ø<Ð<Ð<Ð<Ð<Ð<ðððððððððAÐ@Ð@Ð@Ð@Ð@ØUÐUÐUÐUÐUÐUØUÐUÐUÐUÐUÐUðððððððððððððððððÐÐÐÐÐØDÐDÐDÐDÐDÐDÐDÐDð ð ð ð ð Ð'ñ ô ð ð ð ð ð ð ˜^ñ ô ð ð˜Ð€ ð %�7Ô$ XÑ.Ô.ÐØÐðsðsðsðsðs˜Fñsôsðsðsðsr3