§ ;Š»j¿¿ãóЗddlZddlZddlZddlZddlZddlZddlZddlZddl Zddl Zddl m Z ddl mZmZmZddlmZddl mZddlZddlZddlmZddlmZddlmZmZmZmZmZm Z m!Z!m"Z"dd l#m$Z$m%Z%m&Z&m'Z'dd l(m)Z)dd l*m+Z+dd l,m-Z-m.Z.m/Z/dd l0m1Z1m2Z2m3Z3m4Z4m5Z5dZ6dZ7dZ8ej9e:¦«Z;d„ZdZ?dZ@dZAdZBdZCdZDdZEdZFdZGdddd d!d"d#œZHd$ZIe=fd%„ZJe>fd&„ZKeAfd'„ZLd(„ZMeAfd)„ZNdDd+„ZOdEd-„ZPdd$e@d.d.fd/„ZQdFd0„ZRdGd1„ZSdGd2„ZTeCd.fd3„ZUeBd.fd4„ZViZWeBd.fd5„ZXeCd.fd,eYd6eZfd7„Z[eCd.fd,eYd6eZfd8„Z\eBd.fd9„Z]deDfd:„Z^d;„Z_dHd<„Z`d=„Zad>„ZbdHd?„Zcd@„ZddA„ZeGdB„dCe&¦«ZfdS)IéN)Ú OrderedDict)Ú ConfigParserÚ NoOptionErrorÚNoSectionError)Ú format_exc)Úurlparse)ÚClPwd)Ú load_fast)ÚCPAPIExternalProgramFailedÚCpApiTypeErrorÚ DuplicateDataÚ EncodingErrorÚNoDBAccessDataÚNoDomainÚ NotSupportedÚ ParsingError)ÚCPAPI_CACHE_STORAGEÚDomainDescriptionÚGeneralPanelPluginV1ÚPHPDescription)Úgetuser)ÚFeature)Ú WhmApiErrorÚ WhmApiRequestÚWhmNoPhpBinariesError)ÚExternalProgramFailedÚget_file_linesÚget_modules_dir_for_alt_phpÚgrepÚ run_commandÚcPanelz)/opt/cloudlinux/venv/bin/cpanel-dbmappingz /usr/bin/uapicó@—tj d¦«S)Nú/usr/local/cpanel/cpanel)Ú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/cpanel.pyÚdetectr*5s€Ý Œ7�>Š>Ð4Ñ 5Ô 5Ð5r(z /root/.my.cnfz/etc/userplansz/var/cpanel/databases/z/var/cpanel/users/z/var/cpanel/resellersz6/etc/userdatadomains;/var/cpanel/userdata/{user}/cachez/var/cpanel/userdata/{user}z/etc/wwwacct.confz/etc/trueuserownersz/etc/sysconfig/cloudlinuxz/var/cpanel/cpanel.configÚdnsÚplanÚownerÚ contactemailÚlocaleÚuser)r+ÚpackageÚresellerÚmailr/Úcplogin©r4r1r3r2r+r/có:—i}tddd¬¦«}| |¦«}|std|›�¦«‚ | dd¬¦«r/| ddd¬¦« d ¦«|d <n.| dd d¬¦« d ¦«|d <| dd d¬¦« d ¦«|d <n4#t tf$r }td |›d|j›�¦«|‚d}~wwxYwd|d<|S)NTF)Úallow_no_valueÚ interpolationÚstrictz=Cannot find database access data for localhost. No such file ÚclientÚpassword)ÚsectionÚoption)r<r=Úrawz"'Úpassr0Úloginz@Cannot find database access data for localhost from config file ú; ÚmysqlÚdb) rÚreadrÚ has_optionÚgetÚstriprrÚmessage)Ú _conf_pathÚaccessÚreg_data_configÚ opened_filesÚerrs r)Ú db_accessrNQs™€Ø €FÝ"ØØØðñô€Oð #×'Ò'¨ Ñ3Ô3€LØ ð ÝØ XÈJÐ XÐ Xñ ô ð ð Ø × %Ò %¨h¸zÐ %Ñ JÔ Jð Ø,×0Ò0Ø Ø!Øð1ñô÷Še�E‰lŒlð �6‰NˆNð -×0Ò0Ø ØØð1ñô÷Še�E‰lŒlð �6‰Nð *×-Ò-ØØØð.ñ ô ÷ Š%�‰,Œ,ð ˆw‰ˆøõ �>Ð *ðððÝð 0Øð 0ð 0Ø"%¤+ð 0ð 0ñ ô ðð øøøøðøøøð €Fˆ4�LØ €Ms¿B"C"Ã"DÃ3DÄDcóŠ—t|d¬¦«5}d„|D¦«}ddd¦«n #1swxYwYt|¦«S)z² Parse the file /etc/userplans, which contains the pairs of user-plan :param _userplans_file: path to the user's plans file :return: list of the non-system users úutf-8©Úencodingcó—g|]‚}| d¦«sk| d¦«dk¯0t| ¦«¦«dk¯U| d¦«d ¦«‘ŒƒS)ú#ú:éér)Ú startswithÚcountÚlenrGÚsplit©Ú.0Úlines r)ú zcpusers..ƒs‰€ðfðfðf°TØ!Ÿ_š_¨SÑ1Ô1ðfØ6:·j²jÀ±o´oÈÒ6JÐ6JÍsÐSW×S]ÒS]ÑS_ÔS_ÑO`ÔO`ÐcdÒOdÐOdð—j’j ‘o”o aÔ(×.Ò.Ñ0Ô0ØOdÐOdÐOdr(N)ÚopenÚtuple)Ú_userplans_fileÚstreamÚ users_lists r)Úcpusersre|s«€õ ˆo¨Ð 0Ñ 0Ô 0ðf°Fðfðf¸Vðfñfôfˆ ðfðfðfñfôfðfðfðfðfðfðføøøðfðfðfðfõ �Ñ Ô Ðs ’ +«/²/cóä—tj |¦«st¦«St |d¬¦«5}d„|D¦«}ddd¦«n #1swxYwYt|¦«S)NrPrQcóæ—g|]n}| d¦«sWd|v¯t| ¦«¦«dk¯@| dd¦«d ¦«‘ŒoS)rTrUrVr)rXrZrGr[r\s r)r_zresellers..�s�€ðcðcðc¸DØ!%§¢°Ñ!5Ô!5ðcØ;>À$¸;¸;ÍCÐPT×PZÒPZÑP\ÔP\ÑL]ÔL]Ð`aÒLaÐLaðŸ*š* S¨!Ñ,Ô,¨QÔ/×5Ò5Ñ7Ô7ØLaÐLaÐLar()r$r%r&rar`)Ú_resellers_pathrcÚresellers_lists r)Ú resellersrjˆsÈ€Ý Œ7�>Š>˜/Ñ *Ô *ð݉wŒwˆÝ ˆo¨Ð 0Ñ 0Ô 0ðc°Fð cðcÀFðcñcôcˆð cðcðcñcôcðcðcðcðcðcðcøøøðcðcðcðcõ �Ñ Ô Ð s¿ AÁAÁAcó—dhS)NÚrootr'r'r(r)Úadminsrm•s €Ø ˆ8€Or(cóT‡—tˆfd„t|¦«D¦«¦«S)z€ Check if given user is reseller; :param _resellers_path: for testing only :type username: str :rtype: bool c3ó$•K—|] }|‰kV—Œ dS©Nr')r]r4Úusernames €r)ú zis_reseller.. s(øèè€ÐMÐM wˆw˜(Ò"ÐMÐMÐMÐMÐMÐMr()Úanyrj)rqrhs` r)Ú is_resellerrt™s0ø€õ ÐMÐMÐMÐMµ)¸OÑ2LÔ2LÐMÑMÔMÑ MÔ MÐMr(Fcó¬—g}g}|pgD]a} | ttj|¦«j¦«¦«Œ=#t $r| d¦«YŒ^wxYwt g}|s| d¦«||z }tj|tj tj d¬¦«5}|  ¦«\}}ddd¦«n #1swxYwY|  d¦«D]G} |   ¦«} | r/| |   ¦«dd…¦«ŒHt|¦«S)zö 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 z-1z--nosysT©ÚstdoutÚstderrÚtextNú é)ÚappendÚstrÚpwdÚgetpwnamÚpw_uidÚKeyErrorÚDBMAPPING_SCRIPTÚ subprocessÚPopenÚPIPEÚ communicater[rGra) Ú cplogin_lstÚwith_system_usersÚresultsÚuid_listrqÚparamsÚpÚoutputÚ_r^s r)Údblogin_cplogin_pairsr�£s¢€ð€Gà€HØ Ð& Bð"ð"ˆð "Ø �OŠO�C¥¤ ¨XÑ 6Ô 6Ô =Ñ>Ô>Ñ ?Ô ?Ð ?Ð ?øÝð "ð "ð "à �OŠO˜DÑ !Ô !Ð !Ð !Ð !ð "øøøõ Ð €FØ ð!Ø� Š �iÑ Ô Ð Ø ˆhÑ€Få Ô ØÝŒÝŒØ ð  ñ ô ð$ð Ø—M’M‘O”O‰ ˆ�ð $ð$ð$ñ$ô$ð$ð$ð$ð$ð$ð$øøøð$ð$ð$ð$ð— ’ ˜TÑ"Ô"ð-ð-ˆØ�zŠz‰|Œ|ˆØ ð -Ø �NŠN˜4Ÿ:š:™<œ<¨¨¨Ô+Ñ ,Ô ,Ð ,øå �‰>Œ>Ðs#Œ9AÁA(Á'A(Â;CÃC#Ã&C#Úcpusercó—t|t¦«rT|rR|dvsNd|vsJd|vsFd|vsBtj |¦«s#tj |¦«|krt dd|›d�d¬ ¦«‚d S) a: Reject a value that is unsafe to splice into a filesystem path as a single component (these helpers are exported public API and run as root). A safe component equals its own basename and contains no separator, NUL or traversal, so an absolute or '..'-bearing value cannot escape the base dir. )ú.z..ú/ú\úÚcpinfoza safe z" (no path separators or traversal)zunsafe path component©ÚfuncnameÚsupportedtypesÚ received_typeN)Ú isinstancer}r$r%ÚisabsÚbasenamer )ÚvalueÚkinds r)Ú_validate_path_componentr Ìsª€õ �u�cÑ "Ô "ðD¨%ðDؘ Ð#Ð#Ø�eˆ|ˆ|˜t u˜}˜}°¸° ° ÝŒw�}Š}˜UÑ#Ô#ð1>åŒw×Ò Ñ&Ô&¨%Ò/Ð/Ý hØ,^°dÐ,^Ð,^Ð,^Ø+BðDñDôDð Dð0Ð/r(TcóR—g}t|t¦«r|g}nht|ttf¦«rt|¦«}n<|€t t ¬¦«}n$t ddt|¦«j¬¦«‚|D�]’}t|d¬¦«tj   ||¦«}tj   |¦«s&|s#tj d|›d�¦«Œyt#|d d ¬ ¦«}g} |D]k} | t& | ¦«¦«} | d kr!| €tj  |¦«} |  | ¦«Œl| t| ¦«¦«d |vrq| d ¦«} | rZ| | t|¦« d ¦«<t| ¦«} | |vr"| t| ¦«¦«�Œ”t|¦«S)N)rbr–zstr|unicode|list|tupler—r�©rŸz(WARNING: Can not load data to the user "z*"; Perhaps there is no such user in cPanelT)Ú lower_keysÚ skip_commentsr4r3Ú contactemail2)r›r}ÚlistrareÚCPANEL_USERPLANS_PATHr ÚtypeÚ__name__r r$r%ÚjoinÚexistsÚsysrxÚwriter rFÚUSERCONF_PARAM_MAPr�r|Úindex)r�ÚkeylsÚ_cpanel_users_dirÚquietÚsearch_sys_usersÚreturnedÚ cpusers_listÚuser_config_pathÚ cpuser_dataÚ user_dataÚdata_keyÚdataÚadditional_mailÚuser_data_tuples r)r–r–ÝsI€à€HÝ�&�#ÑÔðBØ�xˆ ˆ Ý �F�T¥5˜MÑ *Ô *ðBݘV‘}”}ˆ ˆ Ø ˆÝÕ/DÐEÑEÔEˆ ˆ å hÐ?WÝ+/°©<¬<Ô+@ðBñBôBð Bðð(6ñ(6ˆÝ  ¨hÐ7Ñ7Ô7Ð7Ýœ7Ÿ<š<Ð(9¸6ÑBÔBÐÝŒw�~Š~Ð.Ñ/Ô/ð Øð LÝ” × Ò ð"KÈFð"Kð"Kð"KñLôLðLà õ Ð 0¸TØ.2ð4ñ4ô4ˆ àˆ Øð #ð #ˆHØ—?’?Õ#5×#9Ò#9¸(Ñ#CÔ#CÑDÔDˆDð˜9Ò$Ð$¨¨Ý”w×'Ò'Ð(8Ñ9Ô9�Ø × Ò ˜TÑ "Ô "Ð "Ð "Ø�Š�˜iÑ(Ô(Ñ)Ô)Ð)à �Uˆ?ˆ?Ø)Ÿošo¨oÑ>Ô>ˆOØð 6Ø7F� �$˜u™+œ+×+Ò+¨FÑ3Ô3Ñ4Ý"'¨ Ñ"2Ô"2�Ø"¨(Ð2Ð2Ø—O’O¥E¨)Ñ$4Ô$4Ñ5Ô5Ð5ùÝ �‰?Œ?Ðr(có—g} t|pt¦«}n#ttf$rYnwxYw|D]w}| d¦«r`| d¦«}t |¦«dkr8d|d ¦«vr|d ¦«cSŒxg} t|pt¦«}n#ttf$rYnwxYwd}|D]†}| d¦«r.|  dd¦« ¦«}|r|cS| d¦«r,|  dd¦« ¦«}|r|}Œ‡|rd |zSd d l m }||¬ ¦«S) z� :param str|None _conf1: for testing :param str|None _conf2: for testing :param str|None _hostname: for testing :return: ÚEMAILú=r{ú@rVÚÚ CONTACTEMAILÚHOSTzroot@r©Úget_admin_email)Ú _hostname) rÚSYSCONF_CLOUDLINUX_PATHÚOSErrorÚIOErrorrXr[rZrGÚCPANEL_ACCT_CONF_PATHÚreplaceÚ clcommon.cpapi.plugins.universalrÅ) Ú_conf1Ú_conf2rÆÚlinesr^ÚpartsÚhostÚsrÅs r)rÅrÅsÖ€ð €Eð ݘvÐ@Õ)@ÑAÔAˆˆøÝ •WÐ ð ð ð Ø ˆð øøøðð(ð(ˆØ �?Š?˜7Ñ #Ô #ð (Ø—J’J˜s‘O”OˆEÝ�5‰zŒz˜QŠˆ 3¨%°¬(¯.ª.Ñ*:Ô*:Ð#:Ð#:ؘQ”x—~’~Ñ'Ô'Ð'Ð'Ð'øð €Eð ݘvÐ>Õ)>Ñ?Ô?ˆˆøÝ •WÐ ð ð ð Ø ˆð øøøð €DØððˆØ �?Š?˜>Ñ *Ô *ð Ø— ’ ˜^¨RÑ0Ô0×6Ò6Ñ8Ô8ˆAØð Ø���Ø �?Š?˜6Ñ "Ô "ð Ø— ’ ˜V RÑ(Ô(×.Ò.Ñ0Ô0ˆAØð Ø�øØ ðØ˜‰~Ðà@Ð@Ð@Ð@Ð@Ð@Ø ˆ? YÐ /Ñ /Ô /Ð/s„›/®/Â/CÃCÃCc óL—d|vr@tjtj¦«¦«j}| d|¦«}| d¦«}|D�]F}tj |¦«sŒ# t|d¬¦«5}t|¦«D]¨\}}|  ¦«sŒ|  d¦«dkr)|s&tj d|›d|›d �¦«Œ\| d¦«\} } |   ¦« d ¦«} ||| | ¦«Œ© ddd¦«n #1swxYwY�Œ#t $r3} |s&tj d |›d | ›d �¦«Yd} ~ �Œ@d} ~ wwxYwdS)Nú{user}ú;rPrQú: rVz Can't parse z line in file "z"; line was ignored z==úCan't open file ú [ú] )r~Úgetpwuidr$ÚgeteuidÚpw_namerËr[r%r«r`Ú enumeraterGrYr¬rxr­rÉ) Ú_pathÚparserr²Ú call_as_userÚ path_listÚpath_rcÚir^ÚdomainÚdomain_raw_dataÚ domain_dataÚes r)Ú_parse_userdatadomainsrèBs€Ø�5ÐÐÝ”|¥B¤J¡L¤LÑ1Ô1Ô9ˆ Ø— ’ ˜h¨ Ñ5Ô5ˆØ— ’ ˜CÑ Ô €IØðñˆÝŒw�~Š~˜eÑ$Ô$ð Ø ð Ý�e gÐ.Ñ.Ô.ð 7°&õ )¨Ñ0Ô0ð 7ð 7‘G�A�tØŸ:š:™<œ<ð!Ø Ø—z’z $Ñ'Ô'¨1Ò,Ð,Ø$ðmÝœJ×,Ò,Ð-k¸QÐ-kÐ-kÈuÐ-kÐ-kÐ-kÑlÔlÐlØ Ø.2¯jªj¸Ñ.>Ô.>Ñ+�F˜OØ"1×"7Ò"7Ñ"9Ô"9×"?Ò"?ÀÑ"EÔ"E�KØ�F˜5 &¨+Ñ6Ô6Ð6Ð6ð 7ð 7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7ùøõð ð ð Øð EÝ” × Ò Ð!C°EÐ!CÐ!C¸QÐ!CÐ!CÐ!CÑDÔDÐDØ ˆHˆHˆH‰Høøøøð øøøð%ðs=ÂE$ÂB9EÅ E$ÅE ÅE$ÅE ÅE$Å$ F!Å.(FÆF!c ó,—| d¦«}g}|D]ù}tj |¦«sŒ" t |d¬¦«5}t |¦«D]]\}}| ¦«sŒd|vrŒ|| dd¦« ¦« d¦«z }Œ^ ddd¦«n #1swxYwYŒ»#t$r2}|s&tj   d|›d |›d �¦«Yd}~Œòd}~wwxYw|S) NrÕrPrQÚ serveraliasz serveralias: rÁú r×rØrÙ) r[r$r%r«r`rÝrGrËrÉr¬rxr­) rÞr²ráÚaliasesrârcrãr^rçs r)Ú_parse_userdataaliasesrí_s›€Ø— ’ ˜CÑ Ô €IØ€GØððˆÝŒw�~Š~˜eÑ$Ô$ð Ø ð Ý�e gÐ.Ñ.Ô.ð T°&õ )¨Ñ0Ô0ðTðT‘G�A�tØŸ:š:™<œ<ð!Ø Ø$¨DÐ0Ð0Ø Ø˜tŸ|š|¨O¸RÑ@Ô@×FÒFÑHÔH×NÒNÈsÑSÔSÑS�G�Gð Tð Tð Tð Tñ Tô Tð Tð Tð Tð Tð Tð Tøøøð Tð Tð Tð Tøøõð ð ð Øð EÝ” × Ò Ð!C°EÐ!CÐ!C¸QÐ!CÐ!CÐ!CÑDÔDÐDØ ˆHˆHˆHˆHøøøøð øøøð €Ns<½CÁA.C Â= Cà C à CÃC ÃCà DÃ(D Ä Dcóú—t|d¬¦«t|d¬¦«d|vr| d|¦«}tj ||¦«}t ||¬¦«}t |¦«S)Nr�r¢rärÔ©r²)r rËr$r%rªrír¦)r�rärÞr²rìs r)Ú useraliasesrðwsy€å˜V¨(Ð3Ñ3Ô3Ð3ݘV¨(Ð3Ñ3Ô3Ð3Ø�5ÐÐØ— ’ ˜h¨Ñ/Ô/ˆÝ ŒG�LŠL˜ Ñ 'Ô '€EÝ$ U°%Ð8Ñ8Ô8€GÝ �‰=Œ=Ðr(có4‡‡‡—‰ ¦«Št¦«ŠdddœŠˆˆˆfd„}t|||¬¦«‰d�‰d�‰d‰dfSd ˆfd„‰D¦«¦«}t d‰›d |›�¦«‚) N)Ú docroot_pathr0cón•—‰ |¦«|‰kr|d‰d<|d‰d<dSdS)Néròrr0)Úadd)r%ÚdræräÚpathesÚresults €€€r)rßzdocroot..parser‡sDø€Ø� Š �4ÑÔÐØ �Š;ˆ;Ø%0°¤^ˆF�>Ñ "Ø(¨œ^ˆF�6‰NˆNˆNð ˆ;r(rïròr0rAcó •—g|] }d‰|dœz‘Œ S)z)Can't find record "%(d)s" in file "%(p)s")rörŒr')r]rŒräs €r)r_zdocroot..’s(ø€Ð^Ð^Ð^ÐRSÐ 5¸fÈ1Ð8MÐ8MÑ MÐ^Ð^Ð^r(z'Can't obtain document root for domain 'z'; )rGÚsetrèrªr)rärÞr²rßÚwatchedr÷røs` @@r)Údocrootrü‚sÖøøø€Ø �\Š\‰^Œ^€FÝ ‰UŒU€FØ"¨DÐ 1Ð 1€Fð,ð,ð,ð,ð,ð,ð,õ ˜5 &°Ð6Ñ6Ô6Ð6à �>Ô "Ð *¨f°V¬nÐ.DØ�nÔ% v¨f¤~Ð5Ð5Ø�iŠiØ^Ð^Ð^Ð^ÐW]Ð^Ñ^Ô^ñô€Gõ ÐQ¸VÐQÐQÈÐQÐQÑ RÔ RÐRr(có ‡‡‡—‰tvr t‰St¦«Št¦«Šˆˆˆfd„}t|||¬¦«‰ ‰¦«t ‰ ¦«¦«S)Nc󆕗|d}|d}|tvrt|}ng}d|dkr||f|vr| d||f¦«n||f|vr| ||f¦«|t|<|‰kr>d|dkr‰ ||i¦«dS‰ ||i¦«dSdS)NrrôÚmainr{)Ú_user_to_domains_map_cpanelÚinsertr|Úupdate) r%röræÚuser_Ú document_rootr¸r�ÚdomainsÚ domains_tmps €€€r)rßzuserdomains..parser¦süø€Ø˜A”ˆØ# Aœˆ à Õ/Ð /Ð /Ý3°EÔ:ˆIˆIàˆIØ �[ ”^Ò #Ð #à�=Ð!¨Ð2Ð2Ø× Ò   Q¨ Ð$6Ñ7Ô7Ð7øà�=Ð!¨Ð2Ð2Ø× Ò  ! ]Ð!3Ñ4Ô4Ð4Ø-6Õ# EÑ*Ø �FŠ?ˆ?ؘ QœÒ'Ð'à—’  =Ð1Ñ2Ô2Ð2Ð2Ð2à×"Ò" A }Ð#5Ñ6Ô6Ð6Ð6Ð6ð ˆ?r(rï)rrrèrr¦Úitems)r�rÞr²rßrrs` @@r)Ú userdomainsržs�øøø€à Õ,Ð,Ð,Ý*¨6Ô2Ð2å‘-”-€K݉mŒm€Gð7ð7ð7ð7ð7ð7ð7õ.˜5 &°Ð6Ñ6Ô6Ð6Ø ‡N‚N�;ÑÔÐÝ �— ’ ‘”Ñ Ô Ð r(Úreturncóú—t|d¬¦«d|vr| d|¦«}tj |d¦«} t |dd¬¦«5}t j|¦«}ddd¦«n #1swxYwY|S#t$r4}|s&tj   d |›d |›d �¦«icYd}~Sd}~wt j $r"}tt|¦«¦«|‚d}~wwxYw) a… Private helper to load and parse the main file for a given user. E.g. `/var/cpanel/userdata/{user}/main` :param cpuser: The cPanel username. :param _path: A path template containing the "{user}" placeholder. :param quiet: If False, errors are printed. :return: The parsed YAML data as a dictionary. :raises ParsingError: If an error occurs while parsing. r�r¢rÔrÿÚrtrPrQNr×rØrÙ)r rËr$r%rªr`ÚyamlÚ safe_loadrÉr¬rxr­Ú YAMLErrorrr})r�rÞr²Ú main_fileÚfrºrçs r)Ú_load_main_user_filerÂsY€õ˜V¨(Ð3Ñ3Ô3Ð3Ø�5ÐÐØ— ’ ˜h¨Ñ/Ô/ˆÝ”— ’ ˜U FÑ+Ô+€Ið *Ý �)˜T¨GÐ 4Ñ 4Ô 4ð %¸Ý”> !Ñ$Ô$ˆDð %ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %àˆ øÝ ðððØð EÝ ŒJ× Ò ÐC° ÐCÐC¸QÐCÐCÐCÑ DÔ DÐ D؈ ˆ ˆ ˆ ˆ ˆ øøøøÝ Œ>ð*ð*ð*Ý�3˜q™6œ6Ñ"Ô"¨Ð)øøøøð*øøøsNÁ B ÁBÁ4 B ÂBÂB ÂBÂB  C:Â)CÃC:ÃC:ÃC5Ã5C:cóR—t|||¬¦«}| di¦«S)ax Return all addon domains for the given cPanel user. It loads the user's main file at `/var/cpanel/userdata/{user}/main` and parses the YAML content, and then extracts the addon_domains mapping. :param cpuser: The cPanel username. :param _path: The path template for the userdata folder :param quiet: If False, errors might be printed. :return: A dict mapping addon domain names to their server names. For example: { "aurapoolshop.com.au": "aurapoolshop.thepoolandyardman.com.au" } :raises ParsingError: If the main file cannot be parsed. )rÞr²Ú addon_domains)rrF)r�rÞr²Ú main_datas r)ÚuseraddondomainsrÝs,€õ"% V°5ÀÐFÑFÔF€IØ �=Š=˜¨"Ñ -Ô -Ð-r(có쇇—gŠˆˆfd„}t|||¬¦«t‰¦«dkr)td‰›dd ‰¦«›d�¦«‚t‰¦«dkrdS‰dS) NcóN•—|‰kr‰ |d¦«dSdS)Nr)r|)r%rörærärds €€r)rßzdomain_owner..parserõs1ø€Ø �Š;ˆ;Ø × Ò ˜k¨!œnÑ -Ô -Ð -Ð -Ð -ð ˆ;r(rïrVzdomain z belongs to few users: [ú,ú]r)rèrZr rª)rärÞr²rßrds` @r)Ú domain_ownerròs¥øø€Ø€Jð.ð.ð.ð.ð.ð.õ˜5 &°Ð6Ñ6Ô6Ð6Ý ˆ:�„˜ÒÐÝØ M�fÐ MÐ M°c·h²h¸zÑ6JÔ6JÐ MÐ MÐ Mñ ô ð õ ˆ:�„˜!ÒÐØˆtØ �aŒ=Ðr(cóò—d}d}g}d}d}tj |¦«r™t|¦«}|D]‡}| |¦«r.| |¦«d ¦«}ŒE| |¦«r-| |¦«d ¦«}Œˆ|r| |¦«t¦«} |   ¦«} t|ttf¦«r&Gd„d¦«} i} |D]\} } | | | ¦«| | <Œ|   ¦«D]¤}|j}tj |dz¦«s"tj |dz¦«rWtj |¦«}|r| d |z¦«d krŒ‹||vr| |¦«Œ¥|S) a Detects and returns list of folders contained the home dirs of users of the cPanel :param str|None _sysusers: for testing :param str|None _conf_path: for testing :return: list of folders, which are parent of home dirs of users of the panel zHOMEDIR z HOMEMATCH rÁrVcó—eZdZd„ZdS)úhomedirs..pwcó"—||_||_dSrp)rÜÚpw_dir)ÚselfÚnameÚdirs r)Ú__init__zhomedirs..pw.__init__#s€Ø#�” Ø!�” � � r(N)r©Ú __module__Ú __qualname__r#r'r(r)Úpwr"s#€€€€€ð "ð "ð "ð "ð "r(r&z /public_htmlz/wwwr“éÿÿÿÿ)r$r%r«rrXr[rGr|r Ú get_user_dictr›r¦raÚvaluesrÚdirnameÚfind)Ú _sysusersrIÚHOMEDIRÚ HOMEMATCHÚhomedirsÚ users_homedirÚusers_home_matchrÏr^ÚclpwdÚ users_dictr&r!r"r¸ÚuserdirÚhomedirs r)r/r/s €ð€GØ€Ià€HØ€MØÐå „w‡~‚~�jÑ!Ô!ðDݘzÑ*Ô*ˆØð Dð DˆDØ�Š˜wÑ'Ô'ð DØ $§ ¢ ¨7Ñ 3Ô 3°AÔ 6× <Ò <Ñ >Ô >� � Ø—’ Ñ+Ô+ð DØ#'§:¢:¨iÑ#8Ô#8¸Ô#;×#AÒ#AÑ#CÔ#CÐ øàð'Ø�Š˜ Ñ&Ô&Ð&å ‰GŒG€EØ×$Ò$Ñ&Ô&€Jõ�)�d¥E˜]Ñ+Ô+ð-ð "ð "ð "ð "ð "ñ "ô "ð "ð ˆ Ø#ð -ð -‰JˆT�#Ø!˜r $¨™}œ}ˆJ�tÑ Ð à×&Ò&Ñ(Ô(ð)ð)ˆ ØÔ"ˆÝ Œ7�>Š>˜' NÑ2Ñ 3Ô 3ð )µr´w·~²~ÀgÐPVÑFVÑ7WÔ7Wð )Ý”g—o’o gÑ.Ô.ˆGØð  G§L¢L°Ð5EÑ1EÑ$FÔ$FÈ"Ò$LÐ$LØØ˜hÐ&Ð&Ø—’ Ñ(Ô(Ð(øà €Or(cóØ— tj|¦«}|d}d„|dD¦«S#tttf$r"}t t |¦«¦«|‚d}~wwxYw)Nrøcó—g|] }|d‘Œ S©r0r'©r]Úitems r)r_z*_reseller_users_parser..;ó€Ð8Ð8Ð8 ��V” Ð8Ð8Ð8r(rº©ÚjsonÚloadsr�Ú ValueErrorÚ TypeErrorrr})Ú json_stringÚjson_serializedrørçs r)Ú_reseller_users_parserrC7st€ð*Ýœ* [Ñ1Ô1ˆØ  Ô*ˆØ8Ð8¨°¬Ð8Ñ8Ô8Ð8øÝ •j¥)Ð ,ð*ð*ð*Ý�3˜q™6œ6Ñ"Ô"¨Ð)øøøøð*øøøs‚-0°A)ÁA$Á$A)có~—|p t¦«}tdddg}|t¦«kst¦«dkr5| dtj |¦«›�¦« t |d¬¦«d}n/#t$r"}tt|¦«¦«|‚d }~wwxYw|S) z’ Call UAPI and get json string; :type reseller_name: str | None :raises: ParsingError, CPAPIExternalProgramFailed :rtype: str Ú ResellersÚ list_accountsz --output=jsonrlz--user=T)ÚcmdÚreturn_full_outputrVN) rÚUAPIr|ÚurllibÚparseÚquoter rr r})Ú reseller_namerGrArçs r)Ú_reseller_users_jsonrN@sÁ€ð"Ð.¥W¡Y¤Y€Må �˜o¨Ð ?€Cà�™ œ Ò!Ð!¥W¡Y¤Y°&Ò%8Ð%8Ø � Š Ð@�Vœ\×/Ò/° Ñ>Ô>Ð@Ð@ÑAÔAÐAð8Ý! c¸dÐCÑCÔCÀAÔFˆ ˆ øÝ ð8ð8ð8Ý(­¨Q©¬Ñ0Ô0°aÐ7øøøøð8øøøà ÐsÁ6B B:ÂB5Â5B:cóø—|€gSg}tt¦«}|�]td|›d�ddd|¬¦«D]D}| ¦« d¦«}| |d¦«ŒE|S) zˆ Return reseller users :param resellername: reseller name; return empty list if None :return list[str]: user names list Nz\: ú$FT)Ú fixed_stringÚmatch_any_positionÚmultiple_searchÚdata_from_filerÖr)rÚCPANEL_USEROWNERS_FILErrGr[r|)Ú resellernamerøÚuserowner_file_datar^Ú splitted_lines r)Úreseller_usersrYTs�€ð*ÐØˆ Ø €FÝ(Õ)?Ñ@Ô@ÐØÐÝÐ/  Ð/Ð/Ð/Ø&+Ø,0Ø)-Ø(;ð =ñ=ô=ð ,ð ,ˆDð !ŸJšJ™LœL×.Ò.¨tÑ4Ô4ˆMØ �MŠM˜-¨Ô*Ñ +Ô +Ð +Ð +à €Mr(cóô— tj|¦«}|d}i}|dD]}|d||d<Œ|S#tttf$r"}t t |¦«¦«|‚d}~wwxYw)Nrørºrär0r<)rArBrøÚ users_datar:rçs r)Ú_reseller_user_domains_parserr\ys�€ð*Ýœ* [Ñ1Ô1ˆØ  Ô*ˆØˆ ؘ6”Nð 6ð 6ˆDØ'+¨H¤~ˆJ�t˜F”|Ñ $Ð $ØÐøÝ •j¥)Ð ,ð*ð*ð*Ý�3˜q™6œ6Ñ"Ô"¨Ð)øøøøð*øøøs‚;>¾A7ÁA2Á2A7có>—t|¦«}t|¦«S)zí Get dict[user, domain] Attention!! This function may work unstable. See PTCLLIB-95 for details. :param reseller_name: reseller's name :rtype: dict[str, str|None] :raises DomainException: if cannot obtain domains )rNr\)rMrAs r)Úreseller_domainsr^…s€õ' }Ñ5Ô5€KÝ (¨Ñ 5Ô 5Ð5r(có—d|›d�S)Nzhttp://z:2083r')räs r)Úget_user_login_urlr`‘s€Ø "�VÐ "Ð "Ð "Ð"r(cón— td¦« ¦«n#t$rYdSwxYwdS)zM Checks that there are no installed php binaries only for cpanel Úphp_get_installed_versionsTF)rÚcallrr'r(r)Úis_no_php_binaries_on_cpanelrd•sL€ð ÝÐ2Ñ3Ô3×8Ò8Ñ:Ô:Ð:Ð:øÝ ððð؈tˆtðøøøà ˆ5s ‚!$¤ 2±2cóʇ—eZdZdZdZdZdZdZdZe e j e j z¦«Z dZdZd Zˆfd „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zdd„Z#d>d „Z$d!„Z%d"„Z&d#„Z'd$„Z(ed%„¦«Z)ee*j+d&d'g¬(¦«d)„¦«¦«Z,ee*j+d'g¬(¦«d*„¦«¦«Z-ed+„¦«Z.d,„Z/ed-„¦«Z0ed.„¦«Z1ed/„¦«Z2ed0„¦«Z3ed1„¦«Z4ed2„¦«Z5ed3e6d4e6d5e6fd6„¦«Z7ed7„¦«Z8ed8„¦«Z9d9„Z:d:„Z;d5eˆxZ?S)?Ú PanelPluginÚené0z/etc/apache2/conf/httpd.confz!/var/cpanel/whm_server_status_keyz/whm-server-statuszéz/var/cpanel/config/apache/portéPcóH•—t¦« ¦«dSrp)Úsuperr#)r Ú __class__s €r)r#zPanelPlugin.__init__µsø€Ý ‰Œ×ÒÑÔÐÐÐr(có —ddgfdddgff}|D]}|d|d}}tj t|dz¦«}| ||¦«rŒQt ||¦«¦«}| ||¦«Œ€dS) zL Goes through all panel caches and invalidates it if needed Ú"_get_php_version_id_to_handler_mapú/etc/cpanel/ea4/php.confÚ_get_vhosts_php_versionsú/etc/userdatadomainsrrVz.cacheN)r$r%rªrÚis_cache_validÚgetattrÚrewrite_cpapi_cache)r Úmethod_marker_pairsÚpairÚmethodÚmarkersÚ cache_filerºs r)Úinvalidate_cpapi_cachez"PanelPlugin.invalidate_cpapi_cache¸s»€ð!EÐGaÐFbÐcØ :Ð=SÐUoÐA;Á?B BÂBcó—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 )rNr‡s r)rNzPanelPlugin.db_accessùs€õ‰{Œ{Ðr(có—t¦«S)z¥ Generates a list of cpusers registered in the control panel :return: list of cpusers registered in the control panel :rtype: tuple )rer‡s r)rezPanelPlugin.cpuserss€õ‰yŒyÐr(có—t¦«S)zœ Generates a list of resellers in the control panel :return: list of cpusers registered in the control panel :rtype: tuple )rjr‡s r)rjzPanelPlugin.resellers s€õ‰{Œ{Ðr(có —t|¦«S)zc Check if given user is reseller; :type username: str :rtype: bool )rt)r rqs r)rtzPanelPlugin.is_resellers€õ ˜8Ñ$Ô$Ð$r(NFcó"—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 )r�)r r‡rˆs r)r�z!PanelPlugin.dblogin_cplogin_pairss€õ% [Ð2CÑDÔDÐDr(r5Tcó&—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 r)r–zPanelPlugin.cpinfo's€õ"�f˜eÐ6FÐGÑGÔGÐGr(có—t¦«S)zR Retrieve admin email address :return: Host admin's email rÄr‡s r)rÅzPanelPlugin.get_admin_email:s€õ Ñ Ô Ð r(có"—t||¦«S)z¢ Return aliases from user domain :param str|unicode cpuser: user login :param str|unicode domain: :return list of aliases )rð)r�räs r)rðzPanelPlugin.useraliasesAs€õ˜6 6Ñ*Ô*Ð*r(có —t|¦«S)z„ Return document root for domain :param str|unicode domain: :return Cortege: (document_root, owner) )rü©r räs r)rüzPanelPlugin.docrootKs€õ �v‰ŒÐr(có —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 r)rzPanelPlugin.userdomainsSs€õ˜6Ñ"Ô"Ð"r(có —t|¦«S)zà Return addon domain and mountpoint domain pairs for control panel user :param str|unicode cpuser: user login :return: mapping of addon domain names to their server names :rtype: dict )rr™s r)rzPanelPlugin.useraddondomains\s€õ  Ñ'Ô'Ð'r(có—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 )r/r‡s r)r/zPanelPlugin.homedirsfs€õ ‰zŒzÐr(có —t|¦«S)z– Return reseller users :param resellername: reseller name; autodetect name if None :return list[str]: user names list )rY©r rVs r)rYzPanelPlugin.reseller_usersms€õ ˜lÑ+Ô+Ð+r(có —t|¦«S)a Get dict[user, domain] Attention!! This function may work unstable. See PTCLLIB-95 for details. :param reseller_name: reseller's name :rtype: dict[str, str|None] :raises DomainException: if cannot obtain domains )r^r�s r)r^zPanelPlugin.reseller_domainsus€õ   Ñ-Ô-Ð-r(có —t|¦«S)z` Get login url for current panel; :type domain: str :rtype: str )r`r—s r)r`zPanelPlugin.get_user_login_urls€õ " &Ñ)Ô)Ð)r(có —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 )rr—s r)rzPanelPlugin.domain_owner‡s€õ˜FÑ#Ô#Ð#r(có — td¦« ¦«d}n"#t$r}t|¦«|‚d}~wwxYwd|iS)NÚphp_get_system_default_versionrŠÚdefault_version_id©rrcrr )r Údefault_versionrçs r)Úget_system_php_infozPanelPlugin.get_system_php_info�sl€ð 7Ý+Ø0ñ2ô2ß26²$±&´&¸ôDˆOˆOøåð 7ð 7ð 7Ý,¨QÑ/Ô/°QÐ 6øøøøð 7øøøð ! /ð ð s‚'*ª A ´AÁA c ój—| ¦«}| ¦«}i}|D]…}|d}|t| ¦«¦«vr$t d||||dœ¬¦«d}n|drdn||}t |d|||¬ ¦«||d <Œ†|S) a³ Returns info about domains: username, php_version, handler_type For each domain we detect handler and php_version _get_php_version_id_to_handler_map() returns data of installed versions, so if the version of some domain was removed we can`t detect the handler. In such case we set handler_type to None. Otherwise we detect handler and set it to handler_type :rtype dict rŠz*Unable to find php %s in handlers map %s. )Úphp_version_idÚphp_version_to_handler_map©ÚextraNÚphp_fpmÚfpmÚaccount)rqr¨Ú handler_typeÚdisplay_versionÚvhost)rorqr¦ÚkeysÚloggerr~r)r r©Úphp_settings_per_vhostÚdomains_php_infoÚ domain_infor¨r¯s r)Úget_domains_php_infoz PanelPlugin.get_domains_php_info›sþ€ð&*×%LÒ%LÑ%NÔ%NÐ"Ø!%×!>Ò!>Ñ!@Ô!@ÐØÐØ1ð ð ˆKØ(¨Ô3ˆNØ¥TÐ*D×*IÒ*IÑ*KÔ*KÑ%LÔ%LÐLÐLÝ— ’ ÐIØ+Ð-Gà3AØ?Yð$ð$ðñ ô ð ð $� � à(3°IÔ(>ð D˜u˜uØ3°NÔCðå5FØ$ YÔ/Ø-Ø)Ø .ð 6ñ6ô6Ð ˜[¨Ô1Ñ 2Ð 2ð Ðr(cóP— td¦« ¦«d}g}|D�]¼}| d¦«r×d| dd¦«›d�}| t ||d›d|d ›�t j |¦«t j |t¦«¦«t j |d ¦«t j |d ¦«¬ ¦«¦«Œï| d ¦«r¸d|›d�}| t ||d›d|d ›�t j |d¦«t j |¦«t j |d ¦«t j |d¦«¬¦«¦«�Œ¼�Œ¾|S#ttf$r'}t  d|¦«gcYd}~Sd}~wwxYw)zV Get the list of PHP version installed in panel :return: list rbÚversionszalt-z/opt/ú-r“éþÿÿÿr’r'z usr/bin/phpzlink/conf/default.ini)Ú identifierrŠr"Ú modules_dirÚbinÚinizea-z /opt/cpanel/z/root/zusr/lib64/php/modules/z etc/php.ini)r¼rŠr½r"r¾r¿z7CPAPI: Could not get list of installed PHP versions: %sN)rrcrXrËr|rr$r%rªrr�rr³r~)Ú php_versionsÚphp_descriptionÚphp_nameÚ php_root_dirrçs r)Úget_installed_php_versionsz&PanelPlugin.get_installed_php_versions¿s!€ð " #å(Ð)EÑFÔF×KÒKÑMÔMÈjÔYˆLð !ˆOØ(ð ñ �Ø×&Ò& vÑ.Ô.ðØ#H¨8×+;Ò+;¸CÀÑ+EÔ+EÐ#HÐ#HÐ#H�LØ#×*Ò*­>Ø#+Ø#+¨B¤<Ð @Ð @°(¸2´,Ð @Ð @ÝœGŸLšL¨Ñ6Ô6Ý$&¤G§L¢L°Õ?ZÑ?\Ô?\Ñ$]Ô$]ÝœGŸLšL¨°}ÑEÔEÝœGŸLšL¨Ð7NÑOÔOð ,ñ,ô,ñôððð×(Ò(¨Ñ/Ô/ð Ø#B°(Ð#BÐ#BÐ#B�Là#×*Ò*­>Ø#+Ø#+¨B¤<Ð @Ð @°(¸2´,Ð @Ð @Ý$&¤G§L¢L°Ð?WÑ$XÔ$XÝœGŸLšL¨Ñ6Ô6ÝœGŸLšL¨°}ÑEÔEÝœGŸLšL¨°}ÑEÔEð ,ñ,ô,ñôðññØ"Ð "øõ?�+Ð&ð ð ð Ý �LŠLÐRÐTUÑ VÔ VÐ VàˆIˆIˆIˆIˆIˆIøøøøð øøøs‚'G-Ç-H%Ç>H ÈH%È H%rrrp)Ú panel_parkercó–— td¦« ¦«dS#t$r}t|¦«|‚d}~wwxYw)zƒ See https://documentation.cpanel.net/display/DD/WHM+API+1+Functions+-+php_get_vhost_versions :rtype: dict Úphp_get_vhost_versionsr¹Nr¤)rçs r)rqz$PanelPlugin._get_vhosts_php_versionsësV€ð 7Ý Ð!9Ñ:Ô:×?Ò?ÑAÔAÀ*ÔMÐ MøÝð 7ð 7ð 7Ý,¨QÑ/Ô/°QÐ 6øøøøð 7øøøs‚&)© A³AÁAcó — td¦« ¦«d}nZ#t$rM}t d||j|jdœ¬¦«t ¦«}Yd}~nd}~wwxYwd„|D¦«S)a  Returns dict with info about php version and it`s current handler: {'ea-php56': 'cgi', 'ea-php72': 'suphp', 'alt-php51': 'suphp', 'alt-php52': 'suphp' ...} Using cpanel whmapi request Tries to get all handlers or if there is problem with some handler - gets handlers one by one As a result information could be incomplete if some handlers are not available See https://documentation.cpanel.net/display/DD/WHM+API+1+Functions+-+php_get_handlers :rtype: dict Úphp_get_handlersÚversion_handlerszlUnable to get information about php handlers, falling back to per-handler data gathering. Error happened: %s)Ú error_messageÚ error_contextrªNcó,—i|]}|d|d“ŒS)rŠÚcurrent_handlerr')r]Úphps r)ú zBPanelPlugin._get_php_version_id_to_handler_map..s1€ð ð ð Ø7:ˆC� ŒN˜CÐ 1Ô2ð ð ð r() rrcrr³r~rHÚcontextrfÚ"_get_handler_info_for_each_version)Úhandlersrçs r)roz.PanelPlugin._get_php_version_id_to_handler_mapøs€ð HÝ$Ð%7Ñ8Ô8×=Ò=Ñ?Ô?Ð@RÔSˆHˆHøÝð Hð Hð HÝ �LŠLð.à/0à./¬iØ./¬ið ð ð ñ ô ð õ#×EÒEÑGÔGˆHˆHˆHˆHˆHˆHøøøøð Høøøð ð Ø>Fð ñ ô ð s‚'*ª B´AA<Á<Bcór—g}t ¦«}|D]˜} td¦« |d¬¦« ¦«dd}| |¦«Œ`#t tf$r%}t  d|¦«Yd}~Œ‘d}~wwxYw|S)z½ Gets handler data from each version one by one, so that data can still be collected even when one of the installed versions is broken. :rtype: list rÉr¼)rŠrÊrz-CPAPI: Could not get data for PHP version: %sN) rfrÄrÚwith_argumentsrcr|r�rr³r~)rÓÚinstalled_php_versionsrŠÚversion_handlerrçs r)rÒz.PanelPlugin._get_handler_info_for_each_versionsÙ€ðˆÝ!,×!GÒ!GÑ!IÔ!IÐØ-ð ð ˆGð å!Ð"4Ñ5Ô5×DÒDØ '¨ Ô 5ðEñôç’d‘f”fÐ/ô1à12ô4ð ð—’ Ñ0Ô0Ð0Ð0øÝ�kÐ*ð ð ð Ý— ’ ÐLÈaÑPÔPÐPØ����øøøøð øøøðˆs¡AA>Á>B4ÂB/Â/B4có”—tt¦«} |d}|r|StjS#t$rtjcYSwxYw)NÚ server_locale)r Ú CPANEL_CONFIGrfÚDEFAULT_LOCALEr�)r Ú cpanel_configrÙs r)Úget_admin_localezPanelPlugin.get_admin_locale+s_€Ý!¥-Ñ0Ô0ˆ ð .Ø)¨/Ô:ˆMØð %Ø$Ð$ÝÔ-Ð -øÝð .ð .ð .ÝÔ-Ð -Ð -Ð -ð .øøøs– .¢ .®AÁAcóÈ—g} ttjdd¬¦«5}| ¦« ¦«}ddd¦«n #1swxYwYn#t $rd}YnwxYwt |¦«tjkr5t|¦«tj kr|  d|z¦«|  tj ¦«|S)aÌ Locations that may serve Apache's server-status handler, most likely first. cPanel only randomizes it since 11.136; older versions still publish the fixed path, and even on a randomized one the key file and the running config can disagree - the window between a config rebuild and the Apache restart that picks it up, or a downgrade leaving the key file behind - so the legacy path always stays as the last candidate. Never raises - an unreadable or malformed key just leaves that candidate out, so the rest of the metrics keep being collected. :return: list of location paths, e.g. ['/gph1nzp63f07c7qc9bx1qq8h', '/whm-server-status'] rPrË©rRÚerrorsNrÁr“) r`rfÚWHM_SERVER_STATUS_KEY_FILErDrGrŒrZÚSERVER_STATUS_KEY_MIN_LENrúÚSERVER_STATUS_KEY_CHARSr|ÚSERVER_STATUS_LOCATION_FALLBACK)Ú locationsrÚkeys r)Ú#_get_apache_server_status_locationsz/PanelPlugin._get_apache_server_status_locations5s€ðˆ ð Ý•kÔ<ÀwÐW`ÐaÑaÔað 'ÐefØ—f’f‘h”h—n’nÑ&Ô&�ð 'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'øøåð ð ð ØˆCˆCˆCð øøøõ ˆs‰8Œ8•{Ô<Ò <Ð <ݘ‘H”H¥ Ô CÒCÐCØ × Ò ˜S 3™YÑ 'Ô 'Ð 'Ø×Ò�ÔDÑEÔEÐEØÐs4„A 'AÁ AÁAÁAÁAÁAÁ A.Á-A.có–—|D]E}|tjkr3| | d¦«tj¦«}ŒF|S)zõ The randomized location is a cPanel secret and must not reach clplus_sender.log, wherever in the message it turns up; the legacy path is public, and keeping it readable is what tells support which one was tried. r“)rfrärËÚlstripÚSERVER_STATUS_REDACTED)rHråÚlocations r)Ú_redact_server_status_locationsz+PanelPlugin._redact_server_status_locationsPsK€ð"ð dð dˆHØ�;ÔFÒFÐFØ!Ÿ/š/¨(¯/ª/¸#Ñ*>Ô*>Å Ô@bÑcÔc�øØˆr(c óª—g} ttjdd¬¦«5}| t | ¦« ¦« dd¦«d¦«¦«ddd¦«n #1swxYwYn#t$rYnwxYw | t tt¦«d dd¦«d¦«¦«n#t$rYnwxYw| tj ¦«tt |¦«¦«S) au Plain-HTTP ports Apache may listen on, most authoritative first. Apache is not on 80 when a reverse proxy (e.g. nginx) fronts it, and the proxy must be bypassed, so the real port comes first and 80 stays as the last resort. Never raises - see _get_apache_server_status_location. :return: list of port numbers, e.g. [81, 80] rPrËrßrUrVr'NÚ apache_port)r`rfÚAPACHE_PORT_FILEr|ÚintrDrGÚrsplitrŒr rÚÚAPACHE_DEFAULT_HTTP_PORTr¦ÚdictÚfromkeys)Úportsrs r)Ú_get_apache_http_portsz"PanelPlugin._get_apache_http_ports\s„€ðˆð õ•kÔ2¸WÈYÐWÑWÔWð GÐ[\Ø— ’ �S §¢¡¤§¢Ñ!1Ô!1×!8Ò!8¸¸aÑ!@Ô!@ÀÔ!DÑEÔEÑFÔFÐFð Gð Gð Gñ Gô Gð Gð Gð Gð Gð Gð Gøøøð Gð Gð Gð Gøøåð ð ð Ø ˆDð øøøð ð �LŠL��Y¥}Ñ5Ô5°mÔD×KÒKÈCÐQRÑSÔSÐTVÔWÑXÔXÑ YÔ YÐ YÐ YøÝð ð ð Ø ˆDð øøøà � Š •[Ô9Ñ:Ô:Ð:å•D—M’M %Ñ(Ô(Ñ)Ô)Ð)sH„B A!B  B BÂBÂBÂB B&Â%B&Â*AC?Ã? D Ä D c ó—t ¦«}t ¦«}g}|D�]:}|D�]3}d|›|›d�} tj|dd¬¦«}|jdkr d|j›�}n•|j d¦«}| d ¦«} ttd | ¬ ¦«¦«} | d  d ¦«d  ¦«} t| ¦«dfccSn0#t$r#} t| ¦«j›d| ›�}Yd} ~ nd} ~ wwxYw| t d|›d|›�|¦«¦«�Œ5�Œ.©s €Ð0Ð0Ð0 $�—’‘”Ð0Ð0Ð0r(ÚListenFT)rRrSrTrUr'rj) rrfÚHTTPD_CONFIG_FILErÈrÉrrðr[r|Ú IndexErrorr?)Ú_httpd_ports_listrÏr^ržs r)Úget_apache_ports_listz!PanelPlugin.get_apache_ports_listœs€ðÐð Ý"¥;Ô#@Ø9JðLñLôLˆEˆEøå�Ð!ð ð ð Ø�4�4ð øøøà0Ð0¨%Ð0Ñ0Ô0ˆÝ˜°eÈTÐbgÐhÑhÔhð ð ˆDð ݘDŸJšJ s™OœO¨BÔ/Ñ0Ô0�ØÐ 1Ð1Ð1Ø%×,Ò,¨UÑ3Ô3Ð3øøÝ¥ Ð+ð ð ð Ø�ð øøøà ð )Ø × $Ò $ RÑ (Ô (Ð (Ø Ð s„  5´5ÁABÂB0Â/B0có®— ttjd¬¦«}tt dd|¬¦«¦«}t |¦«dkrdS|d d ¦«}t |¦«d krt|d¦«d fSdd |d›d �fS#ttttf$rdt¦«fcYSwxYw)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/Trace r r ÚMaxRequestWorkersF)rRrTrV)rzCMaxRequestWorkers directive is absent or multiple in httpd's configrrër{rüz)httpd config line syntax error. Line is 'ú') rrfrr¦rrZr[rðrÈrÉrr?r)rÏÚmrw_listrÐs r)Úget_apache_max_request_workersz*PanelPlugin.get_apache_max_request_workers¸sé€ð #Ý"¥;Ô#@Ø9JðLñLôLˆEå�DÐ!4ÈÐ_dÐeÑeÔeÑfÔfˆHÝ�8‰}Œ} Ò!Ð!Ø`Ð`ؘQ”K×%Ò% cÑ*Ô*ˆEÝ�5‰zŒz˜QŠˆÝ˜5 œ8‘}”} dÐ*Ð*ØÐRÀ8ÈAÄ;ÐRÐRÐRÐRÐ RøÝ�¥*­jÐ9ð #ð #ð #Ø•j‘l”l�?Ð "Ð "Ð "ð #øøøs‚A B$ÁAB$ B$Â$-CÃCrqrär có®—td¦« dd|d¬¦« ¦«dd}|d}|dkrd S|S) NÚ listacctsÚemailÚexactr0)ÚwantÚ searchmethodÚsearchÚ searchtypeÚacctrz *unknown*rÁ)rrÕrc)rqräÚemailsÚ user_emailss r)Úget_user_emails_listz PanelPlugin.get_user_emails_listÏsr€õ ˜+Ñ &Ô &× 5Ò 5¸7ØCJÐS[ØAGð 6ñ Iô IçIMÊÉÌÐPVô XàXYô [ð ð˜W”oˆ Ø ˜+Ò %Ð %Ø�2ØÐr(cóÄ—td¦« |d¬¦« ¦«d}|sdSt|¦«}|j›d|j›d�S)NÚcreate_user_sessionÚcpaneld)r0ÚservicerrÁz://r“)rrÕrcrÚschemeÚnetloc)rqÚlinkÚparseds r)Úpanel_login_linkzPanelPlugin.panel_login_linkàsw€åÐ2Ñ3Ô3×BÒBÈØV_ðCñaôaßaeÒaeÑagÔagÐhmôoˆàð Ø�2õ˜$‘”ˆØ”-Ð4Ð4 F¤MÐ4Ð4Ð4Ð4r(có�—t |¦« d¦«}t|¦«dkrdS|›d�S)Nr“rrÁz@/cpsess0000000000/frontend/paper_lantern/lveversion/wpos.live.pl)rfr.ÚrstriprZ)rqr,s r)Úpanel_awp_linkzPanelPlugin.panel_awp_linkësF€å×+Ò+¨HÑ5Ô5×<Ò<¸SÑAÔAˆÝ ˆt‰9Œ9˜Š>ˆ>Ø�2ØÐXÐXÐXÐXr(cóê— tdd¬¦«5}| ¦« ¦«cddd¦«S#1swxYwYdS#t$r}t d¦«|‚d}~wwxYw)Nz/var/cpanel/mainiprPrQzZUnable to detect main ip for this server. Contact CloudLinux support and report the issue.)r`rDrGÚFileNotFoundErrorr)r rrçs r)Ú get_server_ipzPanelPlugin.get_server_ipòsÍ€ð ÝÐ*°WÐ=Ñ=Ô=ð (ÀØ—v’v‘x”x—~’~Ñ'Ô'ð (ð (ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (ð (øå ð ð ð ÝðCñôðð øøøøð øøøs9‚A“&A¹ AÁA Á AÁ A ÁAÁ A2ÁA-Á-A2cóh—td¦« ¦«d}d„|D¦«S)NÚ listsuspendedr®có—g|] }|d‘Œ Sr8r'r9s r)r_z4PanelPlugin.suspended_users_list..r;r()rrc)r Úsuspended_infos r)Úsuspended_users_listz PanelPlugin.suspended_users_listüs6€õ (¨Ñ8Ô8×=Ò=Ñ?Ô?À ÔJˆØ8Ð8¨Ð8Ñ8Ô8Ð8r(có—gSrpr'r‡s r)Úget_unsupported_cl_featuresz'PanelPlugin.get_unsupported_cl_featuress€Øˆ r(©NF)Nr5Trp)@r©r$r%rÛr�rrárärêÚ frozensetÚstringÚdigitsÚascii_lowercaserãrârïròr#r{r„rˆr�rNrerjrtr�r–rÅÚ staticmethodrðrürrr/rYr^r`rr¦r·rÄrÚ cache_callrqrorÒrÝrçrìrör rrr}r%r.r1r4r9r¦rr;Ú __classcell__)rms@r)rfrf¡s&ø€€€€€à€NØÐØ6Ðð"EÐØ&:Ð#Ø.Ðà'˜i¨¬ ¸Ô8NÑ(NÑOÔOÐð!#Ðà7ÐØ!Ððððððð7ð7ð7ð"$ð$ð$ð.ðððððð$ ð ð ððððððð%ð%ð%ðEðEðEðEð)dØ $ðHðHðHðHð&!ð!ð!ðð+ð+ñ„\ð+ðððð#ð#ð#ð(ð(ð(ðððð,ð,ð,ð,ð.ð.ð.ð.ð*ð*ð*ð$ð$ð$ð  ð  ð  ð" ð" ð" ðHð'#ð'#ñ„\ð'#ðVØ$ÐÔ$Ð3IØ3Mð3OðPñPôPð7ð7ñPôPñ„\ð7ðØ$ÐÔ$Ð3MÐ2NÐOÑOÔOð ð ñPÔOñ„\ð ð2ððñ„\ðð..ð.ð.ðððñ„\ðð4ð ð ñ„\ð ðð*ð*ñ„\ð*ð4ð"&ð"&ñ„\ð"&ðHð!ð!ñ„\ð!ð6ð#ð#ñ„\ð#ð,ð sð°Cð¸Cðððñ„\ðð ð5ð5ñ„\ð5ððYðYñ„\ðYð ððð9ð9ð9ð¨T°'¬]ððððððððr(rfr<)r�)NNN)Trp)gr=Úloggingr$r~r>rƒr¬Ú urllib.errorrJÚ urllib.parseÚurllib.requestÚ collectionsrÚ configparserrrrÚ tracebackrrrýr Úclcommonr Úclcommon.clconfparsr Úclcommon.cpapi.cpapiexceptionsr r r rrrrrÚclcommon.cpapi.GeneralPanelrrrrÚclcommon.cpapi.pluginlibrÚclcommon.featuresrÚclcommon.lib.whmapi_librrrÚclcommon.utilsrrrrr r†r‚rIÚ getLoggerr©r³r*ÚCPANEL_DB_CONFr§ÚCPANEL_DATABASES_PATHÚCPANEL_USERS_DIRÚCPANEL_RESELLERS_PATHÚCPANEL_USERDATADOMAINS_PATHÚCPANEL_USERDATAFOLDER_PATHrÊrUrÇrÚr®ÚSUPPORTED_CPANEL_CPINFOrNrerjrmrtr�r r–rÅrèrírðrürrr}rórrrr/rCrNrYr\r^r`rdrfr'r(r)úr[sQðà € € € Ø€€€Ø € € € Ø € € € Ø € € € ØÐÐÐØ € € € ØÐÐÐØÐÐÐØÐÐÐØ#Ð#Ð#Ð#Ð#Ð#ØDÐDÐDÐDÐDÐDÐDÐDÐDÐDØ Ð Ð Ð Ð Ð Ø!Ð!Ð!Ð!Ð!Ð!à€€€Ø € € € àÐÐÐÐÐØ)Ð)Ð)Ð)Ð)Ð)ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ððððððððððððð -Ð,Ð,Ð,Ð,Ð,Ø%Ð%Ð%Ð%Ð%Ð%ØUÐUÐUÐUÐUÐUÐUÐUÐUÐUØpÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpà € à>ÐØ€à ˆÔ ˜8Ñ $Ô $€ð 6ð6ð6ð!€Ø(ÐØ0ÐØ'ÐØ/ÐØVÐØ:ÐØ+ÐØ.ÐØ5ÐØ+€ ð ØØØ ØØð ðÐðVÐð(ð(ð(ð(ð(ðV2ð ð ð ð ð4ð !ð !ð !ð !ðððð+@ðNðNðNðNð&ð&ð&ð&ðRDðDðDðDð"ÐYØ-°TÈDð6ð6ð6ð6ðr)0ð)0ð)0ð)0ðXðððð:ðððð0'AÈððððð6¸TðSðSðSðSð2!Ðð:Àð!!ð!!ð!!ð!!ðH-GÈdð*ð* ð*ÐW[ð*ð*ð*ð*ð6)CÈ$ð.ð.˜Sð.ÐSWð.ð.ð.ð.ð* ;À$ððððð"Ð*?ð1ð1ð1ð1ðh*ð*ð*ððððð("ð"ð"ðJ *ð *ð *ð 6ð 6ð 6ð 6ð#ð#ð#ð ð ð ðd ðd ðd ðd ðd Ð&ñd ôd ðd ðd ðd r(