atomicshop 2.11.49__py3-none-any.whl → 2.12.0__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__ = '2.11.49'
4
+ __version__ = '2.12.0'
@@ -0,0 +1,9 @@
1
+ from atomicshop.wrappers.fibratusw import install
2
+
3
+
4
+ def main():
5
+ install.install_fibratus(remove_file_after_installation=True)
6
+
7
+
8
+ if __name__ == '__main__':
9
+ main()
atomicshop/filesystem.py CHANGED
@@ -6,6 +6,8 @@ import shutil
6
6
  import stat
7
7
  import errno
8
8
  from contextlib import contextmanager
9
+ from typing import Literal
10
+ import tempfile
9
11
 
10
12
  import psutil
11
13
 
@@ -115,6 +117,22 @@ def get_working_directory() -> str:
115
117
  return str(Path.cwd())
116
118
 
117
119
 
120
+ def get_temp_directory() -> str:
121
+ """
122
+ The function returns temporary directory of the system.
123
+
124
+ :return: string.
125
+ """
126
+
127
+ # Get the temporary directory in 8.3 format
128
+ short_temp_dir = tempfile.gettempdir()
129
+
130
+ # Convert to the long path name
131
+ long_temp_dir = str(Path(short_temp_dir).resolve())
132
+
133
+ return long_temp_dir
134
+
135
+
118
136
  def get_file_directory(file_path: str) -> str:
119
137
  """
120
138
  The function will return directory of the file.
@@ -1273,3 +1291,31 @@ def is_file_open_by_process(file_path: str) -> bool:
1273
1291
  continue
1274
1292
 
1275
1293
  return False
1294
+
1295
+
1296
+ def get_download_directory(place: Literal['temp', 'script', 'working'] = 'temp', script_path: str = None) -> str:
1297
+ """
1298
+ The function returns the default download directory based on place.
1299
+
1300
+ :param place: string,
1301
+ 'temp', then the function will return the temporary directory.
1302
+ 'script', then the function will return the directory of the script.
1303
+ 'working', then the function will return the working directory.
1304
+ :param script_path: string, full path to the script.
1305
+ :return: string, full path to the default download directory.
1306
+ """
1307
+
1308
+ if place == 'script' and script_path is None:
1309
+ raise ValueError("Script path must be specified if place is 'script'.")
1310
+
1311
+ # Get the download directory based on the operating system
1312
+ if place == 'script':
1313
+ download_directory = get_file_directory(script_path)
1314
+ elif place == 'working':
1315
+ download_directory = get_working_directory()
1316
+ elif place == 'temp':
1317
+ download_directory = get_temp_directory()
1318
+ else:
1319
+ raise ValueError("Invalid place specified.")
1320
+
1321
+ return download_directory
atomicshop/permissions.py CHANGED
@@ -108,3 +108,32 @@ def expand_user_path(user_name, path):
108
108
  pwnam = pwd.getpwnam(user_name)
109
109
  home_dir = pwnam.pw_dir
110
110
  return path.replace("~", home_dir)
111
+
112
+
113
+ def unblock_file_windows(file_path):
114
+ """
115
+ Unblock a file on Windows. This is used to unblock files downloaded from the internet.
116
+ When you Right-click then navigate to Properties, you will see the Unblock checkbox.
117
+ :param file_path:
118
+ :return:
119
+ """
120
+ try:
121
+ subprocess.run(["powershell", "-Command", f"Unblock-File -Path '{file_path}'"], check=True)
122
+ print(f"Successfully unblocked the file: {file_path}")
123
+ except subprocess.CalledProcessError as e:
124
+ print(f"Failed to unblock the file: {file_path}\nError: {e}")
125
+
126
+
127
+ def get_command_to_run_as_admin_windows(command: str) -> str:
128
+ """
129
+ Function returns the command to run a command as administrator on Windows.
130
+ :param command: str, command to run.
131
+ :return: str, command to run as administrator.
132
+ """
133
+
134
+ executable = command.split()[0]
135
+ command = (
136
+ f"powershell -Command "
137
+ f"\"Start-Process {executable} -ArgumentList '{' '.join(command.split()[1:])}' -Verb RunAs\"")
138
+
139
+ return command
atomicshop/web.py CHANGED
@@ -174,6 +174,7 @@ def download(file_url: str, target_directory: str, file_name: str = None, **kwar
174
174
  file_path: str = f'{target_directory}{os.sep}{file_name}'
175
175
 
176
176
  print_api(f'Downloading: {file_url}', **kwargs)
177
+ print_api(f'To: {file_path}', **kwargs)
177
178
 
178
179
  # In order to use 'urllib.request', it is not enough to 'import urllib', you need to 'import urllib.request'.
179
180
  # Open the URL for data gathering.
File without changes
@@ -0,0 +1,81 @@
1
+ import os.path
2
+ import subprocess
3
+ import time
4
+ from typing import Literal
5
+
6
+ from .. import githubw, msiw
7
+ from ... import filesystem
8
+ from ...print_api import print_api
9
+
10
+
11
+ DEFAULT_INSTALLATION_EXE_PATH = r"C:\Program Files\Fibratus\Bin\fibratus.exe"
12
+ WAIT_SECONDS_FOR_EXECUTABLE_TO_APPEAR_AFTER_INSTALLATION: float = 10
13
+
14
+
15
+ def install_fibratus(
16
+ installation_file_download_directory: str = None,
17
+ place_to_download_file: Literal['working', 'temp', 'script'] = 'temp',
18
+ remove_file_after_installation: bool = False
19
+ ):
20
+ """
21
+ Download latest release from GitHub and install Fibratus.
22
+ :param installation_file_download_directory: Directory to download the installation file. If None, the download
23
+ directory will be automatically determined, by the 'place_to_download_file' parameter.
24
+ :param place_to_download_file: Where to download the installation file.
25
+ 'working' is the working directory of the script.
26
+ 'temp' is the temporary directory.
27
+ 'script' is the directory of the script.
28
+ :param remove_file_after_installation: Whether to remove the installation file after installation.
29
+ :return:
30
+ """
31
+
32
+ if not installation_file_download_directory:
33
+ installation_file_download_directory = filesystem.get_download_directory(
34
+ place=place_to_download_file, script_path=__file__)
35
+
36
+ github_wrapper = githubw.GitHubWrapper(user_name='rabbitstack', repo_name='fibratus')
37
+ fibratus_setup_file_path: str = github_wrapper.download_latest_release(
38
+ target_directory=installation_file_download_directory,
39
+ string_pattern='*fibratus-*-amd64.msi',
40
+ exclude_string='slim')
41
+
42
+ # Install the MSI file
43
+ msiw.install_msi(
44
+ msi_path=fibratus_setup_file_path, exit_on_error=True, as_admin=True)
45
+
46
+ count = 0
47
+ while count != WAIT_SECONDS_FOR_EXECUTABLE_TO_APPEAR_AFTER_INSTALLATION:
48
+ if os.path.isfile(DEFAULT_INSTALLATION_EXE_PATH):
49
+ break
50
+ count += 1
51
+ time.sleep(1)
52
+
53
+ if count == WAIT_SECONDS_FOR_EXECUTABLE_TO_APPEAR_AFTER_INSTALLATION:
54
+ message = \
55
+ (f"Fibratus installation failed. The executable was not found after "
56
+ f"{str(WAIT_SECONDS_FOR_EXECUTABLE_TO_APPEAR_AFTER_INSTALLATION)} seconds.\n"
57
+ f"{DEFAULT_INSTALLATION_EXE_PATH}")
58
+ print_api(message, color="red")
59
+
60
+ result = None
61
+ # Check if the installation was successful
62
+ try:
63
+ result = subprocess.run([DEFAULT_INSTALLATION_EXE_PATH], capture_output=True, text=True)
64
+ except FileNotFoundError:
65
+ print_api("Fibratus executable not found.", color="red")
66
+
67
+ if result:
68
+ if result.returncode == 0:
69
+ print_api("Fibratus installed successfully. Please restart.", color="green")
70
+ else:
71
+ print_api("Fibratus installation failed.", color="red")
72
+ print_api(result.stderr)
73
+ raise Exception("Fibratus installation failed.")
74
+ else:
75
+ print_api("Fibratus executable not found.", color="red")
76
+
77
+ # Wait for the installation to finish before removing the file.
78
+ time.sleep(5)
79
+
80
+ if remove_file_after_installation:
81
+ filesystem.remove_file(fibratus_setup_file_path)
@@ -3,6 +3,7 @@ import fnmatch
3
3
 
4
4
  from .. import web, urls
5
5
  from ..print_api import print_api
6
+ from ..basics import strings
6
7
 
7
8
 
8
9
  class GitHubWrapper:
@@ -146,22 +147,17 @@ class GitHubWrapper:
146
147
  archive_remove_first_directory=archive_remove_first_directory,
147
148
  **kwargs)
148
149
 
149
- def download_and_extract_latest_release(
150
+ def get_latest_release_url(
150
151
  self,
151
- target_directory: str,
152
152
  string_pattern: str,
153
- archive_remove_first_directory: bool = False,
153
+ exclude_string: str = None,
154
154
  **kwargs):
155
155
  """
156
- This function will download the latest release from the GitHub repository, extract the file and remove the file,
157
- leaving only the extracted folder.
158
- :param target_directory: str, the target directory to download and extract the file.
156
+ This function will return the latest release url.
159
157
  :param string_pattern: str, the string pattern to search in the latest release. Wildcards can be used.
160
- :param archive_remove_first_directory: bool, sets if archive extract function will extract the archive
161
- without first directory in the archive. Check reference in the
162
- 'archiver.zip.extract_archive_with_zipfile' function.
158
+ :param exclude_string: str, the string to exclude from the search. No wildcards can be used.
163
159
  :param kwargs: dict, the print arguments for the 'print_api' function.
164
- :return:
160
+ :return: str, the latest release url.
165
161
  """
166
162
 
167
163
  # Get the 'assets' key of the latest release json.
@@ -172,6 +168,12 @@ class GitHubWrapper:
172
168
  for single_dict in github_latest_releases_list:
173
169
  download_urls.append(single_dict['browser_download_url'])
174
170
 
171
+ # Exclude urls against 'exclude_string'.
172
+ if exclude_string:
173
+ for download_url in download_urls:
174
+ if exclude_string in download_url:
175
+ download_urls.remove(download_url)
176
+
175
177
  # Find urls against 'string_pattern'.
176
178
  found_urls = fnmatch.filter(download_urls, string_pattern)
177
179
 
@@ -182,8 +184,55 @@ class GitHubWrapper:
182
184
  f'{found_urls}'
183
185
  print_api(message, color="red", error_type=True, **kwargs)
184
186
 
187
+ return found_urls[0]
188
+
189
+ def download_latest_release(
190
+ self,
191
+ target_directory: str,
192
+ string_pattern: str,
193
+ exclude_string: str = None,
194
+ **kwargs):
195
+ """
196
+ This function will download the latest release from the GitHub repository.
197
+ :param target_directory: str, the target directory to download the file.
198
+ :param string_pattern: str, the string pattern to search in the latest release. Wildcards can be used.
199
+ :param exclude_string: str, the string to exclude from the search. No wildcards can be used.
200
+ The 'excluded_string' will be filtered before the 'string_pattern' entries.
201
+ :param kwargs: dict, the print arguments for the 'print_api' function.
202
+ :return:
203
+ """
204
+
205
+ # Get the latest release url.
206
+ found_url = self.get_latest_release_url(string_pattern=string_pattern, exclude_string=exclude_string, **kwargs)
207
+
208
+ downloaded_file_path = web.download(file_url=found_url, target_directory=target_directory, **kwargs)
209
+ return downloaded_file_path
210
+
211
+ def download_and_extract_latest_release(
212
+ self,
213
+ target_directory: str,
214
+ string_pattern: str,
215
+ exclude_string: str = None,
216
+ archive_remove_first_directory: bool = False,
217
+ **kwargs):
218
+ """
219
+ This function will download the latest release from the GitHub repository, extract the file and remove the file,
220
+ leaving only the extracted folder.
221
+ :param target_directory: str, the target directory to download and extract the file.
222
+ :param string_pattern: str, the string pattern to search in the latest release. Wildcards can be used.
223
+ :param exclude_string: str, the string to exclude from the search. No wildcards can be used.
224
+ :param archive_remove_first_directory: bool, sets if archive extract function will extract the archive
225
+ without first directory in the archive. Check reference in the
226
+ 'archiver.zip.extract_archive_with_zipfile' function.
227
+ :param kwargs: dict, the print arguments for the 'print_api' function.
228
+ :return:
229
+ """
230
+
231
+ # Get the latest release url.
232
+ found_url = self.get_latest_release_url(string_pattern=string_pattern, exclude_string=exclude_string, **kwargs)
233
+
185
234
  web.download_and_extract_file(
186
- file_url=found_urls[0],
235
+ file_url=found_url,
187
236
  target_directory=target_directory,
188
237
  archive_remove_first_directory=archive_remove_first_directory,
189
238
  **kwargs)
@@ -0,0 +1,60 @@
1
+ import subprocess
2
+
3
+ from ..print_api import print_api
4
+ from .. import permissions
5
+
6
+
7
+ ERROR_CODES = {
8
+ '1603': 'The App is already installed or Insufficient permissions',
9
+ '1619': 'This installation package could not be opened. Verify that the package exists and that you can '
10
+ 'install it manually, also check the installation command line switches'
11
+ }
12
+
13
+
14
+ def install_msi(
15
+ msi_path,
16
+ silent_no_gui=True,
17
+ silent_progress_bar=False,
18
+ no_restart=True,
19
+ as_admin=False,
20
+ exit_on_error=False,
21
+ print_kwargs=None):
22
+ """
23
+ Install an MSI file silently.
24
+ :param msi_path: str, path to the MSI file.
25
+ :param silent_no_gui: bool, whether to run the installation silently, without showing GUI.
26
+ :param silent_progress_bar: bool, whether to show a progress bar during silent installation.
27
+ :param no_restart: bool, whether to restart the computer after installation.
28
+ :param as_admin: bool, whether to run the installation as administrator.
29
+ :param exit_on_error: bool, whether to exit the script if the installation fails.
30
+ :param print_kwargs: dict, print_api kwargs.
31
+ :return:
32
+ """
33
+
34
+ if silent_progress_bar and silent_no_gui:
35
+ raise ValueError("silent_progress_bar and silent_no_gui cannot be both True.")
36
+
37
+ # Define the msiexec command
38
+ command = f'msiexec /i "{msi_path}"'
39
+
40
+ if silent_no_gui:
41
+ command = f"{command} /qn"
42
+ if silent_progress_bar:
43
+ command = f"{command} /qb"
44
+ if no_restart:
45
+ command = f"{command} /norestart"
46
+
47
+ if as_admin:
48
+ command = permissions.get_command_to_run_as_admin_windows(command)
49
+
50
+ # Run the command
51
+ result = subprocess.run(command, capture_output=True, shell=True, text=True)
52
+
53
+ # Check the result
54
+ if result.returncode == 0:
55
+ print_api("MSI Installation completed.", color="green", **(print_kwargs or {}))
56
+ else:
57
+ message = f"Installation failed. Return code: {result.returncode}\n{ERROR_CODES.get(str(result.returncode), '')}"
58
+ print_api(message, color="red", **(print_kwargs or {}))
59
+ if exit_on_error:
60
+ exit()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: atomicshop
3
- Version: 2.11.49
3
+ Version: 2.12.0
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=qgi85ZKKeYx9w0YfZF0iWyjf6YkZavOGGnHhYdTgoP4,124
1
+ atomicshop/__init__.py,sha256=8ZKqx9-Se0JtEyqegyhmE18yPrampj8_boZTeK7vSMc,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
@@ -14,7 +14,7 @@ atomicshop/dns.py,sha256=bNZOo5jVPzq7OT2qCPukXoK3zb1oOsyaelUwQEyK1SA,2500
14
14
  atomicshop/domains.py,sha256=Rxu6JhhMqFZRcoFs69IoEd1PtYca0lMCG6F1AomP7z4,3197
15
15
  atomicshop/emails.py,sha256=I0KyODQpIMEsNRi9YWSOL8EUPBiWyon3HRdIuSj3AEU,1410
16
16
  atomicshop/file_types.py,sha256=-0jzQMRlmU1AP9DARjk-HJm1tVE22E6ngP2mRblyEjY,763
17
- atomicshop/filesystem.py,sha256=M4x2jTPMOyvwxJD9hJzgJ6BgF2Z9SIDf2Ye4ImXvXtY,47268
17
+ atomicshop/filesystem.py,sha256=JVWoOSkm-lfh11nBMlrP0w_YnrTFnJ5noYLtoN5Nf5o,48809
18
18
  atomicshop/functions.py,sha256=pK8hoCE9z61PtWCxQJsda7YAphrLH1wxU5x-1QJP-sY,499
19
19
  atomicshop/hashing.py,sha256=Le8qGFyt3_wX-zGTeQShz7L2HL_b6nVv9PnawjglyHo,3474
20
20
  atomicshop/http_parse.py,sha256=nrf2rZcprLqtW8HVrV7TCZ1iTBcWRRy-mXIlAOzcaJs,9703
@@ -22,7 +22,7 @@ atomicshop/inspect_wrapper.py,sha256=sGRVQhrJovNygHTydqJj0hxES-aB2Eg9KbIk3G31apw
22
22
  atomicshop/ip_addresses.py,sha256=Hvi4TumEFoTEpKWaq5WNF-YzcRzt24IxmNgv-Mgax1s,1190
23
23
  atomicshop/keyboard_press.py,sha256=1W5kRtOB75fulVx-uF2yarBhW0_IzdI1k73AnvXstk0,452
24
24
  atomicshop/pbtkmultifile_argparse.py,sha256=aEk8nhvoQVu-xyfZosK3ma17CwIgOjzO1erXXdjwtS4,4574
25
- atomicshop/permissions.py,sha256=441sSs7QBX3cuFIEG8U-RiiDwXE5XL-PESpRbZLKqqw,3047
25
+ atomicshop/permissions.py,sha256=pGynX57FqFdCW2Y6dE1T0oqL7ujagMAABw7nPHxi2IQ,4094
26
26
  atomicshop/print_api.py,sha256=DhbCQd0MWZZ5GYEk4oTu1opRFC-b31g1VWZgTGewG2Y,11568
27
27
  atomicshop/process.py,sha256=kOLrpUb5T5QN9ZvpGOjXyo7Kivrc14A9gcw9lvNMidI,15670
28
28
  atomicshop/process_name_cmd.py,sha256=TNAK6kQZm5JKWzEW6QLqVHEG98ZLNDQiSS4YwDk8V8c,3830
@@ -44,7 +44,7 @@ atomicshop/timer.py,sha256=KxBBgVM8po6pUJDW8TgY1UXj0iiDmRmL5XDCq0VHAfU,1670
44
44
  atomicshop/urls.py,sha256=CQl1j1kjEVDlAuYJqYD9XxPF1SUSgrmG8PjlcXNEKsQ,597
45
45
  atomicshop/uuids.py,sha256=JSQdm3ZTJiwPQ1gYe6kU0TKS_7suwVrHc8JZDGYlydM,2214
46
46
  atomicshop/virtualization.py,sha256=LPP4vjE0Vr10R6DA4lqhfX_WaNdDGRAZUW0Am6VeGco,494
47
- atomicshop/web.py,sha256=7WPV6Q4xZX7bByEeCl2VAfPlyMY42BpR_byVX0Gu7Js,11071
47
+ atomicshop/web.py,sha256=Ks_4F02MUqGvFRC-gs2H_NHk3jf1XIzrf_Q_NFb3re4,11116
48
48
  atomicshop/addons/PlayWrightCodegen.cmd,sha256=Z5cnllsyXD4F1W2h-WLEnyFkg5nZy0-hTGHRWXVOuW4,173
49
49
  atomicshop/addons/ScriptExecution.cmd,sha256=8iC-uHs9MX9qUD_C2M7n9Xw4MZvwOfxT8H5v3hluVps,93
50
50
  atomicshop/addons/a_setup_scripts/install_psycopg2_ubuntu.sh,sha256=lM7LkXQ2AxfFzDGyzSOfIS_zpg9bAD1k3JJ-qu5CdH8,81
@@ -52,11 +52,13 @@ atomicshop/addons/a_setup_scripts/install_pywintrace_0.3.cmd,sha256=lEP_o6rWcBFU
52
52
  atomicshop/addons/mains/install_docker_rootless_ubuntu.py,sha256=9IPNtGZYjfy1_n6ZRt7gWz9KZgR6XCgevjqq02xk-o0,281
53
53
  atomicshop/addons/mains/install_docker_ubuntu_main_sudo.py,sha256=JzayxeyKDtiuT4Icp2L2LyFRbx4wvpyN_bHLfZ-yX5E,281
54
54
  atomicshop/addons/mains/install_elastic_search_and_kibana_ubuntu.py,sha256=yRB-l1zBxdiN6av-FwNkhcBlaeu4zrDPjQ0uPGgpK2I,244
55
+ atomicshop/addons/mains/install_fibratus_windows.py,sha256=TU4e9gdZ_zI73C40uueJ59pD3qmN-UFGdX5GFoVf6cM,179
55
56
  atomicshop/addons/mains/install_wsl_ubuntu_lts_admin.py,sha256=PrvZ4hMuadzj2GYKRZSwyNayJUuaSnCF9nV6ORqoPdo,123
56
57
  atomicshop/addons/mains/msi_unpacker.py,sha256=XAJdEqs-3s9JqIgHpGRL-HxLKpFMXdrlXmq2Is2Pyfk,164
57
58
  atomicshop/addons/mains/search_for_hyperlinks_in_docx.py,sha256=HkIdo_Sz9nPbbbJf1mwfwFkyI7vkvpH8qiIkuYopN4w,529
58
59
  atomicshop/addons/mains/FACT/factw_fact_extractor_docker_image_main_sudo.py,sha256=DDKX3Wp2SmzMCEtCIEOUbEKMob2ZQ7VEQGLEf9uYXrs,320
59
60
  atomicshop/addons/mains/FACT/update_extract.py,sha256=H3VsdhlA7xxK5lI_nyrWUdk8GNZXbEUVR_K9cJ4ECAw,506
61
+ atomicshop/addons/mains/__pycache__/install_fibratus_windows.cpython-312.pyc,sha256=u92dFjDrTbZBIti9B3ttna33Jg1ZSeMYhTiupdfklt4,549
60
62
  atomicshop/addons/mains/inits/init_to_import_all_modules.py,sha256=piyFjkqtNbM9PT2p8aGcatI615517XEQHgU9kDFwseY,559
61
63
  atomicshop/addons/package_setup/CreateWheel.cmd,sha256=hq9aWBSH6iffYlZyaCNrFlA0vxMh3j1k8DQE8IARQuA,189
62
64
  atomicshop/addons/package_setup/Setup in Edit mode.cmd,sha256=299RsExjR8Mup6YyC6rW0qF8lnwa3uIzwk_gYg_R_Ss,176
@@ -147,7 +149,8 @@ atomicshop/wrappers/astw.py,sha256=VkYfkfyc_PJLIOxByT6L7B8uUmKY6-I8XGZl4t_z828,4
147
149
  atomicshop/wrappers/configparserw.py,sha256=JwDTPjZoSrv44YKwIRcjyUnpN-FjgXVfMqMK_tJuSgU,22800
148
150
  atomicshop/wrappers/cryptographyw.py,sha256=H5NaHHDkr97QYhUrHFO9vY218u8k3N3Zgh6bQRnicUE,13140
149
151
  atomicshop/wrappers/ffmpegw.py,sha256=wcq0ZnAe0yajBOuTKZCCaKI7CDBjkq7FAgdW5IsKcVE,6031
150
- atomicshop/wrappers/githubw.py,sha256=mQGtj6up1HIvjOD2t0bmOWjLooJLYvuIa7d7H-tknrw,9998
152
+ atomicshop/wrappers/githubw.py,sha256=AQcFuT5mvDUNT_cI31MwkJ7srdhMtttF8FyXS8vs5cU,12270
153
+ atomicshop/wrappers/msiw.py,sha256=1kEs9T3eJYGzEpEBXaq8OZxlCnV4gnIR4zhmCsQiKvY,2201
151
154
  atomicshop/wrappers/numpyw.py,sha256=sBV4gSKyr23kXTalqAb1oqttzE_2XxBooCui66jbAqc,1025
152
155
  atomicshop/wrappers/olefilew.py,sha256=biD5m58rogifCYmYhJBrAFb9O_Bn_spLek_9HofLeYE,2051
153
156
  atomicshop/wrappers/pipw.py,sha256=mu4jnHkSaYNfpBiLZKMZxEX_E2LqW5BVthMZkblPB_c,1317
@@ -204,6 +207,8 @@ atomicshop/wrappers/factw/rest/firmware.py,sha256=FezneouU1lUO9uZ6_8ZQNxr4MDlFIo
204
207
  atomicshop/wrappers/factw/rest/router.py,sha256=fdGok5ESBxcZHIBgM93l4yTPRGoeooQNsrPWIETieGk,710
205
208
  atomicshop/wrappers/factw/rest/statistics.py,sha256=vznwzKP1gEF7uXz3HsuV66BU9wrp73N_eFqpFpye9Qw,653
206
209
  atomicshop/wrappers/factw/rest/status.py,sha256=4O3xS1poafwyUiLDkhyx4oMMe4PBwABuRPpOMnMKgIU,641
210
+ atomicshop/wrappers/fibratusw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
211
+ atomicshop/wrappers/fibratusw/install.py,sha256=PLVymDe0HuOvU0r2lje8BkQAgtiOWEeRO7n-1zKuL7A,3287
207
212
  atomicshop/wrappers/loggingw/checks.py,sha256=AGFsTsLxHQd1yAraa5popqLaGO9VM0KpcPGuSLn5ptU,719
208
213
  atomicshop/wrappers/loggingw/formatters.py,sha256=mUtcJJfmhLNrwUVYShXTmdu40dBaJu4TS8FiuTXI7ys,7189
209
214
  atomicshop/wrappers/loggingw/handlers.py,sha256=qm5Fbu8eDmlstMduUe5nKUlJU5IazFkSnQizz8Qt2os,5479
@@ -244,8 +249,8 @@ atomicshop/wrappers/socketw/socket_server_tester.py,sha256=AhpurHJmP2kgzHaUbq5ey
244
249
  atomicshop/wrappers/socketw/socket_wrapper.py,sha256=aXBwlEIJhFT0-c4i8iNlFx2It9VpCEpsv--5Oqcpxao,11624
245
250
  atomicshop/wrappers/socketw/ssl_base.py,sha256=k4V3gwkbq10MvOH4btU4onLX2GNOsSfUAdcHmL1rpVE,2274
246
251
  atomicshop/wrappers/socketw/statistics_csv.py,sha256=t3dtDEfN47CfYVi0CW6Kc2QHTEeZVyYhc57IYYh5nmA,826
247
- atomicshop-2.11.49.dist-info/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
248
- atomicshop-2.11.49.dist-info/METADATA,sha256=2Q8mFvwf5Wx4Hyhu2Ngv8Hr2U4hfvkBFGiNpaVdSkg4,10448
249
- atomicshop-2.11.49.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
250
- atomicshop-2.11.49.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
251
- atomicshop-2.11.49.dist-info/RECORD,,
252
+ atomicshop-2.12.0.dist-info/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
253
+ atomicshop-2.12.0.dist-info/METADATA,sha256=yur7wBqT9rw3Av358zCJ1dGraOU-lnOLyUXzoRDu_yc,10447
254
+ atomicshop-2.12.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
255
+ atomicshop-2.12.0.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
256
+ atomicshop-2.12.0.dist-info/RECORD,,