X7ROOT File Manager
Current Path:
/opt/cloudlinux/venv/lib/python3.11/site-packages
opt
/
cloudlinux
/
venv
/
lib
/
python3.11
/
site-packages
/
π
..
π
GitPython-3.1.32.dist-info
π
Jinja2-3.0.3.dist-info
π
Mako-1.2.4.dist-info
π
MarkupSafe-2.1.3.dist-info
π
PyJWT-2.8.0.dist-info
π
PyMySQL-1.1.0.dist-info
π
PyVirtualDisplay-3.0.dist-info
π
PyYAML-6.0.1.dist-info
π
__pycache__
π
_cffi_backend.cpython-311-x86_64-linux-gnu.so
(267.63 KB)
π
_distutils_hack
π
_lvdmap.cpython-311-x86_64-linux-gnu.so
(18.36 KB)
π
_pyrsistent_version.py
(23 B)
π
_pytest
π
_yaml
π
aiohttp
π
aiohttp-3.9.2.dist-info
π
aiohttp_jinja2
π
aiohttp_jinja2-1.5.dist-info
π
aiohttp_security
π
aiohttp_security-0.4.0.dist-info
π
aiohttp_session
π
aiohttp_session-2.9.0.dist-info
π
aiosignal
π
aiosignal-1.3.1.dist-info
π
alembic
π
alembic-1.11.1.dist-info
π
astroid
π
astroid-2.15.6.dist-info
π
attr
π
attrs
π
attrs-23.1.0.dist-info
π
backports
π
certifi
π
certifi-2023.7.22.dist-info
π
cffi
π
cffi-1.15.1.dist-info
π
chardet
π
chardet-5.2.0.dist-info
π
charset_normalizer
π
charset_normalizer-2.1.1.dist-info
π
cl_dom_collector
π
cl_proc_hidepid.py
(4.53 KB)
π
cl_website_collector
π
clcagefslib
π
clcommon
π
clconfig
π
clconfigure
π
clcontrollib.py
(51.73 KB)
π
cldashboard
π
cldetectlib.py
(18.4 KB)
π
cldiaglib.py
(48.5 KB)
π
clevents
π
clflags
π
clhooklib.py
(1.27 KB)
π
cli_utils.py
(1.66 KB)
π
cllicense
π
cllicenselib.py
(9.1 KB)
π
cllimits
π
cllimits_validator
π
cllimitslib_v2
π
cllvectl
π
clpackages
π
clquota
π
clselect
π
clselector
π
clsentry
π
clsetuplib.py
(4.29 KB)
π
clsudo.py
(14.42 KB)
π
clsummary
π
clveconfig
π
clwizard
π
clwpos
π
configparser-5.0.2.dist-info
π
configparser.py
(1.51 KB)
π
contextlib2
π
contextlib2-21.6.0.dist-info
π
coverage
π
coverage-7.2.7.dist-info
π
cryptography
π
cryptography-41.0.2.dist-info
π
ddt-1.4.4.dist-info
π
ddt.py
(12.43 KB)
π
dill
π
dill-0.3.7.dist-info
π
distlib
π
distlib-0.3.8.dist-info
π
distutils-precedence.pth
(151 B)
π
docopt-0.6.2.dist-info
π
docopt.py
(19.48 KB)
π
dodgy
π
dodgy-0.2.1.dist-info
π
filelock
π
filelock-3.13.1.dist-info
π
flake8
π
flake8-5.0.4.dist-info
π
flake8_polyfill
π
flake8_polyfill-1.0.2.dist-info
π
fluent
π
fluent-0.10.0.dist-info
π
fluent_logger-0.11.1.dist-info
π
frozenlist
π
frozenlist-1.4.0.dist-info
π
future
π
future-0.18.3.dist-info
π
git
π
gitdb
π
gitdb-4.0.10.dist-info
π
guppy
π
guppy3-3.1.3.dist-info
π
idna
π
idna-3.4.dist-info
π
iniconfig
π
iniconfig-2.0.0.dist-info
π
isort
π
isort-5.12.0.dist-info
π
jinja2
π
jsonschema
π
jsonschema-3.2.0.dist-info
π
jwt
π
lazy_object_proxy
π
lazy_object_proxy-1.9.0.dist-info
π
libfuturize
π
libpasteurize
π
lve_stats-2.0.dist-info
π
lve_utils
π
lveapi.py
(18.5 KB)
π
lvectllib.py
(118.19 KB)
π
lvemanager
π
lvestat.py
(6.83 KB)
π
lvestats
π
lxml
π
lxml-4.9.2.dist-info
π
mako
π
markupsafe
π
mccabe-0.7.0.dist-info
π
mccabe.py
(10.4 KB)
π
mock
π
mock-5.1.0.dist-info
π
msgpack
π
msgpack-1.0.8.dist-info
π
multidict
π
multidict-6.0.4.dist-info
π
numpy
π
numpy-1.25.1.dist-info
π
numpy.libs
π
packaging
π
packaging-23.1.dist-info
π
pam.py
(7.38 KB)
π
past
π
pep8_naming-0.10.0.dist-info
π
pep8ext_naming.py
(18.61 KB)
π
pip
π
pip-25.3.dist-info
π
pkg_resources
π
platformdirs
π
platformdirs-3.11.0.dist-info
π
pluggy
π
pluggy-1.2.0.dist-info
π
prettytable
π
prettytable-3.8.0.dist-info
π
prometheus_client
π
prometheus_client-0.8.0.dist-info
π
prospector
π
prospector-1.10.2.dist-info
π
psutil
π
psutil-5.9.5.dist-info
π
psycopg2
π
psycopg2_binary-2.9.6.dist-info
π
psycopg2_binary.libs
π
py.py
(263 B)
π
pycodestyle-2.9.1.dist-info
π
pycodestyle.py
(101.08 KB)
π
pycparser
π
pycparser-2.21.dist-info
π
pydocstyle
π
pydocstyle-6.3.0.dist-info
π
pyfakefs
π
pyfakefs-5.10.2.dist-info
π
pyflakes
π
pyflakes-2.5.0.dist-info
π
pylint
π
pylint-2.17.4.dist-info
π
pylint_celery
π
pylint_celery-0.3.dist-info
π
pylint_django
π
pylint_django-2.5.3.dist-info
π
pylint_flask
π
pylint_flask-0.6.dist-info
π
pylint_plugin_utils
π
pylint_plugin_utils-0.7.dist-info
π
pylve-2.1-py3.11.egg-info
π
pylve.cpython-311-x86_64-linux-gnu.so
(28.84 KB)
π
pymysql
π
pyparsing
π
pyparsing-3.0.9.dist-info
π
pyrsistent
π
pyrsistent-0.19.3.dist-info
π
pytest
π
pytest-7.4.0.dist-info
π
pytest_check
π
pytest_check-2.5.3.dist-info
π
pytest_snapshot
π
pytest_snapshot-0.9.0.dist-info
π
pytest_subprocess
π
pytest_subprocess-1.5.3.dist-info
π
pytest_tap
π
pytest_tap-3.5.dist-info
π
python_pam-1.8.4.dist-info
π
pyvirtualdisplay
π
raven
π
raven-6.10.0.dist-info
π
remove_ubc.py
(5.73 KB)
π
requests
π
requests-2.31.0.dist-info
π
requirements_detector
π
requirements_detector-1.2.2.dist-info
π
schema-0.7.5.dist-info
π
schema.py
(29.51 KB)
π
secureio.py
(19.09 KB)
π
semver
π
semver-3.0.1.dist-info
π
sentry_sdk
π
sentry_sdk-1.29.2.dist-info
π
setoptconf
π
setoptconf_tmp-0.3.1.dist-info
π
setuptools
π
setuptools-80.9.0.dist-info
π
simple_rpm.so
(15.18 KB)
π
simplejson
π
simplejson-3.19.1.dist-info
π
six-1.16.0.dist-info
π
six.py
(33.74 KB)
π
smmap
π
smmap-5.0.0.dist-info
π
snowballstemmer
π
snowballstemmer-2.2.0.dist-info
π
sqlalchemy
π
sqlalchemy-1.3.24.dist-info
π
ssa
π
svgwrite
π
svgwrite-1.4.3.dist-info
π
tap
π
tap_py-3.2.1.dist-info
π
testfixtures
π
testfixtures-7.1.0.dist-info
π
toml
π
toml-0.10.2.dist-info
π
tomlkit
π
tomlkit-0.11.8.dist-info
π
typing_extensions-4.7.1.dist-info
π
typing_extensions.py
(108.48 KB)
π
unshare-0.22.dist-info
π
unshare.cpython-311-x86_64-linux-gnu.so
(16.31 KB)
π
urllib3
π
urllib3-2.0.4.dist-info
π
vendors_api
π
virtualenv
π
virtualenv-20.21.1.dist-info
π
wcwidth
π
wcwidth-0.2.6.dist-info
π
websiteisolation
π
wmt
π
wrapt
π
wrapt-1.15.0.dist-info
π
xray
π
yaml
π
yarl
π
yarl-1.9.2.dist-info
Editing: lveapi.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright Β© Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2019 All Rights Reserved # # Licensed under CLOUD LINUX LICENSE AGREEMENT # http://cloudlinux.com/docs/LICENSE.TXT import os import syslog import pwd from typing import Optional # NOQA from clcommon.clproc import ProcLve from clcommon import cpapi, ClPwd from clcommon.cpapi.cpapiexceptions import NotSupported from clveconfig import ve_config from lve_utils.pylve_wrapper import PyLveError, PyLve # noqa: F401 β re-exported for callers from websiteisolation import config as _ws_config from websiteisolation import id_registry as _ws_id_registry LVP_XML_TAG_NAME = "reseller" LVE_NO_UBC = 1 << 1 LVE_NO_MAXENTER = 1 << 2 class NameMapError(Exception): pass class NameMapConfigError(NameMapError): pass class NameMapNotInitialized(NameMapError): pass class NameMap: """ Container for backend storing resellers_name<=>resellers_id map As backend store use ve.cfg Usage: >>> name_map = NameMap() >>> name_map.link_xml_node() >>> name_map.id_list() [1001] """ def __init__(self, xml_tag_name=LVP_XML_TAG_NAME): self._xml_tag_name = xml_tag_name self._xml_node = None # Reseller name to id map (list of corteges) self._reseller_id_name_map = None def get_id(self, name): for name_, id_ in self.load_from_node(): if name_ == name: return id_ def get_name(self, id_): for name_, _id in self.load_from_node(): if id_ == _id: return name_ def id_list(self): return [id_ for _, id_ in self.load_from_node()] def link_xml_node(self, xml_node=None, use_cache=True): """ Initialize NameMap. If xml_node is none, config will be loaded automatically :param use_cache: Bool whether bypass ve.cfg xml cache :param xml_node: !! DEPRECATED PARAM !! this param is left only for compatibility with our old code """ if xml_node is None: # New mode, Load reseller_id, reseller_name pairs from ve.cfg to dictionary self._xml_node = None self._load_resellers_map_from_ve_cfg(use_cache) else: # For compatibility with our old code self._xml_node = xml_node self._reseller_id_name_map = None def _load_resellers_map_from_ve_cfg(self, use_cache): """ Fills self._reseller_id_name_map from ve.cfg file :return: """ self._reseller_id_name_map = [] ve_cfg, xml_node = self._try_get_xml_node(use_cache=use_cache) for el_ in xml_node: name = el_.getAttribute('user') id_ = int(el_.getAttribute('id')) if name and id_ and id_ not in self._reseller_id_name_map: self._reseller_id_name_map.append((id_, name)) # Force delete XML object to avoid high memory load del xml_node del ve_cfg def _try_get_xml_node(self, use_cache=True): try: ve_cfg, xml_node = ve_config.get_xml_config(use_cache=use_cache) except ve_config.BadVeConfigException as e: self._reseller_id_name_map = None raise NameMapConfigError("Error happened while loading data from ve.cfg") from e return ve_cfg, xml_node.getElementsByTagName(self._xml_tag_name) def load_from_node(self): """ Obtain data from xml node as (name, id_) list """ if self._xml_node is None and self._reseller_id_name_map is None: raise NameMapNotInitialized('Name map is not initialized. ' 'Use obj.link_xml_node() to get data from config') if self._xml_node: # For compatibility with our old code for el_ in self._xml_node.getElementsByTagName(self._xml_tag_name): name = el_.getAttribute('user') id_ = int(el_.getAttribute('id')) if name and id_: yield name, id_ if self._reseller_id_name_map: # New mode, use resellers map for id_, name in self._reseller_id_name_map: yield name, id_ class LvpMap: """ Container for storing information about lve:lvp mapping In which reseller container stored lve """ def __init__(self): self.name_map = NameMap() self._id_name_map = {} self._name_id_map = {} self._reseller_id_map_panel = None self._pwd = ClPwd() def _add_map(self, name, id_): self._id_name_map[id_] = name self._name_id_map[name] = id_ def pw_uid(self, name, default=None): try: return self._pwd.get_pw_by_name(name).pw_uid except ClPwd.NoSuchUserException: return default def _get_panel_reseller_id(self, reseller): # type: (str) -> Optional[int] uid = self.pw_uid(reseller) if uid is not None: return uid # in case when we cannot find reseller in passwd file # let's ask control panel for reseller's id if self._reseller_id_map_panel is None: self._reseller_id_map_panel = cpapi.get_reseller_id_pairs() return self._reseller_id_map_panel.get(reseller) def get_reseller_id(self, name): # type: (str) -> Optional[int] """ Convert reseller name to an LVE id. It supports resellers without a system account (for Plesk compatibility). """ uid = self.name_map.get_id(name) or self._name_id_map.get(name) if uid is not None: return uid try: uid = self._get_panel_reseller_id(name) except NotSupported: uid = None if uid is not None: self._add_map(name, uid) return uid def get_reseller_name(self, id_): """ Convert reseller id to reseller name It support resellers without system account (for Plesk compatibilyty) """ # add attribute fo in memory cache support name = self.name_map.get_name(id_) or self._id_name_map.get(id_) if name is not None: return name try: name = pwd.getpwuid(id_).pw_name if cpapi.is_reseller(name): self._add_map(name, id_) else: name = None except KeyError: name = None return name def lve_lvp_pairs(self): """ This method loops over all user:reseller pairs in control panel and returns appropriate lve_id:lvp_id pairs. THIS METHOD WON'T CHECK IF 'RESELLER LIMITS' IS ENABLED IN ve.cfg """ resellers = set(cpapi.resellers()) reseller_uids = {} for reseller in resellers: try: reseller_uids[reseller] = self.get_reseller_id(reseller) except NotSupported: syslog.syslog( syslog.LOG_WARNING, f"Reseller {reseller} still exists in control panel, " "but absent in /etc/passwd file") for cplogin, reseller in cpapi.cpinfo(keyls=('cplogin', 'reseller')): lve_id = self.pw_uid(cplogin) # for some reasons (process of destroying user died # or admin called 'pure' userdel), user may still exist in control panel # but absent in /etc/passwd file; we can do nothing with that, # so just skip and write a warning to syslog if lve_id is None: syslog.syslog( syslog.LOG_WARNING, f"user {cplogin} still exists in control panel, " "but absent in /etc/passwd file") continue lvp_id = reseller_uids.get(reseller, 0) yield lve_id, lvp_id @staticmethod def resellers(): for reseller_name in cpapi.resellers(): yield reseller_name @staticmethod def reseller_uids(name): """ Obtain from control panel resellers uids """ uids = [] reseller_users = cpapi.reseller_users(name) for user in reseller_users: try: id_ = pwd.getpwnam(user).pw_uid uids.append(id_) except KeyError: syslog.syslog( syslog.LOG_WARNING, f"user {user} still exists in control panel, " "but absent in /etc/passwd file") return uids def lvp_lve_id_list(self, lvp_id): reseller_name = self.get_reseller_name(lvp_id) return self.reseller_uids(reseller_name) class Lve: def __init__(self, proc=None, py=None, map=None): self.proc = proc or ProcLve() self.py = py or PyLve() self.map = map or LvpMap() self._mapped_domain_users: set = set() def lve_id_lvp_id_pairs(self): """ Obtain {lve id}:{lvp id} pairs iterator based on ve.cfg config (detect enabled resellers containers) This method (unlike LvpMap.lve_lvp_pairs) will check if reseller is enabled in ve.cfg and return lvp_id=0 for users of reseller with disabled reseller limits """ enabled_lvp_id = set(self.map.name_map.id_list()) for lve_id, lvp_id in self.map.lve_lvp_pairs(): if lvp_id in enabled_lvp_id: # load map for enabled resellers only yield lve_id, lvp_id else: yield lve_id, 0 def lve2lvp(self, lve_id): """ Obtain lvp id based on ve.cfg config (detect enabled resellers containers) """ for lve_id_, lvp_id_ in self.lve_id_lvp_id_pairs(): if lve_id == lve_id_: return lvp_id_ return 0 def lve_destroy(self, lve_id, *args, **kwargs): """ safe destroy lve container with preserving lvp mapping """ if os.path.exists(self.proc.proc_lve_map()): lvp_id = self.proc.map().get(lve_id, 0) else: lvp_id = 0 self.py.lve_destroy(lve_id, *args, **kwargs) if lvp_id != 0: try: pwd.getpwuid(lve_id) self.py.lve_lvp_map(lvp_id, lve_id) except KeyError: pass def _build_domain_map(self, lve_id): """Resolve all domainβdocrootβdomain_id mappings once. Returns a list of (domain_id, limits_dict) tuples. Callers pass this to _map_domain_lves / apply_domain_lve_limits to avoid redundant resolve_docroot + assign_domain_id calls. Uses cpapi.userdomains() to fetch all domainβdocroot pairs in a single file read instead of calling resolve_docroot per domain, which would re-parse the entire userdatadomains file each time. """ config = _ws_config.load_config(lve_id) try: username = pwd.getpwuid(lve_id).pw_name docroot_by_domain = dict(cpapi.userdomains(username) or []) except KeyError: docroot_by_domain = {} entries = [] for d in config.domains: if not d.name: continue docroot = docroot_by_domain.get(d.name) if docroot is None: continue domain_id = _ws_id_registry.assign_domain_id(lve_id, docroot) entries.append((domain_id, d.limits.to_dict())) return entries def _map_domain_lves(self, lve_id, proc_map, domain_map): """Place every domain LVE that belongs to *lve_id* under its user LVP. Uses lve_lvp_move for domain LVEs that already exist in the kernel, and falls back to lve_lvp_map for those that do not yet exist (so the kernel will place them under the correct LVP when lve_setup creates them later). *proc_map* is an lve_idβlvp_id dict (from /proc/lve/map) used to skip mappings that are already correct. Updated in-place so callers see the new state. *domain_map* is a precomputed list from _build_domain_map(). """ for domain_id, _limits in domain_map: if proc_map.get(domain_id) == lve_id: continue if domain_id in proc_map: # Domain LVE exists in the kernel β move it. self.py.lve_lvp_move(lve_id, domain_id) else: # Domain LVE does not exist yet β pre-register mapping. self.py.lve_lvp_map(lve_id, domain_id) proc_map[domain_id] = lve_id self._mapped_domain_users.add(lve_id) def apply_domain_lve_limits(self, lve_id, domain_map): """Apply per-domain limits from domains.json to each domain LVE. Must be called after lve_set_default() resets all LVEs inside the user LVP to the user's defaults. Each domain LVE is set to its stored limits, or the user's current cpu when unconfigured (cpu=0). CLOS-4024: the kernel rejects lve_lvp_setup when any child has cpu=0 inside a finite-cpu parent, so we never write cpu=0 to the kernel. *domain_map* is a precomputed list from _build_domain_map(). """ try: parent_ls_cpu = self.py.lve_info(lve_id).ls_cpu except OSError: # fallback to 100% of all available CPU # fallback to 1 cpu core when we cannot identify # number of cores and cpu_count returns None parent_ls_cpu = (os.cpu_count() or 1) * 10000 for domain_id, limits in domain_map: settings = self.py.liblve_settings() # CLOS-4024: the kernel rejects lve_lvp_setup with EINVAL when any # child LVE has cpu=0 inside a finite-cpu parent. Always set a # non-zero cpu on domain LVEs: use the stored value if present, # otherwise inherit the parent's current cpu limit. if 'cpu' in limits: settings.ls_cpu = int(limits['cpu']) or parent_ls_cpu else: settings.ls_cpu = parent_ls_cpu if 'pmem' in limits: pmem_bytes = int(limits['pmem']) settings.ls_memory_phy = pmem_bytes // 4096 if pmem_bytes else 0 if 'io' in limits: settings.ls_io = int(limits['io']) if 'nproc' in limits: settings.ls_nproc = int(limits['nproc']) if 'iops' in limits: settings.ls_iops = int(limits['iops']) self.py.lve_setup( domain_id, settings, err_msg=f'Can`t setup domain LVE {domain_id}; error code {{code}}', ) def _sync_map(self): """ Load lve_id:lvp_id map to kmod-lve. For users with per-domain isolation configured, builds a nested LVP hierarchy instead of a flat reseller mapping: lvp<0> [lvp<reseller_id>] β reseller LVP (if enabled) lvp<user_id> β user-level LVP with isolation lve<user_id> β user LVE lve<domain_id> ... β domain LVEs lvp<0> [lvp<reseller_id>] β reseller LVP (without isolation) lve<user_id> β user LVE (flat, existing behaviour) """ # load mapping information from kernel (/proc/lve/map) proc_map_dict = self.proc.map() # loop over user_id:reseller_id pairs # lve_id_lvp_id_pairs includes all control panel users # and checks for enabled resellers in ve.cfg # so user of reseller without reseller limits # will be listed in response like 'tuple(user_id, 0)' if self.py.domains_supported(): isolated_users = set(_ws_config.find_all_lve_ids_with_config()) else: isolated_users = set() for lve_id, lvp_id in self.lve_id_lvp_id_pairs(): if lve_id in isolated_users: # User has per-domain isolation: build nested LVP hierarchy. # Ensure the parent (reseller) LVP exists first. if lvp_id != 0 and not self.proc.exist_lvp(lvp_id=lvp_id): self.py.lve_lvp_create(lvp_id) # Create user LVP nested under the reseller (or at root # when there is no reseller). lve_apply_all() already # creates the nested LVP for reseller users; this handles # the non-reseller case and the standalone sync-map call. if not self.proc.exist_lvp(lvp_id=lve_id): if lvp_id: self.py.lve_lvp_create2(lve_id, lvp_id) else: self.py.lve_lvp_create(lve_id) # Move the user LVE under the user LVP (both share lve_id). if proc_map_dict.get(lve_id, 0) != lve_id: self.py.lve_lvp_move(lve_id, lve_id) proc_map_dict[lve_id] = lve_id if lve_id not in self._mapped_domain_users: domain_map = self._build_domain_map(lve_id) self._map_domain_lves(lve_id, proc_map=proc_map_dict, domain_map=domain_map) else: # Standard behaviour: move user LVE under reseller/root LVP. if proc_map_dict.get(lve_id, 0) != lvp_id: # change map if needed only if not self.proc.exist_lvp(lvp_id=lvp_id): self.py.lve_lvp_create(lvp_id) self.py.lve_lvp_move(lvp_id, lve_id) proc_map_dict[lve_id] = lvp_id def sync_map(self): """ wrapped _sync_map function for prevent error if some cpapi not supported """ try: self._sync_map() except NotSupported: pass def is_panel_supported(self): """ Check if current panel supported for reseller's limits; :rtype: bool """ try: return cpapi.is_reseller_limits_supported() except NotSupported: return False def reseller_limit_supported(self): """ Check present all needed (kmod-lve, liblve, /proc/lve, panel) for manipulate resellers limits """ return all((self.py.resellers_supported(), self.proc.resellers_supported(), self.is_panel_supported())) def is_lve10(self): """ Check present all needed (kmod-lve, liblve, /proc/lve) for manipulate resellers limits """ return all((self.py.resellers_supported(), self.proc.resellers_supported()))
Upload File
Create Folder