§ À•¿jÌ2ãó —ddlmZddlmZddlmZddlZddlZddlZddlmZddl Z ddl Z ddl Z ddl mZddlmZdd lmZdd lmZmZdd lmZmZdd lmZdd lmZddlmZddlm Z ddl!m"Z"ddl m#Z#mZgd¢Z$edd¦«Z%edd¦«Z&ej'd¦«Z(d„Z)d„Z*d„Z+d„Z,d„Z-d%d„Z.d„Z/d„Z0d%d „Z1d!„Z2d"„Z3d#„Z4d$„Z5dS)&é)Úabsolute_import)Úprint_function)ÚdivisionN)Ú namedtuple)ÚList)Ú iteritemsé)Ú clpassenger)ÚcpusersÚ getCPName)Údrop_privilegesÚClPwd)Úis_no_php_binaries_on_cpanel)ÚClSelectExcept)Ú NodeManager)Ú PythonManager)Ú get_abs_rel)ÚOptionalr)Ú public_htmlÚrubyvenvÚ virtualenvz .cl.selectorz.cagefsÚwwwÚnodevenvÚApplicationSummary©ÚuserÚversionÚdoc_rootÚ interpreterÚ app_statusÚInterpreterSummary©rÚ version_fullÚenabledÚ installedz \A[-\w./]*\Zcó®—|std¦«‚d|vrtd¦«‚tj |¦«rtd¦«‚|ddkrtd¦«‚d| d¦«vrtd ¦«‚|t vrtd |z¦«‚t jd |¦«}|€td ¦«‚dS) NzDirectory must not be emptyú z#Directory should not contain spacesz+Directory should be relative to user's homeéÿÿÿÿú/z-Directory should not contain a trailing slashú..z(Directory must not contain ".." segmentszDirectory "%s" not allowedz\A[-\.\w\/]+\Zz*Directory name contains invalid characters)Ú ValueErrorÚosÚpathÚisabsÚsplitÚDISABLED_DIRECTORY_NAMESÚreÚmatch)Ú directoryÚ all_valids úK/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/clselectctl.pyÚcheck_directoryr6(sî€Ø ð8ÝÐ6Ñ7Ô7Ð7Ø ˆiÐÐÝÐ>Ñ?Ô?Ð?Ý „w‡}‚}�YÑÔðIÝÐGÑHÔHÐHØ�„}˜ÒÐÝÐHÑIÔIÐIð ˆy�Š˜sÑ#Ô#Ð#Ð#ÝÐCÑDÔDÐDØÕ,Ð,Ð,ÝÐ5¸ ÑAÑBÔBÐBÝ”Ð*¨IÑ6Ô6€IØÐÝÐEÑFÔFÐFðÐócóÞ—|dvrdSt |¦«std¦«‚d| d¦«vsd|vrtd¦«‚| d¦«S)N)ú.Úr:zAlias is not validr*r)z./)ÚALIAS_VALID_REr2r+r/Ústrip)Úaliass r5Ú get_aliasr><sy€à � ÐÐØˆrÝ × Ò  Ñ &Ô &ð/ÝÐ-Ñ.Ô.Ð.ð ˆu�{Š{˜3ÑÔÐР4¨5 = =ÝÐ-Ñ.Ô.Ð.Ø �;Š;�sÑ Ô Ðr7cóV—| dd¦« dd¦«S)NÚ_r)z//©Úreplace)Úprefixs r5Ú get_directoryrDMs&€Ø �>Š>˜#˜sÑ #Ô #× +Ò +¨D°#Ñ 6Ô 6Ð6r7cóV—| dd¦« dd¦«S)Nr@Ú__r)rA)r3s r5Ú get_prefixrGQs(€Ø × Ò ˜S $Ñ 'Ô '× /Ò /°°SÑ 9Ô 9Ð9r7cóŒ—|s,tj¦«}tj|¦«j}|dkrt d¦«‚|S)NÚrootz8User parameter must be specified if current user is root)r,ÚgeteuidÚpwdÚgetpwuidÚpw_namer+)rÚ current_euids r5Úget_userrOUsD€Ø ð2Ý”z‘|”|ˆ ÝŒ|˜LÑ)Ô)Ô1ˆØ ˆv‚~€~ÝÐSÑTÔTÐTØ €Kr7cóÄ—|dvrtj |¦«Stj |¦«otj |¦«S)zë Application is valid only if binary and app_root exists :param binary_path: path to binary in virtual environment :param app_root: path to root directory of application :return: result of checking :rtype: bool ©ÚnodejsÚpython)r,r-ÚisdirÚisfile)rÚapp_rootÚ binary_paths r5Ú_verify_applicationrX^sK€ðÐ*Ð*Ð*ÝŒw�}Š}˜XÑ&Ô&Ð&Ý Œ7�>Š>˜+Ñ &Ô &Ð B­2¬7¯=ª=¸Ñ+BÔ+BÐBr7c óÈ—d}g}tj¦«}t¦«D�]:} tj¦«r@ddlm}||d¬¦«f}ttdtd„|¦«¦«¦«}t|¦«5tj |¦«|  t|||¦«¦«ddd¦«n #1swxYwYŒ·#tj$rYŒÈt"$rht%jt(¦«}| d||t-j¦«t1t-j¦«¦«fz¦«Y�Œ8wxYw|S)z8Find and return all apps for given interpreter on serverNr)Ú userdomainsT)Úas_rootcó—|r|dndS)Nr©)Úxs r5úz-server_applications_summary..~s€¨aÐ&9 a¨¤d d°T€r7ú]DEBUG: user %s present in panel but doesn't exist in system. Process euid=%d. Trace: %s at %s)r,rJr ÚdetectÚis_daÚ"clcommon.cpapi.plugins.directadminrZÚlistÚfilterÚmapr rKÚgetpwnamÚextendÚ _user_applications_short_summaryrÚNoSuchUserExceptionÚKeyErrorÚloggingÚ getLoggerÚ__name__ÚerrorÚ tracebackÚ format_excÚstrÚ extract_stack)rÚ domains_dataÚ applicationsÚeuidrrZÚ domains_listÚloggers r5Úserver_applications_summaryryksú€ð€Là€Lå Œ:‰<Œ<€DÝ‘ ” ð_ñ_ˆð _ÝŒ|‰~Œ~ð àJÐJÐJÐJÐJÐJØ*˜{¨4¸Ð>Ñ>Ô>Ð?� Ý#ÝØÝØ9Ð9Ø(ñôñôñ ô � õ! Ñ&Ô&ð Wð Wå” ˜TÑ"Ô"Ð"Ø×#Ò#Ý4°T¸;È ÑUÔUñWôWðWð Wð Wð Wñ Wô Wð Wð Wð Wð Wð Wð Wøøøð Wð Wð Wð Wøøõ Ô(ð ð ð Ø ˆHÝð _ð _ð _õÔ&¥xÑ0Ô0ˆFØ �LŠLÐxØ ¥iÔ&:Ñ&<Ô&<½cÅ)ÔBYÑB[ÔB[Ñ>\Ô>\Ð]ñ^ñ _ô _ð _ð _ñ _ð  _øøøð Ðs=ªA"C 9Cà CÃC ÃCÃC ÃCÃEÃ.A-EÅEc ól—ddlm}g}tj¦«}t ¦«D�]} t |¦«5|¦«}t j|¦«} | |¦«}n #tj $rYddd¦«ŒewxYwt|¦«D]ñ\}} t||¦«\} } n#tj $rYŒ+wxYwtd| ¦«sŒ@t||d|dd|d¬¦«} t|¦«} d tj |j|j||dd d ¦«i| d <| ||| ¦«} | | |  d ¦«duf¦«Œò ddd¦«n #1swxYwY�Œ„#t.j$rY�Œ–t2$rht5jt8¦«}| d||t=j¦«tAt=j!¦«¦«fz¦«Y�ŒwxYw|S)aŒReturn Node application summaries and active-marker state in one scan. This is a narrow collector API for ``cloudlinux-summary``. The regular selector summary and the Shared Store aggregate otherwise read every account config independently. Keep the established ``ApplicationSummary`` shape and return the optional state beside it so existing consumers are unaffected. r ©ÚApplicationsManagerNrRÚnodejs_versionÚdomainr rÚ activate_pathÚbinÚactivaterÚactiveTr`)"Úclselectnodejs.apps_managerr|r,rJr r rKrgÚget_user_config_datarÚ WrongDatarrrXrÚdictr-ÚjoinÚpw_dirÚVENV_DIRÚ_shared_node_modules_statusÚappendÚgetrrjrkrlrmrnrorprqrrrs)r|rurvrÚmanagerÚ user_pw_entryÚ config_dataÚappÚdatarVÚ_resolved_app_rootÚ applicationÚ status_dataÚ shared_statusrxs r5Ú-server_nodejs_applications_with_shared_statusr–•s)€ðAÐ@Ð@Ð@Ð@Ð@à€LÝ Œ:‰<Œ<€DÝ‘ ” ð.5ñ.5ˆð- 5Ý  Ñ&Ô&ð# Lð# LØ-Ð-Ñ/Ô/�Ý #¤ ¨TÑ 2Ô 2� ðØ")×">Ò">¸tÑ"DÔ"D�K�KøÝ%Ô/ðððØð # Lð# Lð# Lñ# Lô# Lð# Lð# Lð øøøå!*¨;Ñ!7Ô!7ðLðL‘I�C˜ð!Ý7BÀ4ÈÑ7MÔ7MÑ4˜Ð"4Ð"4øÝ)Ô3ð!ð!ð!Ø ˜ð!øøøå.¨x¸ÑBÔBð!Ø Ý"4Ø!Ø $Ð%5Ô 6Ø!% h¤Ø$,Ø#'¨ Ô#5ð #ñ#ô#�Kõ#' t¡*¤*�Kà'­¬¯ªØ)Ô0Ø#Ô,ØØ Ð!1Ô2Ø!Ø&ñ *ô*ð 1�K  Ñ-ð%,×$GÒ$GØ% s¨Kñ%9ô%9�Mà ×'Ò'Ø$ m×&7Ò&7¸Ñ&AÔ&AÀTÐ&IÐJñLôLðLðLð7Lð# Lð# Lð# Lñ# Lô# Lð# Lð# Lð# Lð# Lð# Lð# Løøøð# Lð# Lð# Lð# LùøõHÔ(ð ð ð Ø ‰HÝð 5ð 5ð 5ÝÔ&¥xÑ0Ô0ˆFØ �LŠLð;à˜$¥ Ô 4Ñ 6Ô 6Ý� Ô/Ñ1Ô1Ñ2Ô2ð>4ñ4ñ 5ô 5ð 5ð 5ñ 5ð 5øøøð ÐsŠ®F.½F!ÁA3Á2F!Á3BÂF! F.ÂBÂF!Â(B<Â;F!Â<C à F!à C ÃCF!Æ F.Æ!F% Æ%F.Æ(F% Æ)F.Æ.H1ÇA-H1È0H1c #óBK—|}|dvrÄ |dkrddlm}nddlm}|¦« |¦«}n#tj$rYdSwxYwt |¦«D]j\}} t||¦«\}} n#tj$rYŒ+wxYwt||¦«r+t||d|z|d||d¬ ¦«V—ŒkdSt tj ||¬ ¦«¦«D]®\} }|d |krŒ|d |d }} t||| ¦«r{tj  tj  tj  | ¦«¦«¦«} t|| |d|d d¬ ¦«V—Œ¯dS)a‡ Return generator with all applications for given user and interpreter. To increase performance, only a small part of the information about the applications is given. :param user: name of panel user :param interpreter: name of interpreter (python, ruby, etc) :param domains_docroots_data: total data about users domains :return: Generator[ApplicationSummary] rQrRr r{Nz %s_versionr~r r)Úuserdomains_datarÚbinaryr3ÚdocrootÚstarted)rƒr|Úclselectpython.apps_managerr„rr…rrrXrr Úsummaryr,r-ÚbasenameÚdirname) rrÚdomains_docroots_datar˜r|r�r�r‘rVr@Údummyr™Ú it_versions r5ririÔs5èè€ð-ÐàÐ*Ð*Ð*ð Ø˜hÒ&Ð&ØLÐLÐLÐLÐLÐLÐLàLÐLÐLÐLÐLÐLà-Ð-Ñ/Ô/×DÒDÀTÑJÔJˆKˆKøÝÔ'ð ð ð Ø ˆFˆFð øøøå" ;Ñ/Ô/ð ð ‰IˆC�ð Ý)¨$°Ñ4Ô4‘ �˜!˜!øÝ!Ô+ð ð ð Ø�ð øøøå" ;°Ñ9Ô9ð Ý(ØØ  ° Ñ!;Ô<Ø! (œ^Ø +Ø# LÔ1ð ñôðððøð ð õ%¥[Ô%8¸ÐP`Ð%aÑ%aÔ%aÑbÔbð `ð `‰KˆE�4Ø�MÔ" kÒ1Ð1Øð $ Hœ~¨t°KÔ/@�HˆFÝ" ;°¸&ÑAÔAð `ÝœW×-Ò-­b¬g¯oªo½b¼g¿oºoÈfÑ>UÔ>UÑ.VÔ.VÑWÔW� Ý(¨d¸JÐQUÐV_ÔQ`Ø59¸-Ô5HÐU^ð`ñ`ô`ð`ð`ð`øð `ð `s!Š0;»AÁ AÁ&A:Á:B  B cój—|dkrt¦«jS|dkrt¦«jSdS)z-Return default version for given interpreter rRrSN)rÚdefault_versionr)rs r5Úget_default_versionr¥s7€à�hÒÐ݉}Œ}Ô,Ð,Ø�hÒÐ݉ŒÔ.Ð.Ø ˆ4r7c#óK—|dkr#t¦« d¬¦«}n7|dkr#t¦« d¬¦«}nt¦«‚t |d¦«D]’\}}|ddk}|dkr6t t | d¦«d ¦«¦«}n0d | d¦«d d …¦«}t|||d¬ ¦«V—Œ“d S) z.Return generator for interpreters all versionsrRT)Úinstalled_interpreters_onlyrSÚavailable_versionsÚstatusr$r9rNér") rÚ get_summaryrÚNotImplementedErrorrrrÚintr/r‡r!)rÚ interpretersrÚ version_infor$Ú major_versions r5Ú_iter_interpretersr±sèè€à�hÒÐÝ"‘}”}×0Ò0ÈTÐ0ÑRÔRˆ ˆ Ø ˜Ò Ð Ý$‘”×2Ò2ÈtÐ2ÑTÔTˆ ˆ å!Ñ#Ô#Ð#Ý!*¨<Ð8LÔ+MÑ!NÔ!Nðoðoш�ؘxÔ(¨IÒ5ˆØ ˜(Ò "Ð "奠G§M¢M°#Ñ$6Ô$6°qÔ$9Ñ :Ô :Ñ;Ô;ˆMˆMð ŸHšH W§]¢]°3Ñ%7Ô%7¸¸¸Ô%;Ñ<Ô<ˆMÝ ¨ÀWÐV]ÐimÐnÑnÔnÐnÐnÐnÐnðoðor7c #ó´K—ddlm}|¦«}| ¦«}|D].\}}}t||d| |¦«¬¦«V—Œ/dS)zf Return generator with all PHP versions on server. :return: Generator[InterpreterSummary] r )ÚClSelectT©r%r$N)Úclselectr³Úlist_alternativesr!Úis_version_enabled)r³ÚphpÚversionsrÚ full_versionr@s r5Ú_iter_php_interpretersr»!s”èè€ð #Ð"Ð"Ð"Ð"Ð"Ø ˆ(‰*Œ*€CØ×$Ò$Ñ&Ô&€HØ$,ð5ð5Ñ ˆ�˜qÝ Ø �\¨TØ×*Ò*¨7Ñ3Ô3ð5ñ5ô5ð 5ð 5ð 5ð 5ð5ð5r7c ór—|dkr=t¦«dkrt¦«rgStt¦«¦«S|dkrddlm}n'|dvrtt |¦«¦«St‚g}|¦«D]2}| t|j |j dd¬¦«¦«Œ3|S) zrDrGrOrXryr–rir¥r±r»rÂr]r7r5úrÐs�ðð'Ð&Ð&Ð&Ð&Ð&Ø%Ð%Ð%Ð%Ð%Ð%ØÐÐÐÐÐØ € € € Ø € € € Ø € € € Ø"Ð"Ð"Ð"Ð"Ð"Ø€€€ØÐÐÐàÐÐÐØÐÐÐÐÐØ"Ð"Ð"Ð"Ð"Ð"àÐÐÐÐÐà-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ø1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ØFÐFÐFÐFÐFÐFØ*Ð*Ð*Ð*Ð*Ð*Ø4Ð4Ð4Ð4Ð4Ð4Ø8Ð8Ð8Ð8Ð8Ð8ØÐÐÐÐÐØ!Ð!Ð!Ð!Ð!Ð!Ð!Ð!àrÐrÐrÐØ�ZÐ 4Ð6rÑsÔsÐØ�ZÐ 4Ð6iÑjÔjÐà�”˜OÑ,Ô,€ðGðGðGð(ððð"7ð7ð7ð:ð:ð:ðððð Cð Cð Cð Cð'ð'ð'ðT<ð<ð<ð~.`ð.`ð.`ð.`ðbðððoðoðoð& 5ð 5ð 5ðððððr7