}CeՕddlmZddlmZddlmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddlmZmZmZddlmZddlZddlmZddlmZdd l mZdd lmZdd lmZmZmZm Z m!Z!dd l"m#Z#m$Z$m%Z%dd l&m'Z'm(Z(m)Z)m*Z*ddl+m,Z-ddlm.Z.m/Z/m0Z0ddl1m2Z2m3Z3m4Z4m5Z5ddl+m6Z6dZ7ej89ej8:ej;dZdZ?dZ@dZAdZBdZCdZDdZEdZFdZGdZHd ZId!d"d#d$d%d&d'ZJd(ZKe?fd)ZLe@fd*ZMeCfd+ZNd,ZOeCfd-ZPdCd/ZQdd(eBd0d0fd1ZRdDd2ZSdEd3ZTdEd4ZUeEd0fd5ZVeDd0fd6ZWeXZYeDd0fd7ZZeDd0fd8Z[deFfd9Z\d:Z]dFd;Z^d<Z_d=Z`dFd>Zad?Zbd@ZcGdAdBe2ZddS)G)absolute_import)division)print_functionN) 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/BUILDROOT/alt-python27-cllib-3.3.7-2.el7.cloudlinux.x86_64/opt/cloudlinux/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-packageresellermailr1cploginr6r3r5r4r-r1cRt}tddd}||}|std| |ddr/|dddd |d <n.|dd dd |d <|dd dd |d <n4#ttf$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"'passr2loginz@Cannot find database access data for localhost from config file ; mysqldb) dictrreadr has_optiongetstriprrmessage) _conf_pathaccessreg_data_config opened_fileserrs r+ db_accessrQKs VVF"O #'' 33L   XJ X X     % %hz % J J ,00 !1eEll 6NN -00 1eEll 6N *--.   %,, w > * 0 0 0"%+ 0 0    F4L Ms B"C..D?DDct|5}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 cg|]}|dsk|ddk0t|dkU|ddS)#:r) startswithcountlenrJsplit.0lines r+ zcpusers..}sfffT!__S11f6:jjoo6J6JsSWS]S]S_S_O`O`cdOdOdjjooa(..00OdOdOdr*N)opentuple)_userplans_filestream users_lists r+cpusersrevs o  f&ffVfff fffffffffffffff   s )--ctj|stSt |5}d|D}dddn #1swxYwYt|S)Ncg|]n}|dsWd|vt|dk@|dddoS)rTrUrVr)rXrZrJr[r\s r+r_zresellers..scccD!%!5!5c;>$;;CPTPZPZP\P\L]L]`aLaLa**S!,,Q/5577LaLaLar*)r&r'r(rar`)_resellers_pathrcresellers_lists r+ resellersrjs 7>>/ * *ww o  c& ccFccc ccccccccccccccc   s AAAcdhS)Nrootr)r)r*r+adminsrms 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]r6usernames r+ zis_reseller..s(MMww("MMMMMMr*)anyrj)rqrhs` r+ is_resellerrts0 MMMM)O2L2LMMM M MMr*Fcg}g}|pgD]a} |ttj|j=#t $r|dY^wxYwt g}|s|d||z }tj|tj tj dj }| dD]I}| }|s|| dddJt|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--nosysTstdoutstderrtext  N)appendstrpwdgetpwnampw_uidKeyErrorDBMAPPING_SCRIPT subprocessPopenPIPErwrGr[rJra) cplogin_lstwith_system_usersresultsuid_listrqparamsoutputr^s r+dblogin_cplogin_pairsrsRGH &B"" " OOC X 6 6 =>> ? ? ? ? " " " OOD ! ! ! ! ! "  F ! i    hF        T"",,zz||  tzz#rr*++++ >>s9AA('A(TcFt}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)rbcpinfozstr|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_encodingr6r5 contactemail2)list isinstancer~rareCPANEL_USERPLANS_PATHrtype__name__r&r'joinexistssysrxwrite loadconfigrIUSERCONF_PARAM_MAPbasenamer}index)cpuserkeyls_cpanel_users_dirquietsearch_sys_usersreturned cpusers_listuser_config_path cpuser_data user_datadata_keydataadditional_mailuser_data_tuples r+rrs'vvH&#Bx FT5M * *BV}} /DEEE h?W+/<<+@BBB B667<<(96BBw~~.//  X    NTff"WXXX !!1tLLL   # #H??#5#9#9(#C#CDDD9$$7++,<==D   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=r|@rV CONTACTEMAILHOSTzroot@rget_admin_email) _hostname) rSYSCONF_CLOUDLINUX_PATHOSErrorIOErrorrXr[rZrJCPANEL_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 bd|vr@tjtjj}|d|}|d}|D]Q}tj|s# t|5}t|D]\}}| s| ddkr)|s&tjd|d|d\|d\} } | d} ||| |  dddn #1swxYwY#t $r@} |s3tjd |d t#| d Yd} ~ Kd} ~ wwxYwdS) N{user};: rVz Can't parse z line in file "z"; line was ignored z==Can't open file  [] )rgetpwuidr&geteuidpw_namerr[r'rr` enumeraterJrYrrxrrr~) _pathparserr call_as_user path_listpath_rcir^domaindomain_raw_data domain_dataes r+_parse_userdatadomainsrs5|BJLL119  h 55 C  Iw~~e$$   e 7 )00 7 7GAt::<<! zz$''1,,$sJ,,,hihihikpkpkp-qrrr .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    P    s1vvvv!NOOO HHHH #s=E"B9E E"E E"E E"" F,,5F''F,c D|d}g}|D]}tj|s# t |5}t |D]]\}}|sd|vr||dddz }^ dddn #1swxYwY#t$r?}|s3tj d|dt|dYd}~d}~wwxYw|S) Nr serveraliasz serveralias: rr{rrr) r[r&r'rr`rrJrrrrxrr~) rrraliasesrrcrr^rs r+_parse_userdataaliasesr:s C  IGw~~e$$   e T )00TTGAt::<<! $D00 t||OR@@FFHHNNsSSSGG T T T T T T T T T T T T T T T T    P    s1vvvv!NOOO HHHH  Ns<C A.C< CC CC C D5DDcd|vr|d|}tj||}t ||}t |S)Nrr)rr&r'rrr)rrrrrs r+ useraliasesrQsS5 h// GLL ' 'E$U%888G ==r*c4tdddfd}t|||ddddfSdfdD}t dd |) N) docroot_pathr2cn||kr|dd<|dd<dSdS)Nrrr2)add)r'drrpathesresults r+rzdocroot..parser_sD 4 ;;%0^F> "(^F6NNN ;r*rrr2rCc8g|]}dt|zS)z)Can't find record "%(d)s" in file "%(p)s")rp)rF)r]rrs r+r_zdocroot..js-\\\PQ 5v8K8K8K K\\\r*z'Can't obtain document root for domain 'z'; )rJsetrrr)rrrrwatchedrrs` @@r+docrootrZs \\^^F UUF"D 1 1F,,,,,,, 5&6666 > " *fVn.Dn%vf~55ii\\\\U[\\\G (vvvwwW X XXr*c tvr tSttfd}t|||t S)Nc|d}|d}|tvrt|}nt}d|dkr||f|vr|d||fn||f|vr|||f|t|<|kr>d|dkr||idS||idSdS)Nrrmainr|)_user_to_domains_map_cpanelrinsertr}update) r'rruser_ document_rootrrdomains domains_tmps r+rzuserdomains..parser~sA#A / / /3E:III [^ # #=!22  Q $6777=!22  !]!3444-6#E* F??Q''=122222""A}#566666 ?r*r)rr rrritems)rrrrrrs` @@r+ userdomainsrvs ,,,*622--KmmG7777777.5&6666 NN;    r*ctfd}t|||tdkr)tddddtdkrdSdS) NcN|kr|ddSdS)Nr)r})r'rrrrds r+rzdomain_owner..parsers1 ;;   k!n - - - - - ;r*rrVzdomain z belongs to few users: [,]r)rrrZrr)rrrrrds` @r+ domain_ownerrsJ......5&6666 :m FFCHHZ((((*++ + :!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 rrVceZdZdZdS)homedirs..pwc"||_||_dSrp)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'rrrXr[rJr}r get_user_dictrrrardirnamefind) _sysusersrLHOMEDIR HOMEMATCHhomedirs users_homedirusers_home_matchrr^clpwd users_dictr rr user_nameuserdirhomedirs r+rrsGIHM w~~j!!Dz** D DDw'' D $ 7 3 3A 6 < < > > ++ D#'::i#8#8#;#A#A#C#C ' &&& GGE$$&&J)dE]++- " " " " " " " "  # - -JT#!r$}}Jt  )) Y'. 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 S)r2r))r]items r+r_z*_reseller_users_parser..s888V 888r*r)jsonloadsr ValueError TypeErrorrr~) json_stringjson_serializedrrs r+_reseller_users_parserr&sr#*[11 *888888 j) ,###3q66"""#s-0A(A##A(c|p t}tdddg}|tkstdkrE|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=jsonrlz --user={}T)cmdreturn_full_outputrVN) r UAPIr}formaturllibparsequoterrrr~) reseller_namer*r$rs r+_reseller_users_jsonr2s".WYYM o ?C !!WYY&%8%8 ;%%fl&8&8&G&GHHIII1!cdCCCAF 111(Q0001 sB C (CC c|gSg}tt}|ltd|ddd|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_FILErr-rJr[r}) resellernameruserowner_file_datar^ splitted_lines r+reseller_usersr<s* F()?@@66&+,0)-(; === , ,D !JJLL..t44M MM-* + + + + Mr*c  tj|}|d}t}|dD]}|d||d<|S#ttt f$r!}t t|d}~wwxYw)Nrrrr2)r r!rFrr"r#rr~)r$r%r users_datarrs r+_reseller_user_domains_parserr? s#*[11 *VV 6N 6 6D'+H~JtF| $ $ j) ,###3q66"""#sAA B!A==Bc>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 )r2r?)r1r$s r+reseller_domainsrA,s'}55K ( 5 55r*c.d|S)Nzhttp://{domain}:2083r)r-rCs r+get_user_login_urlrD8s ! ( ( ( 7 77r*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_cpanelrH<sL 23388:::: tt 5s !$ 22ceZdZdZdZdZfdZdZdZdZ dZ d Z d Z d Z d Zd/dZ d0dZdZedZdZdZdZd1dZd1dZdZdZdZdZedZeejdd 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)d.Z*xZ+S)2 PanelPluginen0z/etc/apache2/conf/httpd.confcVtt|dSrp)superrJr )r __class__s r+r zPanelPlugin.__init__Ns% k4  ))+++++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/userdatadomainsrrVz.cacheN)r&r'rris_cache_validgetattrrewrite_cpapi_cache)rmethod_marker_pairspairmethodmarkers cache_filers r+invalidate_cpapi_cachez"PanelPlugin.invalidate_cpapi_cacheQs!EGaFbc :=SUo$.OJO"& ( ( (]]__ c <45 5 5R/s C{r*ctS)z4 Return panel name :return: ) __cpname__rs r+ getCPNamezPanelPlugin.getCPNamets r*c tjddgtjtjd}|\}}t|dddS#YdSxYw)z Retrieve panel name and it's version :return: dict: { 'name': 'panel_name', 'version': 'panel_version', 'additional_info': 'add_info'} or None if can't get info r%z-VTrvrN)rversionadditional_info)rrrrbrir[)rrrfrPs r+get_cp_descriptionzPanelPlugin.get_cp_description{ss  +T2!! A JS#&399;;q>VZ[[ [ 44s A'A**A/ctS)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 )rQrjs r+rQzPanelPlugin.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 )rerjs r+rezPanelPlugin.cpuserssyyr*ctS)z Generates a list of resellers in the control panel :return: list of cpusers registered in the control panel :rtype: tuple )rjrjs r+rjzPanelPlugin.resellerss{{r*c t|S)zc Check if given user is reseller; :type username: str :rtype: bool )rt)rrqs 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)rrrs r+rz!PanelPlugin.dblogin_cplogin_pairss%[2CDDDr*r7Tc&t|||S)u 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 values​can 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 rrjs 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 )rrjs 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 )r<)rr9s r+r<zPanelPlugin.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 )rA)rr1s r+rAzPanelPlugin.reseller_domainss ...r*c t|S)z` Get login url for current panel; :type domain: str :rtype: str )rDrys r+rDzPanelPlugin.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 )rrys r+rzPanelPlugin.domain_ownersF###r*c tdd}n!#t$r}t|d}~wwxYwd|iS)Nphp_get_system_default_versionrmdefault_version_idrrGrr)rdefault_versionrs r+get_system_php_infozPanelPlugin.get_system_php_infosj 0+02226$&&DOO 0 0 0,Q// / 0 !/  s'* AAAc(|}|}i}|D]d}|d}|t|vrd}n|drdn||}t |d|||||d<e|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 rmNphp_fpmfpmaccount)rqphp_version_id handler_typedisplay_versionvhost)rQrSrkeysr!)rphp_version_to_handler_mapphp_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# (3I(> Duu3NC5F$Y/-) . 666 [1 2 2 r*c~ 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$rJ}tj tj d |tcYd}~Sd}~wwxYw)zV Get the list of PHP version installed in panel :return: list rFversionszalt-z/opt/-r .rzusr/lib64/php/modules/z usr/bin/phpzlink/conf/default.ini) identifierrmr modules_dirbininizea-z /opt/cpanel/z/root/z etc/php.ini)rrmrrrrz8CPAPI: Could not get list of installed PHP versions - {}N)rrGrXrr}r r&r'rrrsyslog LOG_WARNINGr-r) php_versionsphp_descriptionphp_name php_root_dirrs r+get_installed_php_versionsz&PanelPlugin.get_installed_php_versionsBs; # #()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 ,,," "A+&    M&,T[[!! " " "66MMMMMM  s'G!!H<2?H71H<7H<rTrR) 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+rSz$PanelPlugin._get_vhosts_php_versionsosT 0 !9::??AA*M M 0 0 0,Q// / 0s&) AAAc tdd}n)#t$rt}YnwxYwd|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_handlersc,i|]}|d|dS)rmcurrent_handlerr))r]phps r+ zBPanelPlugin._get_php_version_id_to_handler_map..s1   7:C NC 12   r*)rrGrrJ"_get_handler_info_for_each_version)handlerss r+rQz.PanelPlugin._get_php_version_id_to_handler_map|s H$%788==??@RSHH H H H"EEGGHHH H  >F    s'*#AAcg}t}|D]} td|ddd}||`#t tf$r<}tjtj 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)rmrrz.CPAPI: Could not get data for PHP version - {}N) rJrrwith_argumentsrGr}rrrrr-)rinstalled_php_versionsrmversion_handlerrs r+rz.PanelPlugin._get_handler_info_for_each_versions!,!G!G!I!I-  G !"455DD ' 5Edff/1124 0000k*    f02b2i2ijk2l2lmmm sAA>>C 2CC ctt} |d}|r|StjS#t$rtjcYSwxYw)N server_locale)r" CPANEL_CONFIGrJDEFAULT_LOCALEr)r cpanel_configrs r+get_admin_localezPanelPlugin.get_admin_locales_!-00  .)/:M %$$- - . . .- - - - .s . .AAc d}tj|d}|jdkrdd||jfS|jd}|d}ttd | }|dd d  }t|d fS#dtfcYSxYw)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 {} responce code is {}zutf-8rzzTotal Accesses)r7rUrVOK) requestsrI status_coder-contentdecoder[rrrJintr )urlresponce s_responses_response_listout_lists_total_accessess r+get_apache_connections_numberz)PanelPlugin.get_apache_connections_numbers #;C|C333H#s**6==c8CWXXXX!)0099J(..t44OD!1/RRRSSH'{0055a8>>@@ '(($. . #jll? " " "s?CBCC'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))rJr\s r+r_z5PanelPlugin.get_apache_ports_list..s 000$000r*ListenFT)r5r6r7rUrP) rrJHTTPD_CONFIG_FILErrrrr[r} 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 |dfS#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)r5r7rV)rzCMaxRequestWorkers directive is absent or multiple in httpd's configrr{r|rz,httpd config line syntax error. Line is '{}')rrJrrrrZr[rr-rrrr"r )rmrw_listrs r+get_apache_max_request_workersz*PanelPlugin.get_apache_max_request_workerss #";#@9JLLLED!4_deeeffH8}}!!``QK%%c**E5zzQ58}}d**FMMhWXkZZZ Z*j9 # # #jll? " " " #sA B3AB3B33-C#"C#rqrreturnctddd|ddd}|d}|dkrd S|S) N listacctsemailexactr2)want searchmethodsearch searchtypeacctrz *unknown*r)rrrG)rqremails 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)r2servicerrz://r )rrrGr schemenetloc)rqlinkparseds r+panel_login_linkzPanelPlugin.panel_login_link su233BBV_Caaaeaeagaghmo 2$-44FM4444r*c td5}|cdddS#1swxYwYdS#t$rt dwxYw)Nz/var/cpanel/mainipzZUnable to detect main ip for this server. Contact CloudLinux support and report the issue.)r`rGrJFileNotFoundErrorr)rfs r+ get_server_ipzPanelPlugin.get_server_ips S*++ (qvvxx~~'' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (  S S S RSS S Ss-A&A AAA A AA+NF)Nr7Trp),rr r rrdrr r]rgrkrorQrerjrtrrr staticmethodrrrrr<rArDrrrrr cache_callrSrQrrrrrr~rrr __classcell__)rOs@r+rJrJHs<N6,,,,,777"$"   %%%EEEE)d $HHHH&!!!++\+###,,,,////***$$$       <(#(#\(#X$$3I3M3OPPP00PP\0$$3M2NOOO  PO\ $\....##\#,!!\!6##\#,sCC\ 55\5SSSSSSSr*rJr)NNN)Trp)e __future__rrrr r&rrrrurllib.requestr. urllib.parse urllib.error configparserrrr collectionsr r tracebackr clcommon.cpapi.pluginlibr r clcommonr clcommon.cpapi.cpapiexceptionsrrrrrclcommon.lib.whmapi_librrrclcommon.utilsrrrrclcommon.clconfparsrrrrrclcommon.cpapi.GeneralPanelrrr r!r"rir'rr executablerr,r,CPANEL_DB_CONFrCPANEL_DATABASES_PATHCPANEL_USERS_DIRCPANEL_RESELLERS_PATHCPANEL_USERDATADOMAINS_PATHCPANEL_USERDATAFOLDER_PATHrr8rrrSUPPORTED_CPANEL_CPINFOrQrerjrmrtrrrrrrrrFrrrrr&r2r<r?rArDrHrJr)r*r+rs'&&&&&%%%%%%  DDDDDDDDDD###### ,,,,,,!!!!!!              UUUUUUUUUUSSSSSSSSSSSS222222SSSSSSSSSS *))))) 7<< ? ?ASTT 666!(0'/V:+.5+    V(((((V2    4 ! ! ! !+@NNNN&&&&RY-TD))))X)0)0)0)0X8.'A6TYYYY2#dff:!!!!!!!!H ;$     *?1111h###("""J # # # 6 6 6 6888   USUSUSUSUS&USUSUSUSUSr*