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.
- atomicshop/__init__.py +1 -1
- atomicshop/{addons/mains → a_mains}/FACT/update_extract.py +3 -2
- atomicshop/a_mains/addons/process_list/compile.cmd +7 -0
- atomicshop/a_mains/addons/process_list/compiled/Win10x64/process_list.dll +0 -0
- atomicshop/a_mains/addons/process_list/compiled/Win10x64/process_list.exp +0 -0
- atomicshop/a_mains/addons/process_list/compiled/Win10x64/process_list.lib +0 -0
- atomicshop/{addons → a_mains/addons}/process_list/process_list.cpp +8 -1
- atomicshop/a_mains/dns_gateway_setting.py +11 -0
- atomicshop/a_mains/get_local_tcp_ports.py +85 -0
- atomicshop/a_mains/github_wrapper.py +11 -0
- atomicshop/a_mains/install_ca_certificate.py +172 -0
- atomicshop/{addons/mains → a_mains}/msi_unpacker.py +3 -1
- atomicshop/a_mains/process_from_port.py +119 -0
- atomicshop/a_mains/set_default_dns_gateway.py +90 -0
- atomicshop/a_mains/update_config_toml.py +38 -0
- atomicshop/appointment_management.py +5 -3
- atomicshop/basics/ansi_escape_codes.py +3 -1
- atomicshop/basics/argparse_template.py +2 -0
- atomicshop/basics/booleans.py +27 -30
- atomicshop/basics/bytes_arrays.py +43 -0
- atomicshop/basics/classes.py +149 -1
- atomicshop/basics/dicts.py +12 -0
- atomicshop/basics/enums.py +2 -2
- atomicshop/basics/exceptions.py +5 -1
- atomicshop/basics/list_of_classes.py +29 -0
- atomicshop/basics/list_of_dicts.py +69 -5
- atomicshop/basics/lists.py +14 -0
- atomicshop/basics/multiprocesses.py +374 -50
- atomicshop/basics/package_module.py +10 -0
- atomicshop/basics/strings.py +160 -7
- atomicshop/basics/threads.py +14 -0
- atomicshop/basics/tracebacks.py +13 -4
- atomicshop/certificates.py +153 -52
- atomicshop/config_init.py +12 -7
- atomicshop/console_user_response.py +7 -14
- atomicshop/consoles.py +9 -0
- atomicshop/datetimes.py +98 -0
- atomicshop/diff_check.py +340 -40
- atomicshop/dns.py +128 -12
- atomicshop/etws/_pywintrace_fix.py +17 -0
- atomicshop/etws/const.py +38 -0
- atomicshop/etws/providers.py +21 -0
- atomicshop/etws/sessions.py +43 -0
- atomicshop/etws/trace.py +168 -0
- atomicshop/etws/traces/trace_dns.py +162 -0
- atomicshop/etws/traces/trace_sysmon_process_creation.py +126 -0
- atomicshop/etws/traces/trace_tcp.py +130 -0
- atomicshop/file_io/csvs.py +222 -24
- atomicshop/file_io/docxs.py +35 -18
- atomicshop/file_io/file_io.py +35 -19
- atomicshop/file_io/jsons.py +49 -0
- atomicshop/file_io/tomls.py +139 -0
- atomicshop/filesystem.py +864 -293
- atomicshop/get_process_list.py +133 -0
- atomicshop/{process_name_cmd.py → get_process_name_cmd_dll.py} +52 -19
- atomicshop/http_parse.py +149 -93
- atomicshop/ip_addresses.py +6 -1
- atomicshop/mitm/centered_settings.py +132 -0
- atomicshop/mitm/config_static.py +207 -0
- atomicshop/mitm/config_toml_editor.py +55 -0
- atomicshop/mitm/connection_thread_worker.py +875 -357
- atomicshop/mitm/engines/__parent/parser___parent.py +4 -17
- atomicshop/mitm/engines/__parent/recorder___parent.py +108 -51
- atomicshop/mitm/engines/__parent/requester___parent.py +116 -0
- atomicshop/mitm/engines/__parent/responder___parent.py +75 -114
- atomicshop/mitm/engines/__reference_general/parser___reference_general.py +10 -7
- atomicshop/mitm/engines/__reference_general/recorder___reference_general.py +5 -5
- atomicshop/mitm/engines/__reference_general/requester___reference_general.py +47 -0
- atomicshop/mitm/engines/__reference_general/responder___reference_general.py +95 -13
- atomicshop/mitm/engines/create_module_template.py +58 -14
- atomicshop/mitm/import_config.py +359 -139
- atomicshop/mitm/initialize_engines.py +160 -74
- atomicshop/mitm/message.py +64 -23
- atomicshop/mitm/mitm_main.py +892 -0
- atomicshop/mitm/recs_files.py +183 -0
- atomicshop/mitm/shared_functions.py +4 -10
- atomicshop/mitm/ssh_tester.py +82 -0
- atomicshop/mitm/statistic_analyzer.py +257 -166
- atomicshop/mitm/statistic_analyzer_helper/analyzer_helper.py +136 -0
- atomicshop/mitm/statistic_analyzer_helper/moving_average_helper.py +525 -0
- atomicshop/monitor/change_monitor.py +96 -120
- atomicshop/monitor/checks/dns.py +139 -70
- atomicshop/monitor/checks/file.py +77 -0
- atomicshop/monitor/checks/network.py +81 -77
- atomicshop/monitor/checks/process_running.py +33 -34
- atomicshop/monitor/checks/url.py +94 -0
- atomicshop/networks.py +671 -0
- atomicshop/on_exit.py +205 -0
- atomicshop/package_mains_processor.py +84 -0
- atomicshop/permissions/permissions.py +22 -0
- atomicshop/permissions/ubuntu_permissions.py +239 -0
- atomicshop/permissions/win_permissions.py +33 -0
- atomicshop/print_api.py +24 -41
- atomicshop/process.py +63 -17
- atomicshop/process_poller/__init__.py +0 -0
- atomicshop/process_poller/pollers/__init__.py +0 -0
- atomicshop/process_poller/pollers/psutil_pywin32wmi_dll.py +95 -0
- atomicshop/process_poller/process_pool.py +207 -0
- atomicshop/process_poller/simple_process_pool.py +311 -0
- atomicshop/process_poller/tracer_base.py +45 -0
- atomicshop/process_poller/tracers/__init__.py +0 -0
- atomicshop/process_poller/tracers/event_log.py +46 -0
- atomicshop/process_poller/tracers/sysmon_etw.py +68 -0
- atomicshop/python_file_patcher.py +1 -1
- atomicshop/python_functions.py +27 -75
- atomicshop/question_answer_engine.py +2 -2
- atomicshop/scheduling.py +24 -5
- atomicshop/sound.py +4 -2
- atomicshop/speech_recognize.py +8 -0
- atomicshop/ssh_remote.py +158 -172
- atomicshop/startup/__init__.py +0 -0
- atomicshop/startup/win/__init__.py +0 -0
- atomicshop/startup/win/startup_folder.py +53 -0
- atomicshop/startup/win/task_scheduler.py +119 -0
- atomicshop/system_resource_monitor.py +61 -46
- atomicshop/system_resources.py +8 -8
- atomicshop/tempfiles.py +1 -2
- atomicshop/timer.py +30 -11
- atomicshop/urls.py +41 -0
- atomicshop/venvs.py +28 -0
- atomicshop/versioning.py +27 -0
- atomicshop/web.py +110 -25
- atomicshop/web_apis/__init__.py +0 -0
- atomicshop/web_apis/google_custom_search.py +44 -0
- atomicshop/web_apis/google_llm.py +188 -0
- atomicshop/websocket_parse.py +450 -0
- atomicshop/wrappers/certauthw/certauth.py +1 -0
- atomicshop/wrappers/cryptographyw.py +29 -8
- atomicshop/wrappers/ctyping/etw_winapi/__init__.py +0 -0
- atomicshop/wrappers/ctyping/etw_winapi/const.py +335 -0
- atomicshop/wrappers/ctyping/etw_winapi/etw_functions.py +393 -0
- atomicshop/wrappers/ctyping/file_details_winapi.py +67 -0
- atomicshop/wrappers/ctyping/msi_windows_installer/cabs.py +2 -1
- atomicshop/wrappers/ctyping/msi_windows_installer/extract_msi_main.py +13 -9
- atomicshop/wrappers/ctyping/msi_windows_installer/tables.py +35 -0
- atomicshop/wrappers/ctyping/setup_device.py +466 -0
- atomicshop/wrappers/ctyping/win_console.py +39 -0
- atomicshop/wrappers/dockerw/dockerw.py +113 -2
- atomicshop/wrappers/elasticsearchw/config_basic.py +0 -12
- atomicshop/wrappers/elasticsearchw/elastic_infra.py +75 -0
- atomicshop/wrappers/elasticsearchw/elasticsearchw.py +2 -20
- atomicshop/wrappers/factw/get_file_data.py +12 -5
- atomicshop/wrappers/factw/install/install_after_restart.py +89 -5
- atomicshop/wrappers/factw/install/pre_install_and_install_before_restart.py +20 -14
- atomicshop/wrappers/factw/postgresql/firmware.py +4 -6
- atomicshop/wrappers/githubw.py +583 -51
- atomicshop/wrappers/loggingw/consts.py +49 -0
- atomicshop/wrappers/loggingw/filters.py +102 -0
- atomicshop/wrappers/loggingw/formatters.py +58 -71
- atomicshop/wrappers/loggingw/handlers.py +459 -40
- atomicshop/wrappers/loggingw/loggers.py +19 -0
- atomicshop/wrappers/loggingw/loggingw.py +1010 -178
- atomicshop/wrappers/loggingw/reading.py +344 -19
- atomicshop/wrappers/mongodbw/__init__.py +0 -0
- atomicshop/wrappers/mongodbw/mongo_infra.py +31 -0
- atomicshop/wrappers/mongodbw/mongodbw.py +1432 -0
- atomicshop/wrappers/netshw.py +271 -0
- atomicshop/wrappers/playwrightw/engine.py +34 -19
- atomicshop/wrappers/playwrightw/infra.py +5 -0
- atomicshop/wrappers/playwrightw/javascript.py +7 -3
- atomicshop/wrappers/playwrightw/keyboard.py +14 -0
- atomicshop/wrappers/playwrightw/scenarios.py +172 -5
- atomicshop/wrappers/playwrightw/waits.py +9 -7
- atomicshop/wrappers/powershell_networking.py +80 -0
- atomicshop/wrappers/psutilw/processes.py +81 -0
- atomicshop/wrappers/psutilw/psutil_networks.py +85 -0
- atomicshop/wrappers/psutilw/psutilw.py +9 -0
- atomicshop/wrappers/pyopensslw.py +9 -2
- atomicshop/wrappers/pywin32w/__init__.py +0 -0
- atomicshop/wrappers/pywin32w/cert_store.py +116 -0
- atomicshop/wrappers/pywin32w/console.py +34 -0
- atomicshop/wrappers/pywin32w/win_event_log/__init__.py +0 -0
- atomicshop/wrappers/pywin32w/win_event_log/fetch.py +174 -0
- atomicshop/wrappers/pywin32w/win_event_log/subscribe.py +212 -0
- atomicshop/wrappers/pywin32w/win_event_log/subscribes/__init__.py +0 -0
- atomicshop/wrappers/pywin32w/win_event_log/subscribes/process_create.py +57 -0
- atomicshop/wrappers/pywin32w/win_event_log/subscribes/process_terminate.py +49 -0
- atomicshop/wrappers/pywin32w/win_event_log/subscribes/schannel_logging.py +97 -0
- atomicshop/wrappers/pywin32w/winshell.py +19 -0
- atomicshop/wrappers/pywin32w/wmis/__init__.py +0 -0
- atomicshop/wrappers/pywin32w/wmis/msft_netipaddress.py +113 -0
- atomicshop/wrappers/pywin32w/wmis/win32_networkadapterconfiguration.py +259 -0
- atomicshop/wrappers/pywin32w/wmis/win32networkadapter.py +112 -0
- atomicshop/wrappers/pywin32w/wmis/wmi_helpers.py +236 -0
- atomicshop/wrappers/socketw/accepter.py +21 -7
- atomicshop/wrappers/socketw/certificator.py +216 -150
- atomicshop/wrappers/socketw/creator.py +190 -50
- atomicshop/wrappers/socketw/dns_server.py +500 -173
- atomicshop/wrappers/socketw/exception_wrapper.py +45 -52
- atomicshop/wrappers/socketw/process_getter.py +86 -0
- atomicshop/wrappers/socketw/receiver.py +144 -102
- atomicshop/wrappers/socketw/sender.py +65 -35
- atomicshop/wrappers/socketw/sni.py +334 -165
- atomicshop/wrappers/socketw/socket_base.py +134 -0
- atomicshop/wrappers/socketw/socket_client.py +137 -95
- atomicshop/wrappers/socketw/socket_server_tester.py +14 -9
- atomicshop/wrappers/socketw/socket_wrapper.py +717 -116
- atomicshop/wrappers/socketw/ssl_base.py +15 -14
- atomicshop/wrappers/socketw/statistics_csv.py +148 -17
- atomicshop/wrappers/sysmonw.py +157 -0
- atomicshop/wrappers/ubuntu_terminal.py +65 -26
- atomicshop/wrappers/win_auditw.py +189 -0
- atomicshop/wrappers/winregw/__init__.py +0 -0
- atomicshop/wrappers/winregw/winreg_installed_software.py +58 -0
- atomicshop/wrappers/winregw/winreg_network.py +232 -0
- {atomicshop-2.11.47.dist-info → atomicshop-3.10.5.dist-info}/METADATA +31 -49
- atomicshop-3.10.5.dist-info/RECORD +306 -0
- {atomicshop-2.11.47.dist-info → atomicshop-3.10.5.dist-info}/WHEEL +1 -1
- atomicshop/_basics_temp.py +0 -101
- atomicshop/addons/a_setup_scripts/install_psycopg2_ubuntu.sh +0 -3
- atomicshop/addons/a_setup_scripts/install_pywintrace_0.3.cmd +0 -2
- atomicshop/addons/mains/install_docker_rootless_ubuntu.py +0 -11
- atomicshop/addons/mains/install_docker_ubuntu_main_sudo.py +0 -11
- atomicshop/addons/mains/install_elastic_search_and_kibana_ubuntu.py +0 -10
- atomicshop/addons/mains/install_wsl_ubuntu_lts_admin.py +0 -9
- atomicshop/addons/package_setup/CreateWheel.cmd +0 -7
- atomicshop/addons/package_setup/Setup in Edit mode.cmd +0 -6
- atomicshop/addons/package_setup/Setup.cmd +0 -7
- atomicshop/addons/process_list/compile.cmd +0 -2
- atomicshop/addons/process_list/compiled/Win10x64/process_list.dll +0 -0
- atomicshop/addons/process_list/compiled/Win10x64/process_list.exp +0 -0
- atomicshop/addons/process_list/compiled/Win10x64/process_list.lib +0 -0
- atomicshop/archiver/_search_in_zip.py +0 -189
- atomicshop/archiver/archiver.py +0 -34
- atomicshop/archiver/search_in_archive.py +0 -250
- atomicshop/archiver/sevenz_app_w.py +0 -86
- atomicshop/archiver/sevenzs.py +0 -44
- atomicshop/archiver/zips.py +0 -293
- atomicshop/etw/dns_trace.py +0 -118
- atomicshop/etw/etw.py +0 -61
- atomicshop/file_types.py +0 -24
- atomicshop/mitm/engines/create_module_template_example.py +0 -13
- atomicshop/mitm/initialize_mitm_server.py +0 -240
- atomicshop/monitor/checks/hash.py +0 -44
- atomicshop/monitor/checks/hash_checks/file.py +0 -55
- atomicshop/monitor/checks/hash_checks/url.py +0 -62
- atomicshop/pbtkmultifile_argparse.py +0 -88
- atomicshop/permissions.py +0 -110
- atomicshop/process_poller.py +0 -237
- atomicshop/script_as_string_processor.py +0 -38
- atomicshop/ssh_scripts/process_from_ipv4.py +0 -37
- atomicshop/ssh_scripts/process_from_port.py +0 -27
- atomicshop/wrappers/_process_wrapper_curl.py +0 -27
- atomicshop/wrappers/_process_wrapper_tar.py +0 -21
- atomicshop/wrappers/dockerw/install_docker.py +0 -209
- atomicshop/wrappers/elasticsearchw/infrastructure.py +0 -265
- atomicshop/wrappers/elasticsearchw/install_elastic.py +0 -232
- atomicshop/wrappers/ffmpegw.py +0 -125
- atomicshop/wrappers/loggingw/checks.py +0 -20
- atomicshop/wrappers/nodejsw/install_nodejs.py +0 -139
- atomicshop/wrappers/process_wrapper_pbtk.py +0 -16
- atomicshop/wrappers/socketw/base.py +0 -59
- atomicshop/wrappers/socketw/get_process.py +0 -107
- atomicshop/wrappers/wslw.py +0 -191
- atomicshop-2.11.47.dist-info/RECORD +0 -251
- /atomicshop/{addons/mains → a_mains}/FACT/factw_fact_extractor_docker_image_main_sudo.py +0 -0
- /atomicshop/{addons → a_mains/addons}/PlayWrightCodegen.cmd +0 -0
- /atomicshop/{addons → a_mains/addons}/ScriptExecution.cmd +0 -0
- /atomicshop/{addons/mains → a_mains/addons}/inits/init_to_import_all_modules.py +0 -0
- /atomicshop/{addons → a_mains/addons}/process_list/ReadMe.txt +0 -0
- /atomicshop/{addons/mains → a_mains}/search_for_hyperlinks_in_docx.py +0 -0
- /atomicshop/{archiver → etws}/__init__.py +0 -0
- /atomicshop/{etw → etws/traces}/__init__.py +0 -0
- /atomicshop/{monitor/checks/hash_checks → mitm/statistic_analyzer_helper}/__init__.py +0 -0
- /atomicshop/{wrappers/nodejsw → permissions}/__init__.py +0 -0
- /atomicshop/wrappers/pywin32w/{wmi_win32process.py → wmis/win32process.py} +0 -0
- {atomicshop-2.11.47.dist-info → atomicshop-3.10.5.dist-info/licenses}/LICENSE.txt +0 -0
- {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
|
-
|
|
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
|
-
|
|
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
|