atomicshop 2.11.47__py3-none-any.whl → 3.10.5__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.
Files changed (268) hide show
  1. atomicshop/__init__.py +1 -1
  2. atomicshop/{addons/mains → a_mains}/FACT/update_extract.py +3 -2
  3. atomicshop/a_mains/addons/process_list/compile.cmd +7 -0
  4. atomicshop/a_mains/addons/process_list/compiled/Win10x64/process_list.dll +0 -0
  5. atomicshop/a_mains/addons/process_list/compiled/Win10x64/process_list.exp +0 -0
  6. atomicshop/a_mains/addons/process_list/compiled/Win10x64/process_list.lib +0 -0
  7. atomicshop/{addons → a_mains/addons}/process_list/process_list.cpp +8 -1
  8. atomicshop/a_mains/dns_gateway_setting.py +11 -0
  9. atomicshop/a_mains/get_local_tcp_ports.py +85 -0
  10. atomicshop/a_mains/github_wrapper.py +11 -0
  11. atomicshop/a_mains/install_ca_certificate.py +172 -0
  12. atomicshop/{addons/mains → a_mains}/msi_unpacker.py +3 -1
  13. atomicshop/a_mains/process_from_port.py +119 -0
  14. atomicshop/a_mains/set_default_dns_gateway.py +90 -0
  15. atomicshop/a_mains/update_config_toml.py +38 -0
  16. atomicshop/appointment_management.py +5 -3
  17. atomicshop/basics/ansi_escape_codes.py +3 -1
  18. atomicshop/basics/argparse_template.py +2 -0
  19. atomicshop/basics/booleans.py +27 -30
  20. atomicshop/basics/bytes_arrays.py +43 -0
  21. atomicshop/basics/classes.py +149 -1
  22. atomicshop/basics/dicts.py +12 -0
  23. atomicshop/basics/enums.py +2 -2
  24. atomicshop/basics/exceptions.py +5 -1
  25. atomicshop/basics/list_of_classes.py +29 -0
  26. atomicshop/basics/list_of_dicts.py +69 -5
  27. atomicshop/basics/lists.py +14 -0
  28. atomicshop/basics/multiprocesses.py +374 -50
  29. atomicshop/basics/package_module.py +10 -0
  30. atomicshop/basics/strings.py +160 -7
  31. atomicshop/basics/threads.py +14 -0
  32. atomicshop/basics/tracebacks.py +13 -4
  33. atomicshop/certificates.py +153 -52
  34. atomicshop/config_init.py +12 -7
  35. atomicshop/console_user_response.py +7 -14
  36. atomicshop/consoles.py +9 -0
  37. atomicshop/datetimes.py +98 -0
  38. atomicshop/diff_check.py +340 -40
  39. atomicshop/dns.py +128 -12
  40. atomicshop/etws/_pywintrace_fix.py +17 -0
  41. atomicshop/etws/const.py +38 -0
  42. atomicshop/etws/providers.py +21 -0
  43. atomicshop/etws/sessions.py +43 -0
  44. atomicshop/etws/trace.py +168 -0
  45. atomicshop/etws/traces/trace_dns.py +162 -0
  46. atomicshop/etws/traces/trace_sysmon_process_creation.py +126 -0
  47. atomicshop/etws/traces/trace_tcp.py +130 -0
  48. atomicshop/file_io/csvs.py +222 -24
  49. atomicshop/file_io/docxs.py +35 -18
  50. atomicshop/file_io/file_io.py +35 -19
  51. atomicshop/file_io/jsons.py +49 -0
  52. atomicshop/file_io/tomls.py +139 -0
  53. atomicshop/filesystem.py +864 -293
  54. atomicshop/get_process_list.py +133 -0
  55. atomicshop/{process_name_cmd.py → get_process_name_cmd_dll.py} +52 -19
  56. atomicshop/http_parse.py +149 -93
  57. atomicshop/ip_addresses.py +6 -1
  58. atomicshop/mitm/centered_settings.py +132 -0
  59. atomicshop/mitm/config_static.py +207 -0
  60. atomicshop/mitm/config_toml_editor.py +55 -0
  61. atomicshop/mitm/connection_thread_worker.py +875 -357
  62. atomicshop/mitm/engines/__parent/parser___parent.py +4 -17
  63. atomicshop/mitm/engines/__parent/recorder___parent.py +108 -51
  64. atomicshop/mitm/engines/__parent/requester___parent.py +116 -0
  65. atomicshop/mitm/engines/__parent/responder___parent.py +75 -114
  66. atomicshop/mitm/engines/__reference_general/parser___reference_general.py +10 -7
  67. atomicshop/mitm/engines/__reference_general/recorder___reference_general.py +5 -5
  68. atomicshop/mitm/engines/__reference_general/requester___reference_general.py +47 -0
  69. atomicshop/mitm/engines/__reference_general/responder___reference_general.py +95 -13
  70. atomicshop/mitm/engines/create_module_template.py +58 -14
  71. atomicshop/mitm/import_config.py +359 -139
  72. atomicshop/mitm/initialize_engines.py +160 -74
  73. atomicshop/mitm/message.py +64 -23
  74. atomicshop/mitm/mitm_main.py +892 -0
  75. atomicshop/mitm/recs_files.py +183 -0
  76. atomicshop/mitm/shared_functions.py +4 -10
  77. atomicshop/mitm/ssh_tester.py +82 -0
  78. atomicshop/mitm/statistic_analyzer.py +257 -166
  79. atomicshop/mitm/statistic_analyzer_helper/analyzer_helper.py +136 -0
  80. atomicshop/mitm/statistic_analyzer_helper/moving_average_helper.py +525 -0
  81. atomicshop/monitor/change_monitor.py +96 -120
  82. atomicshop/monitor/checks/dns.py +139 -70
  83. atomicshop/monitor/checks/file.py +77 -0
  84. atomicshop/monitor/checks/network.py +81 -77
  85. atomicshop/monitor/checks/process_running.py +33 -34
  86. atomicshop/monitor/checks/url.py +94 -0
  87. atomicshop/networks.py +671 -0
  88. atomicshop/on_exit.py +205 -0
  89. atomicshop/package_mains_processor.py +84 -0
  90. atomicshop/permissions/permissions.py +22 -0
  91. atomicshop/permissions/ubuntu_permissions.py +239 -0
  92. atomicshop/permissions/win_permissions.py +33 -0
  93. atomicshop/print_api.py +24 -41
  94. atomicshop/process.py +63 -17
  95. atomicshop/process_poller/__init__.py +0 -0
  96. atomicshop/process_poller/pollers/__init__.py +0 -0
  97. atomicshop/process_poller/pollers/psutil_pywin32wmi_dll.py +95 -0
  98. atomicshop/process_poller/process_pool.py +207 -0
  99. atomicshop/process_poller/simple_process_pool.py +311 -0
  100. atomicshop/process_poller/tracer_base.py +45 -0
  101. atomicshop/process_poller/tracers/__init__.py +0 -0
  102. atomicshop/process_poller/tracers/event_log.py +46 -0
  103. atomicshop/process_poller/tracers/sysmon_etw.py +68 -0
  104. atomicshop/python_file_patcher.py +1 -1
  105. atomicshop/python_functions.py +27 -75
  106. atomicshop/question_answer_engine.py +2 -2
  107. atomicshop/scheduling.py +24 -5
  108. atomicshop/sound.py +4 -2
  109. atomicshop/speech_recognize.py +8 -0
  110. atomicshop/ssh_remote.py +158 -172
  111. atomicshop/startup/__init__.py +0 -0
  112. atomicshop/startup/win/__init__.py +0 -0
  113. atomicshop/startup/win/startup_folder.py +53 -0
  114. atomicshop/startup/win/task_scheduler.py +119 -0
  115. atomicshop/system_resource_monitor.py +61 -46
  116. atomicshop/system_resources.py +8 -8
  117. atomicshop/tempfiles.py +1 -2
  118. atomicshop/timer.py +30 -11
  119. atomicshop/urls.py +41 -0
  120. atomicshop/venvs.py +28 -0
  121. atomicshop/versioning.py +27 -0
  122. atomicshop/web.py +110 -25
  123. atomicshop/web_apis/__init__.py +0 -0
  124. atomicshop/web_apis/google_custom_search.py +44 -0
  125. atomicshop/web_apis/google_llm.py +188 -0
  126. atomicshop/websocket_parse.py +450 -0
  127. atomicshop/wrappers/certauthw/certauth.py +1 -0
  128. atomicshop/wrappers/cryptographyw.py +29 -8
  129. atomicshop/wrappers/ctyping/etw_winapi/__init__.py +0 -0
  130. atomicshop/wrappers/ctyping/etw_winapi/const.py +335 -0
  131. atomicshop/wrappers/ctyping/etw_winapi/etw_functions.py +393 -0
  132. atomicshop/wrappers/ctyping/file_details_winapi.py +67 -0
  133. atomicshop/wrappers/ctyping/msi_windows_installer/cabs.py +2 -1
  134. atomicshop/wrappers/ctyping/msi_windows_installer/extract_msi_main.py +13 -9
  135. atomicshop/wrappers/ctyping/msi_windows_installer/tables.py +35 -0
  136. atomicshop/wrappers/ctyping/setup_device.py +466 -0
  137. atomicshop/wrappers/ctyping/win_console.py +39 -0
  138. atomicshop/wrappers/dockerw/dockerw.py +113 -2
  139. atomicshop/wrappers/elasticsearchw/config_basic.py +0 -12
  140. atomicshop/wrappers/elasticsearchw/elastic_infra.py +75 -0
  141. atomicshop/wrappers/elasticsearchw/elasticsearchw.py +2 -20
  142. atomicshop/wrappers/factw/get_file_data.py +12 -5
  143. atomicshop/wrappers/factw/install/install_after_restart.py +89 -5
  144. atomicshop/wrappers/factw/install/pre_install_and_install_before_restart.py +20 -14
  145. atomicshop/wrappers/factw/postgresql/firmware.py +4 -6
  146. atomicshop/wrappers/githubw.py +583 -51
  147. atomicshop/wrappers/loggingw/consts.py +49 -0
  148. atomicshop/wrappers/loggingw/filters.py +102 -0
  149. atomicshop/wrappers/loggingw/formatters.py +58 -71
  150. atomicshop/wrappers/loggingw/handlers.py +459 -40
  151. atomicshop/wrappers/loggingw/loggers.py +19 -0
  152. atomicshop/wrappers/loggingw/loggingw.py +1010 -178
  153. atomicshop/wrappers/loggingw/reading.py +344 -19
  154. atomicshop/wrappers/mongodbw/__init__.py +0 -0
  155. atomicshop/wrappers/mongodbw/mongo_infra.py +31 -0
  156. atomicshop/wrappers/mongodbw/mongodbw.py +1432 -0
  157. atomicshop/wrappers/netshw.py +271 -0
  158. atomicshop/wrappers/playwrightw/engine.py +34 -19
  159. atomicshop/wrappers/playwrightw/infra.py +5 -0
  160. atomicshop/wrappers/playwrightw/javascript.py +7 -3
  161. atomicshop/wrappers/playwrightw/keyboard.py +14 -0
  162. atomicshop/wrappers/playwrightw/scenarios.py +172 -5
  163. atomicshop/wrappers/playwrightw/waits.py +9 -7
  164. atomicshop/wrappers/powershell_networking.py +80 -0
  165. atomicshop/wrappers/psutilw/processes.py +81 -0
  166. atomicshop/wrappers/psutilw/psutil_networks.py +85 -0
  167. atomicshop/wrappers/psutilw/psutilw.py +9 -0
  168. atomicshop/wrappers/pyopensslw.py +9 -2
  169. atomicshop/wrappers/pywin32w/__init__.py +0 -0
  170. atomicshop/wrappers/pywin32w/cert_store.py +116 -0
  171. atomicshop/wrappers/pywin32w/console.py +34 -0
  172. atomicshop/wrappers/pywin32w/win_event_log/__init__.py +0 -0
  173. atomicshop/wrappers/pywin32w/win_event_log/fetch.py +174 -0
  174. atomicshop/wrappers/pywin32w/win_event_log/subscribe.py +212 -0
  175. atomicshop/wrappers/pywin32w/win_event_log/subscribes/__init__.py +0 -0
  176. atomicshop/wrappers/pywin32w/win_event_log/subscribes/process_create.py +57 -0
  177. atomicshop/wrappers/pywin32w/win_event_log/subscribes/process_terminate.py +49 -0
  178. atomicshop/wrappers/pywin32w/win_event_log/subscribes/schannel_logging.py +97 -0
  179. atomicshop/wrappers/pywin32w/winshell.py +19 -0
  180. atomicshop/wrappers/pywin32w/wmis/__init__.py +0 -0
  181. atomicshop/wrappers/pywin32w/wmis/msft_netipaddress.py +113 -0
  182. atomicshop/wrappers/pywin32w/wmis/win32_networkadapterconfiguration.py +259 -0
  183. atomicshop/wrappers/pywin32w/wmis/win32networkadapter.py +112 -0
  184. atomicshop/wrappers/pywin32w/wmis/wmi_helpers.py +236 -0
  185. atomicshop/wrappers/socketw/accepter.py +21 -7
  186. atomicshop/wrappers/socketw/certificator.py +216 -150
  187. atomicshop/wrappers/socketw/creator.py +190 -50
  188. atomicshop/wrappers/socketw/dns_server.py +500 -173
  189. atomicshop/wrappers/socketw/exception_wrapper.py +45 -52
  190. atomicshop/wrappers/socketw/process_getter.py +86 -0
  191. atomicshop/wrappers/socketw/receiver.py +144 -102
  192. atomicshop/wrappers/socketw/sender.py +65 -35
  193. atomicshop/wrappers/socketw/sni.py +334 -165
  194. atomicshop/wrappers/socketw/socket_base.py +134 -0
  195. atomicshop/wrappers/socketw/socket_client.py +137 -95
  196. atomicshop/wrappers/socketw/socket_server_tester.py +14 -9
  197. atomicshop/wrappers/socketw/socket_wrapper.py +717 -116
  198. atomicshop/wrappers/socketw/ssl_base.py +15 -14
  199. atomicshop/wrappers/socketw/statistics_csv.py +148 -17
  200. atomicshop/wrappers/sysmonw.py +157 -0
  201. atomicshop/wrappers/ubuntu_terminal.py +65 -26
  202. atomicshop/wrappers/win_auditw.py +189 -0
  203. atomicshop/wrappers/winregw/__init__.py +0 -0
  204. atomicshop/wrappers/winregw/winreg_installed_software.py +58 -0
  205. atomicshop/wrappers/winregw/winreg_network.py +232 -0
  206. {atomicshop-2.11.47.dist-info → atomicshop-3.10.5.dist-info}/METADATA +31 -49
  207. atomicshop-3.10.5.dist-info/RECORD +306 -0
  208. {atomicshop-2.11.47.dist-info → atomicshop-3.10.5.dist-info}/WHEEL +1 -1
  209. atomicshop/_basics_temp.py +0 -101
  210. atomicshop/addons/a_setup_scripts/install_psycopg2_ubuntu.sh +0 -3
  211. atomicshop/addons/a_setup_scripts/install_pywintrace_0.3.cmd +0 -2
  212. atomicshop/addons/mains/install_docker_rootless_ubuntu.py +0 -11
  213. atomicshop/addons/mains/install_docker_ubuntu_main_sudo.py +0 -11
  214. atomicshop/addons/mains/install_elastic_search_and_kibana_ubuntu.py +0 -10
  215. atomicshop/addons/mains/install_wsl_ubuntu_lts_admin.py +0 -9
  216. atomicshop/addons/package_setup/CreateWheel.cmd +0 -7
  217. atomicshop/addons/package_setup/Setup in Edit mode.cmd +0 -6
  218. atomicshop/addons/package_setup/Setup.cmd +0 -7
  219. atomicshop/addons/process_list/compile.cmd +0 -2
  220. atomicshop/addons/process_list/compiled/Win10x64/process_list.dll +0 -0
  221. atomicshop/addons/process_list/compiled/Win10x64/process_list.exp +0 -0
  222. atomicshop/addons/process_list/compiled/Win10x64/process_list.lib +0 -0
  223. atomicshop/archiver/_search_in_zip.py +0 -189
  224. atomicshop/archiver/archiver.py +0 -34
  225. atomicshop/archiver/search_in_archive.py +0 -250
  226. atomicshop/archiver/sevenz_app_w.py +0 -86
  227. atomicshop/archiver/sevenzs.py +0 -44
  228. atomicshop/archiver/zips.py +0 -293
  229. atomicshop/etw/dns_trace.py +0 -118
  230. atomicshop/etw/etw.py +0 -61
  231. atomicshop/file_types.py +0 -24
  232. atomicshop/mitm/engines/create_module_template_example.py +0 -13
  233. atomicshop/mitm/initialize_mitm_server.py +0 -240
  234. atomicshop/monitor/checks/hash.py +0 -44
  235. atomicshop/monitor/checks/hash_checks/file.py +0 -55
  236. atomicshop/monitor/checks/hash_checks/url.py +0 -62
  237. atomicshop/pbtkmultifile_argparse.py +0 -88
  238. atomicshop/permissions.py +0 -110
  239. atomicshop/process_poller.py +0 -237
  240. atomicshop/script_as_string_processor.py +0 -38
  241. atomicshop/ssh_scripts/process_from_ipv4.py +0 -37
  242. atomicshop/ssh_scripts/process_from_port.py +0 -27
  243. atomicshop/wrappers/_process_wrapper_curl.py +0 -27
  244. atomicshop/wrappers/_process_wrapper_tar.py +0 -21
  245. atomicshop/wrappers/dockerw/install_docker.py +0 -209
  246. atomicshop/wrappers/elasticsearchw/infrastructure.py +0 -265
  247. atomicshop/wrappers/elasticsearchw/install_elastic.py +0 -232
  248. atomicshop/wrappers/ffmpegw.py +0 -125
  249. atomicshop/wrappers/loggingw/checks.py +0 -20
  250. atomicshop/wrappers/nodejsw/install_nodejs.py +0 -139
  251. atomicshop/wrappers/process_wrapper_pbtk.py +0 -16
  252. atomicshop/wrappers/socketw/base.py +0 -59
  253. atomicshop/wrappers/socketw/get_process.py +0 -107
  254. atomicshop/wrappers/wslw.py +0 -191
  255. atomicshop-2.11.47.dist-info/RECORD +0 -251
  256. /atomicshop/{addons/mains → a_mains}/FACT/factw_fact_extractor_docker_image_main_sudo.py +0 -0
  257. /atomicshop/{addons → a_mains/addons}/PlayWrightCodegen.cmd +0 -0
  258. /atomicshop/{addons → a_mains/addons}/ScriptExecution.cmd +0 -0
  259. /atomicshop/{addons/mains → a_mains/addons}/inits/init_to_import_all_modules.py +0 -0
  260. /atomicshop/{addons → a_mains/addons}/process_list/ReadMe.txt +0 -0
  261. /atomicshop/{addons/mains → a_mains}/search_for_hyperlinks_in_docx.py +0 -0
  262. /atomicshop/{archiver → etws}/__init__.py +0 -0
  263. /atomicshop/{etw → etws/traces}/__init__.py +0 -0
  264. /atomicshop/{monitor/checks/hash_checks → mitm/statistic_analyzer_helper}/__init__.py +0 -0
  265. /atomicshop/{wrappers/nodejsw → permissions}/__init__.py +0 -0
  266. /atomicshop/wrappers/pywin32w/{wmi_win32process.py → wmis/win32process.py} +0 -0
  267. {atomicshop-2.11.47.dist-info → atomicshop-3.10.5.dist-info/licenses}/LICENSE.txt +0 -0
  268. {atomicshop-2.11.47.dist-info → atomicshop-3.10.5.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,47 @@
1
+ # These are specified with hardcoded paths instead of relative, because 'create_module_template.py' copies the content.
2
+ from atomicshop.mitm.engines.__parent.requester___parent import RequesterParent
3
+ from atomicshop.mitm.shared_functions import create_custom_logger
4
+ from atomicshop.mitm.message import ClientMessage
5
+ from atomicshop.mitm import config_static
6
+
7
+ """
8
+ import time
9
+ datetime
10
+ import binascii
11
+
12
+ # This is 'example' '.proto' file that contains message 'ExampleResponse'.
13
+ from .example_pb2 import ExampleRequest
14
+ # Import from 'protobuf' the 'json_format' library.
15
+ from google.protobuf import json_format
16
+ """
17
+
18
+
19
+ class RequesterGeneral(RequesterParent):
20
+ """The class that is responsible for generating request to client based on the received message."""
21
+ # When initializing main classes through "super" you need to pass parameters to init
22
+ def __init__(self):
23
+ super().__init__()
24
+
25
+ self.logger = create_custom_logger()
26
+
27
+ # def create_request(self, class_client_message: ClientMessage, **kwargs) -> bytes:
28
+ # # noinspection GrazieInspection
29
+ # """
30
+ # For more examples check the responder.
31
+ # Function to create Response based on ClientMessage and its Request.
32
+ #
33
+ # :param class_client_message: contains request and other parameters to help creating response.
34
+ # :return: 1 request in byte string.
35
+ # -----------------------------------
36
+ #
37
+ # # Example of creating byte string using 'build_byte_request' function:
38
+ # request_bytes: bytes = self.build_byte_request(
39
+ # http_method=class_client_message.request_raw_decoded.command,
40
+ # endpoint=class_client_message.request_raw_decoded.path,
41
+ # http_version=class_client_message.request_raw_decoded.request_version,
42
+ # headers=response_headers,
43
+ # body=b''
44
+ # )
45
+ #
46
+ # return request_bytes
47
+ # -----------------------------------
@@ -1,6 +1,8 @@
1
1
  # These are specified with hardcoded paths instead of relative, because 'create_module_template.py' copies the content.
2
2
  from atomicshop.mitm.engines.__parent.responder___parent import ResponderParent
3
3
  from atomicshop.mitm.shared_functions import create_custom_logger
4
+ from atomicshop.mitm.message import ClientMessage
5
+ from atomicshop.mitm import config_static
4
6
 
5
7
  """
6
8
  import time
@@ -14,14 +16,71 @@ from google.protobuf import json_format
14
16
  """
15
17
 
16
18
 
17
- # The class that is responsible for generating response to client based on the received message.
18
19
  class ResponderGeneral(ResponderParent):
19
- logger = create_custom_logger()
20
-
20
+ """The class that is responsible for generating response to client based on the received message."""
21
21
  # When initializing main classes through "super" you need to pass parameters to init
22
22
  def __init__(self):
23
23
  super().__init__()
24
24
 
25
+ self.logger = create_custom_logger()
26
+
27
+ # def create_response(self, class_client_message: ClientMessage):
28
+ # # noinspection GrazieInspection
29
+ # """
30
+ # Function to create Response based on ClientMessage and its Request.
31
+ #
32
+ # :param class_client_message: contains request and other parameters to help creating response.
33
+ # :return: list of responses in bytes.
34
+ # -----------------------------------
35
+ #
36
+ # # Example of creating list of bytes using 'build_byte_response' function:
37
+ # result_list: list[bytes] = list()
38
+ # result_list.append(
39
+ # self.build_byte_response(
40
+ # http_version=class_client_message.request_raw_decoded.request_version,
41
+ # status_code=200,
42
+ # headers=response_headers,
43
+ # body=b''
44
+ # )
45
+ # )
46
+ #
47
+ # return result_list
48
+ # -----------------------------------
49
+ # # Example of extracting variables from URL PATH based on custom PATH TEMPLATE:
50
+ # # (more examples in 'self.extract_variables_from_path_template' function description)
51
+ # template_path: str = "/hithere/<variable1>/else/<variable2>/tested/"
52
+ # path_variables: dict = extract_variables_from_path_template(
53
+ # path=class_client_message.request_raw_decoded.path,
54
+ # template_path=template_path
55
+ # )
56
+ # -----------------------------------
57
+ # # Example of extracting value from URL PATH parameters after question mark:
58
+ # parameter_value = extract_value_from_path_parameter(
59
+ # path=class_client_message.request_raw_decoded.path,
60
+ # parameter='test_id'
61
+ # )
62
+ # """
63
+ #
64
+ # # byte_response: bytes = b''
65
+ # # self.logger.info(f"Response: {byte_response}")
66
+ #
67
+ # response_bytes_list: list[bytes] = list()
68
+ # # response_bytes_list.append(byte_response)
69
+ # return response_bytes_list
70
+
71
+ # def create_connect_response(self, class_client_message: ClientMessage):
72
+ # """
73
+ # This is almost the same as 'create_response' function, but it's used only when the client connects and before
74
+ # sending any data.
75
+ # """
76
+ #
77
+ # # byte_response: bytes = b''
78
+ # # self.logger.info(f"Response: {byte_response}")
79
+ #
80
+ # response_bytes_list: list[bytes] = list()
81
+ # # response_bytes_list.append(byte_response)
82
+ # return response_bytes_list
83
+
25
84
  # ==================================================================================================================
26
85
  # Uncomment this section in order to begin building custom responder.
27
86
  # @staticmethod
@@ -89,7 +148,7 @@ class ResponderGeneral(ResponderParent):
89
148
  # # === Building Headers. ===========================
90
149
  # # Response Date example: 'Tue, 08 Nov 2022 14:23: 00 GMT'
91
150
  # resp_headers = {
92
- # 'Date': self.get_current_formatted_time(),
151
+ # 'Date': self.get_current_formatted_time_http(),
93
152
  # 'Content-Length': str(len(resp_body)),
94
153
  # }
95
154
  #
@@ -109,7 +168,7 @@ class ResponderGeneral(ResponderParent):
109
168
  # # === Building Headers. ===========================
110
169
  # # Response Date example: 'Tue, 08 Nov 2022 14:23: 00 GMT'
111
170
  # resp_headers = {
112
- # 'Date': self.get_current_formatted_time(),
171
+ # 'Date': self.get_current_formatted_time_http(),
113
172
  # 'Content-Length': str(len(resp_body)),
114
173
  # 'Connection': 'keep-alive'
115
174
  # }
@@ -118,10 +177,10 @@ class ResponderGeneral(ResponderParent):
118
177
  #
119
178
  # def create_response(self, class_client_message: ClientMessage):
120
179
  # # Arranging important request entries to appropriate variables.
121
- # req_path = class_client_message.request_raw_decoded.path
122
- # req_command = class_client_message.request_raw_decoded.command
123
- # req_headers = class_client_message.request_raw_decoded.headers
124
- # req_body = class_client_message.request_raw_decoded.body
180
+ # req_path = class_client_message.request_auto_parsed.path
181
+ # req_command = class_client_message.request_auto_parsed.command
182
+ # req_headers = class_client_message.request_auto_parsed.headers
183
+ # req_body = class_client_message.request_auto_parsed.body
125
184
  #
126
185
  # # ====================================
127
186
  # # Case specific.
@@ -144,10 +203,33 @@ class ResponderGeneral(ResponderParent):
144
203
  #
145
204
  # # ==============================================================================
146
205
  # # === Building byte response. ==================================================
147
- # self.build_byte_response(
148
- # http_version=class_client_message.request_raw_decoded.request_version,
206
+ # byte_response = self.build_byte_response(
207
+ # http_version=class_client_message.request_auto_parsed.request_version,
149
208
  # status_code=resp_status_code,
150
209
  # headers=resp_headers,
151
- # body=resp_body_bytes,
152
- # client_message=class_client_message
210
+ # body=resp_body_bytes
153
211
  # )
212
+ #
213
+ # result_response_list: list[bytes] = [byte_response]
214
+ # return result_response_list
215
+ #
216
+ # ==================================================================================================================
217
+ # TEST RESPONSE.
218
+ # def create_response(self, class_client_message: ClientMessage):
219
+ # resp_body_text: bytes = b"<html><body>TEST OK!</body></html>\n"
220
+ # resp_status_code: int = 200
221
+ # resp_headers: dict = {
222
+ # # Tell the browser it’s plain text (could be “text/html” if you wrap it in HTML).
223
+ # "Content-Type": "text/html; charset=utf-8"}
224
+ #
225
+ # # Build the raw bytes to send.
226
+ # byte_response = self.build_byte_response(
227
+ # http_version="HTTP/1.1",
228
+ # status_code=resp_status_code,
229
+ # headers=resp_headers,
230
+ # body=resp_body_text
231
+ #
232
+ # )
233
+ #
234
+ # result_response_list: list[bytes] = [byte_response]
235
+ # return result_response_list
@@ -1,8 +1,14 @@
1
+ import sys
1
2
  import os
3
+ import argparse
2
4
  from typing import Literal
3
5
 
4
- from ... import filesystem
6
+ from ... import filesystem, consoles
5
7
  from ...basics import strings
8
+ from rich.console import Console
9
+
10
+
11
+ console = Console()
6
12
 
7
13
 
8
14
  GENERAL_CLASS_NAME: str = "General"
@@ -13,6 +19,7 @@ CONFIG_FILE_NAME: str = "engine_config.toml"
13
19
 
14
20
  REFERENCE_PARSER_FILE_NAME: str = f"parser_{REFERENCE_ENGINE_NAME}.py"
15
21
  REFERENCE_RESPONDER_FILE_NAME: str = f"responder_{REFERENCE_ENGINE_NAME}.py"
22
+ REFERENCE_REQUESTER_FILE_NAME: str = f"requester_{REFERENCE_ENGINE_NAME}.py"
16
23
  REFERENCE_RECORDER_FILE_NAME: str = f"recorder_{REFERENCE_ENGINE_NAME}.py"
17
24
 
18
25
  SCRIPT_DIRECTORY: str = filesystem.get_file_directory(__file__)
@@ -20,10 +27,13 @@ ENGINES_DIRECTORY_PATH: str = filesystem.get_working_directory() + os.sep + ENGI
20
27
 
21
28
 
22
29
  class CreateModuleTemplate:
23
- def __init__(self, engine_name: str, domains: list):
30
+ def __init__(
31
+ self,
32
+ engine_name: str = None
33
+ ):
24
34
  # === Get input variables. ===
25
35
  self.engine_name: str = engine_name
26
- self.domains: list = domains
36
+ self.domains: list = ['example.com:443', 'example.org:80']
27
37
 
28
38
  # New engine's directory.
29
39
  self.new_engine_directory: str = ENGINES_DIRECTORY_PATH + os.sep + self.engine_name
@@ -36,11 +46,13 @@ class CreateModuleTemplate:
36
46
  reference_folder_path: str = SCRIPT_DIRECTORY + os.sep + REFERENCE_ENGINE_NAME
37
47
  self.parser_general_path: str = reference_folder_path + os.sep + REFERENCE_PARSER_FILE_NAME
38
48
  self.responder_general_path: str = reference_folder_path + os.sep + REFERENCE_RESPONDER_FILE_NAME
49
+ self.requester_general_path: str = reference_folder_path + os.sep + REFERENCE_REQUESTER_FILE_NAME
39
50
  self.recorder_general_path: str = reference_folder_path + os.sep + REFERENCE_RECORDER_FILE_NAME
40
51
 
41
- self.parser_file_name: str = f"parser_{self.engine_name}.py"
42
- self.responder_file_name: str = f"responder_{self.engine_name}.py"
43
- self.recorder_file_name: str = f"recorder_{self.engine_name}.py"
52
+ self.parser_file_name: str = f"parser.py"
53
+ self.responder_file_name: str = f"responder.py"
54
+ self.requester_file_name: str = f"requester.py"
55
+ self.recorder_file_name: str = f"recorder.py"
44
56
 
45
57
  self.create_template()
46
58
 
@@ -51,11 +63,12 @@ class CreateModuleTemplate:
51
63
  # Create the 'engines' directory if it doesn't exist.
52
64
  filesystem.create_directory(ENGINES_DIRECTORY_PATH)
53
65
 
54
- # Create new engines folder.
66
+ # Create new engines' folder.
55
67
  filesystem.create_directory(self.new_engine_directory)
56
68
 
57
69
  self._create_engine_module_from_reference(file_path=self.parser_general_path, module_type='parser')
58
70
  self._create_engine_module_from_reference(file_path=self.responder_general_path, module_type='responder')
71
+ self._create_engine_module_from_reference(file_path=self.requester_general_path, module_type='requester')
59
72
  self._create_engine_module_from_reference(file_path=self.recorder_general_path, module_type='recorder')
60
73
 
61
74
  self.create_config_file()
@@ -66,35 +79,42 @@ class CreateModuleTemplate:
66
79
 
67
80
  # Add "" to each domain.
68
81
  domains_with_quotes: list = [f'"{domain}"' for domain in self.domains]
82
+
83
+ config_lines_list.append('[engine]')
69
84
  config_lines_list.append(f'domains = [{", ".join(domains_with_quotes)}]\n')
70
- config_lines_list.append(f'parser_file = "{self.parser_file_name}"')
71
- config_lines_list.append(f'responder_file = "{self.responder_file_name}"')
72
- config_lines_list.append(f'recorder_file = "{self.recorder_file_name}"')
85
+ config_lines_list.append('[on_port_connect]')
86
+ config_lines_list.append('#5000 = "31.31.31.31:443"')
87
+ config_lines_list.append('#5000 = "ip_port_address.txt"\n')
88
+ config_lines_list.append('[mtls]')
89
+ config_lines_list.append('# "subdomain.domain.com" = "file_name_in_current_dir.pem"\n')
90
+ # config_lines_list.append(f'\n')
73
91
 
74
92
  config_file_path = self.new_engine_directory + os.sep + CONFIG_FILE_NAME
75
93
 
76
94
  with open(config_file_path, 'w') as output_file:
77
95
  output_file.write('\n'.join(config_lines_list))
78
96
 
79
- print(f"Config File Created: {config_file_path}")
97
+ console.print(f"Config File Created: {config_file_path}", style="bright_blue")
80
98
 
81
99
  def _create_engine_module_from_reference(
82
100
  self,
83
101
  file_path: str,
84
- module_type: Literal['parser', 'responder', 'recorder']
102
+ module_type: Literal['parser', 'responder', 'requester', 'recorder']
85
103
  ):
86
104
 
87
105
  if module_type == 'parser':
88
106
  new_module_file_name = self.parser_file_name
89
107
  elif module_type == 'responder':
90
108
  new_module_file_name = self.responder_file_name
109
+ elif module_type == 'requester':
110
+ new_module_file_name = self.requester_file_name
91
111
  elif module_type == 'recorder':
92
112
  new_module_file_name = self.recorder_file_name
93
113
  else:
94
114
  raise ValueError(f"Module type is not recognized: {module_type}")
95
115
 
96
116
  # Reading the module file to string.
97
- with open(file_path, 'r') as input_file:
117
+ with open(file_path, 'r', encoding='utf-8') as input_file:
98
118
  file_content_string = input_file.read()
99
119
 
100
120
  new_module_full_path: str = str()
@@ -107,4 +127,28 @@ class CreateModuleTemplate:
107
127
  output_file.write(new_content_string)
108
128
 
109
129
  print(f"Converted: {file_path}")
110
- print(f"To: {new_module_full_path}")
130
+ console.print(f"To: {new_module_full_path}", style="green")
131
+
132
+
133
+ def create_template(engine_name: str) -> int:
134
+ CreateModuleTemplate(engine_name=engine_name)
135
+ return 0
136
+
137
+
138
+ def _make_parser() -> argparse.ArgumentParser:
139
+ parser = argparse.ArgumentParser(description='Create a new engine module template.')
140
+ parser.add_argument('engine_name', type=str, help='The name of the new engine.')
141
+ return parser
142
+
143
+
144
+ def main() -> int:
145
+ arg_parser: argparse.ArgumentParser = _make_parser()
146
+ args = arg_parser.parse_args()
147
+
148
+ rc: int = create_template(**vars(args))
149
+ consoles.wait_any_key()
150
+ return rc
151
+
152
+
153
+ if __name__ == '__main__':
154
+ sys.exit(main())