python3-commons 0.5.2__tar.gz → 0.5.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of python3-commons might be problematic. Click here for more details.
- {python3_commons-0.5.2/src/python3_commons.egg-info → python3_commons-0.5.3}/PKG-INFO +1 -1
- {python3_commons-0.5.2 → python3_commons-0.5.3}/setup.cfg +1 -1
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/audit.py +42 -41
- {python3_commons-0.5.2 → python3_commons-0.5.3/src/python3_commons.egg-info}/PKG-INFO +1 -1
- {python3_commons-0.5.2 → python3_commons-0.5.3}/.coveragerc +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/.github/workflows/python-publish.yaml +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/.gitignore +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/AUTHORS.rst +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/CHANGELOG.rst +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/LICENSE +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/README.md +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/README.rst +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/docs/Makefile +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/docs/_static/.gitignore +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/docs/authors.rst +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/docs/changelog.rst +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/docs/conf.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/docs/index.rst +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/docs/license.rst +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/pyproject.toml +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/requirements.txt +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/requirements_dev.txt +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/requirements_test.txt +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/setup.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/__init__.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/conf.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/db.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/fs.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/helpers.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/logging/__init__.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/logging/filters.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/logging/formatter.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/object_storage.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/serializers/__init__.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/serializers/json.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/serializers/msgpack.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons/serializers/msgspec.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons.egg-info/SOURCES.txt +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons.egg-info/dependency_links.txt +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons.egg-info/not-zip-safe +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons.egg-info/requires.txt +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons.egg-info/top_level.txt +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/tests/conftest.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/tests/test_msgpack.py +0 -0
- {python3_commons-0.5.2 → python3_commons-0.5.3}/tests/test_msgspec.py +0 -0
|
@@ -1,64 +1,29 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
import io
|
|
2
3
|
import logging
|
|
3
4
|
import tarfile
|
|
4
|
-
from datetime import
|
|
5
|
+
from datetime import datetime, timedelta, UTC
|
|
5
6
|
from io import BytesIO
|
|
6
7
|
from uuid import uuid4
|
|
7
|
-
from zoneinfo import ZoneInfo
|
|
8
8
|
|
|
9
9
|
from lxml import etree
|
|
10
|
+
from minio import S3Error
|
|
10
11
|
from zeep.plugins import Plugin
|
|
11
12
|
from zeep.wsdl.definitions import AbstractOperation
|
|
12
13
|
|
|
13
14
|
from python3_commons import object_storage
|
|
14
15
|
from python3_commons.conf import S3Settings, s3_settings
|
|
16
|
+
from python3_commons.object_storage import get_s3_client
|
|
15
17
|
|
|
16
18
|
logger = logging.getLogger(__name__)
|
|
17
19
|
|
|
18
20
|
|
|
19
|
-
class ZeepAuditPlugin(Plugin):
|
|
20
|
-
def __init__(self, audit_name: str = 'zeep'):
|
|
21
|
-
super().__init__()
|
|
22
|
-
self.audit_name = audit_name
|
|
23
|
-
|
|
24
|
-
@staticmethod
|
|
25
|
-
def store_audit_in_s3(envelope, operation: AbstractOperation, direction: str):
|
|
26
|
-
xml = etree.tostring(envelope, encoding='UTF-8', pretty_print=True)
|
|
27
|
-
now = datetime.now(tz=UTC)
|
|
28
|
-
date_path = now.strftime('%Y/%m/%d')
|
|
29
|
-
timestamp = now.strftime('%H%M%S')
|
|
30
|
-
coro = object_storage.store_bytes_in_s3(
|
|
31
|
-
settings, xml,
|
|
32
|
-
f'audit/{date_path}/{self.audit_name}/{operation.name}/{timestamp}_{str(uuid4())[-12:]}_{direction}.xml'
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
try:
|
|
36
|
-
loop = asyncio.get_running_loop()
|
|
37
|
-
except RuntimeError:
|
|
38
|
-
loop = None
|
|
39
|
-
|
|
40
|
-
if loop and loop.is_running():
|
|
41
|
-
loop.create_task(coro)
|
|
42
|
-
else:
|
|
43
|
-
asyncio.run(coro)
|
|
44
|
-
|
|
45
|
-
def ingress(self, envelope, http_headers, operation: AbstractOperation):
|
|
46
|
-
self.store_audit_in_s3(envelope, operation, 'ingress')
|
|
47
|
-
|
|
48
|
-
return envelope, http_headers
|
|
49
|
-
|
|
50
|
-
def egress(self, envelope, http_headers, operation: AbstractOperation, binding_options):
|
|
51
|
-
self.store_audit_in_s3(envelope, operation, 'egress')
|
|
52
|
-
|
|
53
|
-
return envelope, http_headers
|
|
54
|
-
|
|
55
|
-
|
|
56
21
|
async def write_audit_data(settings: S3Settings, key: str, data: bytes):
|
|
57
22
|
if settings.s3_secret_access_key:
|
|
58
23
|
try:
|
|
59
24
|
client = get_s3_client(settings)
|
|
60
25
|
|
|
61
|
-
client.put_object(settings.s3_bucket, key, io.BytesIO(data), len(data))
|
|
26
|
+
client.put_object(settings.s3_bucket, f'audit/{key}', io.BytesIO(data), len(data))
|
|
62
27
|
except S3Error as e:
|
|
63
28
|
logger.error(f'Failed storing object in storage: {e}')
|
|
64
29
|
else:
|
|
@@ -92,7 +57,7 @@ async def archive_audit_data(root_path: str = 'audit'):
|
|
|
92
57
|
|
|
93
58
|
if object_names:
|
|
94
59
|
archive_path = object_storage.get_absolute_path(
|
|
95
|
-
f'.archive/{year}_{month:02}
|
|
60
|
+
f'.archive/{year}_{month:02}_{day:02}.tar.bz2')
|
|
96
61
|
object_storage.put_object(bucket_name, archive_path, fo, fo.getbuffer().nbytes)
|
|
97
62
|
|
|
98
63
|
if errors := object_storage.remove_objects(bucket_name, object_names=object_names):
|
|
@@ -100,3 +65,39 @@ async def archive_audit_data(root_path: str = 'audit'):
|
|
|
100
65
|
logger.error(f'Failed to delete object in {bucket_name=}: {error}')
|
|
101
66
|
else:
|
|
102
67
|
logger.info('No objects to archive found.')
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class ZeepAuditPlugin(Plugin):
|
|
71
|
+
def __init__(self, audit_name: str = 'zeep'):
|
|
72
|
+
super().__init__()
|
|
73
|
+
self.audit_name = audit_name
|
|
74
|
+
|
|
75
|
+
def store_audit_in_s3(self, envelope, operation: AbstractOperation, direction: str):
|
|
76
|
+
xml = etree.tostring(envelope, encoding='UTF-8', pretty_print=True)
|
|
77
|
+
now = datetime.now(tz=UTC)
|
|
78
|
+
date_path = now.strftime('%Y/%m/%d')
|
|
79
|
+
timestamp = now.strftime('%H%M%S')
|
|
80
|
+
coro = write_audit_data(
|
|
81
|
+
s3_settings,
|
|
82
|
+
f'{date_path}/{self.audit_name}/{operation.name}/{timestamp}_{str(uuid4())[-12:]}_{direction}.xml', xml
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
try:
|
|
86
|
+
loop = asyncio.get_running_loop()
|
|
87
|
+
except RuntimeError:
|
|
88
|
+
loop = None
|
|
89
|
+
|
|
90
|
+
if loop and loop.is_running():
|
|
91
|
+
loop.create_task(coro)
|
|
92
|
+
else:
|
|
93
|
+
asyncio.run(coro)
|
|
94
|
+
|
|
95
|
+
def ingress(self, envelope, http_headers, operation: AbstractOperation):
|
|
96
|
+
self.store_audit_in_s3(envelope, operation, 'ingress')
|
|
97
|
+
|
|
98
|
+
return envelope, http_headers
|
|
99
|
+
|
|
100
|
+
def egress(self, envelope, http_headers, operation: AbstractOperation, binding_options):
|
|
101
|
+
self.store_audit_in_s3(envelope, operation, 'egress')
|
|
102
|
+
|
|
103
|
+
return envelope, http_headers
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python3_commons-0.5.2 → python3_commons-0.5.3}/src/python3_commons.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|