\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7 \8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh \00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€ \00 $\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95 59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9 C/// File Manager

File Manager

Path: /opt/cloudlinux/venv/lib/python3.11/site-packages/cllimits/lib/

Viewing File: __init__.py

# -*- 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 subprocess

# The child interpreter acts on PYTHON* before the spawned script's first
# statement, so it must not inherit them. Keep by name, not drop by name: a drop
# list stops covering every name nobody listed and every name CPython adds later.
# PYTHONWARNINGS is the one that must survive - sixteen scripts under
# jenkins_tests/rpm_tests/p_lve-utils/ set PYTHONWARNINGS=error::UnicodeWarning
# and then drive lve-utils binaries, and fifteen of them assert only on exit
# codes, so dropping it would turn their detection into a silent no-op rather
# than a visible failure. Analysis: CLOS-5881.
CHILD_PYTHON_VARS_KEPT = ("PYTHONWARNINGS",)

# The dynamic linker and the locale loader act earlier still, and no interpreter
# flag suppresses these. lvectl loads the pylve C extension, so the linker is in
# play for this child.
CHILD_LOADER_VAR_PREFIX = "LD_"
CHILD_LOADER_VARS = ("GCONV_PATH", "NLSPATH")


def isolated_child_env():
    """
    Builds the environment for a root utility spawned by exec_utility().

    Removes the variables that let the child interpreter or its dynamic linker
    resolve code from a location this process did not choose, and keeps the rest
    so the child behaves exactly as it does under an inherited environment.

    :return: dict to hand to exec_utility(env=...)
    :rtype: dict[str, str]
    """
    env = {}
    for name, value in os.environ.items():
        if name.startswith("PYTHON") and name not in CHILD_PYTHON_VARS_KEPT:
            continue
        if name.startswith(CHILD_LOADER_VAR_PREFIX) or name in CHILD_LOADER_VARS:
            continue
        env[name] = value
    # Assert the user-site suppression here instead of inheriting it from the
    # venv's pyvenv.cfg, which a different package owns.
    env["PYTHONNOUSERSITE"] = "1"
    return env


def exec_utility(util_path, params, stderr=False, env=None):
    """
    Executes supplied utility with supplied parameters
    :param util_path: string with path to callable utility
    :param params: utility parameters
    :param stderr: trigger to return stderr or not
    :param env: environment for the child; None inherits this process' own
    :return: Cortege (ret_code, cagefsctl_stdout) if stderr is False
             Cortege (ret_code, cagefsctl_stdout, cagefsctl_stderr) otherwise
    """
    args = []
    args.append(util_path)
    args.extend(params)
    with subprocess.Popen(
        args,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True,
        env=env,
    ) as proc:
        out, err = proc.communicate()
        retcode = proc.returncode
    if stderr:
        return retcode, out.strip(), err.strip()
    return retcode, out.strip()