atomicshop 3.3.10__py3-none-any.whl → 3.3.11__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 CHANGED
@@ -1,4 +1,4 @@
1
1
  """Atomic Basic functions and classes to make developer life easier"""
2
2
 
3
3
  __author__ = "Den Kras"
4
- __version__ = '3.3.10'
4
+ __version__ = '3.3.11'
@@ -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
@@ -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
- by_type: Literal['host', 'url'],
351
- moving_average_window_days: int,
352
- top_bottom_deviation_percentage: float,
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
- by_type: Literal['host', 'url'],
14
- moving_average_window_days,
15
- top_bottom_deviation_percentage: float,
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
- statistics_content[date_string]['content_no_useless'] = get_content_without_useless(log_file_content)
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
- ssl_key_logfile = os.environ.get('SSLKEYLOGFILE')
66
- if ssl_key_logfile:
67
- ssl_context.keylog_filename = ssl_key_logfile
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomicshop
3
- Version: 3.3.10
3
+ Version: 3.3.11
4
4
  Summary: Atomic functions and classes to make developer life easier
5
5
  Author: Denis Kras
6
6
  License-Expression: MIT
@@ -1,4 +1,4 @@
1
- atomicshop/__init__.py,sha256=HY3DYsUk0tU3jIXn3TtE_YStylYwC51UrRbr7MMqCM0,123
1
+ atomicshop/__init__.py,sha256=gOyGIspx_71ouLT3MwQVk9LSKCkf42b7QXpvX8qAHVc,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=yNlELenRvLvW37dl2zXstts5zLklay9xF7sVu_AytKM,8839
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=50RP7De2t0WlUk4Ywmv6B63GwvtvoJ9mULo9Q3b-zcY,32992
135
- atomicshop/mitm/import_config.py,sha256=J3ZLF28AsKu1h76iRV_sCM52g0oh4dwDGddZl_XcJsU,18351
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=5_sAYGX2Xunzo_pS2W5WijNCwr_BlGJbbOO462y_wN4,27533
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=UnnY_FSTiXEfZ8SkDKU2s2qpgPYu1oOT99ghmY-zzas,19992
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=LGI4gcgJ47thx6f96rjwjPz3CsTAIv6VxWFY4EyUF2E,13667
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=YlKavbExcPFfHFLYAJ3i3W6QorY7o4mbQp39g-DnDKA,17911
320
- atomicshop/wrappers/socketw/socket_client.py,sha256=McBd3DeCy787oDGCEMUEP2awWy3vdkPqr9w-aFh2fBM,22502
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.10.dist-info/licenses/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
329
- atomicshop-3.3.10.dist-info/METADATA,sha256=Lfm_L1nmudKGv7HXvn9CwF79LD6LdVejuk7lW--4XTE,9312
330
- atomicshop-3.3.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
331
- atomicshop-3.3.10.dist-info/entry_points.txt,sha256=SJEgEP0KoFtfxuGwe5tOzKfXkjR9Dv6YYug33KNYxyY,69
332
- atomicshop-3.3.10.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
333
- atomicshop-3.3.10.dist-info/RECORD,,
328
+ atomicshop-3.3.11.dist-info/licenses/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
329
+ atomicshop-3.3.11.dist-info/METADATA,sha256=24nuyg6-L1PguydiSCUqDwYMjpgtD7v8Gfq2DEKo2Cs,9312
330
+ atomicshop-3.3.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
331
+ atomicshop-3.3.11.dist-info/entry_points.txt,sha256=SJEgEP0KoFtfxuGwe5tOzKfXkjR9Dv6YYug33KNYxyY,69
332
+ atomicshop-3.3.11.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
333
+ atomicshop-3.3.11.dist-info/RECORD,,