ˈD:8ddlZddlZddlZddlZddlZddlZddlZddlZddl Zddl m Z ddl m Z mZmZddlmZddlmZddlZddlZddlmZddlmZddlmZdd lmZmZmZmZm Z m!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/m0Z0ddl1m2Z2m3Z3m4Z4m5Z5m6Z6dZ7ej89ej8:ej;dZe?Z@dZAdZBdZCdZDdZEdZFdZGdZHdZIdZJdZKdZLddd d!d"d#d$ZMd%ZNeBfd&ZOeCfd'ZPeFfd(ZQd)ZReFfd*ZSdDd,ZTdd%eEd-d-fd.ZUdEd/ZVdFd0ZWdFd1ZXeHd-fd2ZYeGd-fd3ZZiZ[eGd-fd4Z\eHd-fd5e]d6e^fd7Z_eHd-fd5e]d6e^fd8Z`eGd-fd9ZadeIfd:Zbd;ZcdGd<Zdd=Zed>ZfdGd?Zgd@ZhdAZiGdBdCe'ZjdS)HN) OrderedDict) ConfigParser NoOptionErrorNoSectionError) format_exc)urlparse)ClPwd)load) load_fast)CPAPIExternalProgramFailedCpApiTypeError DuplicateData EncodingErrorNoDBAccessDataNoDomain NotSupported ParsingError)CPAPI_CACHE_STORAGEDomainDescriptionGeneralPanelPluginV1PHPDescription)getuser)Feature) WhmApiError WhmApiRequestWhmNoPhpBinariesError)ExternalProgramFailedget_file_linesget_modules_dir_for_alt_phpgrep run_commandcPanelzcpanel-dbmappingz /usr/bin/uapic@tjdS)N/usr/local/cpanel/cpanel)ospathisfile/builddir/build/BUILDROOT/alt-python27-cllib-3.4.36-1.el9.cloudlinux.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/clcommon/cpapi/plugins/cpanel.pydetectr+5s 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,packageresellermailr0cploginr5r2r4r3r,r0c: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"'passr1loginz@Cannot find database access data for localhost from config file ; mysqldb) rreadr has_optiongetstriprrmessage) _conf_pathaccessreg_data_config opened_fileserrs r* db_accessrOQs 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) startswithcountlenrHsplit.0lines r* zcpusers..sfffT!__S11f6:jjoo6J6JsSWS]S]S_S_O`O`cdOdOdjjooa(..00OdOdOdr)N)opentuple)_userplans_filestream users_lists r*cpusersrf|s o 0 0 0fFffVfff fffffffffffffff   s +//ctj|stSt |d5}d|D}dddn #1swxYwYt|S)NrQrRcg|]n}|dsWd|vt|dk@|dddoS)rUrVrWr)rYr[rHr\r]s r*r`zresellers..scccD!%!5!5c;>$;;CPTPZPZP\P\L]L]`aLaLa**S!,,Q/5577LaLaLar))r%r&r'rbra)_resellers_pathrdresellers_lists r* resellersrks 7>>/ * *ww o 0 0 0cF ccFccc ccccccccccccccc   s AAAcdhS)Nrootr(r(r)r*adminsrns 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^r5usernames r* zis_reseller..s(MMww("MMMMMMr))anyrk)rrris` r* is_resellerrus0 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 communicater\rHrb) cplogin_lstwith_system_usersresultsuid_listrrparamspoutput_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)rccpinfozstr|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_encodingr5r4 contactemail2) isinstancer~listrbrfCPANEL_USERPLANS_PATHr type__name__r%r&joinexistssysrywrite loadconfigrGUSERCONF_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=r|@rW CONTACTEMAILHOSTzroot@rget_admin_email) _hostname) rSYSCONF_CLOUDLINUX_PATHOSErrorIOErrorrYr\r[rHCPANEL_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};rQrR: rWz Can't parse z line in file "z"; line was ignored z==Can't open file  [] )rgetpwuidr%geteuidpw_namerr\r&rra enumeraterHrZrryrr) _pathparserr call_as_user path_listpath_rdir_domaindomain_raw_data domain_dataes r*_parse_userdatadomainsr$s5|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) NrrQrR serveraliasz serveralias: r rrr) r\r%r&rrarrHrrrryr) rrraliasesrrdrr_rs r*_parse_userdataaliasesrAs 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* useraliasesrYsS5 h// GLL ' 'E$U%888G ==r)c4tdddfd}t|||ddddfSdfdD}t dd |) N) docroot_pathr1cn||kr|dd<|dd<dSdS)Nrrr1)add)r&drrpathesresults r*rzdocroot..parsergsD 4 ;;%0^F> "(^F6NNN ;r)rrr1rBc g|] }d|dz S)z)Can't find record "%(d)s" in file "%(p)s")rrr()r^rrs r*r`zdocroot..rs(^^^RS 5f18M8M M^^^r)z'Can't obtain document root for domain 'z'; )rHsetrrr)rrrrwatchedrrs` @@r*docrootrbs \\^^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)Nrrmainr|)_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* userdomainsr~s ,,,*622--KmmG7777777.5&6666 NN;    r)rreturncd|vr|d|}tj|d} t |dd5}t j|}dddn #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. rrrtrQrRNrrr)rr%r&rrayaml safe_loadrrryr YAMLErrorrr~)rrr main_filefrrs r*_load_main_user_filersF5 h// UF++I * )TG 4 4 4 %>!$$D % % % % % % % % % % % % % % %  E J  C CCQCCC D D D >***3q66"")*sMA<A/# A</A33A<6A37A<< C))B5/C)5C)C$$C)cRt|||}|diS)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. )rr addon_domains)rrG)rrr main_datas r*useraddondomainsr s,"%V5FFFI ==" - --r)cgfd}t|||tdkr)tddddtdkrdSdS) NcN|kr|ddSdS)Nr)r})r&rrrres r*rzdomain_owner..parsers1 ;;   k!n - - - - - ;r)rrWzdomain z belongs to few users: [,]r)rr[rr)rrrrres` @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 rrWceZdZdZdS)homedirs..pwc"||_||_dSrq)rpw_dir)selfnamedirs r*__init__zhomedirs..pw.__init__s# ! r)N)r __module__ __qualname__rr(r)r*pwrs# " " " " "r)rz /public_htmlz/www/)r%r&rrrYr\rHr}r get_user_dictrrrbvaluesrdirnamefind) _sysusersrJHOMEDIR HOMEMATCHhomedirs users_homedirusers_home_matchrr_clpwd users_dictrrrruserdirhomedirs r*r&r&s 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 Sr1r(r^items r*r`z*_reseller_users_parser..888V 888r)rjsonloadsr ValueError TypeErrorrr~) 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=jsonrmz--user=T)cmdreturn_full_outputrWN) rUAPIr}urllibparsequoter!rr r~) reseller_namer>r8rs r*_reseller_users_jsonrEs".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_FILEr rHr\r}) resellernameruserowner_file_datar_ splitted_lines r*reseller_usersrP3s* F()?@@/ ///&+,0)-(; === , ,D !JJLL..t44M MM-* + + + + Mr)c tj|}|d}i}|dD]}|d||d<|S#tttf$r"}t t ||d}~wwxYw)Nrrrr1r3)r8r9r users_datar1rs r*_reseller_user_domains_parserrSXs**[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 )rErS)rDr8s r*reseller_domainsrUds'}55K ( 5 55r)cd|dS)Nzhttp://z:2083r()rs r*get_user_login_urlrWps "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_cpanelr[tsL 23388:::: tt 5s !$ 22c@eZdZdZdZdZfdZdZdZdZ dZ d Z d Z d Z d Zd3dZ d4dZdZedZdZdZdZdZd5dZd5dZdZdZdZdZedZeej d d!g"d#Z!eej d!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+d0Z,d1Z-d,e.e/fd2Z0xZ1S)6 PanelPluginen0z/etc/apache2/conf/httpd.confcHtdSrq)superr)r __class__s r*rzPanelPlugin.__init__s 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/userdatadomainsrrWz.cacheN)r%r&rris_cache_validgetattrrewrite_cpapi_cache)rmethod_marker_pairspairmethodmarkers cache_filers r*invalidate_cpapi_cachez"PanelPlugin.invalidate_cpapi_caches!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 )rOr|s r*rOzPanelPlugin.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 )rfr|s r*rfzPanelPlugin.cpuserssyyr)ctS)z Generates a list of resellers in the control panel :return: list of cpusers registered in the control panel :rtype: tuple )rkr|s r*rkzPanelPlugin.resellerss{{r)c t|S)zc Check if given user is reseller; :type username: str :rtype: bool )ru)rrrs r*ruzPanelPlugin.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)r6Tc&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 rr|s r*rzPanelPlugin.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)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) )rrrs r*rzPanelPlugin.userdomains$s6"""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 )r rs r*r zPanelPlugin.useraddondomains-s '''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 )r&r|s r*r&zPanelPlugin.homedirs7s zzr)c t|S)z Return reseller users :param resellername: reseller name; autodetect name if None :return list[str]: user names list )rPrrMs r*rPzPanelPlugin.reseller_users>s 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 )rUrs r*rUzPanelPlugin.reseller_domainsFs ---r)c t|S)z` Get login url for current panel; :type domain: str :rtype: str )rWrs r*rWzPanelPlugin.get_user_login_urlPs "&)))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 )rrs r*rzPanelPlugin.domain_ownerXsF###r)c tdd}n"#t$r}t||d}~wwxYwd|iS)Nphp_get_system_default_versionrdefault_version_idrrZrr )rdefault_versionrs r*get_system_php_infozPanelPlugin.get_system_php_infoasl 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 rz*Unable to find php %s in handlers map %s. )php_version_idphp_version_to_handler_mapextraNphp_fpmfpmaccount)rrr handler_typedisplay_versionvhost)rdrfrkeysloggerrsr)rrphp_settings_per_vhostdomains_php_info domain_inforrs r*get_domains_php_infoz PanelPlugin.get_domains_php_infols&*%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)cP tdd}g}|D]}|drd|ddd}|t ||dd|d t j|t j|tt j|d t j|d  |d rd|d}|t ||dd|d t j|dt 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 rYversionszalt-z/opt/-r.rz usr/bin/phpzlink/conf/default.ini) identifierrr modules_dirbininizea-z /opt/cpanel/z/root/zusr/lib64/php/modules/z etc/php.ini)rrrrrrz7CPAPI: Could not get list of installed PHP versions: %sN)rrZrYrr}rr%r&rrrrrrs) php_versionsphp_descriptionphp_name php_root_dirrs r*get_installed_php_versionsz&PanelPlugin.get_installed_php_versionss! " #()EFFKKMMjYL !O(  &&v..#H8+;+;C+E+E#H#H#HL#**>#+#+B< @ @(2, @ @GLL66$&GLL?Z?\?\$]$]GLL}EEGLL7NOO ,,,((// #B(#B#B#BL#**>#+#+B< @ @(2, @ @$&GLL?W$X$XGLL66GLL}EEGLL}EE ,,," "?+&    LLRTU V V VIIIIII s'G--H%>H H% H%rgre) 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*rfz$PanelPlugin._get_vhosts_php_versionssV 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)rcurrent_handlerr()r^phps r* zBPanelPlugin._get_php_version_id_to_handler_map..s1   7:C NC 12   r)) rrZrrrsrIcontextr]"_get_handler_info_for_each_version)handlersrs r*rdz.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)rrrz-CPAPI: Could not get data for PHP version: %sN) r]rrwith_argumentsrZr}rrrrs)rinstalled_php_versionsrversion_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_CONFIGr]DEFAULT_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 rQr{zTotal Accesses)rKrVrWOK) requestsrG status_codecontentdecoder\rr rHintrr)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()rHr]s r*r`z5PanelPlugin.get_apache_ports_list..*s 000$000r)ListenFT)rIrJrKrVrP) rr]HTTPD_CONFIG_FILErrr rr\r} IndexErrorr6)_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)rIrKrW)rzCMaxRequestWorkers directive is absent or multiple in httpd's configrrr|rz)httpd config line syntax error. Line is '') rr]rrr r[r\rrrrr6r)rmrw_listrs r*get_apache_max_request_workersz*PanelPlugin.get_apache_max_request_workers9s #";#@9JLLLED!4_deeeffH8}}!!``QK%%c**E5zzQ58}}d**R8A;RRRR R*j9 # # #jll? " " " #sA B$AB$ B$$-CCrrrrctddd|ddd}|d}|dkrd S|S) N listacctsemailexactr1)want searchmethodsearch searchtypeacctrz *unknown*r)rrrZ)rrremails user_emailss r*get_user_emails_listz PanelPlugin.get_user_emails_listPsr + & & 5 57CJS[AG 6 I IIMPV XXY [ Wo + % %2r)ctd|dd}|sdSt|}|jd|jdS)Ncreate_user_sessioncpaneld)r1servicerrz://r)rrrZrschemenetloc)rrlinkparseds r*panel_login_linkzPanelPlugin.panel_login_linkasw233BBV_Caaaeaeagaghmo 2$-44FM4444r)ct|d}t|dkrdS|dS)Nrrrz@/cpsess0000000000/frontend/paper_lantern/lveversion/wpos.live.pl)r]r rstripr[)rrrs r*panel_awp_linkzPanelPlugin.panel_awp_linklsF++H55<>2XXXXr)c tdd5}|cdddS#1swxYwYdS#t$r}t d|d}~wwxYw)Nz/var/cpanel/mainiprQrRzZUnable to detect main ip for this server. Contact CloudLinux support and report the issue.)rarErHFileNotFoundErrorr)rrrs r* get_server_ipzPanelPlugin.get_server_ipss *W=== (vvxx~~'' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (    C  s9A&A AA  A A A A2A--A2chtdd}d|DS)N listsuspendedrcg|] }|d Sr/r(r0s r*r`z4PanelPlugin.suspended_users_list..r2r))rrZ)rsuspended_infos r*suspended_users_listz PanelPlugin.suspended_users_list}s6 (88==?? J888888r)cgSrqr(r|s r*get_unsupported_cl_featuresz'PanelPlugin.get_unsupported_cl_featuress r)NF)Nr6Trq)2rrrrrvrrrpryr}rrOrfrkrurrr staticmethodrrrr r&rPrUrWrrrrr cache_callrfrdrrrrrr~rr r rrrrr __classcell__)rbs@r*r]r]sN6777"$$$.$   %%%EEEE)d $HHHH&!!!++\+###(((,,,,....***$$$    " " " H'#'#\'#V$$3I3M3OPPP77PP\7$$3M2NOOO  PO\ 2\....##\#,!!\!6##\#,sCC\ 55\5YY\Y 999T']r)r]r)NNN)Trq)kr4loggingr%rrr urllib.errorrA urllib.parseurllib.request collectionsr configparserrrr tracebackrrrrclcommonr clcommon.clconfparsr rr clcommon.cpapi.cpapiexceptionsr r rrrrrrclcommon.cpapi.GeneralPanelrrrrclcommon.cpapi.pluginlibrclcommon.featuresrclcommon.lib.whmapi_librrrclcommon.utilsrrrr r!r{r&rr! executablerr@ getLoggerrrr+CPANEL_DB_CONFrCPANEL_DATABASES_PATHCPANEL_USERS_DIRCPANEL_RESELLERS_PATHCPANEL_USERDATADOMAINS_PATHCPANEL_USERDATAFOLDER_PATHrrLrrrSUPPORTED_CPANEL_CPINFOrOrfrkrnrurrrrrrrrrr~dictrr rr&r:rErPrSrUrWr[r]r(r)r*r5sc   ######DDDDDDDDDD !!!!!! 222222))))))                     -,,,,,%%%%%%UUUUUUUUUUpppppppppppppp  7<< ? ?ASTT  8 $ $ 666!(0'/V:+.5+    V(((((V2    4 ! ! ! !+@NNNN&&&&RY-TD))))X)0)0)0)0X:0'A6TSSSS2!:!!!!!!!!H-Gd***W[****4)C$..S.SW....* ;$"*?1111h***("""J * * * 6 6 6 6###   FFFFF&FFFFFr)