§ WèÄj]=ãóÚ—dZddlZddlZddlZddlZddlmZddlmZddl m Z ddl Z ddl m ZddlmZmZdd lmZmZmZdd lmZdd lmZdd lmZmZmZd dlmZGd„de¦«Z dS)zS This module contains classes implementing X-Ray Manager behaviour for DirectAdmin éN)ÚChainMap)Úglob)ÚClassVar)Úgettext)Ú phpinfo_utilsÚ probe_targetsé)ÚXRayManagerErrorÚXRayManagerExitÚXRayMissingDomain)ÚFPMReloadController)Ú DomainInfo)Úget_xray_exec_userÚuser_mode_verificationÚwith_fpm_reload_restrictedé)Ú BaseManagercó�‡—eZdZUdZdZdZdZdZdZddd d d d d dddddddddœZ e e e d<de fd„Zdedefd„Zede fd„¦«Zede fd„¦«Zede fd„¦«Zede fd„¦«Zede fd „¦«Zede fd!„¦«Zeed"edefd#„¦«¦«Zd$edefd%„Zd&edefd'„Zd$edd(fˆfd)„ Z ˆxZ!S)*ÚDirectAdminManagerzG Class implementing an X-Ray manager behaviour for DirectAdmin z//usr/local/directadmin/custombuild/options.confz2/usr/local/directadmin/data/users/*/domains/*.confz8/usr/local/directadmin/data/users/*/domains/*.subdomainsz6/usr/local/directadmin/data/users/*/domains/*.pointerszI/usr/local/directadmin/data/users/*/domains/*.subdomains.docroot.overridez/usr/local/php54/lib/php.conf.dz/usr/local/php55/lib/php.conf.dz/usr/local/php56/lib/php.conf.dz/usr/local/php70/lib/php.conf.dz/usr/local/php71/lib/php.conf.dz/usr/local/php72/lib/php.conf.dz/usr/local/php73/lib/php.conf.dz/usr/local/php74/lib/php.conf.dz/usr/local/php80/lib/php.conf.dz/usr/local/php81/lib/php.conf.dz/usr/local/php82/lib/php.conf.dz/usr/local/php83/lib/php.conf.dz/usr/local/php84/lib/php.conf.dz/usr/local/php85/lib/php.conf.dz/usr/local/php86/lib/php.conf.d)Úphp54Úphp55Úphp56Úphp70Úphp71Úphp72Úphp73Úphp74Úphp80Úphp81Úphp82Úphp83Úphp84Úphp85Úphp86Ú VERSIONS_DAÚreturncó6—t|j|j¦«S)zœ Get supported PHP versions :return: a chained map with basic supported versions and DirectAdmin supported versions )rÚVERSIONSr%)Úselfs úO/opt/cloudlinux/venv/lib64/python3.11/site-packages/xray/manager/directadmin.pyÚsupported_versionsz%DirectAdminManager.supported_versions<s€õ ˜œ  tÔ'7Ñ8Ô8Ð8óÚfilenamecóJ‡—ˆfd„} t‰|¦«¬¦«5}d„|D¦«cddd¦«S#1swxYwYdS#t$rQ}|j d‰t |¦«dœ¬¦«t t d¦«‰z¦«|‚d}~wwxYw) z~ Read lines from file :param filename: a name of file to read :return: list of stripped lines có°•—t‰d¦«5}tj| ¦«¦«}ddd¦«n #1swxYwY|dS)z0 Retrieve file encoding ÚrbNÚencoding)ÚopenÚchardetÚdetectÚread)ÚfÚresultr-s €r*Úget_file_encodingz.get_file_encodingKs‰ø€õ�h Ñ%Ô%ð 2¨Ý œ¨¯ª©¬Ñ1Ô1�ð 2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2à˜*Ô%Ð %s’'AÁA Á A )r1có6—g|]}| ¦«‘ŒS©©Ústrip)Ú.0Úlines r*ú z5DirectAdminManager.file_readlines..Us €Ð3Ð3Ð3¨˜Ÿ š ™ œ Ð3Ð3Ð3r,NzFailed to read [DA conf] file)ÚfnameÚerr©ÚextrazFailed to read file %s)r2ÚOSErrorÚloggerÚerrorÚstrr Ú_)r)r-r8r6Úes ` r*Úfile_readlinesz!DirectAdminManager.file_readlinesDs ø€ð &ð &ð &ð &ð &ð QÝ�hÐ):Ð):Ñ)<Ô)<Ð=Ñ=Ô=ð 4ÀØ3Ð3°Ð3Ñ3Ô3ð 4ð 4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð 4ð 4øåð Qð Qð QØ ŒK× Ò Ð=ÈxÕ`cÐdeÑ`fÔ`fÐEgÐEgÐ Ñ hÔ hÐ hÝ!¥!Ð$<Ñ"=Ô"=ÀÑ"HÑIÔIÈqÐ Pøøøøð Qøøøs5ˆA¡ :­ Aº>¾AÁ>ÁAÁ B"ÁA BÂB"c ó®—i}| |j¦«}d„}tt||d¦«||d¦«¦«d¬¦«D]�\}}|\}}d|vrsdd | d ¦«d  d ¦«¦«›�d |v| d ¦«d d œ|t |¦«<Œ‚|S)zï Retrieve DirectAdmin PHP settings :return: dict of format {'1': {ver, fpm}, '2': {ver, fpm}...} where '1', '2' etc is an ordinal number of a handler as it is defined in options.conf có ‡—ˆfd„|D¦«S)zæ Filter PHP release|mode items in seq by marker :param seq: initial sequence :param marker: should be contained in seq item :return: all items from seq containing marker cóN•—g|]!}‰|v¯d|v¯ | d¦«°|‘Œ"S)Úphpú#)Ú startswith)r=r>Úmarkers €r*r?zHDirectAdminManager.php_options..inner_filter..ls:ø€ÐjÐjÐj˜T¨F°d¨N¨N¸uȸ}¸}ÐUY×UdÒUdÐehÑUiÔUi¸}�D¸}¸}¸}r,r:)ÚseqrQs `r*Ú inner_filterz4DirectAdminManager.php_options..inner_filteres ø€ðkÐjÐjÐj SÐjÑjÔjÐ jr,ÚreleaseÚmoder)ÚstartÚnorNÚú=éÿÿÿÿú.Úfpm)Úverr\Úhandler)rJÚda_options_confÚ enumerateÚzipÚjoinÚsplitrG)r)Úparsed_optionsÚoptsrSÚindexÚorTrUs r*Ú php_optionszDirectAdminManager.php_optionsZsû€ðˆØ×"Ò" 4Ô#7Ñ8Ô8ˆð kð kð kõ"¥# l l°4¸Ñ&CÔ&CÀ\À\ÐRVÐX^ÑE_ÔE_Ñ"`Ô"`ÐhiÐjÑjÔjð ð ‰HˆE�1؉MˆG�Tؘ7Ð"Ð"àM §¢¨¯ª°sÑ);Ô);¸BÔ)?×)EÒ)EÀcÑ)JÔ)JÑ!KÔ!KÐMÐMØ  D˜=Ø#Ÿzšz¨#™œ¨rÔ2ð.ð.��s 5™zœzÑ*øð Ðr,có²—i}t|j¦«D]?}tj |¦« d¦«d}|||<Œ@|S)z; Retrieve main domains configuration files ú.confr)rÚda_domain_patternÚosÚpathÚbasenamerc)r)ÚdomainsÚdom_confÚnames r*Ú main_domainszDirectAdminManager.main_domainsxs[€ð ˆÝ˜TÔ3Ñ4Ô4ð %ð %ˆHÝ”7×#Ò# HÑ-Ô-×3Ò3°GÑ<Ô<¸QÔ?ˆDØ$ˆG�D‰MˆM؈r,có*—i}t|j¦«D]{}| |¦«D]c}tj |¦« d¦«d›}|›d|›�}| d¦«d›d�||<ŒdŒ||S)z9 Retrieve subdomains configuration files ú .subdomainsrr[rj)rÚda_subdomain_patternrJrlrmrnrc)r)Ú subdomainsÚsub_confÚsubdomÚ sub_parentÚsub_names r*rvzDirectAdminManager.subdomainsƒs¸€ð ˆ ݘTÔ6Ñ7Ô7ð Rð RˆHØ×-Ò-¨hÑ7Ô7ð Rð R�Ý "¤× 0Ò 0°Ñ :Ô :× @Ò @ÀÑ OÔ OÐPQÔ RÐT� Ø$Ð3Ð3 zÐ3Ð3�Ø*2¯.ª.¸Ñ*GÔ*GÈÔ*JÐ'QÐ'QÐ'Q� ˜8Ñ$Ð$ð RðÐr,cóx—i}t|j¦«D]¢}| d¦«d}| |¦«D]o}| d¦«}|d}|d}|dkrŒ.|›d�||< | |›d�¦«D]}|›d�||›d|›�<ŒŒ`#t$rYŒlwxYwŒ£|S) z6 Retrieve aliases configuration files z .pointersrrYrZÚpointerrjrtr[)rÚda_alias_patternrcrJr ) r)ÚaliasesÚ alias_confÚparent_domain_nameÚaliasÚ alias_infoÚ alias_nameÚ_typeÚsubs r*r~zDirectAdminManager.aliases�s#€ð ˆÝ˜tÔ4Ñ5Ô5ð ð ˆJØ!+×!1Ò!1°+Ñ!>Ô!>¸qÔ!AÐ Ø×,Ò,¨ZÑ8Ô8ð ð �Ø"Ÿ[š[¨Ñ-Ô-� Ø'¨œ]� Ø" 2œ�ؘIÒ%Ð%ðØ);Ð&BÐ&BÐ&B�˜ Ñ#ðØ#×2Ò2Ð6HÐ3UÐ3UÐ3UÑVÔVðVðV˜Ø×.DÒ.DÑ.FÔ.F�K  Ñ+øð  GðÐr,cób—i}|j|j|jfD]}| |¦«Œ|S)zã Retrieve all domains and subdomains, existing on DA server, including aliases in the form of dict {domain_name: domain_config} :return: {domain_name: domain_config} including subdomains )rrrvr~Úupdate)r)Úda_sitesÚbunchs r*Ú all_siteszDirectAdminManager.all_sites¹s@€ðˆØÔ&¨¬¸¼ÐEð #ð #ˆEØ �OŠO˜EÑ "Ô "Ð "Ð "؈r,Ú domain_namec óP‡— |j|}nJ#t$r=|j dd|i¬¦«t |t d¦«¬¦«‚wxYw| |¦«Šdtdtfˆfd„ }|j}|j   |¦«p |d ¦«}|  |¦«sd }|j r|tj |d ¦«|||d tj|¦«¬ ¦«}t!|| d¦«|jd|d ¦«|j|¬¦«}n5t!|||d |d ¦«||d|¬¦«}|j d||j|j¦«|S)zÙ Retrieve information about given domain from control panel environment: PHP version, user of domain, fpm status :param domain_name: name of domain :return: a DomainInfo object zRDomain does not exist on the server or is a pointer (no task allowed for pointers)r�rBzeDomain '%(domain_name)s' does not exist on this server or is a pointer (no task allowed for pointers))ÚmessageÚitemr&c󈕇—ˆfd„‰D¦«} |d d¦«dS#t$rYdSwxYw)z” Get config value of item (e.g. item=value) :param item: key to get value of :return: value of item có@•—g|]}‰|v¯| ¦«‘ŒSr:r;)r=r>r s €r*r?zIDirectAdminManager.get_domain_info..find_item..æs&ø€ÐCÐCÐC d°d¸d°l°l�T—Z’Z‘\”\°l°l°lr,rrYrZÚ1)rcÚ IndexError)r Úfoundr“s` €r*Ú find_itemz5DirectAdminManager.get_domain_info..find_itemàsbøø€ð DÐCÐCÐC¨dÐCÑCÔCˆEð Ø˜Q”x—~’~ cÑ*Ô*¨2Ô.Ð.øÝð ð ð Ø�s�sð øøøs’ 3³ AÁAÚ php1_selectr£Úusernamer])ÚdomainÚtrusted_php_versionÚ panel_addressrNT)rqÚpanel_php_versionÚphp_ini_scan_dirÚis_selector_appliedÚuserÚ panel_fpmr^r\)rqr¬r¯r°r^z@Retrieved domain info: domain %s owned by %s uses php version %s)rœÚKeyErrorrEÚwarningr rHrJrGrhr—ÚgetÚ phpinfo_moderÚget_php_configurationrÚdirectadmin_conf_addressrÚget_full_php_versionÚabsolute_ini_scan_dirÚ is_php_fpmÚinfor¯r^) r)r�Ú domain_confr¦reÚ php_selectedÚconfigÚ domain_infor“s @r*Úget_domain_infoz"DirectAdminManager.get_domain_infoÆs/ø€ð Øœ.¨Ô5ˆKˆKøÝð ð ð Ø ŒK× Ò ØdØ$ kÐ2ð ñ ô ð õ$ØÝðEñôðñôð ð øøøð×"Ò" ;Ñ/Ô/ˆð �Cð ¥Cð ð ð ð ð ð ðÔˆðÔ3×7Ò7¸ ÑDÔDÐ`È È ÐR_ÑH`ÔH`ˆ ð�xŠx˜ Ñ%Ô%ð ØˆLà Ô ð& Ý"Ô8Ø� ˜*Ñ%Ô%Ø"ð %)¨Ô$6°uÔ$=õ,ÔDÀ[ÑQÔQð!ñôˆFõ$%Ø Ø"(×"=Ò"=¸eÑ"DÔ"DØ!'Ô!=ð%)Ø�Y˜zÑ*Ô*Ø Ô+Ø$ð ñ ô ˆKˆKõ%Ø Ø"& |Ô"4°UÔ";Ø�Y˜zÑ*Ô*ؘ|Ô,¨UÔ3Ø$ð ñôˆKð Œ ×ÒØ NØ Ø Ô Ø Ô ñ  ô ð ð Ðs ƒ ‘AAr¾cóT—d}|j|jd}|jdko||vS)zÝ Check if selector is enabled specifically for DirectAdmin Required to be implemented by child classes :param domain_info: a DomainInfo object :return: True if yes, False otherwise )ÚsuphpÚlsphpÚfastcgir^r£)rhr^)r)r¾Úcompatible_handlersÚcurrent_handlers r*Úpanel_specific_selector_enabledz2DirectAdminManager.panel_specific_selector_enabled-s8€ð<ÐØÔ*¨;Ô+>Ô?À ÔJˆØÔ" cÒ)ÐT¨oÐATÐ.TÐTr,Údom_infocó&—d|jdd…›�S)z� Get DirectAdmin FPM service name :param dom_info: a DomainInfo object :return: FPM service name zphp-fpméþÿÿÿN)r¬)r)rÇs r*Úfpm_service_namez#DirectAdminManager.fpm_service_name8s€ð ;˜Ô3°B°C°CÔ8Ð:Ð:Ð:r,Ncó•— tjd|jdd…gddd¬¦«nC#|j$r6}|j dt |¦«|dœ¬ ¦«Yd}~nd}~wwxYw|j|jd d krßtd ¦«}t¦«du}|r/|  ¦«s|j  d ¦«n� tjgd¢ddd¬¦«|s|  ¦«|j  d¦«nC#|j$r6}|j dt |¦«|dœ¬ ¦«Yd}~nd}~wwxYwt¦« |¦«dS)zÀ Copy xray.so for current version, create ini_location directory Reload FPM service or kill all *php* processes of user :param domain_info: a DomainInfo object z"/usr/share/alt-php-xray/da_cp_xrayrÉNTF)Úcapture_outputÚtextÚcheckzFailed to copy xray.so)rArºrBr^Úmod_phpÚhttpdz=Skipping global httpd restart: throttled for user-mode caller)z/usr/sbin/servicerÐÚrestartzhttpd restartedzFailed to restart httpd)Ú subprocessÚrunr¬Úsubprocess_errorsrErFrGrhr^r rÚreserve_reload_slotrºÚsave_latest_reloadÚsuperÚphp_procs_reload)r)r¾rIÚ controllerÚ is_user_modeÚ __class__s €r*rØz#DirectAdminManager.php_procs_reload@sø€ð  dÝ ŒNØ5°{Ô7TÐUWÐUXÐUXÔ7YÐZØ#ØØð  ñ ô ð ð øð Ô%ð dð dð dØ ŒK× Ò Ð6ÅcÈ!ÁfÄfÐVaÐ>bÐ>bÐ Ñ cÔ cÐ cÐ cÐ cÐ cÐ cÐ cøøøøð døøøà Ô ˜KÔ/Ô 0°Ô ;¸yÒ HÐ HÝ,¨WÑ5Ô5ˆJõ.Ñ/Ô/°tÐ;ˆLØð m J×$BÒ$BÑ$DÔ$Dð mØ” × Ò Ð!`ÑaÔaÐaÐað mÝ”NØAÐAÐAÐRVÐ]aÐinðñôðð(ð8Ø"×5Ò5Ñ7Ô7Ð7Ø”K×$Ò$Ð%6Ñ7Ô7Ð7Ð7øØÔ-ðmðmðmØ”K×%Ò%Ð&?ÍsÐSTÉvÌvÐ_jÐGkÐGkÐ%ÑlÔlÐlÐlÐlÐlÐlÐløøøøðmøøøå ‰Œ× Ò  Ñ-Ô-Ð-Ð-Ð-s-ƒ'+« A+µ,A&Á&A+ÃA D&Ä& E&Ä0,E!Å!E&)"Ú__name__Ú __module__Ú __qualname__Ú__doc__r_rkrur}rˆr%rÚdictÚ__annotations__rr+rGÚlistrJÚpropertyrhrrrvr~r—rœrrrr¿ÚboolrÆrÊrØÚ __classcell__)rÛs@r*rrsø€€€€€€ðððH€OØLÐØUÐØOÐØ"mÐð3Ø2Ø2Ø2Ø2Ø2Ø2Ø2Ø2Ø2Ø2Ø2Ø2Ø2Ø2ð#ð#€K�˜$”ððñð$9 Hð9ð9ð9ð9ðQ sðQ¨tðQðQðQðQð,ð˜Tðððñ„Xðð:ð˜dðððñ„Xððð ˜Dð ð ð ñ„Xð ðð˜ðððñ„Xðð0ð ¨ð ð ð ñ„Xð ðð ˜4ð ð ð ñ„Xð ð Øðc¨3ðc°:ðcðcðcñÔñ ÔðcðJ U¸:ð UÈ$ð Uð Uð Uð Uð;¨ð;¸ð;ð;ð;ð;ð0.¨Jð0.¸4ð0.ð0.ð0.ð0.ð0.ð0.ð0.ð0.ð0.ð0.r,r)!rßrlrŒrÒÚ urllib.parser‰Ú collectionsrrÚtypingrr3ÚxrayrrHÚ xray.internalrrÚinternal.exceptionsr r r Úinternal.fpm_utilsr Úinternal.typesrÚinternal.user_plugin_utilsrrrÚbaserrr:r,r*úrðsTðð ðð  € € € Ø € € € ØÐÐÐØÐÐÐØ Ð Ð Ð Ð Ð ØÐÐÐÐÐØÐÐÐÐÐà€€€àÐÐÐÐÐØ6Ð6Ð6Ð6Ð6Ð6Ð6Ð6àVÐVÐVÐVÐVÐVÐVÐVÐVÐVØ4Ð4Ð4Ð4Ð4Ð4Ø'Ð'Ð'Ð'Ð'Ð'ØoÐoÐoÐoÐoÐoÐoÐoÐoÐoØÐÐÐÐÐðQ.ðQ.ðQ.ðQ.ðQ.˜ñQ.ôQ.ðQ.ðQ.ðQ.r,