atomicshop 3.3.10__py3-none-any.whl → 3.3.12__py3-none-any.whl
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 atomicshop might be problematic. Click here for more details.
- atomicshop/__init__.py +1 -1
- atomicshop/mitm/config_static.py +3 -1
- atomicshop/mitm/connection_thread_worker.py +6 -3
- atomicshop/mitm/import_config.py +3 -0
- atomicshop/mitm/statistic_analyzer.py +27 -13
- atomicshop/mitm/statistic_analyzer_helper/moving_average_helper.py +61 -28
- atomicshop/wrappers/socketw/creator.py +9 -7
- atomicshop/wrappers/socketw/sni.py +1 -3
- atomicshop/wrappers/socketw/socket_client.py +5 -2
- {atomicshop-3.3.10.dist-info → atomicshop-3.3.12.dist-info}/METADATA +1 -1
- {atomicshop-3.3.10.dist-info → atomicshop-3.3.12.dist-info}/RECORD +15 -15
- {atomicshop-3.3.10.dist-info → atomicshop-3.3.12.dist-info}/WHEEL +0 -0
- {atomicshop-3.3.10.dist-info → atomicshop-3.3.12.dist-info}/entry_points.txt +0 -0
- {atomicshop-3.3.10.dist-info → atomicshop-3.3.12.dist-info}/licenses/LICENSE.txt +0 -0
- {atomicshop-3.3.10.dist-info → atomicshop-3.3.12.dist-info}/top_level.txt +0 -0
atomicshop/__init__.py
CHANGED
atomicshop/mitm/config_static.py
CHANGED
|
@@ -124,7 +124,6 @@ class LogRec:
|
|
|
124
124
|
|
|
125
125
|
@dataclass
|
|
126
126
|
class Certificates:
|
|
127
|
-
enable_sslkeylogfile_env_to_client_ssl_context: bool
|
|
128
127
|
install_ca_certificate_to_root_store: bool
|
|
129
128
|
uninstall_unused_ca_certificates_with_mitm_ca_name: bool
|
|
130
129
|
|
|
@@ -141,6 +140,9 @@ class Certificates:
|
|
|
141
140
|
sni_server_certificate_from_server_socket_download_directory: str
|
|
142
141
|
|
|
143
142
|
domains_all_times: list[str]
|
|
143
|
+
enable_sslkeylogfile_env_to_client_ssl_context: bool = True
|
|
144
|
+
sslkeylog_file_path: str = None
|
|
145
|
+
sslkeylog_file_name: str = "sslkeylog.txt"
|
|
144
146
|
|
|
145
147
|
|
|
146
148
|
@dataclass
|
|
@@ -235,7 +235,8 @@ def thread_worker_main(
|
|
|
235
235
|
logger=network_logger,
|
|
236
236
|
custom_pem_client_certificate_file_path=custom_client_pem_certificate_path,
|
|
237
237
|
enable_sslkeylogfile_env_to_client_ssl_context=(
|
|
238
|
-
config_static.Certificates.enable_sslkeylogfile_env_to_client_ssl_context)
|
|
238
|
+
config_static.Certificates.enable_sslkeylogfile_env_to_client_ssl_context),
|
|
239
|
+
sslkeylog_file_path=config_static.Certificates.sslkeylog_file_path
|
|
239
240
|
)
|
|
240
241
|
# If it's a domain name, then we'll use the DNS to resolve it.
|
|
241
242
|
else:
|
|
@@ -250,7 +251,8 @@ def thread_worker_main(
|
|
|
250
251
|
logger=network_logger,
|
|
251
252
|
custom_pem_client_certificate_file_path=custom_client_pem_certificate_path,
|
|
252
253
|
enable_sslkeylogfile_env_to_client_ssl_context=(
|
|
253
|
-
config_static.Certificates.enable_sslkeylogfile_env_to_client_ssl_context)
|
|
254
|
+
config_static.Certificates.enable_sslkeylogfile_env_to_client_ssl_context),
|
|
255
|
+
sslkeylog_file_path=config_static.Certificates.sslkeylog_file_path
|
|
254
256
|
)
|
|
255
257
|
# If we're not on localhost, then connect to domain directly.
|
|
256
258
|
else:
|
|
@@ -261,7 +263,8 @@ def thread_worker_main(
|
|
|
261
263
|
logger=network_logger,
|
|
262
264
|
custom_pem_client_certificate_file_path=custom_client_pem_certificate_path,
|
|
263
265
|
enable_sslkeylogfile_env_to_client_ssl_context=(
|
|
264
|
-
config_static.Certificates.enable_sslkeylogfile_env_to_client_ssl_context)
|
|
266
|
+
config_static.Certificates.enable_sslkeylogfile_env_to_client_ssl_context),
|
|
267
|
+
sslkeylog_file_path=config_static.Certificates.sslkeylog_file_path
|
|
265
268
|
)
|
|
266
269
|
|
|
267
270
|
return service_client_instance
|
atomicshop/mitm/import_config.py
CHANGED
|
@@ -361,3 +361,6 @@ def manipulations_after_import():
|
|
|
361
361
|
filesystem.check_absolute_path___add_full(
|
|
362
362
|
config_static.Certificates.sni_server_certificate_from_server_socket_download_directory,
|
|
363
363
|
config_static.MainConfig.SCRIPT_DIRECTORY)
|
|
364
|
+
config_static.Certificates.sslkeylog_file_path = (f"{config_static.LogRec.logs_path}{os.sep}"
|
|
365
|
+
f"{config_static.Certificates.sslkeylog_file_name}")
|
|
366
|
+
|
|
@@ -346,10 +346,11 @@ def analyze(main_file_path: str):
|
|
|
346
346
|
|
|
347
347
|
|
|
348
348
|
def deviation_calculator_by_moving_average(
|
|
349
|
-
statistics_file_directory: str,
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
349
|
+
statistics_file_directory: str = None,
|
|
350
|
+
statistics_content: dict = None,
|
|
351
|
+
by_type: Literal['host', 'url'] = 'url',
|
|
352
|
+
moving_average_window_days: int = 5,
|
|
353
|
+
top_bottom_deviation_percentage: float = 0.25,
|
|
353
354
|
get_deviation_for_last_day_only: bool = False,
|
|
354
355
|
summary: bool = False,
|
|
355
356
|
output_file_path: str = None,
|
|
@@ -360,9 +361,13 @@ def deviation_calculator_by_moving_average(
|
|
|
360
361
|
"""
|
|
361
362
|
This function is the main function for the moving average calculator.
|
|
362
363
|
|
|
363
|
-
:param statistics_file_directory: string, the directory where 'statistics.csv' file resides
|
|
364
|
+
:param statistics_file_directory: string, can be either providing the directory where 'statistics.csv' file resides
|
|
365
|
+
or None. If None, the 'statistics_content' must be provided.
|
|
366
|
+
The directory where 'statistics.csv' file resides.
|
|
364
367
|
Also, all the rotated files like: statistics_2021-01-01.csv, statistics_2021-01-02.csv, etc.
|
|
365
368
|
These will be analyzed in the order of the date in the file name.
|
|
369
|
+
:param statistics_content: dict, if specified, this will be used instead of reading the files from the directory.
|
|
370
|
+
The dict should be a result of the 'atomicshop.mitm.statistic_analyzer_helper.moving_average_helper.get_all_files_content'.
|
|
366
371
|
:param by_type: string, 'host' or 'url'. The type of the deviation calculation.
|
|
367
372
|
'host' will calculate the deviation by the host name. Example: maps.google.com, yahoo.com, etc.
|
|
368
373
|
'url' will calculate the deviation by the URL. Example: maps.google.com/maps, yahoo.com/news, etc.
|
|
@@ -414,14 +419,6 @@ def deviation_calculator_by_moving_average(
|
|
|
414
419
|
sys.exit(main())
|
|
415
420
|
"""
|
|
416
421
|
|
|
417
|
-
if output_file_type not in ['json', 'csv']:
|
|
418
|
-
raise ValueError(f'output_file_type must be "json" or "csv", not [{output_file_type}]')
|
|
419
|
-
|
|
420
|
-
if by_type not in ['host', 'url']:
|
|
421
|
-
raise ValueError(f'by_type must be "host" or "url", not [{by_type}]')
|
|
422
|
-
|
|
423
|
-
statistics_file_path: str = f'{statistics_file_directory}{os.sep}{STATISTICS_FILE_NAME}'
|
|
424
|
-
|
|
425
422
|
def convert_data_value_to_string(value_key: str, list_index: int) -> None:
|
|
426
423
|
deviation_list[list_index]['data'][value_key] = json.dumps(deviation_list[list_index]['data'][value_key])
|
|
427
424
|
|
|
@@ -429,8 +426,25 @@ def deviation_calculator_by_moving_average(
|
|
|
429
426
|
if value_key in deviation_list[list_index]:
|
|
430
427
|
deviation_list[list_index][value_key] = json.dumps(deviation_list[list_index][value_key])
|
|
431
428
|
|
|
429
|
+
if not statistics_file_directory and not statistics_content:
|
|
430
|
+
raise ValueError('Either [statistics_file_directory] or [statistics_content] must be provided.')
|
|
431
|
+
if statistics_file_directory and statistics_content:
|
|
432
|
+
raise ValueError('Either [statistics_file_directory] or [statistics_content] must be provided, not both.')
|
|
433
|
+
|
|
434
|
+
if output_file_type not in ['json', 'csv']:
|
|
435
|
+
raise ValueError(f'output_file_type must be "json" or "csv", not [{output_file_type}]')
|
|
436
|
+
|
|
437
|
+
if by_type not in ['host', 'url']:
|
|
438
|
+
raise ValueError(f'by_type must be "host" or "url", not [{by_type}]')
|
|
439
|
+
|
|
440
|
+
if statistics_file_directory:
|
|
441
|
+
statistics_file_path: str | None = f'{statistics_file_directory}{os.sep}{STATISTICS_FILE_NAME}'
|
|
442
|
+
else:
|
|
443
|
+
statistics_file_path: str | None = None
|
|
444
|
+
|
|
432
445
|
deviation_list = moving_average_helper.calculate_moving_average(
|
|
433
446
|
statistics_file_path,
|
|
447
|
+
statistics_content,
|
|
434
448
|
by_type,
|
|
435
449
|
moving_average_window_days,
|
|
436
450
|
top_bottom_deviation_percentage,
|
|
@@ -9,10 +9,11 @@ from ... import urls, filesystem
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
def calculate_moving_average(
|
|
12
|
-
file_path: str,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
file_path: str = None,
|
|
13
|
+
statistics_content: dict = None,
|
|
14
|
+
by_type: Literal['host', 'url'] = 'url',
|
|
15
|
+
moving_average_window_days: int = 5,
|
|
16
|
+
top_bottom_deviation_percentage: float = 0.25,
|
|
16
17
|
get_deviation_for_last_day_only: bool = False,
|
|
17
18
|
skip_total_count_less_than: int = None,
|
|
18
19
|
print_kwargs: dict = None
|
|
@@ -21,10 +22,64 @@ def calculate_moving_average(
|
|
|
21
22
|
This function calculates the moving average of the daily statistics.
|
|
22
23
|
|
|
23
24
|
:param file_path: string, the path to the 'statistics.csv' file.
|
|
25
|
+
:param statistics_content: dict, the statistics content dictionary. If provided, 'file_path' will be ignored.
|
|
26
|
+
The dictionary should be in the format returned by 'get_all_files_content' function.
|
|
24
27
|
:param by_type: string, the type to calculate the moving average by. Can be 'host' or 'url'.
|
|
25
28
|
:param moving_average_window_days: integer, the window size for the moving average.
|
|
26
29
|
:param top_bottom_deviation_percentage: float, the percentage of deviation from the moving average to the top or
|
|
27
30
|
bottom.
|
|
31
|
+
:param get_deviation_for_last_day_only: bool, check the 'get_all_files_content' function.
|
|
32
|
+
:param skip_total_count_less_than: integer, if the total count is less than this number, skip the deviation.
|
|
33
|
+
:param print_kwargs: dict, the print_api arguments.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
if not file_path and not statistics_content:
|
|
37
|
+
raise ValueError('Either file_path or statistics_content must be provided.')
|
|
38
|
+
if file_path and statistics_content:
|
|
39
|
+
raise ValueError('Only one of file_path or statistics_content must be provided.')
|
|
40
|
+
|
|
41
|
+
if not statistics_content:
|
|
42
|
+
statistics_content: dict = get_all_files_content(
|
|
43
|
+
file_path=file_path, moving_average_window_days=moving_average_window_days,
|
|
44
|
+
get_deviation_for_last_day_only=get_deviation_for_last_day_only, print_kwargs=print_kwargs)
|
|
45
|
+
|
|
46
|
+
for date_string, day_dict in statistics_content.items():
|
|
47
|
+
day_dict['content_no_useless'] = get_content_without_useless(day_dict['content'])
|
|
48
|
+
|
|
49
|
+
# Get the data dictionary from the statistics content.
|
|
50
|
+
day_dict['statistics_daily'] = compute_statistics_from_content(
|
|
51
|
+
day_dict['content_no_useless'], by_type)
|
|
52
|
+
|
|
53
|
+
moving_average_dict: dict = compute_moving_averages_from_average_statistics(
|
|
54
|
+
statistics_content,
|
|
55
|
+
moving_average_window_days
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
# Add the moving average to the statistics content.
|
|
59
|
+
for day, day_dict in statistics_content.items():
|
|
60
|
+
try:
|
|
61
|
+
day_dict['moving_average'] = moving_average_dict[day]
|
|
62
|
+
except KeyError:
|
|
63
|
+
day_dict['moving_average'] = {}
|
|
64
|
+
|
|
65
|
+
# Find deviation from the moving average to the bottom or top by specified percentage.
|
|
66
|
+
deviation_list: list = find_deviation_from_moving_average(
|
|
67
|
+
statistics_content, top_bottom_deviation_percentage, skip_total_count_less_than)
|
|
68
|
+
|
|
69
|
+
return deviation_list
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def get_all_files_content(
|
|
73
|
+
file_path: str,
|
|
74
|
+
moving_average_window_days: int,
|
|
75
|
+
get_deviation_for_last_day_only: bool = False,
|
|
76
|
+
print_kwargs: dict = None
|
|
77
|
+
) -> dict:
|
|
78
|
+
"""
|
|
79
|
+
Get the dictionary that will contain all the details of the file, like date, header and content, to prepare for the MA analysis.
|
|
80
|
+
|
|
81
|
+
:param file_path: string, the path to the 'statistics.csv' file.
|
|
82
|
+
:param moving_average_window_days: integer, the window size for the moving average.
|
|
28
83
|
:param get_deviation_for_last_day_only: bool, if True, only the last day will be analyzed.
|
|
29
84
|
Example: With 'moving_average_window_days=5', the last 6 days will be analyzed.
|
|
30
85
|
5 days for moving average and the last day for deviation.
|
|
@@ -38,8 +93,8 @@ def calculate_moving_average(
|
|
|
38
93
|
Files 01 to 05 will be used for moving average and the file 06 for deviation.
|
|
39
94
|
Meaning the average calculated for 2021-01-06 will be compared to the values moving average of 2021-01-01
|
|
40
95
|
to 2021-01-05.
|
|
41
|
-
:param skip_total_count_less_than: integer, if the total count is less than this number, skip the deviation.
|
|
42
96
|
:param print_kwargs: dict, the print_api arguments.
|
|
97
|
+
:return:
|
|
43
98
|
"""
|
|
44
99
|
|
|
45
100
|
date_format: str = consts.DEFAULT_ROTATING_SUFFIXES_FROM_WHEN['midnight']
|
|
@@ -67,29 +122,7 @@ def calculate_moving_average(
|
|
|
67
122
|
statistics_content[date_string]['content'] = log_file_content
|
|
68
123
|
statistics_content[date_string]['header'] = log_file_header
|
|
69
124
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
# Get the data dictionary from the statistics content.
|
|
73
|
-
statistics_content[date_string]['statistics_daily'] = compute_statistics_from_content(
|
|
74
|
-
statistics_content[date_string]['content_no_useless'], by_type)
|
|
75
|
-
|
|
76
|
-
moving_average_dict: dict = compute_moving_averages_from_average_statistics(
|
|
77
|
-
statistics_content,
|
|
78
|
-
moving_average_window_days
|
|
79
|
-
)
|
|
80
|
-
|
|
81
|
-
# Add the moving average to the statistics content.
|
|
82
|
-
for day, day_dict in statistics_content.items():
|
|
83
|
-
try:
|
|
84
|
-
day_dict['moving_average'] = moving_average_dict[day]
|
|
85
|
-
except KeyError:
|
|
86
|
-
day_dict['moving_average'] = {}
|
|
87
|
-
|
|
88
|
-
# Find deviation from the moving average to the bottom or top by specified percentage.
|
|
89
|
-
deviation_list: list = find_deviation_from_moving_average(
|
|
90
|
-
statistics_content, top_bottom_deviation_percentage, skip_total_count_less_than)
|
|
91
|
-
|
|
92
|
-
return deviation_list
|
|
125
|
+
return statistics_content
|
|
93
126
|
|
|
94
127
|
|
|
95
128
|
def get_content_without_useless(content: list) -> list:
|
|
@@ -43,7 +43,8 @@ def create_ssl_context_for_server() -> ssl.SSLContext:
|
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
def create_ssl_context_for_client(
|
|
46
|
-
enable_sslkeylogfile_env_to_client_ssl_context: bool = False
|
|
46
|
+
enable_sslkeylogfile_env_to_client_ssl_context: bool = False,
|
|
47
|
+
sslkeylog_file_path: str = None
|
|
47
48
|
) -> ssl.SSLContext:
|
|
48
49
|
"""
|
|
49
50
|
This function creates the SSL context for the client.
|
|
@@ -62,10 +63,9 @@ def create_ssl_context_for_client(
|
|
|
62
63
|
ssl_context: ssl.SSLContext = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
|
63
64
|
|
|
64
65
|
if enable_sslkeylogfile_env_to_client_ssl_context:
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
# This will create the file if it doesn't exist
|
|
67
|
+
open(sslkeylog_file_path, "a").close()
|
|
68
|
+
ssl_context.keylog_filename = sslkeylog_file_path
|
|
69
69
|
return ssl_context
|
|
70
70
|
|
|
71
71
|
|
|
@@ -243,7 +243,8 @@ def wrap_socket_with_ssl_context_client___default_certs___ignore_verification(
|
|
|
243
243
|
socket_object,
|
|
244
244
|
server_hostname: str = None,
|
|
245
245
|
custom_pem_client_certificate_file_path: str = None,
|
|
246
|
-
enable_sslkeylogfile_env_to_client_ssl_context: bool = False
|
|
246
|
+
enable_sslkeylogfile_env_to_client_ssl_context: bool = False,
|
|
247
|
+
sslkeylog_file_path: str = None
|
|
247
248
|
):
|
|
248
249
|
"""
|
|
249
250
|
This function is a preset for wrapping the socket with SSL context for the client.
|
|
@@ -257,7 +258,8 @@ def wrap_socket_with_ssl_context_client___default_certs___ignore_verification(
|
|
|
257
258
|
to the SSL context. Default is False.
|
|
258
259
|
"""
|
|
259
260
|
ssl_context: ssl.SSLContext = create_ssl_context_for_client(
|
|
260
|
-
enable_sslkeylogfile_env_to_client_ssl_context=enable_sslkeylogfile_env_to_client_ssl_context
|
|
261
|
+
enable_sslkeylogfile_env_to_client_ssl_context=enable_sslkeylogfile_env_to_client_ssl_context
|
|
262
|
+
,sslkeylog_file_path=sslkeylog_file_path)
|
|
261
263
|
set_client_ssl_context_ca_default_certs(ssl_context)
|
|
262
264
|
set_client_ssl_context_certificate_verification_ignore(ssl_context)
|
|
263
265
|
|
|
@@ -73,7 +73,6 @@ class SNISetup:
|
|
|
73
73
|
self.skip_extension_id_list = skip_extension_id_list
|
|
74
74
|
self.tls = tls
|
|
75
75
|
self.exceptions_logger = exceptions_logger
|
|
76
|
-
|
|
77
76
|
self.certificator_instance = None
|
|
78
77
|
|
|
79
78
|
def wrap_socket_with_ssl_context_server_sni_extended(
|
|
@@ -160,8 +159,7 @@ class SNISetup:
|
|
|
160
159
|
certificator_instance=self.certificator_instance,
|
|
161
160
|
domain_from_dns_server=self.domain_from_dns_server,
|
|
162
161
|
default_certificate_domain_list=self.default_certificate_domain_list,
|
|
163
|
-
exceptions_logger=self.exceptions_logger
|
|
164
|
-
)
|
|
162
|
+
exceptions_logger=self.exceptions_logger )
|
|
165
163
|
ssl_context.set_servername_callback(
|
|
166
164
|
sni_handler_instance.setup_sni_callback(print_kwargs=print_kwargs))
|
|
167
165
|
|
|
@@ -31,7 +31,8 @@ class SocketClient:
|
|
|
31
31
|
dns_servers_list: list[str] = None,
|
|
32
32
|
logger: logging.Logger = None,
|
|
33
33
|
custom_pem_client_certificate_file_path: str = None,
|
|
34
|
-
enable_sslkeylogfile_env_to_client_ssl_context: bool = False
|
|
34
|
+
enable_sslkeylogfile_env_to_client_ssl_context: bool = False,
|
|
35
|
+
sslkeylog_file_path:str = None
|
|
35
36
|
):
|
|
36
37
|
"""
|
|
37
38
|
If you have a certificate for domain, but not for the IPv4 address, the SSL Socket context can be created for
|
|
@@ -68,6 +69,7 @@ class SocketClient:
|
|
|
68
69
|
self.dns_servers_list = dns_servers_list
|
|
69
70
|
self.custom_pem_client_certificate_file_path: str = custom_pem_client_certificate_file_path
|
|
70
71
|
self.enable_sslkeylogfile_env_to_client_ssl_context: bool = enable_sslkeylogfile_env_to_client_ssl_context
|
|
72
|
+
self.sslkeylog_file_path: str = sslkeylog_file_path
|
|
71
73
|
|
|
72
74
|
if logger:
|
|
73
75
|
# Create child logger for the provided logger with the module's name.
|
|
@@ -101,7 +103,8 @@ class SocketClient:
|
|
|
101
103
|
socket_object = creator.create_socket_ipv4_tcp()
|
|
102
104
|
return creator.wrap_socket_with_ssl_context_client___default_certs___ignore_verification(
|
|
103
105
|
socket_object, self.service_name, self.custom_pem_client_certificate_file_path,
|
|
104
|
-
enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context
|
|
106
|
+
enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context,
|
|
107
|
+
sslkeylog_file_path=self.sslkeylog_file_path
|
|
105
108
|
)
|
|
106
109
|
|
|
107
110
|
def service_connection(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
atomicshop/__init__.py,sha256=
|
|
1
|
+
atomicshop/__init__.py,sha256=TBMr-8fSW7-pm2urzQlk8alPCT-9WMhHJRs5SESDf_M,123
|
|
2
2
|
atomicshop/_basics_temp.py,sha256=6cu2dd6r2dLrd1BRNcVDKTHlsHs_26Gpw8QS6v32lQ0,3699
|
|
3
3
|
atomicshop/_create_pdf_demo.py,sha256=Yi-PGZuMg0RKvQmLqVeLIZYadqEZwUm-4A9JxBl_vYA,3713
|
|
4
4
|
atomicshop/_patch_import.py,sha256=ENp55sKVJ0e6-4lBvZnpz9PQCt3Otbur7F6aXDlyje4,6334
|
|
@@ -129,16 +129,16 @@ atomicshop/file_io/tomls.py,sha256=vZ_Wng5alLf8z6HSEZj7PS0XKDA-Iies9ihVWOkTcKo,1
|
|
|
129
129
|
atomicshop/file_io/xlsxs.py,sha256=v_dyg9GD4LqgWi6wA1QuWRZ8zG4ZwB6Dz52ytdcmmmI,2184
|
|
130
130
|
atomicshop/file_io/xmls.py,sha256=zh3SuK-dNaFq2NDNhx6ivcf4GYCfGM8M10PcEwDSpxk,2104
|
|
131
131
|
atomicshop/mitm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
132
|
-
atomicshop/mitm/config_static.py,sha256=
|
|
132
|
+
atomicshop/mitm/config_static.py,sha256=4_lsZVVHCKMK8KZJeY3sXOiIJGRTUwoyckVo4EVa1FY,8931
|
|
133
133
|
atomicshop/mitm/config_toml_editor.py,sha256=2p1CMcktWRR_NW-SmyDwylu63ad5e0-w1QPMa8ZLDBw,1635
|
|
134
|
-
atomicshop/mitm/connection_thread_worker.py,sha256=
|
|
135
|
-
atomicshop/mitm/import_config.py,sha256=
|
|
134
|
+
atomicshop/mitm/connection_thread_worker.py,sha256=p-93_zdq3HzWpR7NF-gIq0JvvX0L8jz3_TSD3tBhV4o,33255
|
|
135
|
+
atomicshop/mitm/import_config.py,sha256=6fPiV_3v2ym1LgiLlbGoiIPaB6pfRNM9UBXmRnP-pMQ,18560
|
|
136
136
|
atomicshop/mitm/initialize_engines.py,sha256=qzz5jzh_lKC03bI1w5ebngVXo1K-RV3poAyW-nObyqo,11042
|
|
137
137
|
atomicshop/mitm/message.py,sha256=CDhhm4BTuZE7oNZCjvIZ4BuPOW4MuIzQLOg91hJaxDI,3065
|
|
138
138
|
atomicshop/mitm/mitm_main.py,sha256=ucmdCr2p1F4c18DE8qJG3uG3FkkVLWdMEIWevN5BNKE,38967
|
|
139
139
|
atomicshop/mitm/recs_files.py,sha256=tv8XFhYZMkBv4DauvpiAdPgvSo0Bcm1CghnmwO7dx8M,5018
|
|
140
140
|
atomicshop/mitm/shared_functions.py,sha256=0lzeyINd44sVEfFbahJxQmz6KAMWbYrW5ou3UYfItvw,1777
|
|
141
|
-
atomicshop/mitm/statistic_analyzer.py,sha256=
|
|
141
|
+
atomicshop/mitm/statistic_analyzer.py,sha256=D7DzpgqZN303jS8hfXn5HKq1edbTil7CpJr85bk9ERA,28489
|
|
142
142
|
atomicshop/mitm/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
143
143
|
atomicshop/mitm/engines/create_module_template.py,sha256=PHE2pVC9JNgaIh2o7M5dFMrkdOkmIyHLoO2mdzE5BdM,5938
|
|
144
144
|
atomicshop/mitm/engines/create_module_template_main_example.py,sha256=LeQ44Rp2Gi_KbIDY_4OMS0odkSK3zFZWra_oAka5eJY,243
|
|
@@ -154,7 +154,7 @@ atomicshop/mitm/engines/__reference_general/requester___reference_general.py,sha
|
|
|
154
154
|
atomicshop/mitm/engines/__reference_general/responder___reference_general.py,sha256=5XSmvF0d6d9mPkPOGw7f9T-Cr-YoUiUTVYgBIjiKh7s,10615
|
|
155
155
|
atomicshop/mitm/statistic_analyzer_helper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
156
156
|
atomicshop/mitm/statistic_analyzer_helper/analyzer_helper.py,sha256=pk6L1t1ea1kvlBoR9QEJptOmaX-mumhwLsP2GCKukbk,5920
|
|
157
|
-
atomicshop/mitm/statistic_analyzer_helper/moving_average_helper.py,sha256=
|
|
157
|
+
atomicshop/mitm/statistic_analyzer_helper/moving_average_helper.py,sha256=pQDDiLuySFk8rwLJT6GFVEF2HItdiBX3nhWBDfwejWI,21542
|
|
158
158
|
atomicshop/monitor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
159
159
|
atomicshop/monitor/change_monitor.py,sha256=K5NlVp99XIDDPnQQMdru4BDmua_DtcDIhVAzkTOvD5s,7673
|
|
160
160
|
atomicshop/monitor/checks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -310,14 +310,14 @@ atomicshop/wrappers/socketw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
|
|
|
310
310
|
atomicshop/wrappers/socketw/accepter.py,sha256=4I9ORugRDvwaqSzm_gWSjZnRwQGY8hDTlCdsYHwH_ZE,2377
|
|
311
311
|
atomicshop/wrappers/socketw/base.py,sha256=EcosGkD8VzgBY3GeIHDSG29ThQfXwg3-GQPmBTAqTdw,3048
|
|
312
312
|
atomicshop/wrappers/socketw/certificator.py,sha256=mtWPJ_ew3OSwt0-1W4jaoco1VIY4NRCrMv3mDUxb_Cc,12418
|
|
313
|
-
atomicshop/wrappers/socketw/creator.py,sha256=
|
|
313
|
+
atomicshop/wrappers/socketw/creator.py,sha256=V_M-xGoOsPWh0ndScdHG3zHrX-5nIjQjYhJHnt_P8vg,13816
|
|
314
314
|
atomicshop/wrappers/socketw/dns_server.py,sha256=GOYMvHvS6Fx7s-DRygGqO7_o8_Qt9on3HmKxgOSznRE,55956
|
|
315
315
|
atomicshop/wrappers/socketw/exception_wrapper.py,sha256=qW_1CKyPgGlsIt7_jusKkMV4A4hih4bX324u0PLnoO8,7382
|
|
316
316
|
atomicshop/wrappers/socketw/get_process.py,sha256=aJC-_qFUv3NgWCSUzDI72E4z8_-VTZE9NVZ0CwUoNlM,5698
|
|
317
317
|
atomicshop/wrappers/socketw/receiver.py,sha256=9B3MvcDqr4C3x2fsnjG5SQognd1wRqsBgikxZa0wXG8,8243
|
|
318
318
|
atomicshop/wrappers/socketw/sender.py,sha256=aX_K8l_rHjd5AWb8bi5mt8-YTkMYVRDB6DnPqK_XDUE,4754
|
|
319
|
-
atomicshop/wrappers/socketw/sni.py,sha256=
|
|
320
|
-
atomicshop/wrappers/socketw/socket_client.py,sha256=
|
|
319
|
+
atomicshop/wrappers/socketw/sni.py,sha256=wsouhMreR3AmigW-3iZDvRsnhBS4S01a6SGGYFtBIvA,17907
|
|
320
|
+
atomicshop/wrappers/socketw/socket_client.py,sha256=WWIiCxUX9irN9aWzJ6-1xrXNB_iv_diq3ha1yrWsNGU,22671
|
|
321
321
|
atomicshop/wrappers/socketw/socket_server_tester.py,sha256=Qobmh4XV8ZxLUaw-eW4ESKAbeSLecCKn2OWFzMhadk0,6420
|
|
322
322
|
atomicshop/wrappers/socketw/socket_wrapper.py,sha256=VZe27EQhExaiLQ0FEW4ePJhNSwPMyPzgcl6oljMSbGg,41185
|
|
323
323
|
atomicshop/wrappers/socketw/ssl_base.py,sha256=62-hPm7zla1rh3m_WvDnXqKH-sDUTdiRptD8STCkgdk,2313
|
|
@@ -325,9 +325,9 @@ atomicshop/wrappers/socketw/statistics_csv.py,sha256=_gA8bMX6Sw_UCXKi2y9wNAwlqif
|
|
|
325
325
|
atomicshop/wrappers/winregw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
326
326
|
atomicshop/wrappers/winregw/winreg_installed_software.py,sha256=Qzmyktvob1qp6Tjk2DjLfAqr_yXV0sgWzdMW_9kwNjY,2345
|
|
327
327
|
atomicshop/wrappers/winregw/winreg_network.py,sha256=ih0BVNwByLvf9F_Lac4EdmDYYJA3PzMvmG0PieDZrsE,9905
|
|
328
|
-
atomicshop-3.3.
|
|
329
|
-
atomicshop-3.3.
|
|
330
|
-
atomicshop-3.3.
|
|
331
|
-
atomicshop-3.3.
|
|
332
|
-
atomicshop-3.3.
|
|
333
|
-
atomicshop-3.3.
|
|
328
|
+
atomicshop-3.3.12.dist-info/licenses/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
|
|
329
|
+
atomicshop-3.3.12.dist-info/METADATA,sha256=UT8jiyOESmyvNu499k17z5YofzY-uq_a_XLS2E6kknw,9312
|
|
330
|
+
atomicshop-3.3.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
331
|
+
atomicshop-3.3.12.dist-info/entry_points.txt,sha256=SJEgEP0KoFtfxuGwe5tOzKfXkjR9Dv6YYug33KNYxyY,69
|
|
332
|
+
atomicshop-3.3.12.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
|
|
333
|
+
atomicshop-3.3.12.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|