§ ;Š»jh;ãó—dZddlZddlmZddlmZmZddlmZm Z m Z ddl m Z m Z mZmZmZmZmZmZmZddlmZmZdd lmZmZmZe ¦«\ZZd „Zd;d „Zd;d „Z d„Z!d„Z"d„Z#d„Z$d„Z%d„Z&dd!„Z2d"„Z3d#„Z4d$„Z5d%„Z6d&„Z7d'„Z8d(ed)e9fd*„Z:d+„Z;d,„Zd)e?fd/„Z@d0„ZAd1„ZBd2„ZCd)eDefd3„ZEe¦«d4„¦«ZFd5„ZGd)e>fd6„ZHd7„ZId8„ZJd9„ZKd)e9fd:„ZLe e¦«ZMeM N¦«ZOe!¦«ZPeOjQZQeOjRZReOjSZSeOjTZTeOjUZUeOjVZVeOjWZWeOjXZXeOjYZYeOjZZZeOj[Z[eOj\Z\eOj]Z]dS)?z< CloudLinux control panel API API for Hosting control panel éN)Ú lru_cacheé)Ú CACHE_CPNAMEÚUNKNOWN_CP_NAME)ÚFeatureÚget_cl_feature_status_mapÚget_hosting_accounts_limit) Úget_cp_plugin_moduleÚdetect_panel_fastÚ CPANEL_NAMEÚDIRECTADMIN_NAMEÚ PLESK_NAMEÚISPMANAGER_NAMEÚINTERWORX_NAMEÚINTEGRATED_NAMEÚOFFICIAL_PLUGINS)Ú NotSupportedÚ NoPanelUser)Úis_cl_solo_editionÚCLEditionDetectionErrorÚ is_containercóP—tttttt fvS)zH Is current panel has native CL support :return: True/False )Ú_CP_NAMEr r rrr©óú—/builddir/build/BUILDROOT/alt-python27-cllib-3.4.44-1.el8.cloudlinux.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/clcommon/cpapi/__init__.pyÚis_cl_supported_panelr2s%€õ ÝÝÝÝÝð ð ðrFcó6—t |¦«S)zÁ Return list of available admin's packages :param raise_exc: hack for lvemanager :rtype: list :return: List of packages. For example ['BusinessPackage', 'Package2'] )Ú _panel_classÚadmin_packages©Ú raise_excs rr r @s€õ × &Ò & yÑ 1Ô 1Ð1rcó4—t ¦«S)a Return dictionary, contains available resellers packages, grouped by resellers :rtype: dict :return: Dictionary. Example: {'res1': ['BusinessPackage', 'UltraPackage', 'Package'], 'res2': ['SimplePackage', 'Package'] } )rÚresellers_packagesr!s rr$r$Ks€õ × *Ò *Ñ ,Ô ,Ð,rcóè—tj¦«dkrt ¦«Stt t krt ¦«St�tSt}tj   t¦«rTttd¬¦«5}|  ¦« ¦«}ddd¦«n #1swxYwY|S)zC Return panel name :rtype: str :return: Panel name rNzutf-8)Úencoding)ÚosÚgetegidrÚ getCPNamerrÚ_CP_PLUGIN_NAMErrÚpathÚisfilerÚopenÚreadlineÚstrip)ÚcontrolpanelnameÚ cache_streams rr)r)Wsý€õ „z�|„|�qÒÐÝ×%Ò%Ñ'Ô'Ð'õ�Ô(­OÒ;Ð;Ý×%Ò%Ñ'Ô'Ð'õ Р݈å&ÐÝ „w‡~‚~•lÑ#Ô#ð?Ý •,¨Ð 1Ñ 1Ô 1ð ?°\Ø+×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>Ð ð ?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?à ÐsÂ4'C'Ã'C+Ã.C+có4—t ¦«S)zÇ Retrieve panel name and it's version :rtype: dict :return: dict: { 'name': 'panel_name', 'version': 'panel_version', 'additional_info': 'add_info'} or None if can't get info )rÚget_cp_descriptionrrrr3r3qs€õ × *Ò *Ñ ,Ô ,Ð,rcó¼—t¦«rt ¦«St d¬¦«}d„|D¦«}t |¦«S)z” Generates a list of cpusers registered in the control panel :return: list of cpusers registered in the control panel :rtype: tuple )Úcplogin)Úkeylscó—g|] }|d‘Œ S)rr)Ú.0Úuser_s rú zcpusers..…s€Ð4Ð4Ð4 �5˜”8Ð4Ð4Ð4r)rrÚcpusersÚcpinfoÚtuple)Ú users_infoÚ _list_userss rr;r;{s[€õ ÑÔð&å×#Ò#Ñ%Ô%Ð%Ý×$Ò$¨=Ð$Ñ9Ô9€JØ4Ð4¨Ð4Ñ4Ô4€KÝ �Ñ Ô Ðrcó4—t ¦«S)z‹ Generates a list of resellers in the control panel :return: list of cpusers registered in the control panel :rtype: tuple )rÚ resellersrrrrArA‰s€õ × !Ò !Ñ #Ô #Ð#rcó4—t ¦«S)z� Generates a set of admins in the control panel :return: set of cpusers registered in the control panel :rtype: set :raise: NotSupported )rÚadminsrrrrCrC’s€õ × Ò Ñ Ô Ð rcó4—t ¦«S)zæ Getting root access to mysql database. For example {'login': 'root', 'db': 'mysql', 'host': 'localhost', 'pass': '9pJUv38sAqqW'} :return: root access to mysql database :rtype: dict :raises: NoDBAccessData )rÚ db_accessrrrrErEœs€õ × !Ò !Ñ #Ô #Ð#rcó8—t ||¦«S)a· Returs a list of pairs, the database user login - user login control panel For example: (('nata2_someuse', 'nata2'), ('testsome_dfrtbus', 'testsome')) :param list|tuple|None cplogin_lst: list of control panel users :param bool with_system_users: add system users to dbmapping :return: list of pairs, the database user login - user login control panel :rtype: tuple :raises: NotSupported, NoPackage )rÚdblogin_cplogin_pairs)Ú cplogin_lstÚwith_system_userss rrGrG§s€õ × -Ò -¨kÐ;LÑ MÔ MÐMr©r5ÚpackageÚmailÚresellerÚdnsTcó<—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 )Úsearch_sys_users)rr<)Úcpuserr6rPs rr<r<µs €õ" × Ò ˜v uÐ?OÐ Ñ PÔ PÐPrcó²—t¦«rt ¦«S t ¦«dS#t$rYdSwxYw)zÚ Gets admin email Note: be careful when modifying this method. It is used in SSA, ask @dkavchuk or someone else from C-Projects team for details :rtype: string :return: string - admin email rÚ)rrÚget_admin_emailÚget_admin_emails_listÚ IndexErrorrrrrTrTÉsb€õÑÔðÝ×+Ò+Ñ-Ô-Ð-ð Ý×5Ò5Ñ7Ô7¸Ô:Ð :øÝð ð ð Ø�2�2ð øøøs©AÁ AÁAcó~—d}t¦«r, t ¦«S#t$r|cYSwxYw|S)NÚen)rrÚget_admin_localer)ÚDEFAULT_LOCALEs rrYrYÛsY€Ø€NÝÑÔð"ð "Ý×0Ò0Ñ2Ô2Ð 2øÝð "ð "ð "Ø!Ð !Ð !Ð !ð "øøøà Ðs ’+« :¹:có6—t |¦«S)zƒ Return document root for domain :param str|unicode domain: :rtype tuple :return Tuple: (document_root, owner) )rÚdocroot©Údomains rr\r\ås€õ × Ò  Ñ 'Ô 'Ð'rcó8—t ||¦«S©zØ Return domain and document root pairs for control panel user first domain is main domain :param str|unicode cpuser: user login :rtype: list :return list of tuples (domain_name, documen_root) )rÚ useraliases)rQr^s rraraïs€õ × #Ò # F¨FÑ 3Ô 3Ð3rcó6—t |¦«Sr`)rÚ userdomains©rQs rrcrcûs€õ × #Ò # FÑ +Ô +Ð+rcó6—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 mountpoint names :rtype: dict )rÚuseraddondomainsrds rrfrfs€õ × (Ò (¨Ñ 0Ô 0Ð0rcó4—t ¦«S)z¿ Detects and returns list of folders contained the home dirs of users of the cPanel :rtype: list :return: list of folders, which are parent of home dirs of users of the panel )rÚhomedirsrrrrhrhs€õ × Ò Ñ "Ô "Ð"rcóz—t¦«rt |¦«St|¦«\}}|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Ú domain_ownerr\)r^Ú_Ú _domain_owners rrjrjs<€õÑÔð1Ý×(Ò(¨Ñ0Ô0Ð0ݘv‘”Ñ€A€}Ø Ðrcó6—t |¦«S)z˜ Return reseller users :param resellername: reseller name; return empty list if None :rtype list :return list[str]: user names list )rÚreseller_users©Ú resellernames rrnrn&s€õ × &Ò & |Ñ 4Ô 4Ð4rcó6—t |¦«S)zº Return reseller users and their main domains :param resellername: reseller name; autodetect name if None :rtype disct :return dict[str, str]: pairs user <==> domain )rÚreseller_domainsros rrrrr0s€õ × (Ò (¨Ñ 6Ô 6Ð6rcó6—t |¦«S)zM Check if user is reseller; :type username: str :rtype: bool )rÚ is_reseller©Úusernames rrtrt:s€õ × #Ò # HÑ -Ô -Ð-rcó6—t |¦«S)zP Get login url for current panel; :type domain: str :rtype: str )rÚget_user_login_urlr]s rrxrxCs€õ × *Ò *¨6Ñ 2Ô 2Ð2rcó6—t |¦«S)z� Return True if username is in admin names :param str username: user to check :rtype bool :return: True if user is admin )rÚis_adminrus rrzrzLs€õ × Ò  Ñ *Ô *Ð*rcóf—t¦«} |tjS#t$rYdSwxYw)z{ Return True if panel supports reseller limits (LVE10+) :return: bool - True - yes, False - no :rtype bool F)rrÚRESELLER_LIMITSÚKeyError)Úpanel_featuress rÚis_reseller_limits_supportedrVsD€õ /Ñ0Ô0€NðØ�gÔ5Ô6Ð6øÝ ððð؈uˆuðøøøs �"¢ 0¯0có4—t ¦«S)z™ Get dict reseller => id Optional method for panels without hard link reseller <=> system user :rtype: dict[str,int] - {'res1': id1} )rÚget_reseller_id_pairsrrrr�r�fs€õ × -Ò -Ñ /Ô /Ð/rcó4—t ¦«S)zY Retrive encoding name, used for package/reseller names, from panel :return: )rÚget_encoding_namerrrrƒrƒrs€õ × )Ò )Ñ +Ô +Ð+rÚfeatureÚreturncóv— t¦«}|dup| |d¦«S#t$rYdSwxYw)zˆ Get if feature is supported by control panel. :param feature: constant from Feature class :return: boolean NF)Úget_supported_cl_featuresÚgetr)r„Úfeaturess rÚis_panel_feature_supportedrŠzsR€ðÝ,Ñ.Ô.ˆØ˜4ÐÐ? 8§<¢<°¸Ñ#?Ô#?Ð?øÝ "ððð؈uˆuðøøøs ‚'*ª 8·8có4—t ¦«S)zL Retrieves Apache's connections number (from mod_status) For CM )rÚget_apache_connections_numberrrrrŒrŒ‰s€õ × 5Ò 5Ñ 7Ô 7Ð7rcó4—t ¦«S)z` Retrieves active httpd's ports from httpd's config :return: list of apache's ports )rÚget_apache_ports_listrrrrŽrŽ‘s€õ × -Ò -Ñ /Ô /Ð/rcó4—t ¦«S)z× Get current maximum request apache workers from httpd's config :return: tuple (max_req_num, message) max_req_num - Maximum request apache workers number or 0 if error message - OK/Trace )rÚget_apache_max_request_workersrrrr�r�™s€õ × 6Ò 6Ñ 8Ô 8Ð8rÚuidcó6—t |¦«S)zT Get "main" panel username by uid. :param uid: uid :return Username )rÚget_main_username_by_uid)r‘s rr“r“£s€õ × 0Ò 0°Ñ 5Ô 5Ð5rcó8—t ||¦«S©N)rÚget_user_emails_list)rvr^s rr–r–¬s€Ý × ,Ò ,¨X°vÑ >Ô >Ð>rcó6—t |¦«Sr•)rÚpanel_login_linkrus rr˜r˜¯s€Ý × (Ò (¨Ñ 2Ô 2Ð2rcó6—t |¦«Sr•)rÚpanel_awp_linkrus rršrš²s€Ý × &Ò & xÑ 0Ô 0Ð0rcó8—t ¦«pgS)zK Returns features that are not supported on current control panel. )rÚget_unsupported_cl_featuresrrrÚget_unsupported_featuresr�¶s€õ × 3Ò 3Ñ 5Ô 5Ð ;¸Ð;rcó—t¦«S)zd Left here mostly for backwards compatibility. See get_cl_feature_status_map docstring. )rrrrr‡r‡¿s€õ %Ñ &Ô &Ð&rcóF—td¬¦«st¦«rdSdS)NT)Úskip_jwt_checkF)rrrrrÚis_throttling_supportedr¡Ès*€Ý¨Ð.Ñ.Ô.ðµ,±.´.ð؈uØ ˆ4rcó4—t ¦«S)zY Get panel users count, admin accounts are not counted :return: Users count. )rÚget_hosting_accounts_countrrrr£r£Îs€õ × 2Ò 2Ñ 4Ô 4Ð4rcód—t¦«}|sdSt ¦«}||kS)zB Check if customer hitting max accounts count per edition F)r rr£)Úmax_accounts_limitÚcurrent_accounts_counts rÚis_hitting_max_accounts_limitr§Ös;€õ4Ñ5Ô5ÐØ ð؈uå)×DÒDÑFÔFÐØ !Ð$6Ò 6Ð6rcó—t¦«Sr•)r rrrÚget_max_accounts_limitr©âs€å %Ñ 'Ô 'Ð'rc󺇗 t¦«}n"#t$r}td¦«|‚d}~wwxYwt¦«Štˆfd„|D¦«¦«S)z| Retrieve users count and admins count, substract the last value from the first one and dump the result on disk zcpusers() method not supportedNc3ó$•K—|] }|‰v¯dV—Œ dS)rNr)r8ÚuserÚadmins_collections €rú z)count_hosting_accounts..ôs.øèè€ÐIÐI�T¨4Ð7HÐ+HÐ+HˆqÐ+HÐ+HÐ+HÐ+HÐIÐIr)r;rrCÚsum)Ú users_listÚer­s @rÚcount_hosting_accountsr²çswø€ð DÝ‘Y”Yˆ ˆ øÝ ðDðDðDÝÐ;Ñ<Ô<À!ÐCøøøøðDøøøõ™œÐå ÐIÐIÐIÐI˜ZÐIÑIÔIÑ IÔ IÐIsƒ’ 1œ,¬1cóœ—d}tj |¦«sdS tjd¦«dkS#t$rYdSwxYw)z@ They have symlink /usr/local/cpanel/server.type -> wp2 z/usr/local/cpanel/server.typeFÚwp2)r'r+ÚislinkÚreadlinkÚ Exception)Ú wp2_markers rÚis_wp2_environmentr¹ösa€ð1€JÝ Œ7�>Š>˜*Ñ %Ô %ð؈uðÝŒ{Ð:Ñ;Ô;¸uÒDÐDøÝ ððð؈uˆuðøøøs¥=½ A Á A )F)NF)NrJTr•)^Ú__doc__r'Ú functoolsrÚconstrrÚclcommon.featuresrrr Ú pluginlibr r r r rrrrrÚcpapiexceptionsrrÚclcommon.lib.cleditionrrrrr*rr r$r)r3r;rArCrErGr<rTrYr\rarcrfrhrjrnrrrtrxrzrr�rƒÚboolrŠrŒrŽr�ÚintÚstrr“r–r˜ršÚlistr�r‡r¡r£r§r©r²r¹Ú _apipluginÚ PanelPluginrÚCP_NAMEÚget_domains_php_infoÚget_system_php_infoÚlist_allÚ list_usersÚget_reseller_usersÚreseller_package_by_uidÚget_uids_list_by_packageÚget_installed_php_versionsÚget_customer_loginÚget_domain_loginÚ get_server_ipÚinvalidate_cpapi_cacheÚsuspended_users_listrrrúrÕsÿðððð € € € ØÐÐÐÐÐà0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ððððððððððð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð7Ð6Ð6Ð6Ð6Ð6Ð6Ð6ððððððððððð.Ð-Ñ/Ô/Ñ€ˆ/ð ð ð ð2ð2ð2ð2ð -ð -ð -ð -ðððð4-ð-ð-ð ð ð ð$ð$ð$ð!ð!ð!ð$ð$ð$ð Nð Nð Nð NðPØ ðQðQðQðQð(ððð$ððð(ð(ð(ð 4ð 4ð 4ð,ð,ð,ð1ð1ð1ð#ð#ð#ð ð ð ð5ð5ð5ð7ð7ð7ð7ð.ð.ð.ð3ð3ð3ð+ð+ð+ð ð ð ð 0ð0ð0ð,ð,ð,ð ¨ð °Dð ð ð ð ð8ð8ð8ð0ð0ð0ð9ð9ð9ð6 #ð6¨#ð6ð6ð6ð6ð?ð?ð?ð3ð3ð3ð1ð1ð1ð< $ w¤-ð<ð<ð<ð<ð €�„ð'ð'ñ „ð'ðððð 5 Cð5ð5ð5ð5ð 7ð 7ð 7ð(ð(ð(ð Jð Jð Jð ˜Dð ð ð ð ð"Ð ! /Ñ 2Ô 2€ Ø×%Ò%Ñ'Ô'€ Ø ˆ)‰+Œ+€ð$Ô8ÐØ"Ô6ÐØ Ô €Ø Ô $€ Ø!Ô4ÐØ&Ô>ÐØ'Ô@ÐØ)ÔDÐØ!Ô4ÐØÔ0ÐØÔ*€ Ø%Ô<ÐØ#Ô8ÐÐÐr