File: //proc/1093516/root/opt/cloudlinux/venv/lib/python3.11/site-packages/clselect/clselectstatistics.py
#!/opt/cloudlinux/venv/bin/python3 -bb
# 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
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
from collections import defaultdict
from future.utils import iteritems
from cldetectlib import get_suEXEC_status, get_suPHP_status
from cllimits import CageFs, CageFsException
from .cluserselect import ClUserSelect
from .clselect import ClSelect as ClSelectPhp
from .clselectctl import interpreter_versions_short_summary, server_applications_summary
from typing import Optional, Dict # NOQA
# Domain compatibility logic lives in clselectdomains; re-exported here
# for backward compatibility — existing callers that import from
# clselectstatistics will continue to work.
from .clselectdomains import ( # noqa: F401
_is_acceptable_php_handler_cpanel,
_get_php_selector_domains_for_cpanel,
_get_php_selector_domains_for_plesk,
_get_php_selector_domains_for_da,
_get_php_vhosts_for_current_panel,
get_php_selector_compatible_domains,
get_all_selector_compatible_domains_flat,
)
def _iter_versions(interpreter):
"""
Return list of InterpreterSummary objects
:rtype: list[clselectctl.InterpreterSummary]
"""
return interpreter_versions_short_summary(interpreter)
def iter_server_applications(interpreter):
"""
Return list of ApplicationSummary objects
:rtype: list[clselectctl.ApplicationSummary]
"""
return server_applications_summary(interpreter)
def get_versions_statistics(interpreter):
# type: (str) -> Optional[Dict]
interpreters_versions = _iter_versions(interpreter)
if interpreters_versions is not None:
return {
it.version: {
'full_version': it.version_full,
'enabled': it.enabled,
'installed': it.installed
} for it in interpreters_versions
}
def get_php_selector_usage():
"""Get users and domains that use php selector"""
cagefs = CageFs()
if not cagefs.is_cagefs_present():
return None
# check if cagefs is initialized
try:
cagefs._load_info()
except CageFsException:
return None
# either suexec or suphp is required to move user into cagefs
if not any((get_suEXEC_status(), get_suPHP_status())):
return None
# ignore unsupported control panels
php_vhosts = _get_php_vhosts_for_current_panel()
if php_vhosts is None:
return None
php = ClUserSelect()
domains_by_php_version = defaultdict(set)
users_by_php_version = defaultdict(set)
for user, user_domains in iteritems(php_vhosts):
if not cagefs.get_user_status(user):
continue
version = php.get_version(user, show_native_version=False)[0]
domains_by_php_version[version].update(user_domains)
users_by_php_version[version].add(user)
return {
'domains_by_php_version': domains_by_php_version,
'users_by_php_version': users_by_php_version
}
def get_native_version_safe():
"""
Safely get native version, or None if not set
"""
php = ClSelectPhp()
v = php.get_native_version(verbose=False) # tuple[version, full_version] | None
if v is None:
return v
return v[0]
def get_mode_of_php_selector():
# type: () -> str
"""
Get state of PHP selector: without CageFS or normal
"""
return 'without_cagefs' if ClSelectPhp().work_without_cagefs() else 'normal'
def get_default_php_version():
# type: () -> str
"""
Get default version of PHP selector
"""
# yep, get_version() returns default(!) version, don't ask me 'why'
return ClSelectPhp().get_version()[0]