feat: add psagentai agent with deployment and configuration
Initial project setup including the main agent script, configuration files, profile JSON state, systemd service unit, startup script, deployment documentation, and Python dependencies. Includes .env, venv/, and __pycache__/ which should likely be excluded via .gitignore to avoid committing secrets and artifacts.
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
"""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")
|
||||
Reference in New Issue
Block a user