$73 GRAYBYTE WORDPRESS FILE MANAGER $72

SERVER : vnpttt-amd7f72-h1.vietnix.vn #1 SMP Fri May 24 12:42:50 UTC 2024
SERVER IP : 103.200.23.149 | ADMIN IP 216.73.216.22
OPTIONS : CRL = ON | WGT = ON | SDO = OFF | PKEX = OFF
DEACTIVATED : NONE

/opt/cloudlinux/venv/lib/python3.11/site-packages/xray/

HOME
Current File : /opt/cloudlinux/venv/lib/python3.11/site-packages/xray//smart_advice_plugin_helpers.py
#!/opt/cloudlinux/venv/bin/python3 -Ibb
##
# Copyright (с) Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2022 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# https://www.cloudlinux.com/legal/
##

import os
import pwd
import logging
from enum import Enum
from datetime import datetime, timedelta
from clcommon.cpapi import docroot
from xray.internal.clwpos_safe_imports import wp_get_constant
from xray import gettext as _
from xray.internal.utils import user_context
from secureio import disable_quota

class PluginStatuses(Enum):
    """
    INSTALLED = plugin exists in MU directory

    ERROR = plugin should have been installed: there are advices w/o incompatibility
    and created_at > 2days (wordpress-install cron expected to trigger install)

    NOT_INSTALLED = plugin does not exist in MU directory:
    in ideal world it means whether there are no compatible advices or
    wordpress-plugin install cron has not worked yet

    """
    INSTALLED = 'INSTALLED'
    ERROR = 'ERROR'
    NOT_INSTALLED = 'NOT_INSTALLED'

def create_mu_plugins_dir_if_not_exist(user, mu_plugin_dir):
    """
    Creates MU plugin dir if does not exist yet
    """
    if os.path.isdir(mu_plugin_dir):
        return

    user_data = pwd.getpwnam(user)
    with user_context(user_data.pw_uid, user_data.pw_gid), disable_quota():
        try:
            os.makedirs(mu_plugin_dir)
        except OSError as e:
            logging.error("Failed creating must use plugin folder. Path: %s. Reason: %s",
                          mu_plugin_dir, str(e))

            raise ValueError(_('Unable to create MU plugins directory'))

def get_mu_directory(user, full_wp_path):
    """
    Resolve path to MU plugins directory for given site.
    Fast path: <full_wp_path>/wp-content/mu-plugins (and presence of our plugin there).
    Fallback: read WPMU_PLUGIN_DIR or WP_CONTENT_DIR via wp_get_constant (wp-cli), under user context.
    """
    # Fast path: default location
    fast_mu = os.path.join(full_wp_path, 'wp-content', 'mu-plugins')
    fast_mu_file = os.path.join(fast_mu, 'cl-smart-advice.php')
    fast_mu_folder = os.path.join(fast_mu, 'cl-smart-advice')

    if os.path.isdir(fast_mu) or (os.path.isfile(fast_mu_file) and os.path.isdir(fast_mu_folder)):
        return fast_mu

    # Fallback to reading WP constants
    mu_directory = None
    user_data = pwd.getpwnam(user)
    with user_context(user_data.pw_uid, user_data.pw_gid):
        try:
            mu_directory = wp_get_constant(full_wp_path, 'WPMU_PLUGIN_DIR', raise_exception=True)
        except Exception as e:
            logging.error('Unable to read WPMU_PLUGIN_DIR constant, "error=%s"', str(e))

        if not mu_directory:
            try:
                content_dir = wp_get_constant(full_wp_path, 'WP_CONTENT_DIR', raise_exception=True)
                if content_dir:
                    mu_directory = os.path.join(content_dir, 'mu-plugins')
            except Exception as e:
                logging.error('Unable to read WP_CONTENT_DIR constant, "error=%s"', str(e))
    return mu_directory

def is_plugin_installed(user, domain, website):
    """
    Checks whether there is cl-smart-advice.php in MU  plugins directory
    """
    full_website_path = docroot(domain)[0] + website
    mu_directory = get_mu_directory(user, full_website_path)
    if not mu_directory:
        logging.warning('Path to directory with MU plugins was not obtained')
        return None
    plugin_must_use_file = os.path.join(mu_directory, 'cl-smart-advice.php')
    return os.path.islink(plugin_must_use_file)

def should_have_been_installed(advices_for_website, issues):
    """
    1. At least 1 advice has no incompatibilities
    2. The newest advice w/o incompatibilities was created > 2 days ago
    """
    issue_types = []
    if issues:
        issue_types = [issue['advice_type'] for issue in issues]

    return [
        advice
        for advice in advices_for_website
        if is_advice_should_been_synced(advice, issue_types)
    ]

def is_advice_should_been_synced(advice, website_issue_types):
    """
    If advice does not have incompatibility and older than cron time (once a day) ->
    it should have been synced, which triggers plugin installation
    """
    created_at = datetime.fromisoformat(advice['created_at'])
    return advice['advice']['type'] not in website_issue_types and \
            created_at < datetime.now(created_at.tzinfo) - timedelta(days=2)

def get_plugin_status(username, domain, website, issues, current_advices):
    """
    If smart-advice.php in MU plugin dir -> INSTALLED
    If there is at least 1 advice w/o issues and the newest advice is > 2 days -> cron should've work
    and install plugin, most likely error happened -> ERROR
    otherwise: NOT_INSTALLED: all advices are incompatible or wordpress-plugin install cron did not work yet
    """
    if is_plugin_installed(username, domain, website):
        return PluginStatuses.INSTALLED.value
    elif should_have_been_installed(current_advices, issues):
        return PluginStatuses.ERROR.value
    return PluginStatuses.NOT_INSTALLED.value

Current_dir [ NOT WRITEABLE ] Document_root [ WRITEABLE ]


[ Back ]
NAME
SIZE
LAST TOUCH
USER
CAN-I?
FUNCTIONS
..
--
17 Dec 2025 3.08 AM
root / root
0755
__pycache__
--
17 Dec 2025 2.54 AM
root / root
0755
adviser
--
16 Dec 2025 9.31 PM
root / root
0755
agent
--
16 Dec 2025 9.31 PM
root / root
0755
analytics
--
16 Dec 2025 9.31 PM
root / root
0755
apiclient
--
16 Dec 2025 9.31 PM
root / root
0755
console_utils
--
16 Dec 2025 9.31 PM
root / root
0755
continuous
--
16 Dec 2025 9.31 PM
root / root
0755
hooks
--
16 Dec 2025 9.31 PM
root / root
0755
internal
--
16 Dec 2025 9.31 PM
root / root
0755
manager
--
16 Dec 2025 9.31 PM
root / root
0755
reconfiguration
--
16 Dec 2025 9.31 PM
root / root
0755
__init__.py
0.649 KB
20 Oct 2025 7.04 PM
root / root
0644
cl-smart-advice-user.py
0.711 KB
20 Oct 2025 7.04 PM
root / root
0755
cl-smart-advice.py
0.694 KB
20 Oct 2025 7.04 PM
root / root
0755
cloudlinux-xray-agent.py
0.366 KB
20 Oct 2025 7.04 PM
root / root
0755
cloudlinux-xray-continuous.py
0.374 KB
20 Oct 2025 7.04 PM
root / root
0755
cloudlinux-xray-manager.py
0.375 KB
20 Oct 2025 7.04 PM
root / root
0755
cloudlinux-xray-migrate.py
1.471 KB
20 Oct 2025 7.04 PM
root / root
0755
cloudlinux-xray-user-agent.py
0.363 KB
20 Oct 2025 7.04 PM
root / root
0755
cloudlinux-xray-user-manager.py
0.377 KB
20 Oct 2025 7.04 PM
root / root
0755
create_user_uid_dirs.py
0.762 KB
20 Oct 2025 7.04 PM
root / root
0644
imunify_manager.py
8.516 KB
20 Oct 2025 7.04 PM
root / root
0644
shared_library.py
1.395 KB
20 Oct 2025 7.04 PM
root / root
0644
smart_advice_plugin_helpers.py
5.02 KB
20 Oct 2025 7.04 PM
root / root
0644
smart_advice_plugin_manager.py
12.816 KB
20 Oct 2025 7.04 PM
root / root
0755
user_agent.py
5.665 KB
20 Oct 2025 7.04 PM
root / root
0644
xray_hooks.py
1.776 KB
20 Oct 2025 7.04 PM
root / root
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME
Static GIF