Add core Python agent with configuration management, environment setup, and deployment documentation. Includes user/agent profiles, startup scripts, and dependency management for the psagentia system.
92 lines
2.5 KiB
Python
Executable File
92 lines
2.5 KiB
Python
Executable File
"""Stuff that differs in different Python versions and platform
|
|
distributions."""
|
|
|
|
import importlib.resources
|
|
import locale
|
|
import logging
|
|
import os
|
|
import sys
|
|
from typing import IO
|
|
|
|
__all__ = ["get_locale_encoding", "get_path_uid", "tomllib", "WINDOWS"]
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def has_tls() -> bool:
|
|
try:
|
|
import _ssl # noqa: F401 # ignore unused
|
|
|
|
return True
|
|
except ImportError:
|
|
pass
|
|
|
|
from pip._vendor.urllib3.util import IS_PYOPENSSL
|
|
|
|
return IS_PYOPENSSL
|
|
|
|
|
|
def get_locale_encoding() -> str:
|
|
"""Return the locale encoding.
|
|
|
|
Uses ``locale.getencoding()`` when available (Python 3.11+) to avoid the
|
|
``EncodingWarning`` that ``locale.getpreferredencoding(False)`` raises
|
|
under UTF-8 Mode.
|
|
"""
|
|
# TODO: Remove the 3.10 fallback once pip drops Python 3.10 support.
|
|
if sys.version_info >= (3, 11):
|
|
return locale.getencoding()
|
|
return locale.getpreferredencoding(False)
|
|
|
|
|
|
def get_path_uid(path: str) -> int:
|
|
"""
|
|
Return path's uid.
|
|
|
|
Does not follow symlinks:
|
|
https://github.com/pypa/pip/pull/935#discussion_r5307003
|
|
|
|
Placed this function in compat due to differences on AIX and
|
|
Jython, that should eventually go away.
|
|
|
|
:raises OSError: When path is a symlink or can't be read.
|
|
"""
|
|
if hasattr(os, "O_NOFOLLOW"):
|
|
fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW)
|
|
file_uid = os.fstat(fd).st_uid
|
|
os.close(fd)
|
|
else: # AIX and Jython
|
|
# WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW
|
|
if not os.path.islink(path):
|
|
# older versions of Jython don't have `os.fstat`
|
|
file_uid = os.stat(path).st_uid
|
|
else:
|
|
# raise OSError for parity with os.O_NOFOLLOW above
|
|
raise OSError(f"{path} is a symlink; Will not return uid for symlinks")
|
|
return file_uid
|
|
|
|
|
|
# The importlib.resources.open_text function was deprecated in 3.11 with suggested
|
|
# replacement we use below.
|
|
if sys.version_info < (3, 11):
|
|
open_text_resource = importlib.resources.open_text
|
|
else:
|
|
|
|
def open_text_resource(
|
|
package: str, resource: str, encoding: str = "utf-8", errors: str = "strict"
|
|
) -> IO[str]:
|
|
return (importlib.resources.files(package) / resource).open(
|
|
"r", encoding=encoding, errors=errors
|
|
)
|
|
|
|
|
|
if sys.version_info >= (3, 11):
|
|
import tomllib
|
|
else:
|
|
from pip._vendor import tomli as tomllib
|
|
|
|
|
|
# windows detection, covers cpython and ironpython
|
|
WINDOWS = sys.platform.startswith("win") or (sys.platform == "cli" and os.name == "nt")
|