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.
- atomicshop/__init__.py +1 -1
- atomicshop/basics/threads.py +14 -0
- atomicshop/mitm/connection_thread_worker.py +10 -1
- atomicshop/mitm/initialize_engines.py +1 -1
- atomicshop/mitm/message.py +2 -0
- atomicshop/mitm/mitm_main.py +71 -37
- atomicshop/on_exit.py +1 -0
- atomicshop/print_api.py +5 -8
- atomicshop/web.py +5 -2
- atomicshop/wrappers/loggingw/handlers.py +148 -98
- atomicshop/wrappers/loggingw/loggingw.py +186 -23
- atomicshop/wrappers/playwrightw/scenarios.py +5 -2
- atomicshop/wrappers/socketw/base.py +13 -0
- atomicshop/wrappers/socketw/dns_server.py +100 -12
- atomicshop/wrappers/socketw/socket_wrapper.py +58 -8
- atomicshop/wrappers/socketw/statistics_csv.py +23 -3
- {atomicshop-2.19.19.dist-info → atomicshop-2.20.1.dist-info}/METADATA +1 -1
- {atomicshop-2.19.19.dist-info → atomicshop-2.20.1.dist-info}/RECORD +21 -21
- {atomicshop-2.19.19.dist-info → atomicshop-2.20.1.dist-info}/LICENSE.txt +0 -0
- {atomicshop-2.19.19.dist-info → atomicshop-2.20.1.dist-info}/WHEEL +0 -0
- {atomicshop-2.19.19.dist-info → atomicshop-2.20.1.dist-info}/top_level.txt +0 -0
|
@@ -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:
|
|
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:
|
|
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
|
-
|
|
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
|
|
456
|
-
domain_from_dns_server = self.request_domain_from_dns_server_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
|
-
|
|
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
|
-
|
|
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,4 +1,4 @@
|
|
|
1
|
-
atomicshop/__init__.py,sha256=
|
|
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=
|
|
26
|
+
atomicshop/on_exit.py,sha256=9XlOnzoAG8zlI8wBF4AB8hyrC6Q1b84gkhqpAhhdN9g,6977
|
|
27
27
|
atomicshop/pbtkmultifile_argparse.py,sha256=aEk8nhvoQVu-xyfZosK3ma17CwIgOjzO1erXXdjwtS4,4574
|
|
28
|
-
atomicshop/print_api.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
141
|
-
atomicshop/mitm/message.py,sha256=
|
|
142
|
-
atomicshop/mitm/mitm_main.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
334
|
-
atomicshop-2.
|
|
335
|
-
atomicshop-2.
|
|
336
|
-
atomicshop-2.
|
|
337
|
-
atomicshop-2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|