§ ;Š»j¶¤ãóX—dZddlZddlZddlZddlZddlZddlZddlmZddl m Z m Z m Z ddl mZddlZddlmZmZmZmZmZmZmZddlmZddlmZdd lmZmZdd lm Z m!Z!m"Z"m#Z#m$Z$m%Z%dd l&m'Z'm(Z(m)Z)dd l*m+Z,dd l-m.Z.ddl/m0Z0m1Z1m2Z2m3Z3m4Z4dZ5dZ6ej7 8e6d¦«Z9ej7 8e6d¦«Z:ej7 8e6d¦«Z;ej7 8e:d¦«ZdZ?ej7 8e:d¦«Z@ej7 8e@d¦«ZAej7 8e@d¦«ZBejCdejDe>¦«›�¦«ZEd„ZFd„ZGd„ZHd „ZId!„ZJdEd#„ZKdFd%„ZLdGd'„ZMd(„ZNd)„ZOd*„ZPd+„ZQd,„ZRd-„ZSd.„ZTdHd/„ZUd0„ZVd1„ZWe(jXe?g¬2¦«d3e eYeYffd4„¦«ZZd5„Z[dId6„Z\d7„Z+d8„Z]d9„Z^d:„Z_d;„Z`d<„Zad=„Zbd>„Zcd?„Zdd@„ZedA„ZfdB„ZgGdC„dDe(¦«ZhdS)Jz. CloudLinux API for DirectAdmin control panel éN)Ú format_exc)ÚDictÚListÚTuple)Úurlparse)ÚWebConfigMissingÚWebConfigParsingErrorÚapache_conf_parserÚ load_fastÚnginx_conf_parserÚopenlitespeed_conf_parserÚ&read_unicode_file_with_decode_fallback)Úload)ÚClPwd)Ú"_docroot_under_user_via_custom_binÚget_domains_via_custom_binary)ÚCpApiTypeErrorÚNoDBAccessDataÚNoDomainÚ NoPanelUserÚ ParsingErrorÚ ReadFileError)ÚDomainDescriptionÚGeneralPanelPluginV1ÚPHPDescription©Úget_admin_email)ÚFeature)ÚExternalProgramFailedÚfind_module_param_in_configÚget_file_linesÚget_modules_dir_for_alt_phpÚgrepÚ DirectAdminz/usr/local/directadminzconf/directadmin.confÚdatazconf/mysql.confÚusersÚ custombuildz options.confz user.confz/etc/virtual/domainownersÚadminz reseller.listú admin.listz.+/(.+)/có~—tj d¦«ptj d¦«S)Nú"/usr/local/directadmin/directadminz(/usr/local/directadmin/custombuild/build)ÚosÚpathÚisfile©óú¢/builddir/build/BUILDROOT/alt-python27-cllib-3.4.44-1.el8.cloudlinux.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/clcommon/cpapi/plugins/directadmin.pyÚdetectr2Ms2€Ý Œ7�>Š>Ð>Ñ ?Ô ?ð FÝ Œ7�>Š>ÐDÑ EÔ EðFr0có—i} tt¦«}|d|d<|d|d<nW#t$r%}tdt |¦«z¦«|‚d}~wt $r}tdt›�¦«|‚d}~wwxYw|S)NÚuserÚloginÚpasswdÚpassz0Can not open file with data to database access; z+Can not get database access data from file )Ú loadconfigÚ DA_DB_CONFÚIOErrorrÚstrÚKeyError)ÚaccessÚ login_dataÚerrs r1Ú db_accessr@Rs¸€Ø €Fð Ý¥ Ñ+Ô+ˆ Ø$ VÔ,ˆˆw‰Ø# HÔ-ˆˆv‰ˆøÝ ðððÝØ >ÅÀSÁÄÑ Iñ ô àð øøøøõ ðððÝØ F½*Ð FÐ Fñ ô àð øøøøðøøøð €Ms „*/¯ B¹ AÁ BÁ&A>Á>BcóÆ—d„tjtj tdt ¦«¦«D¦«}d„|D¦«}t |¦«S)NcóB—g|]}t |¦«‘ŒSr/)Ú USER_PATTERNÚmatch)Ú.0r-s r1ú zcpusers..ds&€ÐnÐnÐn¨t•,×$Ò$ TÑ*Ô*ÐnÐnÐnr0Ú*có<—g|]}|¯| d¦«‘ŒS)é)Úgroup)rErDs r1rFzcpusers..es'€ÐBÐBÐB U¸EÐB�%—+’+˜a‘.”.ÐBÐBÐBr0)Úglobr,r-ÚjoinÚ DA_USERS_PATHÚ USER_CONFÚtuple)Ú match_listÚ users_lists r1ÚcpusersrRcsT€ØnÐnµt´yÅÄÇÂÍmÐ]`ÕbkÑAlÔAlÑ7mÔ7mÐnÑnÔn€JØBÐB¨jÐBÑBÔB€JÝ �Ñ Ô Ðr0có”—ttd¬¦«5}d„|D¦«}ddd¦«n #1swxYwYt|¦«S)Núutf-8©Úencodingcó6—g|]}| ¦«‘ŒSr/©Ústrip©rEÚlines r1rFzresellers..ks €Ð5Ð5Ð5¨4˜$Ÿ*š*™,œ,Ð5Ð5Ð5r0)ÚopenÚRESELLERS_LISTrO)ÚfÚresellers_lists r1Ú resellersr`isˆ€Ý �n wÐ /Ñ /Ô /ð6°1Ø5Ð5°1Ð5Ñ5Ô5ˆð6ð6ð6ñ6ô6ð6ð6ð6ð6ð6ð6øøøð6ð6ð6ð6å �Ñ Ô Ð ó — 0°4·4có”—ttd¬¦«5}d„|D¦«}ddd¦«n #1swxYwYt|¦«S)NrTrUcó6—g|]}| ¦«‘ŒSr/rXrZs r1rFzadmins..qs €Ð2Ð2Ð2¨�t—z’z‘|”|Ð2Ð2Ð2r0)r\Ú ADMINS_LISTÚset)r^Ú admins_lists r1Úadminsrgosˆ€Ý �k GÐ ,Ñ ,Ô ,ð3°Ø2Ð2°Ð2Ñ2Ô2ˆ ð3ð3ð3ñ3ô3ð3ð3ð3ð3ð3ð3øøøð3ð3ð3ð3å ˆ{Ñ Ô ÐraFcó¸—ddlm}t¦«}|||¬¦«}|r6|tt t ¦« ¦«¦«z }|S)Nr)Ú_dblogin_cplogin_pairs)Ú cplogin_lstr=)Ú clcommon.cpapi.plugins.universalrir@rOÚ get_da_userrMÚitems)rjÚwith_system_usersrir=r%s r1Údblogin_cplogin_pairsrouse€ØGÐGÐGÐGÐGÐGÝ ‰[Œ[€FØ !Ð !¨kÀ&Ð IÑ IÔ I€DØð:Ø ••k¥-Ñ0Ô0×6Ò6Ñ8Ô8Ñ9Ô9Ñ9ˆØ €Kr0Tcó,—i}tj¦«}tj|¦«tjd¦«}|D]¿}tj |¦«rž|dz|zdz} t |d¬¦«5}t| ¦«¦«dkr|dd…}|||<ddd¦«n #1swxYwYŒ‹#t$r'|s"tj   d|z¦«YŒ»wxYwŒÀtj|¦«|S) Nz./*ú/z /domains.listrTrUrézNo file ) r,ÚgetcwdÚchdirrKr-Úisdirr\ÚlenÚreadliner:ÚsysÚstderrÚwrite) r-Úquietr&Úcur_dirÚdir_listÚuser_dirÚ file_domainsr^Ú user_names r1rlrl~sk€Ø €EÝŒi‰kŒk€GÝ„HˆT�N„N€NÝŒy˜ÑÔ€Hàð @ð @ˆÝ Œ7�=Š=˜Ñ "Ô "ð @Ø #™:¨Ñ0°?ÑBˆLð @ݘ,°Ð9Ñ9Ô9ð5¸Qݘ1Ÿ:š:™<œ<Ñ(Ô(¨1Ò,Ð,Ø$,¨Q¨R¨R¤L˜ Ø+4˜˜iÑ(ð5ð5ð5ñ5ô5ð5ð5ð5ð5ð5ð5øøøð5ð5ð5ð5øøõð @ð @ð @Øð@Ý”J×$Ò$ Z°,Ñ%>Ñ?Ô?Ð?øøð @øøøð @õ„HˆWÑÔÐØ €Ls6Á-C Á>5B?Â3 C Â?C ÃC ÃC ÃC à .C<Ã;C<©ÚcploginÚpackageÚmailÚresellerÚdnsÚlocalecóF‡‡ ‡ —g}t|t¦«r|g}nat|ttf¦«rt|¦«}n5|€t ¦«}n$t ddt |¦«j¬¦«‚d„Šd„d„d„ˆfd„d „d „d œŠ ˆ fd „|D¦«}|D]|}tj   t|t¦«}tj   |¦«r0t|¦«Š | ˆ fd „|D¦«¦«Œ}|S)NÚcpinfozstr|unicode|list|tuple)ÚfuncnameÚsupportedtypesÚ received_typecóˆ—| d¦«dkr| d¦«S| d¦«S)NÚusertyper…ÚusernameÚcreator©Úget©Úconfigs r1Ú _get_resellerzcpinfo.._get_resellerŸs=€Ø �:Š:�jÑ !Ô ! ZÒ /Ð /Ø—:’:˜jÑ)Ô)Ð )Ø�zŠz˜)Ñ$Ô$Ð$r0có,—| d¦«S)Nr�r‘r“s r1úzcpinfo..¤s€°· ² ¸:Ñ0FÔ0F€r0có,—| d¦«S)Nrƒr‘r“s r1r—zcpinfo..¥s€°· ² ¸9Ñ0EÔ0E€r0có,—| d¦«S)NÚemailr‘r“s r1r—zcpinfo..¦s€¨V¯ZªZ¸Ñ-@Ô-@€r0có•—‰|¦«S©Nr/)r”r•s €r1r—zcpinfo..§sø€°°¸vÑ1FÔ1F€r0có,—| d¦«S)NÚdomainr‘r“s r1r—zcpinfo..¨s€¨F¯JªJ°xÑ,@Ô,@€r0có,—| d¦«S)NÚlanguager‘r“s r1r—zcpinfo..©s€¨v¯zªz¸*Ñ/EÔ/E€r0r�có •—g|] }‰|‘Œ Sr/r/)rEÚkeyÚ_user_conf_maps €r1rFzcpinfo..ªsø€Ð 3Ð 3Ð 3 cˆn˜SÔ!Ð 3Ð 3Ð 3r0có&•—g|] }|‰¦«‘ŒSr/r/)rEr¢Ú user_configs €r1rFzcpinfo..¯s#ø€Ð@Ð@Ð@°#˜S˜S Ñ-Ô-Ð@Ð@Ð@r0)Ú isinstancer;ÚlistrOrRrÚtypeÚ__name__r,r-rLrMrNÚexistsr Úappend) ÚcpuserÚkeylsÚsearch_sys_usersÚreturnedÚ cpusers_listÚkeyls_r�Úuser_conf_filer•r£r¥s @@@r1r‰r‰“sdøøø€Ø€HÝ�&�#ÑÔðBØ�xˆ ˆ Ý �F�T¥5˜MÑ *Ô *ðBݘV‘}”}ˆ ˆ Ø ˆÝ‘y”yˆ ˆ å hÐ?WÝ+/°©<¬<Ô+@ðBñBôBð Bð%ð%ð%ð "GÐ!FØ!EÐ!EØ@Ð@Ø"FÐ"FÐ"FÐ"FØ@Ð@Ø EÐ Eð GðG€Nð 4Ð 3Ð 3Ð 3¨UÐ 3Ñ 3Ô 3€FØ ðBðBˆÝœŸš¥m°X½yÑIÔIˆÝ Œ7�>Š>˜.Ñ )Ô )ð BÝ# NÑ3Ô3ˆKØ �OŠOÐ@Ð@Ð@Ð@¸Ð@Ñ@Ô@Ñ AÔ AÐ AøØ €Or0cóp—d}t¦«}||vr ||}noi}| ¦«D].\}}| |g¦« |¦«Œ/|D]'}t t |¦«|¦«}||vr|}nŒ(|€g}nt |¦«}|D]}||vr |d|fcSŒdS)z„ Old method for getting doc_root for domain under root Method reads DA config :return: (doc_root, username) cortege NrI)Ú_load_domains_ownersrmÚ setdefaultr«Ú_get_subdomainsÚ userdomains) ržr€Ú_domain_to_user_mapÚowner_to_main_domainsÚ main_domainÚownerÚ subdomainsÚ domains_listÚds r1Ú_docroot_under_rootr¿³s€ð€Iå.Ñ0Ô0Ðà Ð$Ð$Ð$Ø'¨Ô/ˆ ˆ ð!#ÐØ"5×";Ò";Ñ"=Ô"=ð Lð LÑ ˆK˜Ø !× ,Ò ,¨U°BÑ 7Ô 7× >Ò >¸{Ñ KÔ KÐ KÐ Kð+ð ð ˆEå(­°UÑ);Ô);Ð=PÑQÔQˆJؘÐ#Ð#à!� Ø�ð$ð ÐØˆ ˆ å" 9Ñ-Ô-ˆ Ø ð#ð#ˆØ �Qˆ;ˆ;Ø�Q”4˜�?Ð "Ð "Ð "ð ð#ð#r0cóæ—t¦«}| tj¦«¦«d}t |j¦«}|D]}|d|kr|d|jfcSŒ dS)zž Old method for getting doc_root for domain under user Method parses /home//domains directory :return: (doc_root, username) cortege rÚ server_nameÚ document_rootN)rÚ get_pw_by_uidr,ÚgetuidÚ_get_domains_list_as_userÚpw_dirÚpw_name)ržÚclpwdÚuser_pwÚlist_domains_and_doc_rootsÚ domain_datas r1Ú!_docroot_under_user_old_mechanismrÌÚs…€õ ‰GŒG€EØ×!Ò!¥"¤)¡+¤+Ñ.Ô.¨qÔ1€GÝ!:¸7¼>Ñ!JÔ!JÐØ1ðAðAˆ Ø �}Ô %¨Ò /Ð /ؘÔ/°´Ð@Ð @Ð @Ð @ð 0ðAðAr0cóþ—d}| ¦«}tj¦«}tj¦«}|dkr|dkrt |¦«}nt |¦«}|�|St d|›d�¦«‚)zŠ Retrieves document root for domain :param domain: Domain to determine doc_root :return: Cortege: (doc_root, domain_user) Nrz'Can't obtain document root for domain 'ú')rYr,rÄÚgeteuidr¿rr)ržÚresÚuidÚeuids r1ÚdocrootrÓês€ð €CØ �\Š\‰^Œ^€Få Œ)‰+Œ+€CÝ Œ:‰<Œ<€DØ ˆq‚y€y�S˜A’X�XÝ! &Ñ)Ô)ˆˆå0°Ñ8Ô8ˆð  €Øˆ Ý ÐF¸VÐFÐFÐFÑ GÔ GÐGr0cóЗtt¦«}tt| dd¦«¦«p"t| dd¦«¦«¦«S)z6 Check if nginx is installed via custombuild; ÚnginxrÚ nginx_proxy©r8ÚDA_CONFÚboolÚintr’r“s r1Ú_is_nginx_installedrÛsP€õ�Ñ Ô €FÝ •�F—J’J˜w¨Ñ*Ô*Ñ+Ô+ÐP­s°6·:²:¸mÈQÑ3OÔ3OÑ/PÔ/PÑ QÔ QÐQr0cóŠ—tt¦«}tt| dd¦«¦«¦«S)z> Check if OpenLiteSpeed is installed via custombuild; Ú openlitespeedrr×r“s r1Ú_is_openlitespeed_installedrÞ s5€õ�Ñ Ô €FÝ •�F—J’J˜°Ñ2Ô2Ñ3Ô3Ñ 4Ô 4Ð4r0có¼— t¦«r.ttj |d¦«¦«}nit ¦«r.t tj |d¦«¦«}n-ttj |d¦«¦«}n4#t$r}t|j ¦«|‚d}~wt$rgcYSwxYw|S)z¾ Get domains list for user from httpd or nginx config as root :param user_path: path to DA directory of user's profile :return: parsed httpd or nginx config :rtype: list z nginx.confzopenlitespeed.confz httpd.confN) rÛr r,r-rLrÞr r r rÚmessager)Ú user_pathÚ httpd_confÚes r1Ú_get_domains_list_as_rooträsÖ€ð Ý Ñ Ô ð SÝ*­2¬7¯<ª<¸ À<Ñ+PÔ+PÑQÔQˆJˆJÝ (Ñ *Ô *ð SÝ2µ2´7·<²<À ÐK_Ñ3`Ô3`ÑaÔaˆJˆJå+­B¬G¯LªL¸ÀLÑ,QÔ,QÑRÔRˆJøøÝ ð-ð-ð-ݘ1œ9Ñ%Ô%¨1Ð,øøøøÝ ðððØˆ ˆ ˆ ðøøøð Ðs‚B%B(Â( CÂ2CÃCÃCcó²—d}d}g}tj ||¦«}tj|¦«D]›}tj ||¦«}tj |||¦«}tj |¦«r9tj |¦«r| ||ddœ¦«Œ›Œœ|S)aT Get domains list for user from ~/domains directory as user. Method DOESN'T search subdomains, because it's almost impossible detect by user's folders without privileges escalation :param user_home: path to user home :return: list of dictionaries {'server_name': 'domain', 'document_root': 'doc_root', 'ssl': False} ÚdomainsÚ public_htmlF)rÁrÂÚssl)r,r-rLÚlistdirrur«)Ú user_homeÚ domains_dirÚ doc_root_dirr½Ú domains_pathÚ domain_dirÚ domain_pathÚ doc_root_paths r1rÅrÅ(sÕ€ð€KØ €Là€LÝ”7—<’<  ¨;Ñ7Ô7€Lõ”j Ñ.Ô.ð ð ˆ Ý”g—l’l <°Ñ<Ô<ˆ ÝœŸ š  \°:¸|ÑLÔLˆ Ý Œ7�=Š=˜Ñ %Ô %ð ­"¬'¯-ª-¸ Ñ*FÔ*Fð Ø × Ò Ø#-Ø%2Ø ð!ð!ñ ô ð ð ð à Ðr0cóx—g}tj t|¦«}tj¦«}d}tj |¦«sgStj d|z¦«}tj |d¦«}tj |¦«r>tj |¦«rtj |¦«}|dks|rst|¦«}|D]_} | ddurŒ | d|vr%|  d| d| df¦«Œ<|  | d| df¦«Œ`|St¦«\} } | dkr| S| d krtd |›d �¦«‚td | ›�¦«‚) aD Get user's domains list :return list: domain names Example: [('cltest1.com', '/home/cltest1/domains/cltest1.com/public_html'), ('mk.cltest1.com', '/home/cltest1/domains/cltest1.com/public_html/mk'), ('cltest11.com', '/home/cltest1/domains/cltest11.com/public_html') ] Úú~rçrrèTrÁrÂé zUser z not found in the databasezFailed to get userdomains: )r,r-rLrMrÏrªÚ expanduserÚislinkÚrealpathräÚinsertr«rrr) r¬Úas_rootr½rárÒÚmain_domain_pathrêÚ public_pathrâržÚrcrÐs r1r·r·Hs¶€ð€LÝ”— ’ �]¨FÑ3Ô3€IÝ Œ:‰<Œ<€DðÐÝ Œ7�>Š>˜)Ñ $Ô $ðØˆ å”×"Ò" 3¨¡<Ñ0Ô0€IÝ”'—,’,˜y¨-Ñ8Ô8€KÝ „w‡~‚~�kÑ"Ô"ð9¥r¤w§~¢~°kÑ'BÔ'Bð9Ýœ7×+Ò+¨KÑ8Ô8ÐØ ˆq‚y€y�G€yÝ.¨yÑ9Ô9ˆ Ø ð Vð VˆFØ�eŒ} Ð$Ð$Øà�mÔ$Ð(8Ð8Ð8Ø×#Ò# A¨¨}Ô(=¸vÀoÔ?VÐ'WÑXÔXÐXÐXà×#Ò# V¨MÔ%:¸FÀ?ÔŠ>˜)Ñ $Ô $ð $Ý”w—’ w¤~Ñ6Ô6ˆHØ �MŠM˜(Ñ #Ô #Ð #øÝ � ‰?Œ?Ðr0cód— t¦« |d¦«S#ttf$rzt j¦«dkr‚t ¦« t j¦«¦«dj}t|¦«D]\}}||kr|ccYSŒYdSwxYw)z‡ Return domain's owner :param domain: Domain/sub-domain/add-domain name :return: user name or None if domain not found Nr) r´r’rÚOSErrorr,rÏrrÃrÇr·)ržr�r¾Ú_s r1Ú domain_ownerr ˆs»€ð Ý#Ñ%Ô%×)Ò)¨&°$Ñ7Ô7Ð7øÝ �7Ð #ð ð ð Ý Œ:‰<Œ<˜1Ò Ð Ø õ‘7”7×(Ò(­¬©¬Ñ6Ô6°qÔ9ÔAˆÝ Ñ)Ô)ð ð ‰DˆAˆqØ�FŠ{ˆ{Ø�����ðàˆtˆtð øøøs‚!$¤BB/Â*B/Â.B/)Ú panel_parkerÚreturncóˆ— tt¦« ¦«}n6#ttf$r"}t t |¦«¦«|‚d}~wwxYwi}|D]^}| ¦«}|sŒ| d¦«\}}| ¦«}| ¦«}|||<Œ_|S)zC Get domain<->user map from /etc/virtual/domainowners file Nú:) rÚ DOMAINOWNERSÚ splitlinesrr:rr;rYÚsplit)Ú domains_linesrãr¸Úline_Údomain_Úuser_s r1r´r´�s΀ð +Ý>½|ÑLÔL×WÒWÑYÔYˆ ˆ øÝ •WÐ ð+ð+ð+Ý�C ™FœFÑ#Ô#¨Ð*øøøøð+øøøðÐØð -ð -ˆØ— ’ ‘ ” ˆàð Ø ØŸš SÑ)Ô)‰ˆ�Ø—-’-‘/”/ˆØ— ’ ‘ ” ˆà',ИGÑ$Ð$Ø Ðs‚&)©AºAÁAcóº—|€gSt¦« ¦«}tj t |d¦«} t |d¬¦«5}d„|D¦«}| |¦«tt|¦«t|¦«z¦«cddd¦«S#1swxYwYdS#ttf$rgcYSwxYw)z� Return list of reseller users :param resellername: reseller name; return empty list if None :return list[str]: user names list Nz users.listrTrUcó6—g|]}| ¦«‘ŒSr/rX)rEÚitems r1rFz"reseller_users..Ås €Ð>Ð>Ð>¨4˜$Ÿ*š*™,œ,Ð>Ð>Ð>r0) rrþr,r-rLrMr\r«r§rer:r)Ú resellernameÚall_users_dictÚusers_list_filerQs r1Úreseller_usersr·s&€ð ÐØˆ å‘W”W×*Ò*Ñ,Ô,€Nå”g—l’l¥=°,À ÑMÔM€OðÝ �/¨GÐ 4Ñ 4Ô 4ð ?¸ Ø>Ð>°:Ð>Ñ>Ô>ˆJØ × Ò ˜lÑ +Ô +Ð +õ�˜NÑ+Ô+­c°*©o¬oÑ=Ñ>Ô>ð  ?ð ?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?ð ?ð ?øõ •WÐ ðððØˆ ˆ ˆ ðøøøs7Á CÁA B7Â* CÂ7B;Â;CÂ>B;Â?CÃCÃCcód—|€gSt|¦«}tt|d¬¦«¦«S)zà Get pairs user <=> domain for given reseller; Empty list if cannot get or no users found; :type resellername: str :return list[tuple[str, str]]: tuple[username, main_domain] N)r‚r†)r­)rÚdictr‰)rr&s r1Úreseller_domainsrÎs8€ðÐØˆ Ý ˜<Ñ (Ô (€EÝ •�uÐ$6Ð7Ñ7Ô7Ñ 8Ô 8Ð8r0cóø—tj tdt¦«} t |¦«}| dt¦«¦«S#t$rt¦«cYSwxYw)Nr(rš) r,r-rLrMrNr8r’Úuniversal_get_admin_emailÚFileNotFoundError)Úadmin_user_fileÚcnfs r1rrÛss€Ý”g—l’l¥=°'½9ÑEÔE€Oð+ݘÑ)Ô)ˆØ�wŠw�wÕ 9Ñ ;Ô ;Ñ<Ô<Ð<øÝ ð+ð+ð+Ý(Ñ*Ô*Ð*Ð*Ð*ð+øøøs­0AÁA9Á8A9có—tj t|t¦«}tj |¦«r< t |¦«ddkS#t$r}td¦«|‚d}~wwxYwdS)z{ Check if given user is reseller; :type username: str :rtype: bool :raise: ParsingError, ReadFileError rŽr…z)User config exists, but no usertype givenNF) r,r-rLrMrNrªr8Ú IndexErrorr)r�r¥rãs r1Ú is_resellerr'äsŠ€õ”'—,’,�}¨h½ ÑBÔB€KÝ „w‡~‚~�kÑ"Ô"ðSð SݘkÑ*Ô*¨:Ô6¸*ÒDÐ DøÝð Sð Sð SÝÐJÑKÔKÐQRÐ Røøøøð Søøøà ˆ5sÁ A%Á% BÁ/A?Á?Bcó—d|›d�S)Nzhttp://z:2222r/)ržs r1Úget_user_login_urlr)ôs€Ø "�VÐ "Ð "Ð "Ð"r0có`—i} tt¦«}n#ttf$rYdSwxYwd}d|›d�|vrsd|›d�|vrki|t |¦«<|d|›d�|t |¦«d<|d|›d�|t |¦«d<|dz }d|›d�|vrd|›d�|v°k|S)zJ Return map (PHP_DA_CODE:{PHP_HANDLER, PHP_VERSION}) :return: NrIÚphpÚ_modeÚ_releaseÚ handler_typeÚphp_version_id)r8Ú DA_OPT_PATHr:rr;)Ú _php_da_mapÚphp_cfgÚis r1Ú_get_da_php_configr4øs €ð €KðÝ�[Ñ)Ô)ˆˆøÝ •WÐ ððð؈tˆtðøøøð €AØ �ˆ.ˆ.ˆ.˜GÐ #Ð #Ð(9¨aÐ(9Ð(9Ð(9¸WÐ(DÐ(DØ ˆ •C˜‘F”FÑØ.5°n¸A°n°n°nÔ.Eˆ •C˜‘F”FÔ˜NÑ+Ø07Ð8I¸aÐ8IÐ8IÐ8IÔ0Jˆ •C˜‘F”FÔÐ,Ñ-Ø ˆQ‰ˆð �ˆ.ˆ.ˆ.˜GÐ #Ð #Ð(9¨aÐ(9Ð(9Ð(9¸WÐ(DÐ(Dð Ðs „™.­.có—tj tt |¦«dt |¦«dz¦«} t |¦«}n#t tf$rYdSwxYw| d¦«}|�|dkrd}|S)z� Return php code from domain config :param domain: :param owner: :return: string '1' or '2' - php code in DA ræz.confÚ1Ú php1_selectNÚ0) r,r-rLrMr;r8r:rr’)ržr»Údomain_config_fileÚ domain_configÚ domain_phps r1Ú_get_php_code_info_for_domainr< s�€õœŸš¥mµS¸±Z´ZÀÍCÐPVÉKÌKÐZaÑLaÑbÔbÐðÝ"Ð#5Ñ6Ô6ˆ ˆ øÝ •WÐ ððð؈sˆsðøøøà×"Ò" =Ñ1Ô1€JðИZ¨3Ò.Ð.؈ Ø ÐsÁAÁA+Á*A+có„—g}|D]:}|d| ¦«vrŒ| |d¦«Œ;|S)Nr)Úkeysr«)Ú all_domainsÚmapped_all_domainsr¼ržs r1r¶r¶!sV€Ø€JØð%ð%ˆØ �!Œ9Ð*×/Ò/Ñ1Ô1Ð 1Ð 1Ø Ø×Ò˜& œ)Ñ$Ô$Ð$Ð$Ø Ðr0c ó¶—t¦«}i}t¦«}|€|Si}| ¦«D].\}}| |g¦« |¦«Œ/| ¦«D]Ü\}}t |¦«} t ||¦«}n#t$rg}YnwxYw|D]¡}t||¦«} | |vs|| ddkrd} || } t||¦«} n#t$rg} YnwxYw|g|z| zD]A} t|| d| dd| d  dd¦«›�¬ ¦«|| <ŒBŒ¢ŒÝ|S) a¯ Return php version information for each domain :return: domain to php info mapping Example output: {'cltest.com': {'handler_type': 'mod_php', 'php_version_id': '7.1', 'username': 'cltest'}, 'cltest2.com': {'handler_type': 'fastcgi', 'php_version_id': '7.3', 'username': 'kek_2'}, 'cltest3.com': {'handler_type': 'suphp', 'php_version_id': '5.5', 'username': 'cltest3'}, 'omg.kek': {'handler_type': 'php-fpm', 'php_version_id': '5.2', 'username': 'cltest'}} :rtype: dict[str, dict] Nr/Únor6r.r+ú.rò)r�r/r.Údisplay_version) r´r4rmrµr«r·r¶Ú Exceptionr<Ú _useraliasesrÚreplace) Úmap_domain_userÚ result_mapÚ php_da_mapÚowner_to_domainsržr»ræÚall_domains_in_httpd_filer¼Ú php_info_codeÚphp_infoÚdomain_aliasesÚ domain_entitys r1Úget_domains_php_inforQ*sì€õ(+Ñ,Ô,€OØ€JÝ#Ñ%Ô%€JØÐØÐà-/ÐØ(×.Ò.Ñ0Ô0ð>ð>‰ ˆ�Ø×#Ò# E¨2Ñ.Ô.×5Ò5°fÑ=Ô=Ð=Ð=à*×0Ò0Ñ2Ô2ð 𠉈ˆwÝ$/°Ñ$6Ô$6Ð!ð Ý(Ð)BÀOÑTÔTˆJˆJøÝð ð ð ØˆJˆJˆJð øøøðð ð ˆFÝ9¸&À%ÑHÔHˆMØ JÐ.Ð.Ø! -Ô0Ð1AÔBÀdÒJÐJð!$� à! -Ô0ˆHð $Ý!-¨e°VÑ!<Ô!<��øÝð $ð $ð $Ø!#���ð $øøøð #) ¨JÑ!6¸Ñ!Gð ð � Ý,=Ø"Ø#+Ð,<Ô#=Ø!)¨.Ô!9Ø$W¨(Ð3CÔ*D×*LÒ*LÈSÐRTÑ*UÔ*UÐ$WÐ$Wð -ñ-ô-� ˜=Ñ)Ð)ð ð# ð2 Ðs$ÂB"Â" B1Â0B1Ã)C:Ã: D ÄD cóÒ—g}d}tjd¦«}tj|¦«D�]8}tj ||¦«}tj |¦«rö| |¦«rátj |›d�¦«r¿|  dd¦«}|  td|›�|dd…›d |dd…›�|›d �tj |t¦«¦«tj |d ¦«tj |d ¦«¬ ¦«¦«�Œ:|S)zs Gets installed alt-phpXY - could be chosen via CloudLinux PHP Selector w/o being compiled via custombuild z /opt/alt/z^php\d+$z /usr/bin/phpr+ròzalt-NrIrCrqz usr/bin/phpzlink/conf/default.ini©Ú identifierÚversionÚdirÚ modules_dirÚbinÚini) ÚreÚcompiler,rér-rLrurDrªrGr«rr")Úinstalled_listÚalt_phps_directoryÚpatternrÚ item_pathrUs r1Ú_get_installed_alt_php_versionsr`msQ€ð€NØ$ÐÝŒj˜Ñ%Ô%€Gå” Ð-Ñ.Ô.ð ñ ˆÝ”G—L’LÐ!3°TÑ:Ô:ˆ õ Œ7�=Š=˜Ñ #Ô #𠨯 ª °dÑ(;Ô(;ð ÅÄÇÂÐR[ÐOiÐOiÐOiÑ@jÔ@jð Ø—l’l 5¨"Ñ-Ô-ˆGØ × !Ò !¥.Ø( $˜=˜=Ø" 2 A 2œ;Ð6Ð6¨°°°¬Ð6Ð6Ø �O�O�OÝœGŸLšL¨Õ4OÑ4QÔ4QÑRÔRÝ”G—L’L ¨MÑ:Ô:Ý”G—L’L Ð,CÑDÔDð #ñ#ô#ñ ô ð ùð Ðr0cóF—tj|›d�dgddd¬¦«jS)Nzbin/php-configz--extension-dirTF)ÚtextÚcapture_outputÚcheck)Ú subprocessÚrunÚstdout)Údirectadmin_php_dirs r1Ú_get_da_php_extension_dirri†s;€Ý Œ>Ø Ð /Ð /Ð /Ð1BÐCØ ØØð  ñ ô ô  ð  r0cóp—t¦«}|€gS| ¦«}g}|D�] }|d}|dkrŒd| dd¦«›d�}tj |¦«sŒLt |¦«}|r| ¦«}| td| dd¦«›�|tj  |¦«|tj  |d ¦«tj  |d ¦«¬ ¦«¦«�Œ |S) zL Gets compiled phpXY - could be chosen via DirectAdmin PHP Selector Nr/rBz/usr/local/phprCròrqr+zbin/phpz lib/php.inirS) r4ÚvaluesrGr,r-rªrirYr«rrL)rJÚinstalled_php_datar\Ú version_inforUrhÚmodules_dir_paths r1Ú"_get_compiled_custombuild_versionsro�sL€õ$Ñ%Ô%€JØÐ؈ ð$×*Ò*Ñ,Ô,ÐØ€Nð+ð ñ ˆ ØÐ/Ô0ˆà �dŠ?ˆ?Ø àJ¨w¯ª¸sÀBÑ/GÔ/GÐJÐJÐJÐåŒw�~Š~Ð1Ñ2Ô2ð Ø å4Ð5HÑIÔIÐØ ð 8Ø/×5Ò5Ñ7Ô7Ð à×Ò�nØ7˜WŸ_š_¨S°"Ñ5Ô5Ð7Ð7ØÝ”— ’ Ð0Ñ1Ô1Ø(Ý”— ’ Ð0°)Ñ<Ô<Ý”— ’ Ð0°-Ñ@Ô@ð  ñ ô ñ ô ð ñ ð Ðr0c óX—tj |¦«sgSg} t|d¬¦«5}| ¦«}ddd¦«n #1swxYwYn=#t $r0}t jt jd|›d|›d�¦«Yd}~nd}~wwxYwd„|D¦«S)z1 Parse user aliases file and return data rTrUNzCan`t open file "z " due to : "ú"cóh—g|]/}| ¦« d¦«d‘Œ0S)ú=r)rYr)rEÚrecords r1rFz _get_aliases..Æs3€Ð <Ð <Ð <¨VˆF�LŠL‰NŒN× Ò  Ñ %Ô % aÔ (Ð <Ð <Ð Š>˜$Ñ Ô ðØˆ Ø €DðVÝ �$ Ð )Ñ )Ô )ð !¨QØ—;’;‘=”=ˆDð !ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !øøå ðVðVðVÝŒ •fÔ(Ð*T¸dÐ*TÐ*TÐPQÐ*TÐ*TÐ*TÑUÔUÐUÐUÐUÐUÐUÐUøøøøðVøøøà <Ð <°tÐ <Ñ <Ô <Ðz1PanelPlugin.get_cp_description..÷s.èè€ÐGÐG°4˜TŸ[š[¨Ñ.Ô.ÐGÐGÐGÐGÐGÐGr0cóR—| dd¦« ¦«S)NrCrò)rGÚisdigit)Úss r1Ú _is_floatz1PanelPlugin.get_cp_description.._is_floatùs"€Ø—y’y  bÑ)Ô)×1Ò1Ñ3Ô3Ð3r0rò)ÚnamerUÚadditional_info) reÚPopenÚPIPEÚ communicaterÚnextÚfilterr„rE)r�ÚpÚoutr Ú version_wordsr�rUs r1Úget_cp_descriptionzPanelPlugin.get_cp_descriptionäs€ð  ÝÔ!Ø5°sÐ;Ý!”Ý!”Øð ñôð )ð ØŸš™œ‘��Qð  )ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ðHÐG¸3¿9º9¹;¼;ÐGÑGÔGˆMð 4ð 4ð 4õ�6 )¨]Ñ;Ô;¸RÑ@Ô@ˆGÝ&°7ÈtÐTÐTÐ TøÝð ð ð Ø�4�4ð øøøs5‚.B)°AÁ B)ÁAÁB)ÁAÁA B)Â) B7Â6B7có—t¦«S)zÿ Getting root access to mysql database. For example {'login': 'root', 'db': 'mysql', 'host': 'localhost', 'pass': '9pJUv38sAqqW'} :return: root access to mysql database :rtype: dict :raises: NoDBAccessData )r@r…s r1r@zPanelPlugin.db_accesss€õ‰{Œ{Ðr0có—t¦«S)z¥ Generates a list of cpusers registered in the control panel :return: list of cpusers registered in the control panel :rtype: tuple )rRr…s r1rRzPanelPlugin.cpusers s€õ‰yŒyÐr0có—t¦«S)zœ Generates a list of resellers in the control panel :return: list of cpusers registered in the control panel :rtype: tuple )r`r…s r1r`zPanelPlugin.resellerss€õ‰{Œ{Ðr0có —t|¦«S)zc Check if given user is reseller; :type username: str :rtype: bool )r')r�r�s r1r'zPanelPlugin.is_resellers€õ ˜8Ñ$Ô$Ð$r0cóЗtj t|t¦«}tj |¦«sdSt |¦«}|ddkS)z| Return True if username is in admin names :param str username: user to check :return: bool FrŽr()r,r-rLrMrNrªr )r�r�r²r¥s r1Úis_adminzPanelPlugin.is_admin)sS€õ œŸš¥m°X½yÑIÔIˆÝŒw�~Š~˜nÑ-Ô-ð Ø�5Ý Ñ/Ô/ˆ ؘ:Ô&¨'Ò1Ð1r0NFcó"—t||¦«S)a  Get mapping between system and DB users @param cplogin_lst :list: list with usernames for generate mapping @param with_system_users :bool: add system users to result list or no. default: False )ro)r�rjrns r1roz!PanelPlugin.dblogin_cplogin_pairs5s€õ% [Ð2CÑDÔDÐDr0r�Tcó&—t|||¬¦«S)aØ Retrieves info about panel user(s) :param str|unicode|list|tuple|None cpuser: user login :param keyls: list of data which is necessary to obtain the user, the valuescan be: cplogin - name/login user control panel mail - Email users reseller - name reseller/owner users locale - localization of the user account package - User name of the package dns - domain of the user :param bool search_sys_users: search for cpuser in sys_users or in control panel users (e.g. for Plesk) :return: returns a tuple of tuples of data in the same sequence as specified keys in keylst :rtype: tuple )r®)r‰)r�r¬r­r®s r1r‰zPanelPlugin.cpinfo>s€õ"�f˜eÐ6FÐGÑGÔGÐGr0có—t¦«S)zR Retrieve admin email address :return: Host admin's email rr…s r1rzPanelPlugin.get_admin_emailQs€õ Ñ Ô Ð r0có —t|¦«S)z„ Return document root for domain :param str|unicode domain: :return Cortege: (document_root, owner) )rÓ©r�ržs r1rÓzPanelPlugin.docrootXs€õ �v‰ŒÐr0có"—t||¦«Srœ)rF)r¬ržs r1Ú useraliaseszPanelPlugin.useraliases`s€å˜F FÑ+Ô+Ð+r0có —t|¦«S)zÛ Return domain and document root pairs for control panel user first domain is main domain :param str|unicode cpuser: user login :return list of tuples (domain_name, documen_root) )r·)r�r¬s r1r·zPanelPlugin.userdomainsds€õ˜6Ñ"Ô"Ð"r0có—t¦«S)zº Detects and returns list of folders contained the home dirs of users of the cPanel :return: list of folders, which are parent of home dirs of users of the panel )rr…s r1rzPanelPlugin.homedirsms€õ ‰zŒzÐr0có —t|¦«S)z– Return reseller users :param resellername: reseller name; autodetect name if None :return list[str]: user names list )r©r�rs r1rzPanelPlugin.reseller_usersts€õ ˜lÑ+Ô+Ð+r0có —t|¦«S)z´ Get dict[user, domain] :param reseller_name: reseller's name :rtype: dict[str, str|None] :raises DomainException: if cannot obtain domains )rr¬s r1rzPanelPlugin.reseller_domains|s€õ   Ñ-Ô-Ð-r0có —t|¦«S)z` Get login url for current panel; :type domain: str :rtype: str )r)r¦s r1r)zPanelPlugin.get_user_login_url…s€õ " &Ñ)Ô)Ð)r0có—t¦«S)z_ List all admins names in given control panel :return: list of strings )rgr…s r1rgzPanelPlugin.admins�s €õ ‰xŒxˆr0có —t|¦«S)z« Return domain's owner :param domain: Domain/sub-domain/add-domain name :rtype: str :return: user name or None if domain not found )r r¦s r1r zPanelPlugin.domain_owner”s€õ˜FÑ#Ô#Ð#r0có—t¦«S)zŒ Return php version information for each domain :return: domain to php info mapping :rtype: dict[str, dict] )rQr…s r1rQz PanelPlugin.get_domains_php_info�s€õ $Ñ%Ô%Ð%r0có¬—tt¦«}d|vr|dS| dd¦«}|€dS| d¦«dS)zf Retrieve current DA skin name :return: Current DA skin name. None if unknown Ú system_skinÚdocsrootNrqéÿÿÿÿ)r8rØr’r)r”r´s r1Ú_get_da_skin_namezPanelPlugin._get_da_skin_name¥s`€õ �GÑ$Ô$ˆð ˜FÐ "Ð "ؘ-Ô(Ð (ð—:’:˜j¨$Ñ/Ô/ˆà Ð Ø�4Ø�~Š~˜cÑ"Ô" 2Ô&Ð&r0cóÜ—tj td¦«}d}t ¦«}|dkr%t |¦«}| d|¦«S|S)zZ Retrieve encoding name, used for package/reseller names :return: z,data/skins/enhanced/lang/en/lf_standard.htmlÚutf8ÚenhancedÚ lang_encoding)r,r-rLÚDA_DIRr|r¶r8r’)Úenhanced_skin_configÚdefault_encodingÚ current_skinÚ skin_configs r1Úget_encoding_namezPanelPlugin.get_encoding_name¸sh€õ "œwŸ|š|­FÐ4bÑcÔcÐØ!ÐÝ"×4Ò4Ñ6Ô6ˆ Ø ˜:Ò %Ð %õ%Ð%9Ñ:Ô:ˆKà—?’? ?Ð4DÑEÔEÐ EØÐr0r có—tjgSrœ)rÚ RUBY_SELECTORr…s r1Úget_unsupported_cl_featuresz'PanelPlugin.get_unsupported_cl_featuresÉs€å Ô !ð ð r0có”—g} ttj¦«}n#ttf$rYdSwxYwd„|D¦«}t ddd|¬¦«D][} t | d¦«d¦«}||vr| |¦«ŒE#ttf$rYŒXwxYw|s| d ¦«|S) zl Retrieves active httpd's ports from httpd's config :return: list of apache's ports Ncó6—g|]}| ¦«‘ŒSr/rXrZs r1rFz5PanelPlugin.get_apache_ports_list..Ús €Ð0Ð0Ð0 $�—’‘”Ð0Ð0Ð0r0ÚListenFT)Úmatch_any_positionÚmultiple_searchÚdata_from_fileú rIéP) r!r|ÚHTTPD_CONFIG_FILErr:r#rÚrr«r&Ú ValueError)Ú_httpd_ports_listÚlinesr[Úvalues r1Úget_apache_ports_listz!PanelPlugin.get_apache_ports_listÎs€ðÐð Ý"¥;Ô#@ÑAÔAˆEˆEøÝ�Ð!ð ð ð Ø�4�4ð øøøà0Ð0¨%Ð0Ñ0Ô0ˆÝ˜°eÈTÐbgÐhÑhÔhð ð ˆDð ݘDŸJšJ s™OœO¨AÔ.Ñ/Ô/�ØÐ 1Ð1Ð1Ø%×,Ò,¨UÑ3Ô3Ð3øøÝ¥ Ð+ð ð ð Ø�ð øøøà ð )Ø × $Ò $ RÑ (Ô (Ð (Ø Ð s„ž3²3ÁABÂB.Â-B.c ór—d}d} tt¦«}ttdddd|¬¦«¦«}|D]Y}| ¦« d¦«}|ddkr|d }|dd kr|d }|d krd }ŒZn#t ttf$rYnwxYw||fS) aŒ Determines active web server from options.conf, directive 'webserver' :return: tuple (active_web_server_name, apache_active_module_name) active_web_server_name: 'apache', 'nginx', 'nginx_apache', 'litespeed', 'openlitespeed', etc apache_active_module_name: 'prefork', 'event', 'worker' (None, None) if DA options.conf read/parse error Nz^apache_mpm|^webserverFT)Ú fixed_stringrÇrÈrÉrsrÚ webserverrIÚ apache_mpmÚautoÚworker) r!r0r§r#rYrrr:r&)Úweb_server_nameÚapache_active_module_nameÚ options_linesÚgrep_result_listr[Ú line_partss r1Ú_get_active_web_server_paramsz)PanelPlugin._get_active_web_server_paramsés€ðˆØ$(Ð!ð õ+­;Ñ7Ô7ˆMÝ#¥DÐ)AÐPUÐjoØ9=Èmð%]ñ%]ô%]ñ ^ô ^Ð ð)ð =ð =�Ø!ŸZšZ™\œ\×/Ò/°Ñ4Ô4� ؘa”= KÒ/Ð/Ø&0°¤m�Oؘa”= LÒ0Ð0Ø0:¸1´ Ð-à0°FÒ:Ð:Ø4<Ð1øð =øõ�¥*Ð-ð ð ð Ø ˆDð øøøàÐ 9Ð9Ð9s†BBÂB2Â1B2Úapache_module_namecó–— t|j|d¦«S#tttt f$rdt ¦«fcYSwxYw)aš Determine MaxRequestWorkers directive value for specified apache module. Reads config file /etc/httpd/conf/extra/httpd-mpm.conf :param apache_module_name: Current apache's module name: 'prefork', 'event', 'worker' :return: tuple (max_req_num, message) max_req_num - Maximum request apache workers number or 0 if error message - OK/Error message ÚMaxRequestWorkersr)r ÚHTTPD_MPM_CONFIGrr:r&rÍr)r�rÞs r1Ú#_get_max_request_workers_for_modulez/PanelPlugin._get_max_request_workers_for_module sa€ð #Ý.¨tÔ/DØ/AØ/BñDôDð Døõ�¥*­jÐ9ð #ð #ð #Ø•j‘l”l�?Ð "Ð "Ð "ð #øøøs‚˜-AÁAcó˜—| ¦«\}}|�|€ ddt›d�fS|dkrdd|›d�fS| |¦«S)zó Get current maximum request apache workers from httpd's config :return: tuple (max_req_num, message) max_req_num - Maximum request apache workers number or 0 if error message - OK/Error message Nrú"There was error during read/parse ú . Apache collector will not workÚapacheú!DA is configured for web server 'ú9'; but 'apache' is needed. Apache collector will not work)rÝr0râ)r�rØrÙs r1Úget_apache_max_request_workersz*PanelPlugin.get_apache_max_request_workerss�€ð6:×5WÒ5WÑ5YÔ5YÑ2ˆÐ2Ø Ð "Ð&?Ð&GØÐh½;ÐhÐhÐhÐhÐ hØ ˜hÒ &Ð &Øð7¸/ð7ð7ð7ð7ð 7à×7Ò7Ð8QÑRÔRÐRr0cóx—d} t|j¦«}d}d}|D]ƒ}| ¦«}| |¦«r|}Œ.| d¦«r@|r>| |d¦« dd¦« ¦«}nŒ„n#t t f$rYnwxYw|S)z¤ Determine apache mod_status URI from /etc/httpd/conf/extra/httpd-info.conf config :return Apache mod_status URI or None if error/not found Nz )r!ÚHTTPD_INFO_CONFIGrYÚ startswithrGrr:)r�Ú location_uriÚ info_linesÚlocation_directiveÚ location_liner[s r1Ú_get_httpd_status_uriz!PanelPlugin._get_httpd_status_uri(sæ€ð ˆ ð õ (¨Ô(>Ñ?Ô?ˆJØ!,Ð Ø ˆMØ"ð ð �Ø—z’z‘|”|�Ø—?’?Ð#5Ñ6Ô6ðà$(�MØØ—?’?Ð#=Ñ>Ô>ðÀ=ðà#0×#8Ò#8Ð9KÈRÑ#PÔ#P×#XÒ#XÐY\Ð^`Ñ#aÔ#a×#gÒ#gÑ#iÔ#i�LØ�EøøøÝ�Ð!ð ð ð Ø ˆDð øøøàÐs„BB#Â#B7Â6B7cój—| ¦«\}}|€ ddt›d�fS|dkrdd|›d�fS | ¦«}|€dSd |›d �}tj|d ¬ ¦«}|jd krdd|›d|j›�fS|j d¦«}| d¦«}ttd|¬¦«¦«}|d d¦«d  ¦«} t| ¦«dfS#t$rdt¦«fcYSwxYw)zÚ Retrieves Apache's connections number (from apache's mod_status) :return: tuple (conn_num, message) conn_num - current connections number, 0 if error message - OK/Trace Nrrärårærçrè)rz%Can't found mod_status URI in configszhttp://127.0.0.1z?autoé)ÚtimeoutéÈzGET z response code is rTú zTotal Accesses)rÉrrIÚOK)rÝr0ròÚrequestsr’Ú status_codeÚcontentÚdecoderr§r#rYrÚrEr) r�rØr rîÚurlÚresponseÚ s_responseÚs_response_listÚout_listÚs_total_accessess r1Úget_apache_connections_numberz)PanelPlugin.get_apache_connections_numberDsŠ€ð"×?Ò?ÑAÔAш˜Ø Ð "ØÐh½;ÐhÐhÐhÐhÐ hØ ˜hÒ &Ð &Øð7¸/ð7ð7ð7ð7ð 7ð #ð ×5Ò5Ñ7Ô7ˆLØÐ#ØAÐAØ8 \Ð8Ð8Ð8ˆCÝ”| C°Ð3Ñ3Ô3ˆHØÔ# sÒ*Ð*ØÐN ÐNÐN¸Ô8LÐNÐNÐNÐNØ!Ô)×0Ò0°Ñ9Ô9ˆJØ(×.Ò.¨tÑ4Ô4ˆOÝ�DÐ!1À/ÐRÑRÔRÑSÔSˆHà'¨œ{×0Ò0°Ñ5Ô5°aÔ8×>Ò>Ñ@Ô@Ð ÝÐ'Ñ(Ô(¨$Ð.Ð .øÝð #ð #ð #Ø•j‘l”l�?Ð "Ð "Ð "ð #øøøs¶DÁ5DÂBDÄD2Ä1D2có<—t¦«t¦«zS)a  Returns installed alt-php(s) on the server compiled phpXY via custombuild and alt-phpXY has different paths also user could choose version via PHP selector which was not compiled with custombuild (will be absent in DA configs) )r`ror/r0r1Úget_installed_php_versionsz&PanelPlugin.get_installed_php_versionsds€õ/Ñ0Ô0Õ3UÑ3WÔ3WÑWÐWr0cóþ—d}tj |¦«sdSt|d¬¦«5}| ¦«}ddd¦«n #1swxYwY|sdS|d ¦«S)Nz)/usr/local/directadmin/data/admin/ip.listròrTrUr)r,r-rªr\rurY)r�Ú ip_list_filer^Úipss r1Ú get_server_ipzPanelPlugin.get_server_iposµ€ØBˆ ÝŒw�~Š~˜lÑ+Ô+ð Ø�2å �,¨Ð 1Ñ 1Ô 1ð °QØ—+’+‘-”-ˆCð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ðð Ø�2à�1Œv�|Š|‰~Œ~ÐsµAÁAÁAr�ržcóš—d|›d�}tj |¦«sdSt|¦«}| dd¦«S)Nrzz /user.confròrš)r,r-rªr r’)r�ržÚ user_confs r1Úget_user_emails_listz PanelPlugin.get_user_emails_list|sN€àM¸ÐMÐMÐMˆ ÝŒw�~Š~˜iÑ(Ô(ð Ø�2å˜iÑ(Ô(ˆ Ø�}Š}˜W bÑ)Ô)Ð)r0có´—tjddd|›�gddd¬¦«j}t|¦«dkrdSt |¦«}|j›d |j›d �S) Nr+z--create-login-urlzuser=TF)rcrbrdrròz://rq)rerfrgrvrÚschemeÚnetloc)r�Úgenerated_loginÚparseds r1Úpanel_login_linkzPanelPlugin.panel_login_link…s�€å$œ.Ð*NØ*>Ð@RÈÐ@RÐ@Rð*Tà8<À4ÈuðVñVôVäV\ð õ ˆÑ Ô  1Ò $Ð $Ø�2ݘ/Ñ*Ô*ˆØ”-Ð4Ð4 F¤MÐ4Ð4Ð4Ð4r0có�—t |¦« d¦«}t|¦«dkrdS|›d�S)Nrqrròz/evo/user/plugins/awp#/)r|rÚrstriprv)r�Úlinks r1Úpanel_awp_linkzPanelPlugin.panel_awp_link�sF€å×+Ò+¨HÑ5Ô5×<Ò<¸SÑAÔAˆÝ ˆt‰9Œ9˜Š>ˆ>Ø�2ØÐ/Ð/Ð/Ð/r0có@—t¦«}g}|D]Š}tj t|t ¦«}tj |¦«sŒMt|¦«}| d¦«dkr|  |¦«Œ‹|S)NÚ suspendedÚyes) rRr,r-rLrMrNrªr r’r«)r�Ú all_usersÚsuspended_usersr4r²r¥s r1Úsuspended_users_listz PanelPlugin.suspended_users_list—sŽ€Ý‘I”Iˆ ؈Øð -ð -ˆDÝœWŸ\š\­-¸½yÑIÔIˆNå”7—>’> .Ñ1Ô1ð Øå# NÑ3Ô3ˆKØ�Š˜{Ñ+Ô+¨uÒ4Ð4Ø×&Ò& tÑ,Ô,Ð,øàÐr0©NF©Nr�Trœ)1r©Ú __module__Ú __qualname__rÌrárìrr†r›r@rRr`r'r¡ror‰rrÓÚ staticmethodr¨r·rrrr)rgr rQr¶rÀr§rrÃrÚrÑrr;rÝrâréròrrr r rrrÚ __classcell__)r‚s@r1r|r|Ôs{ø€€€€€Ø4ÐØ=ÐØ?ÐðAðAðAðAðAððððððð: ð ð ððððððð%ð%ð%ð 2ð 2ð 2ðEðEðEðEð)dØ $ðHðHðHðHð&!ð!ð!ððððð,ð,ñ„\ð,ð#ð#ð#ðððð,ð,ð,ð,ð.ð.ð.ð.ð*ð*ð*ðððð$ð$ð$ð&ð&ð&ðð'ð'ñ„\ð'ð$ð ð ñ„\ð ð  ¨T°'¬]ð ð ð ð ð ð! 4¨¤9ð!ð!ð!ñ„\ð!ð4ð:¨5°°c°¬?ð:ð:ð:ñ„\ð:ð>#Àcð#ÈeÐTWÐY\ÐT\Ìoð#ð#ð#ð#ð S°°c¸3°h´ð Sð Sð Sð Sð sððððð8#ð#ð#ð@ðXðXñ„\ðXð ð ð ðð* sð*°Cð*ð*ð*ñ„\ð*ðð5ð5ñ„\ð5ðð0ð0ñ„\ð0ð ð ð ð ð ð ð r0r|r)Tr)Frœ)iÚ__doc__rKr,rZrerxrvÚ tracebackrÚtypingrrrÚ urllib.parserrùÚclcommon.clconfparsrr r r r r rrr8Úclcommon.clpwdrÚclcommon.cpapi.cpapicustombinrrÚclcommon.cpapi.cpapiexceptionsrrrrrrÚclcommon.cpapi.GeneralPanelrrrrkrr!Úclcommon.featuresrÚclcommon.utilsrr r!r"r#r„r»r-rLrØÚ DA_DATA_DIRr9rMr0rNrr€r]rdr[ÚescaperCr2r@rRr`rgrorlr‰r¿rÌrÓrÛrÞrärÅr·rr Ú cache_callr;r´rrr'r)r4r<r¶rQr`rirorxrFr|r/r0r1úr1sµðððð € € € Ø € € € Ø € € € ØÐÐÐØ € € € Ø € € € Ø Ð Ð Ð Ð Ð Ø$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ø!Ð!Ð!Ð!Ð!Ð!à€€€ððððððððððððððððððð3Ð2Ð2Ð2Ð2Ð2Ø Ð Ð Ð Ð Ð ððððððððððððððððððððððððððððððððððð ðððððð&Ð%Ð%Ð%Ð%Ð%ððððððððððððððð€ ð "€Ø Œ'�,Š,�vÐ6Ñ 7Ô 7€ØŒg�lŠl˜6 6Ñ*Ô*€ Ø ŒW�\Š\˜&Ð"3Ñ 4Ô 4€ Ø”— ’ ˜[¨'Ñ2Ô2€ ØŒg�lŠl˜6 =°.ÑAÔA€ Ø € Ø*€ Ø ŒG�LŠL˜ gÑ .Ô .€ Ø”—’˜i¨Ñ9Ô9€ØŒg�lŠl˜9 lÑ3Ô3€ ؈rŒzÐ< i b¤i° Ñ&:Ô&:Ð<Ð<Ñ=Ô=€ ð FðFðFð ððð"ððð !ð!ð!ð ððð ðððððððð*ðððð@$#ð$#ð$#ðN Að Að Að HðHðHð2RðRðRð5ð5ð5ðððð.ððð@,Ið,Ið,Ið,Ið^ððð"ððð*!ÐÔ ¨|¨nÐ=Ñ=Ô=ð˜d 3¨ 8œnðððñ>Ô=ðð2ððð. 9ð 9ð 9ð 9ð+ð+ð+ð ð ð ð #ð#ð#ðððð*ððð(ððð@ð@ð@ðFððð2 ð ð ð(ð(ð(ðV =ð =ð =ð ð ð ðPðPðPðPðPÐ&ñPôPðPðPðPr0