OXIESEC PANEL
- Current Dir:
/
/
opt
/
cloudlinux
/
venv
/
lib
/
python3.11
/
site-packages
Server IP: 2a02:4780:11:1084:0:327f:3464:10
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
12/18/2024 10:23:15 AM
rwxr-xr-x
📁
GitPython-3.1.32.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
Jinja2-3.0.3.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
Mako-1.2.4.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
MarkupSafe-2.1.3.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
PyJWT-2.8.0.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
PyMySQL-1.1.0.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
PyVirtualDisplay-3.0.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
PyYAML-6.0.1.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
SQLAlchemy-1.3.24.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
__pycache__
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📄
_cffi_backend.cpython-311-x86_64-linux-gnu.so
267.63 KB
12/18/2024 10:23:52 AM
rwxr-xr-x
📁
_distutils_hack
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📄
_pyrsistent_version.py
23 bytes
12/18/2024 10:23:15 AM
rw-r--r--
📁
_pytest
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
_yaml
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
aiohttp
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
aiohttp-3.8.5.dist-info
-
02/16/2024 08:50:15 PM
rwxr-xr-x
📁
aiohttp-3.9.2.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
aiohttp_jinja2
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
aiohttp_jinja2-1.5.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
aiohttp_security
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
aiohttp_security-0.4.0.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
aiohttp_session
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
aiohttp_session-2.9.0.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
aiosignal
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
aiosignal-1.3.1.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
alembic
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
alembic-1.11.1.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
astroid
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
astroid-2.15.6.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
async_timeout
-
02/16/2024 08:50:15 PM
rwxr-xr-x
📁
async_timeout-4.0.3.dist-info
-
02/16/2024 08:50:15 PM
rwxr-xr-x
📁
attr
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
attrs
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
attrs-23.1.0.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
backports
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
certifi
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
certifi-2023.7.22.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
cffi
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
cffi-1.15.1.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
chardet
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
chardet-5.2.0.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
charset_normalizer
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
charset_normalizer-2.1.1.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
cl_dom_collector
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📄
cl_proc_hidepid.py
4.53 KB
06/05/2025 09:53:15 AM
rw-r--r--
📁
clcagefslib
-
09/05/2025 09:34:06 AM
rwxr-xr-x
📁
clcommon
-
09/05/2025 09:30:59 AM
rwxr-xr-x
📁
clconfig
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📁
clconfigure
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📄
clcontrollib.py
51.73 KB
06/05/2025 09:53:15 AM
rw-r--r--
📁
cldashboard
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📄
cldetectlib.py
18.13 KB
06/05/2025 09:53:15 AM
rw-r--r--
📄
cldiaglib.py
45.84 KB
06/05/2025 09:53:15 AM
rw-r--r--
📁
clevents
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📁
clflags
-
09/05/2025 09:30:59 AM
rwxr-xr-x
📄
clhooklib.py
1.27 KB
07/11/2025 05:46:23 PM
rw-r--r--
📄
cli_utils.py
1.66 KB
06/05/2025 09:53:15 AM
rw-r--r--
📁
cllicense
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📄
cllicenselib.py
9.1 KB
06/05/2025 09:53:15 AM
rw-r--r--
📁
cllimits
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📁
cllimits_validator
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📁
cllimitslib_v2
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📁
cllvectl
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📁
clpackages
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📁
clquota
-
09/05/2025 09:32:33 AM
rwxr-xr-x
📁
clselect
-
09/05/2025 09:32:33 AM
rwxr-xr-x
📁
clselector
-
09/05/2025 09:32:33 AM
rwxr-xr-x
📁
clsentry
-
09/05/2025 09:30:59 AM
rwxr-xr-x
📄
clsetuplib.py
4.35 KB
06/05/2025 09:53:15 AM
rw-r--r--
📄
clsudo.py
14.42 KB
06/23/2025 12:47:48 PM
rw-r--r--
📁
clsummary
-
09/05/2025 09:36:16 AM
rwxr-xr-x
📁
clveconfig
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📁
clwizard
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📁
clwpos
-
09/05/2025 09:34:13 AM
rwxr-xr-x
📁
colorama
-
02/16/2024 08:50:15 PM
rwxr-xr-x
📁
colorama-0.4.6.dist-info
-
02/16/2024 08:50:15 PM
rwxr-xr-x
📁
configparser-5.0.2.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📄
configparser.py
1.51 KB
12/18/2024 10:23:15 AM
rw-r--r--
📁
contextlib2
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
contextlib2-21.6.0.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
coverage
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
coverage-7.2.7.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
cryptography
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
cryptography-41.0.2.dist-info
-
02/07/2025 10:01:29 PM
rwxr-xr-x
📁
ddt-1.4.4.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📄
ddt.py
12.43 KB
12/18/2024 10:23:15 AM
rw-r--r--
📁
dill
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
dill-0.3.7.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
distlib
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
distlib-0.3.7.dist-info
-
02/16/2024 08:50:15 PM
rwxr-xr-x
📁
distlib-0.3.8.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📄
distutils-precedence.pth
151 bytes
12/18/2024 10:23:15 AM
rw-r--r--
📁
docopt-0.6.2.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📄
docopt.py
19.48 KB
12/18/2024 10:23:15 AM
rw-r--r--
📁
dodgy
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
dodgy-0.2.1.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
filelock
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
filelock-3.12.2.dist-info
-
02/16/2024 08:50:15 PM
rwxr-xr-x
📁
filelock-3.13.1.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
flake8
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
flake8-5.0.4.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
flake8_polyfill
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
flake8_polyfill-1.0.2.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
fluent
-
02/16/2024 10:46:04 PM
rwxr-xr-x
📁
fluent_logger-0.10.0.dist-info
-
02/16/2024 10:46:04 PM
rwxr-xr-x
📁
frozenlist
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
frozenlist-1.4.0.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
future
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
future-0.18.3.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
git
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
gitdb
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
gitdb-4.0.10.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
guppy
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
guppy3-3.1.3.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
idna
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
idna-3.4.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
iniconfig
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
iniconfig-2.0.0.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
isort
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
isort-5.12.0.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
jinja2
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
jsonschema
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
jsonschema-3.2.0.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
jwt
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
lazy_object_proxy
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
lazy_object_proxy-1.9.0.dist-info
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
libfuturize
-
02/07/2025 10:01:30 PM
rwxr-xr-x
📁
libpasteurize
-
02/07/2025 10:01:31 PM
rwxr-xr-x
📁
lve_stats-2.0.dist-info
-
08/20/2024 07:46:41 PM
rwxr-xr-x
📁
lve_utils
-
09/05/2025 09:31:01 AM
rwxr-xr-x
📄
lveapi.py
19.53 KB
06/05/2025 09:53:15 AM
rw-r--r--
📄
lvectllib.py
102.55 KB
06/05/2025 09:53:15 AM
rw-r--r--
📁
lvemanager
-
09/05/2025 09:32:33 AM
rwxr-xr-x
📄
lvestat.py
6.83 KB
06/23/2025 12:47:48 PM
rw-r--r--
📁
lvestats
-
08/20/2024 07:46:41 PM
rwxr-xr-x
📁
lxml
-
02/07/2025 10:01:31 PM
rwxr-xr-x
📁
lxml-4.9.2.dist-info
-
02/07/2025 10:01:31 PM
rwxr-xr-x
📁
mako
-
02/07/2025 10:01:31 PM
rwxr-xr-x
📁
markupsafe
-
02/07/2025 10:01:31 PM
rwxr-xr-x
📁
mccabe-0.7.0.dist-info
-
02/07/2025 10:01:31 PM
rwxr-xr-x
📄
mccabe.py
10.4 KB
12/18/2024 10:23:15 AM
rw-r--r--
📁
mock
-
02/07/2025 10:01:31 PM
rwxr-xr-x
📁
mock-5.1.0.dist-info
-
02/07/2025 10:01:31 PM
rwxr-xr-x
📁
msgpack
-
02/16/2024 10:46:04 PM
rwxr-xr-x
📁
msgpack-1.0.7.dist-info
-
02/16/2024 10:46:04 PM
rwxr-xr-x
📁
multidict
-
02/07/2025 10:01:31 PM
rwxr-xr-x
📁
multidict-6.0.4.dist-info
-
02/07/2025 10:01:31 PM
rwxr-xr-x
📁
numpy
-
02/07/2025 10:01:33 PM
rwxr-xr-x
📁
numpy-1.25.1.dist-info
-
02/07/2025 10:01:31 PM
rwxr-xr-x
📁
numpy.libs
-
02/07/2025 10:01:32 PM
rwxr-xr-x
📁
packaging
-
02/07/2025 10:01:33 PM
rwxr-xr-x
📁
packaging-23.1.dist-info
-
02/07/2025 10:01:33 PM
rwxr-xr-x
📄
pam.py
7.38 KB
12/18/2024 10:23:15 AM
rw-r--r--
📁
past
-
02/07/2025 10:01:33 PM
rwxr-xr-x
📁
pep8_naming-0.10.0.dist-info
-
02/07/2025 10:01:33 PM
rwxr-xr-x
📄
pep8ext_naming.py
18.61 KB
12/18/2024 10:23:15 AM
rw-r--r--
📁
pip
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
pip-23.3.2.dist-info
-
02/16/2024 08:50:17 PM
rwxr-xr-x
📁
pip-24.3.1.dist-info
-
02/07/2025 10:01:33 PM
rwxr-xr-x
📁
pkg_resources
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
platformdirs
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
platformdirs-2.6.2.dist-info
-
02/16/2024 08:50:18 PM
rwxr-xr-x
📁
platformdirs-3.11.0.dist-info
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
pluggy
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
pluggy-1.2.0.dist-info
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
prettytable
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
prettytable-3.8.0.dist-info
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
prometheus_client
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
prometheus_client-0.8.0.dist-info
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
prospector
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
prospector-1.10.2.dist-info
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
psutil
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
psutil-5.9.5.dist-info
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
psycopg2
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
psycopg2_binary-2.9.6.dist-info
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
psycopg2_binary.libs
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📄
py.py
263 bytes
12/18/2024 10:23:15 AM
rw-r--r--
📁
pycodestyle-2.9.1.dist-info
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📄
pycodestyle.py
101.08 KB
12/18/2024 10:23:15 AM
rw-r--r--
📁
pycparser
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
pycparser-2.21.dist-info
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
pydocstyle
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
pydocstyle-6.3.0.dist-info
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
pyfakefs
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pyfakefs-5.2.3.dist-info
-
02/07/2025 10:01:34 PM
rwxr-xr-x
📁
pyflakes
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pyflakes-2.5.0.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pylint
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pylint-2.17.4.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pylint_celery
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pylint_celery-0.3.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pylint_django
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pylint_django-2.5.3.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pylint_flask
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pylint_flask-0.6.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pylint_plugin_utils
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pylint_plugin_utils-0.7.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pylve-2.1-py3.11.egg-info
-
08/20/2024 07:46:32 PM
rwxr-xr-x
📄
pylve.cpython-311-x86_64-linux-gnu.so
25.48 KB
06/27/2024 11:28:05 AM
rwxr-xr-x
📁
pymysql
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pyparsing
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pyparsing-3.0.9.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pyrsistent
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pyrsistent-0.19.3.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pytest
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pytest-7.4.0.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pytest_subprocess
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pytest_subprocess-1.5.0.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
python_pam-1.8.4.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
pyvirtualdisplay
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
raven
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
raven-6.10.0.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📄
remove_ubc.py
5.73 KB
06/05/2025 09:53:15 AM
rwxr-xr-x
📁
requests
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
requests-2.31.0.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
requirements_detector
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
requirements_detector-1.2.2.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
schema-0.7.5.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📄
schema.py
29.51 KB
12/18/2024 10:23:15 AM
rw-r--r--
📄
secureio.py
18.83 KB
06/23/2025 12:47:48 PM
rw-r--r--
📁
semver
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
semver-3.0.1.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
sentry_sdk
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
sentry_sdk-1.29.2.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
setoptconf
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
setoptconf_tmp-0.3.1.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
setuptools
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
setuptools-69.0.2.dist-info
-
02/16/2024 08:50:18 PM
rwxr-xr-x
📁
setuptools-75.6.0.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📄
simple_rpm.so
11.29 KB
06/23/2025 12:23:46 PM
rwxr-xr-x
📁
simplejson
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
simplejson-3.19.1.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
six-1.16.0.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📄
six.py
33.74 KB
12/18/2024 10:23:15 AM
rw-r--r--
📁
smmap
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
smmap-5.0.0.dist-info
-
02/07/2025 10:01:35 PM
rwxr-xr-x
📁
snowballstemmer
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
snowballstemmer-2.2.0.dist-info
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
sqlalchemy
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
ssa
-
09/05/2025 09:31:38 AM
rwxr-xr-x
📁
svgwrite
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
svgwrite-1.4.3.dist-info
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
tap
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
tap.py-3.1.dist-info
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
testfixtures
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
testfixtures-7.1.0.dist-info
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
toml
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
toml-0.10.2.dist-info
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
tomlkit
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
tomlkit-0.11.8.dist-info
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
typing_extensions-4.7.1.dist-info
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📄
typing_extensions.py
108.48 KB
12/18/2024 10:23:15 AM
rw-r--r--
📁
unshare-0.22.dist-info
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📄
unshare.cpython-311-x86_64-linux-gnu.so
8.17 KB
12/18/2024 10:23:51 AM
rwxr-xr-x
📁
urllib3
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
urllib3-2.0.4.dist-info
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
vendors_api
-
09/05/2025 09:30:59 AM
rwxr-xr-x
📁
virtualenv
-
02/07/2025 10:01:37 PM
rwxr-xr-x
📁
virtualenv-20.18.0.dist-info
-
02/16/2024 08:50:19 PM
rwxr-xr-x
📁
virtualenv-20.21.1.dist-info
-
02/07/2025 10:01:36 PM
rwxr-xr-x
📁
wcwidth
-
02/07/2025 10:01:37 PM
rwxr-xr-x
📁
wcwidth-0.2.6.dist-info
-
02/07/2025 10:01:37 PM
rwxr-xr-x
📁
wmt
-
09/05/2025 09:31:35 AM
rwxr-xr-x
📁
wrapt
-
02/07/2025 10:01:37 PM
rwxr-xr-x
📁
wrapt-1.15.0.dist-info
-
02/07/2025 10:01:37 PM
rwxr-xr-x
📁
xray
-
09/05/2025 09:33:56 AM
rwxr-xr-x
📁
yaml
-
02/07/2025 10:01:37 PM
rwxr-xr-x
📁
yarl
-
02/07/2025 10:01:37 PM
rwxr-xr-x
📁
yarl-1.9.2.dist-info
-
02/07/2025 10:01:37 PM
rwxr-xr-x
Editing: clsudo.py
Close
# coding=utf-8 # Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2018 All Rights Reserved # # Licensed under CLOUD LINUX LICENSE AGREEMENT # http://cloudlinux.com/docs/LICENSE.TXT import os import pwd import grp import re import subprocess import tempfile from stat import S_IRUSR, S_IRGRP class NoSuchUser(Exception): def __init__(self, user): Exception.__init__(self, f'No such user ({user})') class NoSuchGroup(Exception): def __init__(self, group): Exception.__init__(self, f'No such group ({group})') class UnableToReadFile(Exception): def __init__(self): Exception.__init__(self, 'Cannot read sudoers file') class UnableToWriteFile(Exception): def __init__(self): Exception.__init__(self, 'Cannot modify sudoers file') SUDOERS_FILE = '/etc/sudoers' ALIAS_LVECTL_CMDS = ["/bin/ps", "/bin/grep", "/sbin/service", "/usr/bin/getcontrolpaneluserspackages", "/usr/sbin/lvectl", "/usr/local/directadmin/plugins/new_lvemanager/admin/GetDomains", "/usr/share/l.v.e-manager/utils/cloudlinux-cli.py"] ALIAS_LVECTL_USER_CMDS = ["/usr/share/l.v.e-manager/utils/cloudlinux-cli-user.py"] ALIAS_SELECTOR_CMDS = ["/usr/bin/cl-selector", "/usr/bin/piniset", "/usr/sbin/lveps", "/usr/bin/selectorctl"] DEFAULTS_REQUIRETTY = 'Defaults:%s !requiretty' # Patterns for group GROUP_LVECTL_SELECTOR = '%%%s ALL=NOPASSWD: LVECTL_CMDS, SELECTOR_CMDS' GROUP_DEFAULTS_REQUIRETTY = 'Defaults:%%%s !requiretty' class Clsudo: """ Adds CloudLinux users to sudoers file """ filepath = None sudoers_list = [] has_action = False has_group_action = False has_alias = False has_user_alias = False has_rights = False has_user_rights = False has_selector_alias = False has_selector_rights = False has_cagefs_alias = False has_cagefs_rights = False @staticmethod def add_user(user, sudoers_file=SUDOERS_FILE): """ Adds username to sudoers file (for lvemanager) """ # Update command lists for lvemanager Clsudo.update_commands_list(sudoers_file) Clsudo._check_user(user) Clsudo._get_contents(user) if not Clsudo.has_alias: Clsudo.sudoers_list.append('Cmnd_Alias LVECTL_CMDS = ' + ", ".join(ALIAS_LVECTL_CMDS)) if not Clsudo.has_user_alias: Clsudo.sudoers_list.append('Cmnd_Alias LVECTL_USER_CMDS = ' + ", ".join(ALIAS_LVECTL_USER_CMDS)) if not Clsudo.has_selector_alias: Clsudo.sudoers_list.append('Cmnd_Alias SELECTOR_CMDS = ' + ", ".join(ALIAS_SELECTOR_CMDS)) if not Clsudo.has_rights: Clsudo.sudoers_list.append(f'{user} ALL=NOPASSWD: LVECTL_CMDS') if not Clsudo.has_user_rights: Clsudo.sudoers_list.append(f'{user} ALL=(ALL) NOPASSWD: LVECTL_USER_CMDS') if not Clsudo.has_selector_rights: Clsudo.sudoers_list.append(f'{user} ALL=NOPASSWD: SELECTOR_CMDS') if not Clsudo.has_action: Clsudo.sudoers_list.append(DEFAULTS_REQUIRETTY % (user,)) Clsudo._write_contents() @staticmethod def add_cagefs_user(user, sudoers_file=SUDOERS_FILE): """ Adds username to sudoers file (for cagefs) """ Clsudo.filepath = sudoers_file Clsudo._check_user(user) Clsudo._get_contents(user) if not Clsudo.has_cagefs_alias: Clsudo.sudoers_list.append('Cmnd_Alias CAGEFS_CMDS = /usr/sbin/cagefsctl, ' '/bin/ps, /bin/grep, /sbin/service') if not Clsudo.has_cagefs_rights: Clsudo.sudoers_list.append(f'{user} ALL=NOPASSWD: CAGEFS_CMDS') if not Clsudo.has_action: Clsudo.sudoers_list.append(DEFAULTS_REQUIRETTY % (user,)) Clsudo._write_contents() @staticmethod def add_lvemanager_group(group_name, sudoers_file=SUDOERS_FILE): """ Adds group to sudoers file, grants access to LVE Manager """ # Update command lists for lvemanager Clsudo.update_commands_list(sudoers_file) Clsudo._check_group(group_name) Clsudo._get_contents_group(group_name) if not Clsudo.has_alias: Clsudo.sudoers_list.append('Cmnd_Alias LVECTL_CMDS = ' + ", ".join(ALIAS_LVECTL_CMDS)) if not Clsudo.has_selector_alias: Clsudo.sudoers_list.append('Cmnd_Alias SELECTOR_CMDS = ' + ", ".join(ALIAS_SELECTOR_CMDS)) if not Clsudo.has_action: Clsudo.sudoers_list.append(GROUP_LVECTL_SELECTOR % (group_name,)) if not Clsudo.has_group_action: Clsudo.sudoers_list.append(GROUP_DEFAULTS_REQUIRETTY % (group_name,)) # writes file Clsudo._write_contents() @staticmethod def remove_user(user, sudoers_file=SUDOERS_FILE): """ Removes username from sudoers file """ Clsudo.filepath = sudoers_file try: with open(Clsudo.filepath, encoding='utf-8') as f: Clsudo.sudoers_list = f.read().splitlines() idx = 0 removed = False while idx < len(Clsudo.sudoers_list): line = Clsudo.sudoers_list[idx] if ((f'{user} ALL=NOPASSWD:') in line) or ((DEFAULTS_REQUIRETTY % (user,)) in line): Clsudo.sudoers_list.remove(line) removed = True continue idx += 1 if removed: Clsudo._write_contents() except (IOError, OSError) as e: raise UnableToReadFile() from e @staticmethod def update_user(user, sudoers_file=SUDOERS_FILE): """ updates username in sudoers file :param user: username for caching :param sudoers_file: path to /etc/sudoers (only for tests) :return: None """ # Update command lists Clsudo.update_commands_list(sudoers_file) # For backward compatibility # Check user presence in system Clsudo._check_user(user) Clsudo._get_contents(user) @staticmethod def update_commands_list(sudoers_file=SUDOERS_FILE): """ Update command lists for lvemanager plugin If any required command absent in file, add it :param sudoers_file: path to /etc/sudoers :return: None """ # Read /etc/sudoers Clsudo.filepath = sudoers_file Clsudo.temp_dir = os.path.dirname(Clsudo.filepath) Clsudo._read_sudoers() cmnd_dict = {"Cmnd_Alias LVECTL_CMDS": ALIAS_LVECTL_CMDS, "Cmnd_Alias SELECTOR_CMDS": ALIAS_SELECTOR_CMDS} is_sudoer_change = False for idx, command_string in enumerate(Clsudo.sudoers_list): for aliase_key, aliase_list in cmnd_dict.items(): if aliase_key in command_string: command_string = command_string.replace(aliase_key, "").strip() cmnd_list = command_string.split(",") for aliase_cmnd_item in aliase_list: if aliase_cmnd_item not in cmnd_list: is_sudoer_change = True Clsudo.sudoers_list[idx] = f"{aliase_key} = {', '.join(aliase_list)}" break if is_sudoer_change: Clsudo._write_contents() @staticmethod def _check_user(user): """ Checks passwd database for username presence @param user: string """ try: pwd.getpwnam(user) except KeyError as e: raise NoSuchUser(user) from e @staticmethod def _check_group(group_name): """ Checks grp database for group_name presence @param group_name: string """ try: grp.getgrnam(group_name) except KeyError as e: raise NoSuchGroup(group_name) from e @staticmethod def _read_sudoers(): with open(Clsudo.filepath, encoding='utf-8') as f: Clsudo.sudoers_list = f.read().splitlines() @staticmethod def _get_contents(user): """ Reads file into list of strings @param user: string """ # Clear all status flags Clsudo.has_action = False Clsudo.has_group_action = False Clsudo.has_alias = False Clsudo.has_user_alias = False Clsudo.has_rights = False Clsudo.has_user_rights = False Clsudo.has_selector_alias = False Clsudo.has_selector_rights = False Clsudo.has_cagefs_alias = False Clsudo.has_cagefs_rights = False require_tty_pattern = re.compile(rf'Defaults:\s*{user}\s*!requiretty') try: # Read sudoers file Clsudo._read_sudoers() for idx, command_string in enumerate(Clsudo.sudoers_list): if "Cmnd_Alias LVECTL_CMDS" in command_string: Clsudo.has_alias = True continue if "Cmnd_Alias LVECTL_USER_CMDS" in command_string: Clsudo.has_user_alias = True continue if "Cmnd_Alias CAGEFS_CMDS" in command_string: Clsudo.has_cagefs_alias = True continue if f"{user} ALL=NOPASSWD: LVECTL_CMDS" in command_string: Clsudo.has_rights = True continue if f"{user} ALL=(ALL) NOPASSWD: LVECTL_USER_CMDS" in command_string: Clsudo.has_user_rights = True continue if f"{user} ALL=NOPASSWD: CAGEFS_CMDS" in command_string: Clsudo.has_cagefs_rights = True continue if "requiretty" in command_string: pattern_match = require_tty_pattern.search(command_string) if pattern_match: Clsudo.has_action = True continue if "Cmnd_Alias SELECTOR_CMDS" in command_string: if 'piniset' not in command_string: Clsudo.sudoers_list[idx] = command_string.replace( '/usr/bin/cl-selector', '/usr/bin/cl-selector, /usr/bin/piniset', ) if 'lveps' not in command_string: Clsudo.sudoers_list[idx] = command_string.replace( '/usr/bin/cl-selector, /usr/bin/piniset', '/usr/bin/cl-selector, /usr/bin/piniset, /usr/sbin/lveps', ) Clsudo.has_selector_alias = True continue if f"{user} ALL=NOPASSWD: SELECTOR_CMDS" in command_string: Clsudo.has_selector_rights = True continue except (IOError, OSError) as e: raise UnableToReadFile() from e @staticmethod def _get_contents_group(group_name): """ Reads file into list of strings @param group_name: string """ # Clear all status flags Clsudo.has_action = False Clsudo.has_group_action = False Clsudo.has_alias = False Clsudo.has_rights = False Clsudo.has_selector_alias = False Clsudo.has_selector_rights = False Clsudo.has_cagefs_alias = False Clsudo.has_cagefs_rights = False group_prefix = f"%{group_name}" group_action = f"Defaults:%{group_name}" group_pattern = re.compile(rf'{group_name}\s*ALL=NOPASSWD:\s*LVECTL_CMDS,\s*SELECTOR_CMDS') try: # Read sudoers file Clsudo._read_sudoers() for idx, command_string in enumerate(Clsudo.sudoers_list): if "Cmnd_Alias SELECTOR_CMDS" in command_string: if 'piniset' not in command_string: Clsudo.sudoers_list[idx] = command_string.replace( '/usr/bin/cl-selector', '/usr/bin/cl-selector, /usr/bin/piniset', ) if 'lveps' not in command_string: Clsudo.sudoers_list[idx] = command_string.replace( '/usr/bin/cl-selector, /usr/bin/piniset', '/usr/bin/cl-selector, /usr/bin/piniset, /usr/sbin/lveps', ) Clsudo.has_selector_alias = True continue if "Cmnd_Alias LVECTL_CMDS" in command_string: Clsudo.has_alias = True continue if "Cmnd_Alias CAGEFS_CMDS" in command_string: Clsudo.has_cagefs_alias = True continue if command_string.startswith(group_prefix): pattern_match = group_pattern.search(command_string) if pattern_match: Clsudo.has_action = True if command_string.startswith(group_action): Clsudo.has_group_action = True except (IOError, OSError) as e: raise UnableToReadFile() from e @staticmethod def _write_contents(): """ Writes data to temporary file then checks it and rewrites sudoers file """ try: temp_dir = os.path.dirname(Clsudo.filepath) temp_prefix = 'lve_sudoers_' fd, temp_path = tempfile.mkstemp(prefix=temp_prefix, dir=temp_dir) fo = os.fdopen(fd, 'w') fo.write('\n'.join(Clsudo.sudoers_list) + '\n') fo.close() mask = S_IRUSR | S_IRGRP os.chmod(temp_path, mask) if not Clsudo._is_file_valid(temp_path): raise IOError except (IOError, OSError) as e: try: if os.path.exists(temp_path): os.unlink(temp_path) except Exception: pass raise UnableToWriteFile() from e try: os.rename(temp_path, Clsudo.filepath) except OSError as e: raise UnableToWriteFile() from e @staticmethod def _is_file_valid(filename): cmd = [ '/usr/sbin/visudo', '-c', '-f', filename ] with subprocess.Popen( cmd, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, ) as proc: proc.communicate() if proc.returncode != 0: return False return True