atomicshop 2.19.19__py3-none-any.whl → 2.20.1__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.

@@ -3,6 +3,8 @@ import select
3
3
  from typing import Literal, Union
4
4
  from pathlib import Path
5
5
  import logging
6
+ import socket
7
+ import multiprocessing
6
8
 
7
9
  from ..psutilw import networks
8
10
  from ..certauthw import certauthw
@@ -67,7 +69,8 @@ class SocketWrapper:
67
69
  logger: logging.Logger = None,
68
70
  exceptions_logger: loggingw.ExceptionCsvLogger = None,
69
71
  statistics_logs_directory: str = None,
70
- request_domain_from_dns_server_queue: queues.NonBlockQueue = None
72
+ request_domain_from_dns_server_queue: multiprocessing.Queue = None,
73
+ engines_domains: dict = None
71
74
  ):
72
75
  """
73
76
  Socket Wrapper class that will be used to create sockets, listen on them, accept connections and send them to
@@ -160,10 +163,18 @@ class SocketWrapper:
160
163
 
161
164
  statistics_writer: statistics_csv.StatisticsCSVWriter object, there is a logger object that
162
165
  will be used to write the statistics file.
163
- :param request_domain_from_dns_server_queue: queues.NonBlockQueue object, non-blocking queue that will be used
166
+ :param request_domain_from_dns_server_queue: multiprocessing queue that will be used
164
167
  to get the domain name that was requested from the DNS server (atomicshop.wrappers.socketw.dns_server).
165
168
  This is used to get the domain name that got to the DNS server and set it to the socket in case SNI
166
169
  was empty (in the SNIHandler class to set the 'server_hostname' for the socket).
170
+ :param engines_domains: dictionary of engines that will be used to process the requests. Example:
171
+ [
172
+ {'this_is_engine_name': ['example.com', 'example.org']},
173
+ {'this_is_engine_name2': ['example2.com', 'example2.org']}
174
+ ]
175
+
176
+ the 'engine_name' for statistics.csv file will be taken from the key of the dictionary, while correlated
177
+ by the domain name from the list in the dictionary.
167
178
  """
168
179
 
169
180
  self.listening_interface: str = listening_interface
@@ -199,7 +210,8 @@ class SocketWrapper:
199
210
  self.statistics_logs_directory: str = statistics_logs_directory
200
211
  self.forwarding_dns_service_ipv4_list___only_for_localhost = (
201
212
  forwarding_dns_service_ipv4_list___only_for_localhost)
202
- self.request_domain_from_dns_server_queue = request_domain_from_dns_server_queue
213
+ self.request_domain_from_dns_server_queue: multiprocessing.Queue = request_domain_from_dns_server_queue
214
+ self.engines_domains: dict = engines_domains
203
215
 
204
216
  self.socket_object = None
205
217
 
@@ -232,7 +244,7 @@ class SocketWrapper:
232
244
  logger_name='SocketWrapper',
233
245
  directory_path=self.statistics_logs_directory,
234
246
  add_stream=True,
235
- add_timedfile=True,
247
+ add_timedfile_with_internal_queue=True,
236
248
  formatter_streamhandler='DEFAULT',
237
249
  formatter_filehandler='DEFAULT'
238
250
  )
@@ -452,10 +464,9 @@ class SocketWrapper:
452
464
  # Get the domain queue. Tried using "Queue.Queue" object, but it stomped the SSL Sockets
453
465
  # from accepting connections.
454
466
  domain_from_dns_server = None
455
- if self.request_domain_from_dns_server_queue.queue:
456
- domain_from_dns_server = self.request_domain_from_dns_server_queue.queue
457
- self.logger.info(
458
- f"Requested domain from DNS Server: {self.request_domain_from_dns_server_queue.queue}")
467
+ if self.request_domain_from_dns_server_queue is not None:
468
+ domain_from_dns_server = self.request_domain_from_dns_server_queue.get()
469
+ self.logger.info(f"Requested domain from DNS Server: {domain_from_dns_server}")
459
470
 
460
471
  # Wait from any connection on "accept()".
461
472
  # 'client_socket' is socket or ssl socket, 'client_address' is a tuple (ip_address, port).
@@ -477,6 +488,11 @@ class SocketWrapper:
477
488
  logger=self.logger)
478
489
  process_name = get_command_instance.get_process_name(print_kwargs={'logger': self.logger})
479
490
 
491
+ source_ip: str = client_address[0]
492
+ source_hostname: str = socket.gethostbyaddr(source_ip)[0]
493
+ engine_name: str = get_engine_name(domain_from_dns_server, self.engines_domains)
494
+ dest_port: int = listening_socket_object.getsockname()[1]
495
+
480
496
  # If 'accept()' function worked well, SSL worked well, then 'client_socket' won't be empty.
481
497
  if client_socket:
482
498
  # Get the protocol type from the socket.
@@ -527,10 +543,21 @@ class SocketWrapper:
527
543
  print_kwargs={'logger': self.logger}
528
544
  )
529
545
 
546
+ # If the 'domain_from_dns_server' is empty, it means that the 'engine_name' is not set.
547
+ # In this case we will set the 'engine_name' to from the SNI.
548
+ if engine_name == '':
549
+ sni_hostname: str = ssl_client_socket.server_hostname
550
+ if sni_hostname:
551
+ engine_name = get_engine_name(sni_hostname, self.engines_domains)
552
+
530
553
  if accept_error_message:
531
554
  # Write statistics after wrap is there was an error.
532
555
  self.statistics_writer.write_accept_error(
556
+ engine=engine_name,
557
+ source_host=source_hostname,
558
+ source_ip=source_ip,
533
559
  error_message=accept_error_message,
560
+ dest_port=str(dest_port),
534
561
  host=domain_from_dns_server,
535
562
  process_name=process_name)
536
563
 
@@ -564,7 +591,11 @@ class SocketWrapper:
564
591
  else:
565
592
  # Write statistics after accept.
566
593
  self.statistics_writer.write_accept_error(
594
+ engine=engine_name,
595
+ source_host=source_hostname,
596
+ source_ip=source_ip,
567
597
  error_message=accept_error_message,
598
+ dest_port=str(dest_port),
568
599
  host=domain_from_dns_server,
569
600
  process_name=process_name)
570
601
  except Exception as e:
@@ -601,3 +632,22 @@ def before_socket_thread_worker(
601
632
  callable_function(*thread_args)
602
633
  except Exception as e:
603
634
  exceptions_logger.write(e)
635
+
636
+
637
+ def get_engine_name(domain: str, engines_domains: dict):
638
+ """
639
+ Function that will get the engine name from the domain name.
640
+ :param domain: string, domain name.
641
+ :param engines_domains: dictionary, dictionary that contains the engine names and domains. Example:
642
+ [
643
+ {'this_is_engine_name': ['example.com', 'example.org']},
644
+ {'this_is_engine_name2': ['example2.com', 'example2.org']}
645
+ ]
646
+ :return: string, engine name.
647
+ """
648
+
649
+ for engine_name, engine_domain_list in engines_domains.items():
650
+ if any(engine_domain in domain for engine_domain in engine_domain_list):
651
+ return engine_name
652
+
653
+ return ''
@@ -6,7 +6,7 @@ from ..loggingw import loggingw
6
6
 
7
7
  LOGGER_NAME: str = 'statistics'
8
8
  STATISTICS_HEADER: str = (
9
- 'request_time_sent,thread_id,tls,protocol,protocol2,protocol3,host,path,command,status_code,request_size_bytes,'
9
+ 'request_time_sent,thread_id,engine,source_host,source_ip,tls,protocol,protocol2,protocol3,dest_port,host,path,command,status_code,request_size_bytes,'
10
10
  'response_size_bytes,file_path,process_cmd,action,error')
11
11
 
12
12
 
@@ -22,7 +22,7 @@ class StatisticsCSVWriter:
22
22
  self.csv_logger = loggingw.create_logger(
23
23
  logger_name=LOGGER_NAME,
24
24
  directory_path=statistics_directory_path,
25
- add_timedfile=True,
25
+ add_timedfile_with_internal_queue=True,
26
26
  formatter_filehandler='MESSAGE',
27
27
  file_type='csv',
28
28
  header=STATISTICS_HEADER
@@ -31,12 +31,16 @@ class StatisticsCSVWriter:
31
31
  def write_row(
32
32
  self,
33
33
  thread_id: str,
34
+ engine: str,
35
+ source_host: str,
36
+ source_ip: str,
34
37
  host: str,
35
38
  tls_type: str,
36
39
  tls_version: str,
37
40
  protocol: str,
38
41
  protocol2: str,
39
42
  protocol3: str,
43
+ dest_port: str,
40
44
  path: str,
41
45
  status_code: str,
42
46
  command: str,
@@ -59,10 +63,14 @@ class StatisticsCSVWriter:
59
63
  escaped_line_string: str = csvs.escape_csv_line_to_string([
60
64
  timestamp,
61
65
  thread_id,
66
+ engine,
67
+ source_host,
68
+ source_ip,
62
69
  tls_info,
63
70
  protocol,
64
71
  protocol2,
65
72
  protocol3,
73
+ dest_port,
66
74
  host,
67
75
  path,
68
76
  command,
@@ -79,7 +87,11 @@ class StatisticsCSVWriter:
79
87
 
80
88
  def write_accept_error(
81
89
  self,
90
+ engine: str,
91
+ source_ip: str,
92
+ source_host: str,
82
93
  error_message: str,
94
+ dest_port: str,
83
95
  host: str,
84
96
  process_name: str,
85
97
  thread_id: str = str()
@@ -88,7 +100,11 @@ class StatisticsCSVWriter:
88
100
  Write the error message to the statistics CSV file.
89
101
  This is used for easier execution, since most of the parameters will be empty on accept.
90
102
 
103
+ :param engine: string, engine name.
104
+ :param source_ip: string, source IP address.
105
+ :param source_host: string, source host name.
91
106
  :param error_message: string, error message.
107
+ :param dest_port: string, destination port.
92
108
  :param host: string, host, the domain or IP address.
93
109
  :param process_name: process name, the command line of the process.
94
110
  :param thread_id: integer, the id of the thread.
@@ -97,12 +113,16 @@ class StatisticsCSVWriter:
97
113
 
98
114
  self.write_row(
99
115
  thread_id=thread_id,
100
- host=host,
116
+ engine=engine,
117
+ source_host=source_host,
118
+ source_ip=source_ip,
101
119
  tls_type='',
102
120
  tls_version='',
103
121
  protocol='',
104
122
  protocol2='',
105
123
  protocol3='',
124
+ dest_port=dest_port,
125
+ host=host,
106
126
  path='',
107
127
  status_code='',
108
128
  command='',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: atomicshop
3
- Version: 2.19.19
3
+ Version: 2.20.1
4
4
  Summary: Atomic functions and classes to make developer life easier
5
5
  Author: Denis Kras
6
6
  License: MIT License
@@ -1,4 +1,4 @@
1
- atomicshop/__init__.py,sha256=9NTN5n9oTHbDX8JvsmHXwnyznaLqNWTJxTHCojA8XBE,124
1
+ atomicshop/__init__.py,sha256=v-nWc0H5hzfYpv98O85V2zxHgjjuPKnvoGqDkz_SCGE,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
@@ -23,9 +23,9 @@ atomicshop/http_parse.py,sha256=1Tna9YbOM0rE3t6i_M-klBlwd1KNSA9skA_BqKGXDFc,1186
23
23
  atomicshop/inspect_wrapper.py,sha256=sGRVQhrJovNygHTydqJj0hxES-aB2Eg9KbIk3G31apw,11429
24
24
  atomicshop/ip_addresses.py,sha256=penRFeJ1-LDVTko4Q0EwK4JiN5cU-KzCBR2VXg9qbUY,1238
25
25
  atomicshop/keyboard_press.py,sha256=1W5kRtOB75fulVx-uF2yarBhW0_IzdI1k73AnvXstk0,452
26
- atomicshop/on_exit.py,sha256=Rpg2SaF0aginuO7JYwA49YJYnS8F6K2jUqhjH65WzuU,6889
26
+ atomicshop/on_exit.py,sha256=9XlOnzoAG8zlI8wBF4AB8hyrC6Q1b84gkhqpAhhdN9g,6977
27
27
  atomicshop/pbtkmultifile_argparse.py,sha256=aEk8nhvoQVu-xyfZosK3ma17CwIgOjzO1erXXdjwtS4,4574
28
- atomicshop/print_api.py,sha256=q9dAQCASk3pHp_PtYIpr6iZmRcW_lvrV_gPPNwTMRsw,11152
28
+ atomicshop/print_api.py,sha256=SJNQIMqSLlYaPtjHnALySAI-jQYuYHOCGgfP7oe96fU,10957
29
29
  atomicshop/process.py,sha256=dmje2YIDPVM8zS38ylAqyOhDBXk6ay_N1xeewKdEIX4,16966
30
30
  atomicshop/python_file_patcher.py,sha256=-uhbUX-um5k-If_XXuOfCr8wMzZ3QE6h9N8xGWw6W_o,5486
31
31
  atomicshop/python_functions.py,sha256=BPZ3sv5DgQs6Xrl3nIMdPABRpgrau3XSrsnDIz-LEwY,6175
@@ -46,7 +46,7 @@ atomicshop/uuids.py,sha256=JSQdm3ZTJiwPQ1gYe6kU0TKS_7suwVrHc8JZDGYlydM,2214
46
46
  atomicshop/venvs.py,sha256=D9lwOoObkYoRx-weuoAmbvN-RdSHhVm4DE9TVl-utAs,903
47
47
  atomicshop/versioning.py,sha256=e5W6m9AF3__M5nntqI9CqNAeHqkwY9JhlnpYeZ1CEus,970
48
48
  atomicshop/virtualization.py,sha256=LPP4vjE0Vr10R6DA4lqhfX_WaNdDGRAZUW0Am6VeGco,494
49
- atomicshop/web.py,sha256=uIYt1WHXllc2wwnsW4AOI_IrAEm9j89qAQa4v3nR8Wk,12105
49
+ atomicshop/web.py,sha256=EVaHNgjfdIyJ4es0g0z7FXie4hic4Dsey_nP9ZuBNOc,12409
50
50
  atomicshop/websocket_parse.py,sha256=aLHWyKqaYqEn_MRBWm2L6rIl6QPmqbVrjEXE_rBzwCw,16711
51
51
  atomicshop/a_installs/ubuntu/docker_rootless.py,sha256=9IPNtGZYjfy1_n6ZRt7gWz9KZgR6XCgevjqq02xk-o0,281
52
52
  atomicshop/a_installs/ubuntu/docker_sudo.py,sha256=JzayxeyKDtiuT4Icp2L2LyFRbx4wvpyN_bHLfZ-yX5E,281
@@ -111,7 +111,7 @@ atomicshop/basics/numbers.py,sha256=ESX0z_7o_ok3sOmCKAUBoZinATklgMy2v-4RndqXlVM,
111
111
  atomicshop/basics/package_module.py,sha256=fBd0uVgFce25ZCVtLq83iyowRlbwdWYFj_t4Ml7LU14,391
112
112
  atomicshop/basics/randoms.py,sha256=DmYLtnIhDK29tAQrGP1Nt-A-v8WC7WIEB8Edi-nk3N4,282
113
113
  atomicshop/basics/strings.py,sha256=mT31UXrn4dgfLtNC6PeBwrkuQHtjdPEiP38VaWgpv3w,21217
114
- atomicshop/basics/threads.py,sha256=xvgdDJdmgN0wmmARoZ-H7Kvl1GOcEbvgaeGL4M3Hcx8,2819
114
+ atomicshop/basics/threads.py,sha256=LDJiprLqdWU4JnPpCOiIC_tEnyssmCqh-6J3gfrO4QA,3195
115
115
  atomicshop/basics/timeit_template.py,sha256=fYLrk-X_dhdVtnPU22tarrhhvlggeW6FdKCXM8zkX68,405
116
116
  atomicshop/basics/tracebacks.py,sha256=pMdnTUTYKdY9SVtMPNBUKL_4uSKulc54NNQjOIHjKxE,506
117
117
  atomicshop/etws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -135,11 +135,11 @@ atomicshop/file_io/xmls.py,sha256=zh3SuK-dNaFq2NDNhx6ivcf4GYCfGM8M10PcEwDSpxk,21
135
135
  atomicshop/mitm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
136
136
  atomicshop/mitm/config_static.py,sha256=DjSnDtMU8srdqca8s6Q-oFCWgjjiCjXRhyk-nafRAUk,7788
137
137
  atomicshop/mitm/config_toml_editor.py,sha256=2p1CMcktWRR_NW-SmyDwylu63ad5e0-w1QPMa8ZLDBw,1635
138
- atomicshop/mitm/connection_thread_worker.py,sha256=TzC-wTdCT7NIkO-x0myvGbDItbFPm82PpoRmK22_tjo,28260
138
+ atomicshop/mitm/connection_thread_worker.py,sha256=6xfQ5MmWR2pqgDfjjelSgHfiTzhprRXNpfhgpoNbsGI,28688
139
139
  atomicshop/mitm/import_config.py,sha256=0Ij14aISTllTOiWYJpIUMOWobQqGofD6uafui5uWllE,9272
140
- atomicshop/mitm/initialize_engines.py,sha256=-3B8xkXyPOwrC_mDJm_uaW9s56VeV-f6VTu4-8dou2s,8258
141
- atomicshop/mitm/message.py,sha256=mNo4Lphr_Jo6IlNX5mPJzABpogWGkjOhwI4meAivwHw,2987
142
- atomicshop/mitm/mitm_main.py,sha256=hLFg5ATozqY8S-4PgHXojy-gDYsj_J9cUFE33RXyyhQ,23584
140
+ atomicshop/mitm/initialize_engines.py,sha256=rijND1jxt3Zs8P0jhcQZc0tgcWD4-nq8ARODiWzhurU,8278
141
+ atomicshop/mitm/message.py,sha256=CDhhm4BTuZE7oNZCjvIZ4BuPOW4MuIzQLOg91hJaxDI,3065
142
+ atomicshop/mitm/mitm_main.py,sha256=DhkdUhe-l6wtX7eUDoy8lsOFhIZkfgxQhEdcYuZd2cQ,25228
143
143
  atomicshop/mitm/recs_files.py,sha256=ZAAD0twun-FtmbSniXe3XQhIlawvANNB_HxwbHj7kwI,3151
144
144
  atomicshop/mitm/shared_functions.py,sha256=0lzeyINd44sVEfFbahJxQmz6KAMWbYrW5ou3UYfItvw,1777
145
145
  atomicshop/mitm/statistic_analyzer.py,sha256=5_sAYGX2Xunzo_pS2W5WijNCwr_BlGJbbOO462y_wN4,27533
@@ -263,9 +263,9 @@ atomicshop/wrappers/fibratusw/install.py,sha256=GnaAAqcXRhovxZ3x5uB9RAXTMCh5xd5k
263
263
  atomicshop/wrappers/loggingw/consts.py,sha256=JWiUJEydjhwatBxtIJsGTmDUSTLbmIRidtR6qRLMaIY,1608
264
264
  atomicshop/wrappers/loggingw/filters.py,sha256=48UVhJHemCS0agXmQP8dHvAHM8r9DFphJ1TNEBP3Dlg,3545
265
265
  atomicshop/wrappers/loggingw/formatters.py,sha256=ZY12IokVY1G_Wzn2Zlv9qjK-e8CtIK6yUgUfPHvH2BU,5802
266
- atomicshop/wrappers/loggingw/handlers.py,sha256=vxaSSnlJGs9NKJvYROKtNjaFTqePdHy0sz-GwN5aNPw,19035
266
+ atomicshop/wrappers/loggingw/handlers.py,sha256=9JoleL96N85e6lEtD92YmKMwupHHON_YbV2ajeOBJ-8,21965
267
267
  atomicshop/wrappers/loggingw/loggers.py,sha256=mmM__XR3W4QC82wbsDRG_M4_0JYGGEP0Qn0WCOSp-go,2910
268
- atomicshop/wrappers/loggingw/loggingw.py,sha256=uLY7DJS-3xIYQBRvI--9eFvdcnvsWSXmtJKS-gTRfjM,20863
268
+ atomicshop/wrappers/loggingw/loggingw.py,sha256=BrzhG0SI_0zkZU1gw6lYLm37l3tTq8-KXohGmJ_DAm8,27109
269
269
  atomicshop/wrappers/loggingw/reading.py,sha256=sCNlgqLNH5XdKqOOjjEox7CvViMHzs6h7-hwCnx4NKk,17566
270
270
  atomicshop/wrappers/mongodbw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
271
271
  atomicshop/wrappers/mongodbw/install_mongodb_ubuntu.py,sha256=2eEOb35T259lhn5koynfTIm1hanxD02zN97ExGSBM2o,4021
@@ -285,7 +285,7 @@ atomicshop/wrappers/playwrightw/javascript.py,sha256=_bW7CAtm0Y8IHYrAalg5HpPFnk6
285
285
  atomicshop/wrappers/playwrightw/keyboard.py,sha256=zN3YddGO-qUkn6C0CRVFejP4cTuaUwXLDNFhFREjERY,422
286
286
  atomicshop/wrappers/playwrightw/locators.py,sha256=6wsLywZxDuii7mwv-zQsRbqQC8r7j96Bma5b5_7ZoVo,2411
287
287
  atomicshop/wrappers/playwrightw/mouse.py,sha256=-2FZbQtjgH7tdXWld6ZPGqlKFUdf5in0ujN0hewxa50,656
288
- atomicshop/wrappers/playwrightw/scenarios.py,sha256=oLrZiWnIc09I0Zvh3IxPVDPsQ-Kbr4QM0TeyXGvlsaY,11494
288
+ atomicshop/wrappers/playwrightw/scenarios.py,sha256=FkdzyvefzQCrCnSiPVjxDlY8x14W8jo_xUQQmHad6Iw,11636
289
289
  atomicshop/wrappers/playwrightw/waits.py,sha256=PBFdz_PoM7Fo7O8hLqMrxNPzBEYgPoXwZceFFCGGeu8,7182
290
290
  atomicshop/wrappers/psutilw/cpus.py,sha256=w6LPBMINqS-T_X8vzdYkLS2Wzuve28Ydp_GafTCngrc,236
291
291
  atomicshop/wrappers/psutilw/disks.py,sha256=3ZSVoommKH1TWo37j_83frB-NqXF4Nf5q5mBCX8G4jE,9221
@@ -313,10 +313,10 @@ atomicshop/wrappers/pywin32w/wmis/win32networkadapter.py,sha256=Jzl95viXZExrrlDT
313
313
  atomicshop/wrappers/pywin32w/wmis/win32process.py,sha256=qMzXtJ5hBZ5ydAyqpDbSx0nO2RJQL95HdmV5SzNKMhk,6826
314
314
  atomicshop/wrappers/socketw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
315
315
  atomicshop/wrappers/socketw/accepter.py,sha256=hZZKVYlF3LOHQJsSIEKXZUf6QXXWm-AtqXZevvaYigE,1732
316
- atomicshop/wrappers/socketw/base.py,sha256=zYwFxiEzTcItFi1RZQCMxMTLBvECVUiKwivPYKcu44g,2713
316
+ atomicshop/wrappers/socketw/base.py,sha256=EcosGkD8VzgBY3GeIHDSG29ThQfXwg3-GQPmBTAqTdw,3048
317
317
  atomicshop/wrappers/socketw/certificator.py,sha256=mtWPJ_ew3OSwt0-1W4jaoco1VIY4NRCrMv3mDUxb_Cc,12418
318
318
  atomicshop/wrappers/socketw/creator.py,sha256=aSwfN_IwXXf4Hob35vHXUxD_OPeshZcRDZU2hMyfKs0,13243
319
- atomicshop/wrappers/socketw/dns_server.py,sha256=vNh22q5CBzCf8Rn50NNDRs05J4AyRSoT78lTT0q-rb4,49141
319
+ atomicshop/wrappers/socketw/dns_server.py,sha256=QEHIQ1onGIOpwZ_nLXvGOgFCM5m-jSwh2HZ2eZC30cE,53337
320
320
  atomicshop/wrappers/socketw/exception_wrapper.py,sha256=B-X5SHLSUIWToihH2MKnOB1F4A81_X0DpLLfnYKYbEc,7067
321
321
  atomicshop/wrappers/socketw/get_process.py,sha256=aJC-_qFUv3NgWCSUzDI72E4z8_-VTZE9NVZ0CwUoNlM,5698
322
322
  atomicshop/wrappers/socketw/receiver.py,sha256=9B3MvcDqr4C3x2fsnjG5SQognd1wRqsBgikxZa0wXG8,8243
@@ -324,14 +324,14 @@ atomicshop/wrappers/socketw/sender.py,sha256=aX_K8l_rHjd5AWb8bi5mt8-YTkMYVRDB6Dn
324
324
  atomicshop/wrappers/socketw/sni.py,sha256=T9PXROiTYYxrd_7X4Hoj9hoNPXXTQpa2HdvmBJJIoeA,17607
325
325
  atomicshop/wrappers/socketw/socket_client.py,sha256=oa3GwS4OPgokrJE5_Oc4-5_wlXHxSH9J5f2DKebms8k,22035
326
326
  atomicshop/wrappers/socketw/socket_server_tester.py,sha256=Qobmh4XV8ZxLUaw-eW4ESKAbeSLecCKn2OWFzMhadk0,6420
327
- atomicshop/wrappers/socketw/socket_wrapper.py,sha256=3JhqFmHcNDWYBSqBiJbyXZ5btkEXtbqVG0r4XRCyFGs,36265
327
+ atomicshop/wrappers/socketw/socket_wrapper.py,sha256=i2-1asl25n_RAVvI0zJMw9VSlb3Mu0AD43VZZuJe7Bk,38740
328
328
  atomicshop/wrappers/socketw/ssl_base.py,sha256=kmiif84kMhBr5yjQW17p935sfjR5JKG0LxIwBA4iVvU,2275
329
- atomicshop/wrappers/socketw/statistics_csv.py,sha256=fgMzDXI0cybwUEqAxprRmY3lqbh30KAV-jOpoFKT-m8,3395
329
+ atomicshop/wrappers/socketw/statistics_csv.py,sha256=WcNyaqEZ82S5-f3kzqi1nllNT2Nd2P_zg8HqCc7vW4s,4120
330
330
  atomicshop/wrappers/winregw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
331
331
  atomicshop/wrappers/winregw/winreg_installed_software.py,sha256=Qzmyktvob1qp6Tjk2DjLfAqr_yXV0sgWzdMW_9kwNjY,2345
332
332
  atomicshop/wrappers/winregw/winreg_network.py,sha256=AENV88H1qDidrcpyM9OwEZxX5svfi-Jb4N6FkS1xtqA,8851
333
- atomicshop-2.19.19.dist-info/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
334
- atomicshop-2.19.19.dist-info/METADATA,sha256=KWtJOQ-e9e2Jw4ea8kbUOl2NODhWXNIEAOZx1uwrcOM,10631
335
- atomicshop-2.19.19.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
336
- atomicshop-2.19.19.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
337
- atomicshop-2.19.19.dist-info/RECORD,,
333
+ atomicshop-2.20.1.dist-info/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
334
+ atomicshop-2.20.1.dist-info/METADATA,sha256=uMkPC6Yuv8XR4at2BPfs8myE_eNqq3C3iyZkvOfmbTk,10630
335
+ atomicshop-2.20.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
336
+ atomicshop-2.20.1.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
337
+ atomicshop-2.20.1.dist-info/RECORD,,