atomicshop 3.3.6__py3-none-any.whl → 3.3.8__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/consoles.py +9 -0
- atomicshop/mitm/engines/create_module_template.py +10 -4
- atomicshop/wrappers/socketw/socket_wrapper.py +6 -1
- {atomicshop-3.3.6.dist-info → atomicshop-3.3.8.dist-info}/METADATA +1 -1
- {atomicshop-3.3.6.dist-info → atomicshop-3.3.8.dist-info}/RECORD +10 -15
- atomicshop/a_installs/pywintrace.py +0 -26
- atomicshop/a_installs/ubuntu/pycharm.py +0 -8
- atomicshop/a_installs/win/pycharm.py +0 -9
- atomicshop/wrappers/pycharmw/__init__.py +0 -0
- atomicshop/wrappers/pycharmw/ubuntu.py +0 -36
- atomicshop/wrappers/pycharmw/win.py +0 -81
- {atomicshop-3.3.6.dist-info → atomicshop-3.3.8.dist-info}/WHEEL +0 -0
- {atomicshop-3.3.6.dist-info → atomicshop-3.3.8.dist-info}/entry_points.txt +0 -0
- {atomicshop-3.3.6.dist-info → atomicshop-3.3.8.dist-info}/licenses/LICENSE.txt +0 -0
- {atomicshop-3.3.6.dist-info → atomicshop-3.3.8.dist-info}/top_level.txt +0 -0
atomicshop/__init__.py
CHANGED
atomicshop/consoles.py
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import msvcrt
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# === WINDOWS ONLY FUNCTIONS ===========================================================================================
|
|
5
|
+
def wait_any_key(prompt="Press any key to continue..."):
|
|
6
|
+
print(prompt, end="", flush=True)
|
|
7
|
+
msvcrt.getch() # waits for one key press (no Enter needed)
|
|
8
|
+
print() # move to next line
|
|
9
|
+
# === EOF WINDOWS ONLY FUNCTIONS =======================================================================================
|
|
@@ -2,8 +2,12 @@ import os
|
|
|
2
2
|
import argparse
|
|
3
3
|
from typing import Literal
|
|
4
4
|
|
|
5
|
-
from ... import filesystem
|
|
5
|
+
from ... import filesystem, consoles
|
|
6
6
|
from ...basics import strings
|
|
7
|
+
from rich.console import Console
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
console = Console()
|
|
7
11
|
|
|
8
12
|
|
|
9
13
|
GENERAL_CLASS_NAME: str = "General"
|
|
@@ -71,6 +75,8 @@ class CreateModuleTemplate:
|
|
|
71
75
|
|
|
72
76
|
self.create_config_file()
|
|
73
77
|
|
|
78
|
+
consoles.wait_any_key()
|
|
79
|
+
|
|
74
80
|
def create_config_file(self):
|
|
75
81
|
# Defining variables.
|
|
76
82
|
config_lines_list: list = list()
|
|
@@ -93,7 +99,7 @@ class CreateModuleTemplate:
|
|
|
93
99
|
with open(config_file_path, 'w') as output_file:
|
|
94
100
|
output_file.write('\n'.join(config_lines_list))
|
|
95
101
|
|
|
96
|
-
print(f"Config File Created: {config_file_path}")
|
|
102
|
+
console.print(f"Config File Created: {config_file_path}", style="bright_blue")
|
|
97
103
|
|
|
98
104
|
def _create_engine_module_from_reference(
|
|
99
105
|
self,
|
|
@@ -113,7 +119,7 @@ class CreateModuleTemplate:
|
|
|
113
119
|
raise ValueError(f"Module type is not recognized: {module_type}")
|
|
114
120
|
|
|
115
121
|
# Reading the module file to string.
|
|
116
|
-
with open(file_path, 'r') as input_file:
|
|
122
|
+
with open(file_path, 'r', encoding='utf-8') as input_file:
|
|
117
123
|
file_content_string = input_file.read()
|
|
118
124
|
|
|
119
125
|
new_module_full_path: str = str()
|
|
@@ -126,4 +132,4 @@ class CreateModuleTemplate:
|
|
|
126
132
|
output_file.write(new_content_string)
|
|
127
133
|
|
|
128
134
|
print(f"Converted: {file_path}")
|
|
129
|
-
print(f"To: {new_module_full_path}")
|
|
135
|
+
console.print(f"To: {new_module_full_path}", style="green")
|
|
@@ -370,7 +370,12 @@ class SocketWrapper:
|
|
|
370
370
|
|
|
371
371
|
# If someone removed the CA certificate file manually, and now it was created, we also need to
|
|
372
372
|
# clear the cached certificates.
|
|
373
|
-
|
|
373
|
+
try:
|
|
374
|
+
shutil.rmtree(self.sni_server_certificates_cache_directory)
|
|
375
|
+
# If the directory doesn't exist it will throw an exception, which is OK.
|
|
376
|
+
except FileNotFoundError:
|
|
377
|
+
pass
|
|
378
|
+
|
|
374
379
|
os.makedirs(self.sni_server_certificates_cache_directory, exist_ok=True)
|
|
375
380
|
print_api("Removed cached server certificates.", logger=self.logger)
|
|
376
381
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
atomicshop/__init__.py,sha256=
|
|
1
|
+
atomicshop/__init__.py,sha256=ngY9n0Huc9qRb7eeksH6N2bPuoeEhjgl3Fjm17woyLg,122
|
|
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
|
|
@@ -8,6 +8,7 @@ atomicshop/command_line_processing.py,sha256=u5yT9Ger_cu7ni5ID0VFlRbVD46ARHeNC9t
|
|
|
8
8
|
atomicshop/config_init.py,sha256=G6_f25zPxyPlht5jJC4ZDrrQiuJfjHiuPd22VBjd9Cg,2683
|
|
9
9
|
atomicshop/console_output.py,sha256=AOSJjrRryE97PAGtgDL03IBtWSi02aNol8noDnW3k6M,4667
|
|
10
10
|
atomicshop/console_user_response.py,sha256=OHcjuzWAys6WmfRnMIU_nkJA634kKmJh6T8w1VtUTJM,2714
|
|
11
|
+
atomicshop/consoles.py,sha256=jlEKqMV7OUCq_vCHMwePcSxRa5yZhrdEyfaVcoWj2_k,464
|
|
11
12
|
atomicshop/datetimes.py,sha256=IQZ66lmta-ZqxYbyHzm_9eugbJFSilXK1e0kfMgoXGg,18371
|
|
12
13
|
atomicshop/diff_check.py,sha256=vxTDccVbGZHEge6Ja9_ArLWwslOUgIoJAdYPylh4cZg,27176
|
|
13
14
|
atomicshop/dns.py,sha256=XB0tijVi1bxWLWKV9hPzpt75jK4SrGbZCV5VJbiiQ74,7185
|
|
@@ -49,15 +50,12 @@ atomicshop/versioning.py,sha256=e5W6m9AF3__M5nntqI9CqNAeHqkwY9JhlnpYeZ1CEus,970
|
|
|
49
50
|
atomicshop/virtualization.py,sha256=LPP4vjE0Vr10R6DA4lqhfX_WaNdDGRAZUW0Am6VeGco,494
|
|
50
51
|
atomicshop/web.py,sha256=hkAS0MeMW_mGgxhFCX1xckT3yslCJ2cMP2nx9ADpe3o,13024
|
|
51
52
|
atomicshop/websocket_parse.py,sha256=aLHWyKqaYqEn_MRBWm2L6rIl6QPmqbVrjEXE_rBzwCw,16711
|
|
52
|
-
atomicshop/a_installs/pywintrace.py,sha256=oZ9BATsJ2YsdIkZZWLar_dAUV32-oDiT7MJxthC0NnU,738
|
|
53
53
|
atomicshop/a_installs/ubuntu/docker_rootless.py,sha256=9IPNtGZYjfy1_n6ZRt7gWz9KZgR6XCgevjqq02xk-o0,281
|
|
54
54
|
atomicshop/a_installs/ubuntu/docker_sudo.py,sha256=JzayxeyKDtiuT4Icp2L2LyFRbx4wvpyN_bHLfZ-yX5E,281
|
|
55
55
|
atomicshop/a_installs/ubuntu/elastic_search_and_kibana.py,sha256=yRB-l1zBxdiN6av-FwNkhcBlaeu4zrDPjQ0uPGgpK2I,244
|
|
56
56
|
atomicshop/a_installs/ubuntu/mongodb.py,sha256=xuRJS1qqOZ0EZp7of5R3tTjSu6CwBIxYg8-NaM7othE,230
|
|
57
|
-
atomicshop/a_installs/ubuntu/pycharm.py,sha256=Ld7YQBwPxrjuZcTG1K4kZqjbBdt8aooCVRa15u5FOmE,157
|
|
58
57
|
atomicshop/a_installs/win/fibratus.py,sha256=TU4e9gdZ_zI73C40uueJ59pD3qmN-UFGdX5GFoVf6cM,179
|
|
59
58
|
atomicshop/a_installs/win/mongodb.py,sha256=AqyItXu19aaoe49pppDxtEkXey6PMy0PoT2Y_RmPpPE,179
|
|
60
|
-
atomicshop/a_installs/win/pycharm.py,sha256=j_RSd7aDOyC3yDd-_GUTMLlQTmDrqtVFG--oUfGLiZk,140
|
|
61
59
|
atomicshop/a_installs/win/wsl_ubuntu_lts.py,sha256=dZbPRLNKFeMd6MotjkE6UDY9cOiIaaclIdR1kGYWI50,139
|
|
62
60
|
atomicshop/a_mains/dns_gateway_setting.py,sha256=ncc2rFQCChxlNP59UshwmTonLqC6MWblrVAzbbz-13M,149
|
|
63
61
|
atomicshop/a_mains/github_wrapper.py,sha256=F-PoZknVCxWPN0PTO6l7ZNiaYvo7OVFKFI_zlPt56ps,169
|
|
@@ -142,7 +140,7 @@ atomicshop/mitm/recs_files.py,sha256=tv8XFhYZMkBv4DauvpiAdPgvSo0Bcm1CghnmwO7dx8M
|
|
|
142
140
|
atomicshop/mitm/shared_functions.py,sha256=0lzeyINd44sVEfFbahJxQmz6KAMWbYrW5ou3UYfItvw,1777
|
|
143
141
|
atomicshop/mitm/statistic_analyzer.py,sha256=5_sAYGX2Xunzo_pS2W5WijNCwr_BlGJbbOO462y_wN4,27533
|
|
144
142
|
atomicshop/mitm/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
145
|
-
atomicshop/mitm/engines/create_module_template.py,sha256=
|
|
143
|
+
atomicshop/mitm/engines/create_module_template.py,sha256=PHE2pVC9JNgaIh2o7M5dFMrkdOkmIyHLoO2mdzE5BdM,5938
|
|
146
144
|
atomicshop/mitm/engines/create_module_template_main_example.py,sha256=LeQ44Rp2Gi_KbIDY_4OMS0odkSK3zFZWra_oAka5eJY,243
|
|
147
145
|
atomicshop/mitm/engines/__parent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
148
146
|
atomicshop/mitm/engines/__parent/parser___parent.py,sha256=HHaCXhScl3OlPjz6eUxsDpJaZyk6BNuDMc9xCkeo2Ws,661
|
|
@@ -292,9 +290,6 @@ atomicshop/wrappers/psutilw/processes.py,sha256=ihYnxfMTVEXHWy92iewktoZGxazx3v5Q
|
|
|
292
290
|
atomicshop/wrappers/psutilw/psutil_networks.py,sha256=79FplDAj45ofBCudlft77O3lfi0RDwJ3ijye0ZGRR44,2870
|
|
293
291
|
atomicshop/wrappers/psutilw/psutilw.py,sha256=q3EwgprqyrR4zLCjl4l5DHFOQoukEvQMIPjNB504oQ0,21262
|
|
294
292
|
atomicshop/wrappers/psycopgw/psycopgw.py,sha256=XJvVf0oAUjCHkrYfKeFuGCpfn0Oxj3u4SbKMKA1508E,7118
|
|
295
|
-
atomicshop/wrappers/pycharmw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
296
|
-
atomicshop/wrappers/pycharmw/ubuntu.py,sha256=vOvGWvTbzvTja9tRrJW2yJb0_r1EV11RrENGHckzvVE,1051
|
|
297
|
-
atomicshop/wrappers/pycharmw/win.py,sha256=hNP-d95z1zhcCpYqhHE5HZVYxaAlt8JJCNXh65jZsHc,2757
|
|
298
293
|
atomicshop/wrappers/pywin32w/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
299
294
|
atomicshop/wrappers/pywin32w/cert_store.py,sha256=dV1XyoKTFKZ-HCIVqU2Nd6CTZ8HANqjAXv26rsNzO6s,4365
|
|
300
295
|
atomicshop/wrappers/pywin32w/console.py,sha256=LstHajPLgXp9qQxFNR44QfH10nOnNp3bCJquxaTquns,1175
|
|
@@ -324,15 +319,15 @@ atomicshop/wrappers/socketw/sender.py,sha256=aX_K8l_rHjd5AWb8bi5mt8-YTkMYVRDB6Dn
|
|
|
324
319
|
atomicshop/wrappers/socketw/sni.py,sha256=YlKavbExcPFfHFLYAJ3i3W6QorY7o4mbQp39g-DnDKA,17911
|
|
325
320
|
atomicshop/wrappers/socketw/socket_client.py,sha256=McBd3DeCy787oDGCEMUEP2awWy3vdkPqr9w-aFh2fBM,22502
|
|
326
321
|
atomicshop/wrappers/socketw/socket_server_tester.py,sha256=Qobmh4XV8ZxLUaw-eW4ESKAbeSLecCKn2OWFzMhadk0,6420
|
|
327
|
-
atomicshop/wrappers/socketw/socket_wrapper.py,sha256=
|
|
322
|
+
atomicshop/wrappers/socketw/socket_wrapper.py,sha256=VZe27EQhExaiLQ0FEW4ePJhNSwPMyPzgcl6oljMSbGg,41185
|
|
328
323
|
atomicshop/wrappers/socketw/ssl_base.py,sha256=62-hPm7zla1rh3m_WvDnXqKH-sDUTdiRptD8STCkgdk,2313
|
|
329
324
|
atomicshop/wrappers/socketw/statistics_csv.py,sha256=_gA8bMX6Sw_UCXKi2y9wNAwlqifgExgDGfQIa9pFxQA,5543
|
|
330
325
|
atomicshop/wrappers/winregw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
331
326
|
atomicshop/wrappers/winregw/winreg_installed_software.py,sha256=Qzmyktvob1qp6Tjk2DjLfAqr_yXV0sgWzdMW_9kwNjY,2345
|
|
332
327
|
atomicshop/wrappers/winregw/winreg_network.py,sha256=ih0BVNwByLvf9F_Lac4EdmDYYJA3PzMvmG0PieDZrsE,9905
|
|
333
|
-
atomicshop-3.3.
|
|
334
|
-
atomicshop-3.3.
|
|
335
|
-
atomicshop-3.3.
|
|
336
|
-
atomicshop-3.3.
|
|
337
|
-
atomicshop-3.3.
|
|
338
|
-
atomicshop-3.3.
|
|
328
|
+
atomicshop-3.3.8.dist-info/licenses/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
|
|
329
|
+
atomicshop-3.3.8.dist-info/METADATA,sha256=rYMsgx4ny4J9YRNDVBfecWRdf94iHj8B0AX4EBezbUA,9311
|
|
330
|
+
atomicshop-3.3.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
331
|
+
atomicshop-3.3.8.dist-info/entry_points.txt,sha256=SJEgEP0KoFtfxuGwe5tOzKfXkjR9Dv6YYug33KNYxyY,69
|
|
332
|
+
atomicshop-3.3.8.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
|
|
333
|
+
atomicshop-3.3.8.dist-info/RECORD,,
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import argparse
|
|
2
|
-
import subprocess
|
|
3
|
-
import sys
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
WHEEL = (
|
|
7
|
-
"https://github.com/fireeye/pywintrace/releases/download/"
|
|
8
|
-
"v0.3.0/pywintrace-0.3.0-py3-none-any.whl"
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def main() -> None:
|
|
13
|
-
parser = argparse.ArgumentParser(
|
|
14
|
-
prog="pywintrace",
|
|
15
|
-
description="Utility wrapper for installing FireEye’s pywintrace wheel"
|
|
16
|
-
)
|
|
17
|
-
sub = parser.add_subparsers(dest="command", required=True)
|
|
18
|
-
sub.add_parser("install", help="Download and install pywintrace v0.3.0")
|
|
19
|
-
args = parser.parse_args()
|
|
20
|
-
|
|
21
|
-
if args.command == "install":
|
|
22
|
-
subprocess.check_call([sys.executable, "-m", "pip", "install", WHEEL])
|
|
23
|
-
print("pywintrace 0.3.0 installed")
|
|
24
|
-
|
|
25
|
-
if __name__ == "__main__":
|
|
26
|
-
main()
|
|
File without changes
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import argparse
|
|
2
|
-
|
|
3
|
-
from ... import process
|
|
4
|
-
from ...print_api import print_api
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def parse_args():
|
|
8
|
-
"""
|
|
9
|
-
Parse command line arguments.
|
|
10
|
-
|
|
11
|
-
:return: Parsed arguments.
|
|
12
|
-
"""
|
|
13
|
-
parser = argparse.ArgumentParser(description='Install PyCharm Community Edition.')
|
|
14
|
-
parser.add_argument(
|
|
15
|
-
'--enable_sudo_execution', action='store_true',
|
|
16
|
-
help='There is a problem when trying to run snapd installed Pycharm as sudo, need to enable this.')
|
|
17
|
-
|
|
18
|
-
return parser.parse_args()
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def install_main():
|
|
22
|
-
"""
|
|
23
|
-
Main function to install the latest PyCharm Community Edition.
|
|
24
|
-
|
|
25
|
-
Usage:
|
|
26
|
-
python -m atomicshop.a_installs.ubuntu.pycharm
|
|
27
|
-
"""
|
|
28
|
-
|
|
29
|
-
args = parse_args()
|
|
30
|
-
|
|
31
|
-
process.execute_script('sudo snap install pycharm-professional --classic', shell=True)
|
|
32
|
-
|
|
33
|
-
if args.enable_sudo_execution:
|
|
34
|
-
process.execute_script('xhost +SI:localuser:root', shell=True)
|
|
35
|
-
print_api('Run the following command to start PyCharm as root: [sudo snap run pycharm-professional]', color='blue')
|
|
36
|
-
return 0
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import requests
|
|
2
|
-
from bs4 import BeautifulSoup
|
|
3
|
-
import subprocess
|
|
4
|
-
|
|
5
|
-
from ... import web, filesystem
|
|
6
|
-
from ...print_api import print_api
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
# URL to the PyCharm Community Edition download page
|
|
10
|
-
PYCHARM_DOWNLOAD_URL = 'https://www.jetbrains.com/pycharm/download/#section=windowsC'
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def download_install_main():
|
|
14
|
-
"""
|
|
15
|
-
Main function to download and install the latest PyCharm Community Edition.
|
|
16
|
-
|
|
17
|
-
Usage:
|
|
18
|
-
python -m atomicshop.mains.installs.pycharm
|
|
19
|
-
|
|
20
|
-
Or run the main function directly.
|
|
21
|
-
from atomicshop.wrappers import pycharmw
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def main():
|
|
25
|
-
pycharmw.download_install_main()
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
if __name__ == "__main__":
|
|
29
|
-
main()
|
|
30
|
-
"""
|
|
31
|
-
|
|
32
|
-
def get_latest_pycharm_download_link():
|
|
33
|
-
url = "https://www.jetbrains.com/pycharm/download/"
|
|
34
|
-
headers = {
|
|
35
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
response = requests.get(url, headers=headers)
|
|
39
|
-
if response.status_code != 200:
|
|
40
|
-
raise Exception("Failed to load the download page")
|
|
41
|
-
|
|
42
|
-
soup = BeautifulSoup(response.text, 'html.parser')
|
|
43
|
-
download_link = None
|
|
44
|
-
|
|
45
|
-
# Find the Professional version download link
|
|
46
|
-
for a in soup.find_all('a', href=True):
|
|
47
|
-
if '/download?code=PCC&platform=windows' in a['href']:
|
|
48
|
-
download_link = a['href']
|
|
49
|
-
break
|
|
50
|
-
|
|
51
|
-
if not download_link:
|
|
52
|
-
raise Exception("Could not find the download link for the latest version of PyCharm Professional")
|
|
53
|
-
|
|
54
|
-
return f"https:{download_link}"
|
|
55
|
-
|
|
56
|
-
installer_path: str = None
|
|
57
|
-
try:
|
|
58
|
-
print_api("Fetching the latest PyCharm download link...")
|
|
59
|
-
download_url = get_latest_pycharm_download_link()
|
|
60
|
-
print_api(f"Download URL: {download_url}")
|
|
61
|
-
|
|
62
|
-
print_api("Starting the download...")
|
|
63
|
-
file_name = "pycharm-latest.exe"
|
|
64
|
-
# download_file(download_url, file_name)
|
|
65
|
-
installer_path = web.download(file_url=download_url, file_name=file_name, use_certifi_ca_repository=True)
|
|
66
|
-
print_api(f"Downloaded the latest version of PyCharm to {file_name}", color='green')
|
|
67
|
-
except Exception as e:
|
|
68
|
-
print_api(f"An error occurred: {e}")
|
|
69
|
-
|
|
70
|
-
if not installer_path:
|
|
71
|
-
print_api("Failed to download the latest version of PyCharm", color='red')
|
|
72
|
-
return 1
|
|
73
|
-
|
|
74
|
-
# Install PyCharm
|
|
75
|
-
# Run the installer
|
|
76
|
-
print_api("Running the installer...")
|
|
77
|
-
subprocess.run([installer_path, '/S'], check=True) # /S for silent installation
|
|
78
|
-
print_api("Installation complete.", color='green')
|
|
79
|
-
|
|
80
|
-
# Remove the installer
|
|
81
|
-
filesystem.remove_file(installer_path)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|