Ӻh*ddlZddlZddlZddlZddlZddlZddlZddlZddl Zddl m Z m Z m Z ddlmZddlZddlmZddlmZddlmZddlmZddlmZmZmZmZmZdd lmZm Z m!Z!dd l"m#Z#m$Z$m%Z%m&Z&dd l'm(Z)dd lm*Z*m+Z+m,Z,dd l-m.Z.m/Z/m0Z0m1Z1ddl'm2Z2dZ3ej45ej46ej7dZ8dZ9ej:e;ZdZ?dZ@dZAdZBdZCdZDdZEdZFdZGdZHddd d!d"d#d$ZId%ZJe>fd&ZKe?fd'ZLeBfd(ZMd)ZNeBfd*ZOd@d,ZPdd%eAd-d-fd.ZQdAd/ZRdBd0ZSdBd1ZTeDd-fd2ZUeCd-fd3ZViZWeCd-fd4ZXeCd-fd5ZYdeEfd6ZZd7Z[dCd8Z\d9Z]d:Z^dCd;Z_d<Z`d=ZaGd>d?e.ZbdS)DN) ConfigParser NoOptionErrorNoSectionError) OrderedDict) format_exc)getuser)urlparse)ClPwd) DuplicateDataCPAPIExternalProgramFailed ParsingError EncodingError NotSupported) WhmApiRequest WhmApiErrorWhmNoPhpBinariesError) run_commandExternalProgramFailedgrepget_file_lines)load)NoDBAccessDataCpApiTypeErrorNoDomain)GeneralPanelPluginV1CPAPI_CACHE_STORAGEPHPDescriptionDomainDescription) load_fastcPanelzcpanel-dbmappingz /usr/bin/uapic@tjdS)N/usr/local/cpanel/cpanel)ospathisfile}/builddir/build/BUILD/imunify360-venv-2.5.2/opt/imunify360/venv/lib/python3.11/site-packages/clcommon/cpapi/plugins/cpanel.pydetectr).s 7>>4 5 55r'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.configdnsplanowner contactemaillocaleuser)r*packageresellermailr.cploginr3r0r2r1r*r.c:i}tddd}||}|std| |ddr/|dddd |d <n.|dd dd |d <|dd dd |d <n4#t tf$r }td |d|j|d}~wwxYwd|d<|S)NTF)allow_no_value interpolationstrictz=Cannot find database access data for localhost. No such file clientpassword)sectionoption)r;r<rawz"'passr/loginz@Cannot find database access data for localhost from config file ; mysqldb) rreadr has_optiongetstriprrmessage) _conf_pathaccessreg_data_config opened_fileserrs r( db_accessrMJs F"O #'' 33L   XJ X X     % %hz % J J ,00 !1eEll 6NN -00 1eEll 6N *--.   %,, w > * 0 0 0"%+ 0 0    F4L MsB"C""D3DDct|d5}d|D}dddn #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-8encodingcg|]}|dsk|ddk0t|dkU|ddS)#:r) startswithcountlenrFsplit.0lines r( zcpusers..|sfffT!__S11f6:jjoo6J6JsSWS]S]S_S_O`O`cdOdOdjjooa(..00OdOdOdr'N)opentuple)_userplans_filestream users_lists r(cpusersrdus o 0 0 0fFffVfff fffffffffffffff   s +//ctj|stSt |d5}d|D}dddn #1swxYwYt|S)NrOrPcg|]n}|dsWd|vt|dk@|dddoS)rSrTrUr)rWrYrFrZr[s r(r^zresellers..scccD!%!5!5c;>$;;CPTPZPZP\P\L]L]`aLaLa**S!,,Q/5577LaLaLar')r#r$r%r`r_)_resellers_pathrbresellers_lists r( resellersris 7>>/ * *ww o 0 0 0cF ccFccc ccccccccccccccc   s AAAcdhS)Nrootr&r&r'r(adminsrls 8Or'cTtfdt|DS)z Check if given user is reseller; :param _resellers_path: for testing only :type username: str :rtype: bool c3$K|] }|kV dSNr&)r\r3usernames r( zis_reseller..s(MMww("MMMMMMr')anyri)rprgs` r( is_resellerrss0 MMMM)O2L2LMMM M MMr'Fcg}g}|pgD]a} |ttj|j=#t $r|dY^wxYwt g}|s|d||z }tj|tj tj d5}| \}}dddn #1swxYwY| dD]G} | } | r/|| ddHt|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--nosysTstdoutstderrtextN )appendstrpwdgetpwnampw_uidKeyErrorDBMAPPING_SCRIPT subprocessPopenPIPE communicaterZrFr`) cplogin_lstwith_system_usersresultsuid_listrpparamspoutput_r]s r(dblogin_cplogin_pairsrsGH &B"" " OOC X 6 6 =>> ? ? ? ? " " " OOD ! ! ! ! ! "  F ! i    hF       $ MMOO  $$$$$$$$$$$$$$$ T""--zz||  - NN4::<<+ , , , >>s#9AA('A(;CC#&C#Tc.g}t|tr|g}nht|ttfrt|}n<|t t }n$t ddt|j|D]}tj ||}tj |s&|s#tjd|dht!|d}g} |D]k} |t$| } | d kr!| tj |} | | l|t| d |vrq|d } | rZ| | t|d <t| } | |vr"|t| t|S) N)racpinfozstr|unicode|list|tuple)funcnamesupportedtypes received_typez(WARNING: Can not load data to the user "z*"; Perhaps there is no such user in cPanelT)ignore_bad_encodingr3r2 contactemail2) isinstancer|listr`rdCPANEL_USERPLANS_PATHrtype__name__r#r$joinexistssysrwwrite loadconfigrEUSERCONF_PARAM_MAPbasenamer{index)cpuserkeyls_cpanel_users_dirquietsearch_sys_usersreturned cpusers_listuser_config_path cpuser_data user_datadata_keydataadditional_mailuser_data_tuples r(rrs-H&#Bx FT5M * *BV}} /DEEE h?W+/<<+@BBB B667<<(96BBw~~.//  L   "KF"K"K"KLLL !!1tLLL   # #H??#5#9#9(#C#CDDD9$$w''(899   T " " " "i(())) U??)ooo>>O 67F $u++++F334"' "2"2"(22OOE)$4$4555 ??r'cg} t|pt}n#ttf$rYnwxYw|D]w}|dr`|d}t |dkr8d|dvr|dcSxg} t|pt}n#ttf$rYnwxYwd}|D]}|dr.| dd}|r|cS|dr,| 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=rz@rU CONTACTEMAILHOSTzroot@rget_admin_email) _hostname) rSYSCONF_CLOUDLINUX_PATHOSErrorIOErrorrWrZrYrFCPANEL_ACCT_CONF_PATHreplace clcommon.cpapi.plugins.universalr) _conf1_conf2rlinesr]partshostsrs r(rrs E v@)@AA W      (( ??7 # # (JJsOOE5zzQ3%(..*:*:#:#:Qx~~''''' E v>)>?? W       D ??> * *  ^R006688A  ??6 " "  VR((..00A  ~@@@@@@ ?Y / / //s///CCCc Ld|vr@tjtjj}|d|}|d}|D]F}tj|s# t|d5}t|D]\}}| s| ddkr)|s&tjd|d|d \|d\} } | d } ||| |  dddn #1swxYwY#t $r3} |s&tjd |d | d Yd} ~ @d} ~ wwxYwdS)N{user};rOrP: rUz Can't parse z line in file "z"; line was ignored z==Can't open file  [] )r}getpwuidr#geteuidpw_namerrZr$rr_ enumeraterFrXrrwrr) _pathparserr call_as_user path_listpath_rbir]domaindomain_raw_data domain_dataes r(_parse_userdatadomainsrs5|BJLL119  h 55 C  Iw~~e$$   eg... 7& )00 7 7GAt::<<! zz$''1,,$mJ,,-kQ-k-ku-k-k-klll .2jj.>.>+FO"1"7"7"9"9"?"?"E"EKF5&+6666 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7    E   !CE!C!CQ!C!C!CDDD HHHH %s=E$B9E E$E E$E E$$ F!.(FF!c ,|d}g}|D]}tj|s" t |d5}t |D]]\}}|sd|vr||dddz }^ dddn #1swxYwY#t$r2}|s&tj d|d |d Yd}~d}~wwxYw|S) NrrOrP serveraliasz serveralias: r rrr) rZr#r$rr_rrFrrrrwr) rrraliasesrrbrr]rs r(_parse_userdataaliasesr:s C  IGw~~e$$   eg... T& )00TTGAt::<<! $D00 t||OR@@FFHHNNsSSSGG T T T T T T T T T T T T T T T T    E   !CE!C!CQ!C!C!CDDD HHHH  Ns<CA.C = C C CC C D(D  Dcd|vr|d|}tj||}t ||}t |S)Nrr)rr#r$rrr)rrrrrs r( useraliasesrRsS5 h// GLL ' 'E$U%888G ==r'c4tdddfd}t|||ddddfSdfdD}t dd |) N) docroot_pathr/cn||kr|dd<|dd<dSdS)Nrrr/)add)r$drrpathesresults r(rzdocroot..parser`sD 4 ;;%0^F> "(^F6NNN ;r'rrr/r@c g|] }d|dz S)z)Can't find record "%(d)s" in file "%(p)s")rrr&)r\rrs r(r^zdocroot..ks(^^^RS 5f18M8M M^^^r'z'Can't obtain document root for domain 'z'; )rFsetrrr)rrrrwatchedrrs` @@r(docrootr[s \\^^F UUF"D 1 1F,,,,,,, 5&6666 > " *fVn.Dn%vf~55ii^^^^W]^^^G QVQQQQ R RRr'c tvr tSttfd}t|||t S)Nc|d}|d}|tvrt|}ng}d|dkr||f|vr|d||fn||f|vr|||f|t|<|kr>d|dkr||idS||idSdS)Nrrmainrz)_user_to_domains_map_cpanelinsertr{update) r$rruser_ document_rootrrdomains domains_tmps r(rzuserdomains..parsersA#A / / /3E:III [^ # #=!22  Q $6777=!22  !]!3444-6#E* F??Q''=122222""A}#566666 ?r'r)rrrrritems)rrrrrrs` @@r( userdomainsrws ,,,*622--KmmG7777777.5&6666 NN;    r'cgfd}t|||tdkr)tddddtdkrdSdS) NcN|kr|ddSdS)Nr)r{)r$rrrrcs r(rzdomain_owner..parsers1 ;;   k!n - - - - - ;r'rrUzdomain z belongs to few users: [,]r)rrYr r)rrrrrcs` @r( domain_ownerrsJ......5&6666 : Mf M Mchhz6J6J M M M    :!t a=r'cd}d}g}d}d}tj|rt|}|D]}||r.||d}E||r-||d}|r||t} | } t|ttfr&Gdd} i} |D]\} } | | | | | <| D]}|j}tj|dzs"tj|dzrWtj|}|r|d |zd 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 rrUceZdZdZdS)homedirs..pwc"||_||_dSro)rpw_dir)selfnamedirs r(__init__zhomedirs..pw.__init__s# ! r'N)r __module__ __qualname__r r&r'r(pwrs# " " " " "r'r z /public_htmlz/www/)r#r$rrrWrZrFr{r get_user_dictrrr`valuesrdirnamefind) _sysusersrHHOMEDIR HOMEMATCHhomedirs users_homedirusers_home_matchrr]clpwd users_dictr rr ruserdirhomedirs r(rrs GIHM w~~j!!Dz** D DDw'' D $ 7 3 3A 6 < < > > ++ D#'::i#8#8#;#A#A#C#C ' &&& GGE$$&&J)dE]++- " " " " " " " "  # - -JT#!r$}}Jt  &&(()) " 7>>'N2 3 3 )rw~~gPVFV7W7W )goog..G GLL5E1E$F$F"$L$Lh&&((( Or'c tj|}|d}d|dDS#tttf$r"}t t ||d}~wwxYw)Nrcg|] }|d Sr/r&r\items r(r^z*_reseller_users_parser..888V 888r'rjsonloadsr ValueError TypeErrorr r|) json_stringjson_serializedrrs r(_reseller_users_parserr+st**[11 *888888 j) ,***3q66"")*s-0A)A$$A)c~|p t}tdddg}|tkstdkr5|dtj| t |dd}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=jsonrkz--user=T)cmdreturn_full_outputrUN) rUAPIr{urllibparsequoterrr r|) reseller_namer/r)rs r(_reseller_users_jsonr6s".WYYM o ?C !!WYY&%8%8 @V\// >>@@AAA8!cdCCCAF 888(Q00a78 s6B B:B55B:c|gSg}tt}|]td|dddd|D]D}|d}||dE|S) z Return reseller users :param resellername: reseller name; return empty list if None :return list[str]: user names list Nz\: $FT) fixed_stringmatch_any_positionmultiple_searchdata_from_filerr)rCPANEL_USEROWNERS_FILErrFrZr{) resellernameruserowner_file_datar] splitted_lines r(reseller_usersrAs* F()?@@/ ///&+,0)-(; === , ,D !JJLL..t44M MM-* + + + + Mr'c tj|}|d}i}|dD]}|d||d<|S#tttf$r"}t t ||d}~wwxYw)Nrrrr/r$)r)r*r users_datar"rs r(_reseller_user_domains_parserrD"s**[11 * 6N 6 6D'+H~JtF| $ $ j) ,***3q66"")*s;>A7A22A7c>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 )r6rD)r5r)s r(reseller_domainsrF.s'}55K ( 5 55r'cd|dS)Nzhttp://z:2083r&)rs r(get_user_login_urlrH:s "V " " ""r'cn tdn#t$rYdSwxYwdS)zM Checks that there are no installed php binaries only for cpanel php_get_installed_versionsTF)rcallrr&r'r(is_no_php_binaries_on_cpanelrL>sL 23388:::: tt 5s !$ 22c(eZdZdZdZdZfdZdZdZdZ dZ d Z d Z d Z d Zd2dZ d3dZdZedZdZdZdZd4dZd4dZdZdZdZdZedZeejdd g!d"Z eejd g!d#Z!ed$Z"d%Z#ed&Z$ed'Z%ed(Z&ed)e'd*e'd+e'fd,Z(ed-Z)ed.Z*d/Z+d0Z,d1Z-xZ.S)5 PanelPluginen0z/etc/apache2/conf/httpd.confcHtdSro)superr )r __class__s r(r zPanelPlugin.__init__Ps r'c ddgfdddgff}|D]}|d|d}}tjt|dz}|||rQt ||}|||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/userdatadomainsrrUz.cacheN)r#r$rris_cache_validgetattrrewrite_cpapi_cache)rmethod_marker_pairspairmethodmarkers cache_filers r(invalidate_cpapi_cachez"PanelPlugin.invalidate_cpapi_cacheSs!EGaFbc :=SUoA;?B BBctS)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 )rMrms r(rMzPanelPlugin.db_accesss{{r'ctS)z Generates a list of cpusers registered in the control panel :return: list of cpusers registered in the control panel :rtype: tuple )rdrms r(rdzPanelPlugin.cpuserssyyr'ctS)z Generates a list of resellers in the control panel :return: list of cpusers registered in the control panel :rtype: tuple )rirms r(rizPanelPlugin.resellerss{{r'c t|S)zc Check if given user is reseller; :type username: str :rtype: bool )rs)rrps r(rszPanelPlugin.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)rrrs r(rz!PanelPlugin.dblogin_cplogin_pairss%[2CDDDr'r4Tc&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)rrrrs r(rzPanelPlugin.cpinfos"fe6FGGGGr'ctS)zR Retrieve admin email address :return: Host admin's email rrms r(rzPanelPlugin.get_admin_emails    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)rrs r(rzPanelPlugin.useraliasess66***r'c t|S)z Return document root for domain :param str|unicode domain: :return Cortege: (document_root, owner) )rrrs r(rzPanelPlugin.docroots vr'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)rrs r(rzPanelPlugin.userdomainss6"""r'ctS)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 )rrms r(rzPanelPlugin.homedirss zzr'c t|S)z Return reseller users :param resellername: reseller name; autodetect name if None :return list[str]: user names list )rArr>s r(rAzPanelPlugin.reseller_userss 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 )rFrs r(rFzPanelPlugin.reseller_domainss ---r'c t|S)z` Get login url for current panel; :type domain: str :rtype: str )rHr}s r(rHzPanelPlugin.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_ownersF###r'c tdd}n"#t$r}t||d}~wwxYwd|iS)Nphp_get_system_default_versionrpdefault_version_idrrKrr )rdefault_versionrs r(get_system_php_infozPanelPlugin.get_system_php_info!sl 7+02226$&&DOO 7 7 7,Q//Q 6 7 !/  s'* A AA c j|}|}i}|D]}|d}|t|vr$td||||dd}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 rpz*Unable to find php %s in handlers map %s. )php_version_idphp_version_to_handler_mapextraNphp_fpmfpmaccount)rpr handler_typedisplay_versionvhost)rUrWrkeysloggerrdr)rrphp_settings_per_vhostdomains_php_info domain_inforrs r(get_domains_php_infoz PanelPlugin.get_domains_php_info,s&*%L%L%N%N"!%!>!>!@!@1  K(3NT*D*I*I*K*K%L%LLL I+-G3A?Y$$   $ (3I(> Duu3NC5F$Y/-) . 666 [1 2 2 r'c8 tdd}g}|D]}|drd|ddd}|t ||dd|d t j|t j|d t j|d t j|d  |drd|d}|t ||dd|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 rJversionszalt-z/opt/-r.rzusr/lib64/php/modules/z usr/bin/phpzlink/conf/default.ini) identifierrpr  modules_dirbininizea-z /opt/cpanel/z/root/z etc/php.ini)rrprr rrz7CPAPI: Could not get list of installed PHP versions: %sN) rrKrWrr{rr#r$rrrrrd) php_versionsphp_descriptionphp_name php_root_dirrs r(get_installed_php_versionsz&PanelPlugin.get_installed_php_versionsPs " #()EFFKKMMjYL !O(  &&v..#H8+;+;C+E+E#H#H#HL#**>#+#+B< @ @(2, @ @GLL66$&GLL?W$X$XGLL}EEGLL7NOO ,,,((// #B(#B#B#BL#**>#+#+B< @ @(2, @ @$&GLL?W$X$XGLL66GLL}EEGLL}EE ,,," "?+&    LLRTU V V VIIIIII s'G!!H2HHHrXrV) panel_parkerc tddS#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_versionsrNr)rs r(rWz$PanelPlugin._get_vhosts_php_versions|sV 7 !9::??AA*M M 7 7 7,Q//Q 6 7s&) AAAc  tdd}nZ#t$rM}td||j|jdt}Yd}~nd}~wwxYwd|DS)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_handlersversion_handlerszlUnable to get information about php handlers, falling back to per-handler data gathering. Error happened: %s) error_message error_contextrNc,i|]}|d|dS)rpcurrent_handlerr&)r\phps r( zBPanelPlugin._get_php_version_id_to_handler_map..s1   7:C NC 12   r') rrKrrrdrGcontextrN"_get_handler_info_for_each_version)handlersrs r(rUz.PanelPlugin._get_php_version_id_to_handler_maps H$%788==??@RSHH H H H LL./0./i./i      #EEGGHHHHHH H  >F    s'* BAA<<Bcrg}t}|D]} td|ddd}||`#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 rr)rprrz-CPAPI: Could not get data for PHP version: %sN) rNrrwith_argumentsrKr{rrrrd)rinstalled_php_versionsrpversion_handlerrs r(rz.PanelPlugin._get_handler_info_for_each_versions!,!G!G!I!I-  G !"455DD ' 5Edff/1124 0000k*    LaPPP sAA>>B4B//B4ctt} |d}|r|StjS#t$rtjcYSwxYw)N server_locale)r CPANEL_CONFIGrNDEFAULT_LOCALEr)r cpanel_configrs r(get_admin_localezPanelPlugin.get_admin_locales_!-00  .)/:M %$$- - . . .- - - - .s . .AAc d}tj|d}|jdkrdd|d|jfS|jd}|d }t td | }|dd d }t|dfS#t$rdtfcYSwxYw)z Retrieves Apache's connections number :return: tuple (conn_num, message) conn_num - current connections number, 0 if error message - OK/Trace z'http://127.0.0.1/whm-server-status?auto)timeoutrzGET z response code is rOryzTotal Accesses)r<rTrUOK) requestsrE status_codecontentdecoderZrrrFintrrr)urlresponse s_responses_response_listout_lists_total_accessess r(get_apache_connections_numberz)PanelPlugin.get_apache_connections_numbers #;C|C333H#s**NNN8LNNNN!)0099J(..t44OD!1/RRRSSH'{0055a8>>@@ '(($. . # # #jll? " " " #s1CBCC"!C"cg} ttjd}n#ttf$rYdSwxYwd|D}t ddd|D][} t |d d }||vr||E#ttf$rYXwxYw|s|d |S) zl Retrieves active httpd's ports from httpd's config :return: list of apache's ports surrogateescapeunicode_errors_handleNc6g|]}|Sr&)rFr[s r(r^z5PanelPlugin.get_apache_ports_list..s 000$000r'ListenFT)r:r;r<rTrP) rrNHTTPD_CONFIG_FILErrrrrZr{ IndexErrorr')_httpd_ports_listrr]values r(get_apache_ports_listz!PanelPlugin.get_apache_ports_lists ";#@9JLLLEE!   44 00%000eTbghhh  D DJJsOOB/00 111%,,U333 +      )  $ $R ( ( (  s 55ABB0/B0c ttjd}tt dd|}t |dkrdS|dd }t |d krt|dd fSdd |dd fS#ttttf$rdtfcYSwxYw)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 rrMaxRequestWorkersF)r:r<rU)rzCMaxRequestWorkers directive is absent or multiple in httpd's configrrrzrz)httpd config line syntax error. Line is '') rrNrrrrYrZrrrrr'r)rmrw_listrs r(get_apache_max_request_workersz*PanelPlugin.get_apache_max_request_workerss #";#@9JLLLED!4_deeeffH8}}!!``QK%%c**E5zzQ58}}d**R8A;RRRR R*j9 # # #jll? " " " #sA B$AB$ B$$-CCrprreturnctddd|ddd}|d}|dkrd S|S) N listacctsemailexactr/)want searchmethodsearch searchtypeacctrz *unknown*r)rrrK)rpremails user_emailss r(get_user_emails_listz PanelPlugin.get_user_emails_listsr + & & 5 57CJS[AG 6 I IIMPV XXY [ Wo + % %2r'ctd|dd}|sdSt|}|jd|jdS)Ncreate_user_sessioncpaneld)r/servicerrz://r)rrrKr schemenetloc)rplinkparseds r(panel_login_linkzPanelPlugin.panel_login_link!sw233BBV_Caaaeaeagaghmo 2$-44FM4444r'ct|d}t|dkrdS|dS)Nrrrz@/cpsess0000000000/frontend/paper_lantern/lveversion/wpos.live.pl)rNrrstriprY)rprs r(panel_awp_linkzPanelPlugin.panel_awp_link,sF++H55<>2XXXXr'c tdd5}|cdddS#1swxYwYdS#t$r}t d|d}~wwxYw)Nz/var/cpanel/mainiprOrPzZUnable to detect main ip for this server. Contact CloudLinux support and report the issue.)r_rCrFFileNotFoundErrorr)rfrs r( get_server_ipzPanelPlugin.get_server_ip3s *W=== (vvxx~~'' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (    C  s9A&A AA  A A A A2A--A2chtdd}d|DS)N listsuspendedrcg|] }|d Sr r&r!s r(r^z4PanelPlugin.suspended_users_list..Cr#r')rrK)rsuspended_infos r(suspended_users_listz PanelPlugin.suspended_users_list=s6 (88==?? J888888r'ctSro)r`rms r(get_unsupported_cl_featuresz'PanelPlugin.get_unsupported_cl_featuresEs wwr'NF)Nr4Tro)/rr r rrgrr rarjrnrsrMrdrirsrrr staticmethodrrrrrArFrHrrrrr cache_callrWrUrrrrrr|rrrrrr __classcell__)rSs@r(rNrNJsrN6777"$$$.$   %%%EEEE)d $HHHH&!!!++\+###,,,,....***$$$    " " " H'#'#\'#V$$3I3M3OPPP77PP\7$$3M2NOOO  PO\ 2\....##\#,!!\!6##\#,sCC\ 55\5YY\Y 999r'rNr )NNN)Tro)cr%loggingr#r}rrurllib.requestr2 urllib.parse urllib.error configparserrrr collectionsrr tracebackrclcommon.cpapi.pluginlibrr clcommonr clcommon.cpapi.cpapiexceptionsr r r rrclcommon.lib.whmapi_librrrclcommon.utilsrrrrclcommon.clconfparsrrrrrclcommon.cpapi.GeneralPanelrrrrrrlr$rr executablerr1 getLoggerrrr)CPANEL_DB_CONFrCPANEL_DATABASES_PATHCPANEL_USERS_DIRCPANEL_RESELLERS_PATHCPANEL_USERDATADOMAINS_PATHCPANEL_USERDATAFOLDER_PATHrr=rrrSUPPORTED_CPANEL_CPINFOrMrdrirlrsrrrrrrrrrrrr+r6rArDrFrHrLrNr&r'r(r$s   DDDDDDDDDD###### ,,,,,,!!!!!!              UUUUUUUUUUSSSSSSSSSSSS222222SSSSSSSSSS *))))) 7<< ? ?ASTT  8 $ $ 666!(0'/V:+.5+    V(((((V2    4 ! ! ! !+@NNNN&&&&RY-TD))))X)0)0)0)0X:0'A6TSSSS2!:!!!!!!!!H ;$"*?1111h***("""J * * * 6 6 6 6###   |||||&|||||r'