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,183 @@
1
+ import datetime
2
+ import os
3
+ import multiprocessing
4
+ import logging
5
+ import zipfile
6
+ import shutil
7
+
8
+ from .. import filesystem, print_api
9
+ from .. wrappers.loggingw import consts, loggingw
10
+
11
+
12
+ REC_FILE_DATE_TIME_MILLISECONDS_FORMAT: str = f'{consts.DEFAULT_ROTATING_SUFFIXES_FROM_WHEN["S"]}_%f'
13
+ REC_FILE_DATE_TIME_FORMAT: str = f'{consts.DEFAULT_ROTATING_SUFFIXES_FROM_WHEN["S"]}'
14
+ REC_FILE_DATE_FORMAT: str = REC_FILE_DATE_TIME_FORMAT.split('_')[0]
15
+
16
+
17
+ def archive(
18
+ directory_path: str,
19
+ include_root_directory: bool = True,
20
+ ) -> str:
21
+ """
22
+ Function archives the directory.
23
+ :param directory_path: string, full path to the directory.
24
+ :param include_root_directory: boolean, default is 'True'.
25
+ 'True': The root directory will be included in the archive.
26
+ 'False': The root directory will not be included in the archive.
27
+ True is usually the case in most archiving utilities.
28
+ :return: string, full path to the archived file.
29
+ """
30
+
31
+ # This is commonly used and supported by most ZIP utilities.
32
+ compression_method = zipfile.ZIP_DEFLATED
33
+
34
+ archive_path: str = directory_path + '.zip'
35
+ with zipfile.ZipFile(archive_path, 'w', compression_method) as zip_object:
36
+ for root, _, files in os.walk(directory_path):
37
+ for file in files:
38
+ file_path = os.path.join(root, file)
39
+
40
+ # If including the root directory, use the relative path from the parent directory of the root
41
+ if include_root_directory:
42
+ arcname = os.path.relpath(file_path, os.path.dirname(directory_path))
43
+ else:
44
+ arcname = os.path.relpath(file_path, directory_path)
45
+
46
+ zip_object.write(file_path, arcname)
47
+
48
+ return archive_path
49
+
50
+
51
+ def recs_archiver(
52
+ recs_directory: str,
53
+ logging_queue: multiprocessing.Queue,
54
+ logger_name: str,
55
+ finalize_output_queue: multiprocessing.Queue
56
+ ) -> list | None:
57
+ """
58
+ Find recs files in a directory for each day.
59
+ Each day of recordings will have separate archive.
60
+
61
+ :param recs_directory: The directory where recordings are stored.
62
+ :param logging_queue: The queue for logging messages.
63
+ :param logger_name: The name of the logger to use for logging.
64
+ This is the base name that '.rec_packer' will be added to it.
65
+ :param finalize_output_queue: output queue for results/exceptions.
66
+ """
67
+
68
+ logger_name = f"{logger_name}.rec_packer"
69
+
70
+ rec_packer_logger_with_queue_handler: logging.Logger = loggingw.create_logger(
71
+ logger_name=logger_name,
72
+ add_queue_handler=True,
73
+ log_queue=logging_queue)
74
+
75
+ print_api.print_api(
76
+ 'Starting recs archiver process.', color='blue',
77
+ logger=rec_packer_logger_with_queue_handler
78
+ )
79
+
80
+ today_date_string = datetime.datetime.now().strftime(REC_FILE_DATE_FORMAT)
81
+
82
+ # There should not be recording json files in recs root.
83
+ files_in_recs_root: list = filesystem.get_paths_from_directory(
84
+ recs_directory, get_file=True, file_name_check_pattern='*\\.json', recursive=False)
85
+ if files_in_recs_root:
86
+ raise NotImplementedError("The files in recs root directory are not implemented yet.")
87
+
88
+ # Each engine should have its own directory inside recordings. We will find all the directories inside recs folder.
89
+ directory_paths_in_recs: list = filesystem.get_paths_from_directory(
90
+ recs_directory, get_directory=True, recursive=False)
91
+
92
+ file_list_per_directory: list = list()
93
+ for directory_path in directory_paths_in_recs:
94
+ all_recs_files = filesystem.get_paths_from_directory(
95
+ directory_path=directory_path.path,
96
+ get_file=True,
97
+ file_name_check_pattern='*.json',
98
+ datetime_format=REC_FILE_DATE_FORMAT,
99
+ recursive=False
100
+ )
101
+ file_list_per_directory.append((directory_path, all_recs_files))
102
+
103
+
104
+ try:
105
+ archived_files: list = list()
106
+ for directory_path, all_recs_files in file_list_per_directory:
107
+ print_api.print_api(f"Archiving recs files in directory: {directory_path.path}",
108
+ logger=rec_packer_logger_with_queue_handler, color='blue')
109
+ for recs_atomic_path in all_recs_files:
110
+ # We don't need to archive today's files.
111
+ if today_date_string == recs_atomic_path.datetime_string:
112
+ continue
113
+
114
+ target_directory_path: str = f"{directory_path.path}{os.sep}{recs_atomic_path.datetime_string}"
115
+ filesystem.create_directory(target_directory_path)
116
+ filesystem.move_file(
117
+ recs_atomic_path.path, target_directory_path)
118
+
119
+ # Archive directories.
120
+ archive_directories: list = filesystem.get_paths_from_directory(
121
+ directory_path.path, get_directory=True, recursive=False)
122
+
123
+ if not archive_directories:
124
+ print_api.print_api(
125
+ f"No directories to archive in: {directory_path.path}",
126
+ color='blue',
127
+ logger=rec_packer_logger_with_queue_handler
128
+ )
129
+ else:
130
+ total_archived_files: int = 0
131
+ for archive_directory in archive_directories:
132
+ files_to_archive: list = filesystem.get_paths_from_directory(
133
+ directory_path=archive_directory.path, get_file=True, recursive=False)
134
+ total_archived_files += len(files_to_archive)
135
+ archived_file: str = archive(archive_directory.path, include_root_directory=True)
136
+ # Remove the original directory after archiving.
137
+ shutil.rmtree(archive_directory.path, ignore_errors=True)
138
+ archived_files.append(archived_file)
139
+
140
+ print_api.print_api(
141
+ f'Archived: 'f'Directories: {len(archive_directories)} | '
142
+ f'Total Files: {total_archived_files} | In: {directory_path.path}',
143
+ logger=rec_packer_logger_with_queue_handler, color='blue')
144
+ print_api.print_api(f'Archived files: {archived_files}', logger=rec_packer_logger_with_queue_handler)
145
+
146
+ finalize_output_queue.put(None)
147
+
148
+ print_api.print_api(
149
+ 'Finished recs archiver process.', color='blue',
150
+ logger=rec_packer_logger_with_queue_handler
151
+ )
152
+
153
+ return archived_files
154
+ except Exception as e:
155
+ print_api.print_api(
156
+ f"Error while archiving recs files: {e}",
157
+ color='red',
158
+ logger=rec_packer_logger_with_queue_handler
159
+ )
160
+
161
+ finalize_output_queue.put(e)
162
+ return None
163
+
164
+
165
+ def recs_archiver_in_process(
166
+ recs_directory: str,
167
+ logging_queue: multiprocessing.Queue,
168
+ logger_name: str,
169
+ finalize_output_queue: multiprocessing.Queue
170
+ ) -> multiprocessing.Process:
171
+ """
172
+ Archive recs files in a directory for each day in a separate process.
173
+
174
+ :param recs_directory: The directory where recordings are stored.
175
+ :param logging_queue: The queue for logging messages.
176
+ :param logger_name: The name of the logger to use for logging.
177
+ :param finalize_output_queue: output queue for results/exceptions.
178
+ """
179
+
180
+ process = multiprocessing.Process(
181
+ target=recs_archiver, args=(recs_directory, logging_queue, logger_name, finalize_output_queue))
182
+ process.start()
183
+ return process
@@ -1,9 +1,8 @@
1
- import json
2
- # Needed to get the function caller module.
3
1
  import inspect
4
2
 
5
3
  from ..wrappers.loggingw import loggingw
6
- from ..basics import dicts
4
+
5
+ from . import config_static
7
6
 
8
7
 
9
8
  # If the string has several dot characters (".") - return the most right string after the last dot.
@@ -33,12 +32,7 @@ def create_custom_logger():
33
32
  # 'f_globals' is a dictionary of all the global variables of the calling initiated class.
34
33
  class_name = calling_frame.f_globals['__name__']
35
34
  # Get the logger name only.
36
- logger_name = build_module_names(class_name)[0]
35
+ engine_logger_part = build_module_names(class_name)[0]
36
+ logger_name = f'{config_static.MainConfig.LOGGER_NAME}.{engine_logger_part}'
37
37
 
38
38
  return loggingw.get_logger_with_level(logger_name)
39
-
40
-
41
- def get_json(obj):
42
- """ Convert any nested object to json / dict and values to string as is """
43
-
44
- return json.dumps(obj, default=dicts.convert_complex_object_to_dict)
@@ -0,0 +1,82 @@
1
+ import socket
2
+
3
+ import paramiko
4
+
5
+ from .. import package_mains_processor, ssh_remote, config_init
6
+ from ..wrappers.socketw import process_getter
7
+ from ..print_api import print_api
8
+
9
+
10
+ PORT_TO_CMD_FILE: str = 'process_from_port'
11
+ TCP_PORTS_FILE: str = 'get_local_tcp_ports'
12
+
13
+
14
+ def test_ssh_main(config: dict) -> int:
15
+ hosts: list = config['main']['hosts_or_ips']
16
+
17
+ for host in hosts:
18
+ print("-----------------------------------")
19
+ print_api(f"Testing cmd for host: {host}", color='blue')
20
+
21
+ if host in config['main']:
22
+ print("Using host-specific credentials")
23
+ username = config[host]['user']
24
+ password = config[host]['pass']
25
+ else:
26
+ print("Didn't find host-specific credential, using defaults")
27
+ username = config['all_hosts']['user']
28
+ password = config['all_hosts']['pass']
29
+
30
+ ssh_client = ssh_remote.SSHRemote(ip_address=host, username=username, password=password)
31
+
32
+ try:
33
+ ssh_client.connect()
34
+ except socket.gaierror as e:
35
+ if e.errno == 11001:
36
+ print_api(f"Couldn't resolve IP to {host}: {str(e)}\n"
37
+ f"Try providing IP address instead of hostname", color='red')
38
+ continue
39
+ else:
40
+ raise e
41
+ except paramiko.ssh_exception.NoValidConnectionsError as e:
42
+ print_api(f"Couldn't connect to {host}: {str(e)}", color='red')
43
+ continue
44
+
45
+ # Read the TCP ports file to string.
46
+ tcp_ports_package_processor: package_mains_processor.PackageMainsProcessor = package_mains_processor.PackageMainsProcessor(
47
+ script_file_stem=TCP_PORTS_FILE)
48
+ tcp_ports_script_string: str = tcp_ports_package_processor.read_script_file_to_string()
49
+
50
+ # Execute the TCP ports script remotely via SSH to get the list of open TCP ports.
51
+ tcp_ports_output, tcp_ports_error = ssh_client.remote_execution_python(script_string=tcp_ports_script_string)
52
+ if tcp_ports_error:
53
+ print_api(f"Error getting TCP ports from host {host}: {tcp_ports_error}", color='red')
54
+ continue
55
+
56
+ tcp_ports_list: list = tcp_ports_output.strip().splitlines()
57
+ if not tcp_ports_list:
58
+ print_api(f"No TCP ports found on host {host}", color='red')
59
+ continue
60
+
61
+ last_port: int = int(tcp_ports_list[-1])
62
+
63
+ port_to_cmd_package_processor: package_mains_processor.PackageMainsProcessor = package_mains_processor.PackageMainsProcessor(
64
+ script_file_stem=PORT_TO_CMD_FILE)
65
+ get_command_instance = process_getter.GetCommandLine(
66
+ client_ip=host,
67
+ client_port=last_port,
68
+ package_processor=port_to_cmd_package_processor,
69
+ ssh_client=ssh_client)
70
+ process_name = get_command_instance.get_process_name()
71
+ print(f"Process for port {last_port} on host {host}: {process_name}")
72
+
73
+ print("Closing SSH connection")
74
+ ssh_client.close()
75
+
76
+ if not process_name:
77
+ print_api(f"Failed to get process name for port {last_port} on host {host}", color='red')
78
+ continue
79
+
80
+ print_api(f"SSH test success!", color='green')
81
+
82
+ return 0