Skip to content

Commit 29ba9f4

Browse files
Bug fixes and v3.3.0 (#176)
## Pull Request Template ### Prerequisites <!-- Take a couple of minutes to help our maintainers work faster by checking of the pre-requisites. --> <!-- To tick the checkboxes replace the space with an 'x', so [ ] becomes [x] . --> - [x] I have [searched](https://github.com/DefinetlyNotAI/Logicytics/pulls) for duplicate or closed issues. - [x] I have read the [contributing guidelines](https://github.com/DefinetlyNotAI/Logicytics/blob/main/CONTRIBUTING.md). - [x] I have followed the instructions in the [wiki](https://github.com/DefinetlyNotAI/Logicytics/wiki) about contributions. - [x] I have updated the documentation accordingly, if required. - [x] I have tested my code with the `--dev` flag, if required. ### PR Type <!-- Take a couple of minutes to help our maintainers work faster by telling us what is the PR guided on. --> <!-- To tick the checkboxes replace the space with an 'x', so [ ] becomes [x] . --> - [x] Bug fix <!-- Non-Breaking Bug Fix - Usually relates to fixing an issue --> - [x] Deprecation Change <!-- Removing a deprecation --> - [x] New feature <!-- Non-Breaking Change that adds a new feature --> - [x] Refactoring <!-- Non-Breaking Change that modifies existing code to refactor it to become more organised --> - [x] Documentation update <!-- Non-Breaking Change that modifies existing documentation to refactor it or add extra comments - either wiki, md files or code is included here --> - [x] ⚠️ Breaking change ⚠️ <!-- Breaking Bug Fix / New Addition that changes how Logicytics works --> ### Description <!-- REQUIRED: Provide a summary of the PR and what you expected to happen. --> <!-- Made by copilot --> This pull request includes significant changes to the `Logicytics` project, focusing on code refactoring, logging improvements, and the removal of deprecated features. The most important changes include the refactoring of flag handling, the addition of detailed logging, and the cleanup of deprecated features. #### Code Refactoring and Improvements: * [`CODE/Logicytics.py`](diffhunk://#diff-44a988332704ab86171610dcfe391d08df0f70f8177c3463e6e089aec9c5baa0L78-R87): Refactored `get_flags` function to simplify flag retrieval and logging. Removed deprecated features `extra` and `unzip_extra` from `handle_special_actions`. Added the `Logicytics` main function to encapsulate the main process logic. [[1]](diffhunk://#diff-44a988332704ab86171610dcfe391d08df0f70f8177c3463e6e089aec9c5baa0L78-R87) [[2]](diffhunk://#diff-44a988332704ab86171610dcfe391d08df0f70f8177c3463e6e089aec9c5baa0L138-L145) [[3]](diffhunk://#diff-44a988332704ab86171610dcfe391d08df0f70f8177c3463e6e089aec9c5baa0L176-L183) [[4]](diffhunk://#diff-44a988332704ab86171610dcfe391d08df0f70f8177c3463e6e089aec9c5baa0L370-R359) [[5]](diffhunk://#diff-44a988332704ab86171610dcfe391d08df0f70f8177c3463e6e089aec9c5baa0R373-R376) #### Logging Enhancements: * [`CODE/_debug.py`](diffhunk://#diff-cddd7a4c003554a2fce729e954458aa39d397bf2910c94cdd093f39747848061R181-R188): Added detailed logging to `python_version` and `debug` functions. [[1]](diffhunk://#diff-cddd7a4c003554a2fce729e954458aa39d397bf2910c94cdd093f39747848061R181-R188) [[2]](diffhunk://#diff-cddd7a4c003554a2fce729e954458aa39d397bf2910c94cdd093f39747848061R222) * [`CODE/_dev.py`](diffhunk://#diff-8789fb31b28e15638e2117ffc4916c7d17b62b207559877dce4b69ffcfcfaa09L50-R51): Enhanced `_prompt_user` function with more user-friendly prompts and added logging to `dev_checks` function. [[1]](diffhunk://#diff-8789fb31b28e15638e2117ffc4916c7d17b62b207559877dce4b69ffcfcfaa09L50-R51) [[2]](diffhunk://#diff-8789fb31b28e15638e2117ffc4916c7d17b62b207559877dce4b69ffcfcfaa09R65) [[3]](diffhunk://#diff-8789fb31b28e15638e2117ffc4916c7d17b62b207559877dce4b69ffcfcfaa09L90-R106) [[4]](diffhunk://#diff-8789fb31b28e15638e2117ffc4916c7d17b62b207559877dce4b69ffcfcfaa09L127-R133) * [`CODE/bluetooth_details.py`](diffhunk://#diff-d15430c77b28ebd438edeec503e4666192dd9e256cc386ebcdc6a5012b398d59L1-R12): Improved logging in `get_bluetooth_device_details` and `_query_bluetooth_devices`. [[1]](diffhunk://#diff-d15430c77b28ebd438edeec503e4666192dd9e256cc386ebcdc6a5012b398d59L1-R12) [[2]](diffhunk://#diff-d15430c77b28ebd438edeec503e4666192dd9e256cc386ebcdc6a5012b398d59L30-R39) [[3]](diffhunk://#diff-d15430c77b28ebd438edeec503e4666192dd9e256cc386ebcdc6a5012b398d59L52-R74) [[4]](diffhunk://#diff-d15430c77b28ebd438edeec503e4666192dd9e256cc386ebcdc6a5012b398d59L97) * [`CODE/bluetooth_logger.py`](diffhunk://#diff-1876b6113c2e2b1d8fa0dfe09ab9a1b20d3fb52852256fd0bbdd1f8bfc9ce27aL1-R4): Added detailed logging and documentation to functions `save_to_file`, `run_powershell_command`, `parse_output`, `get_paired_bluetooth_devices`, and `log_bluetooth`. [[1]](diffhunk://#diff-1876b6113c2e2b1d8fa0dfe09ab9a1b20d3fb52852256fd0bbdd1f8bfc9ce27aL1-R4) [[2]](diffhunk://#diff-1876b6113c2e2b1d8fa0dfe09ab9a1b20d3fb52852256fd0bbdd1f8bfc9ce27aL12-R23) [[3]](diffhunk://#diff-1876b6113c2e2b1d8fa0dfe09ab9a1b20d3fb52852256fd0bbdd1f8bfc9ce27aL24-R47) [[4]](diffhunk://#diff-1876b6113c2e2b1d8fa0dfe09ab9a1b20d3fb52852256fd0bbdd1f8bfc9ce27aL38-R95) [[5]](diffhunk://#diff-1876b6113c2e2b1d8fa0dfe09ab9a1b20d3fb52852256fd0bbdd1f8bfc9ce27aR117-R128) [[6]](diffhunk://#diff-1876b6113c2e2b1d8fa0dfe09ab9a1b20d3fb52852256fd0bbdd1f8bfc9ce27aR143-R149) #### Deprecated Feature Removal: * [`CODE/Logicytics.py`](diffhunk://#diff-44a988332704ab86171610dcfe391d08df0f70f8177c3463e6e089aec9c5baa0L138-L145): Removed deprecated features `extra` and `unzip_extra` from `handle_special_actions`. [[1]](diffhunk://#diff-44a988332704ab86171610dcfe391d08df0f70f8177c3463e6e089aec9c5baa0L138-L145) [[2]](diffhunk://#diff-44a988332704ab86171610dcfe391d08df0f70f8177c3463e6e089aec9c5baa0L176-L183) #### Miscellaneous Changes: * [`.github/ISSUE_TEMPLATE/bug_report.yml`](diffhunk://#diff-637f7b97bba458badb691a1557c3d4648686292e948dbe3e8360564378b653efL47-R49): Renamed `flags` to `flags_list` for consistency. * [`CODE/_dev.py`](diffhunk://#diff-8789fb31b28e15638e2117ffc4916c7d17b62b207559877dce4b69ffcfcfaa09L3-R6): Reorganized imports and added `EXCLUDE_FILES` to `dev_checks` function. [[1]](diffhunk://#diff-8789fb31b28e15638e2117ffc4916c7d17b62b207559877dce4b69ffcfcfaa09L3-R6) [[2]](diffhunk://#diff-8789fb31b28e15638e2117ffc4916c7d17b62b207559877dce4b69ffcfcfaa09L90-R106) * [`CODE/cmd_commands.py`](diffhunk://#diff-7422c369c3c1828e52aa953e050cf03d003b07f6f0a244908eb117002bbc4be1R30): Added `__main__` check to execute commands. These changes aim to enhance code readability, improve logging for debugging purposes, and remove outdated features to maintain code quality. ### Motivation and Context <!-- REQUIRED: Why is this PR required? What problem does it solve? Why do you want to do it? --> To move in version 3.3.0 and fix many bugs and improve Logicytics ### Credit <!-- If this PR is a contribution, please mention the contributors here using the appropriate syntax. --> <!-- ### File-Created/CONTRIBUTION by MAIN-Username What you did, created, removed, refactored, fixed, or discovered. - [Your GitHub Username](https://github.com/YourGitHubLink) - [Your GitHub Username](https://github.com/YourGitHubLink) etc... --> _N/A_ ### Issues Fixed <!-- REQUIRED: What issues will be fixed? (Format: "#50, #23" etc.) if none exist type _N/A_ --> _N/A_ <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Release Notes for Logicytics v3.3.0 ### New Features - Enhanced flag suggestion system with historical data tracking. - Improved Bluetooth data collection and logging. - Added support for more file types in sensitive data mining. - Expanded system information and memory snapshot capabilities. - New configuration options for user preferences and accuracy settings. - Added a new XML configuration file for CSV file handling. ### Improvements - Refined error handling across multiple modules. - Enhanced logging and debugging mechanisms. - Updated configuration management. - Improved thread-based execution for certain operations. - Streamlined control flow to prevent unintended execution during imports. ### Bug Fixes - Resolved issues with file parsing and system checks. - Improved compatibility with various system configurations. ### Dependency Updates - Added `sentence-transformers` for advanced flag suggestions. - Added `WMI` for improved Windows system interactions. - Restored `scapy` package. - Removed `transformers` and `pathlib` packages. ### Security - Updated supported version statuses. - Enhanced logging for better tracking and debugging. ### Deprecations - Removed some deprecated actions and methods. - Streamlined code structure for better maintainability. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
2 parents 8d306ac + 77d7519 commit 29ba9f4

36 files changed

+2350
-938
lines changed

.github/ISSUE_TEMPLATE/bug_report.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ body:
4444
validations:
4545
required: false
4646
- type: dropdown
47-
id: flags
47+
id: flags_list
4848
attributes:
49-
label: What flags were you using to run Logicytics?
49+
label: What flags_list were you using to run Logicytics?
5050
multiple: false
5151
options:
5252
- Threading

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,3 +320,5 @@ $RECYCLE.BIN/
320320
/CODE/SysInternal_Suite/.sys.ignore
321321
/ACCESS/
322322
/CODE/VulnScan/tools/NN features/
323+
/CODE/logicytics/User_History.json.gz
324+
/CODE/logicytics/User_History.json

.idea/csv-editor.xml

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CODE/Logicytics.py

Lines changed: 129 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import os
44
import shutil
55
import subprocess
6-
import threading
76
import zipfile
7+
from concurrent.futures import ThreadPoolExecutor, as_completed
88
from datetime import datetime
99
from typing import Any
1010

@@ -75,35 +75,42 @@ def update() -> tuple[str, str]:
7575

7676
def get_flags():
7777
"""
78-
Retrieves the command-line flags and sub-actions.
79-
80-
This function checks if the flags are provided as a tuple. If so, it attempts to unpack
81-
the tuple into ACTION and SUB_ACTION. If an exception occurs, it sets SUB_ACTION to None.
82-
If the flags are not a tuple, it prints the help message and exits the program.
83-
78+
Retrieves action and sub-action flags from the Flag module and sets global variables.
79+
80+
This function extracts the current action and sub-action from the Flag module, setting global
81+
ACTION and SUB_ACTION variables. It logs the retrieved values for debugging and tracing purposes.
82+
83+
No parameters.
84+
85+
Side effects:
86+
- Sets global variables ACTION and SUB_ACTION
87+
- Logs debug information about current action and sub-action
8488
"""
8589
global ACTION, SUB_ACTION
86-
if isinstance(Flag.data(), tuple):
87-
try:
88-
# Get flags
89-
ACTION, SUB_ACTION = Flag.data()
90-
except ValueError:
91-
actions = Flag.data()
92-
ACTION = actions[0]
93-
SUB_ACTION = None
94-
else:
95-
parser = Flag.data()
96-
parser.print_help()
97-
input("Press Enter to exit...")
98-
exit(1)
90+
# Get flags_list
91+
ACTION, SUB_ACTION = Flag.data()
92+
log.debug(f"Action: {ACTION}")
93+
log.debug(f"Sub-Action: {SUB_ACTION}")
9994

10095

10196
def special_execute(file_path: str):
10297
"""
103-
Executes a Python script in a new command prompt window.
104-
105-
Args:
106-
file_path (str): The relative path to the Python script to be executed.
98+
Execute a Python script in a new command prompt window.
99+
100+
This function launches the specified Python script in a separate command prompt window, waits for its completion, and then exits the current process.
101+
102+
Parameters:
103+
file_path (str): The relative path to the Python script to be executed,
104+
which will be resolved relative to the current script's directory.
105+
106+
Side Effects:
107+
- Opens a new command prompt window
108+
- Runs the specified Python script
109+
- Terminates the current process after script execution
110+
111+
Raises:
112+
FileNotFoundError: If the specified script path does not exist
113+
subprocess.SubprocessError: If there are issues launching the subprocess
107114
"""
108115
sr_current_dir = os.path.dirname(os.path.abspath(__file__))
109116
sr_script_path = os.path.join(sr_current_dir, file_path)
@@ -114,12 +121,23 @@ def special_execute(file_path: str):
114121

115122
def handle_special_actions():
116123
"""
117-
Handles special actions based on the provided action flag.
118-
119-
This function checks the value of the `action` variable and performs
120-
corresponding special actions such as opening debug, developer, or extra
121-
tools menus, updating the repository, restoring backups, creating backups,
122-
or unzipping extra files.
124+
Handles special actions based on the current action flag.
125+
126+
This function performs specific actions depending on the global `ACTION` variable:
127+
- For "debug": Opens the debug menu by executing '_debug.py'
128+
- For "dev": Opens the developer menu by executing '_dev.py'
129+
- For "update": Updates the repository using Health.update() method
130+
- For "restore": Displays a warning and opens the backup location
131+
- For "backup": Creates backups of the CODE and MODS directories
132+
133+
Side Effects:
134+
- Logs informational, debug, warning, or error messages
135+
- May execute external Python scripts
136+
- May open file locations
137+
- May terminate the program after completing special actions
138+
139+
Raises:
140+
SystemExit: Exits the program after completing certain special actions
123141
"""
124142
# Special actions -> Quit
125143
if ACTION == "debug":
@@ -135,14 +153,6 @@ def handle_special_actions():
135153
log.info("Opening developer menu...")
136154
special_execute("_dev.py")
137155

138-
# Deprecated, remove in v3.3.0
139-
if ACTION == "extra":
140-
print("\033[91mDeprecationWarning: The `extra` feature has been removed! 🚫\n"
141-
"Why? It didn't match our code quality standards.\n"
142-
"What to use instead? Check out our new features with --help\033[0m")
143-
input("Press Enter to exit...")
144-
exit(0)
145-
146156
if ACTION == "update":
147157
log.info("Updating...")
148158
message, log_type = Health.update()
@@ -173,22 +183,22 @@ def handle_special_actions():
173183
input("Press Enter to exit...")
174184
exit(0)
175185

176-
# Deprecated, remove in v3.3.0
177-
if ACTION == "unzip_extra":
178-
print("\033[91mDeprecationWarning: The `unzip_extra` feature has been removed! 🚫\n"
179-
"Why? It didn't match our code quality standards.\n"
180-
"What to use instead? Check out our new features with --help\033[0m")
181-
input("Press Enter to exit...")
182-
exit(0)
183-
184186

185187
def check_privileges():
186188
"""
187189
Checks if the script is running with administrative privileges and handles UAC (User Account Control) settings.
188-
190+
189191
This function verifies if the script has admin privileges. If not, it either logs a warning (in debug mode) or
190192
prompts the user to run the script with admin privileges and exits. It also checks if UAC is enabled and logs
191193
warnings accordingly.
194+
195+
Raises:
196+
SystemExit: If the script is not running with admin privileges and not in debug mode.
197+
198+
Notes:
199+
- Requires the `Check` module with `admin()` and `uac()` methods
200+
- Depends on global `DEBUG` configuration variable
201+
- Logs warnings or critical messages based on privilege and UAC status
192202
"""
193203
if not Check.admin():
194204
if DEBUG == "DEBUG":
@@ -205,16 +215,33 @@ def check_privileges():
205215

206216
def generate_execution_list() -> list | list[str] | list[str | Any]:
207217
"""
208-
Creates an execution list based on the provided action.
209-
218+
Generate an execution list of scripts based on the specified action.
219+
220+
This function dynamically creates a list of scripts to be executed by filtering and selecting
221+
scripts based on the global ACTION variable. It supports different execution modes:
222+
- 'minimal': A predefined set of lightweight scripts
223+
- 'nopy': PowerShell and script-based scripts without Python
224+
- 'modded': Includes scripts from the MODS directory
225+
- 'depth': Comprehensive script execution with data mining and logging scripts
226+
- 'vulnscan_ai': Vulnerability scanning script only
227+
210228
Returns:
211-
list: The execution list of scripts to be executed.
229+
list[str]: A list of script file paths to be executed, filtered and modified based on the current action.
230+
231+
Raises:
232+
ValueError: Implicitly if a script file cannot be removed from the initial list.
233+
234+
Notes:
235+
- Removes sensitive or unnecessary scripts from the initial file list
236+
- Logs the final execution list for debugging purposes
237+
- Warns users about potential long execution times for certain actions
212238
"""
213239
execution_list = Get.list_of_files(".", extensions=(".py", ".exe", ".ps1", ".bat"))
214240
execution_list.remove("sensitive_data_miner.py")
215241
execution_list.remove("dir_list.py")
216242
execution_list.remove("tree.ps1")
217243
execution_list.remove("vulnscan.py")
244+
execution_list.remove("event_log.py")
218245

219246
if ACTION == "minimal":
220247
execution_list = [
@@ -248,6 +275,7 @@ def generate_execution_list() -> list | list[str] | list[str | Any]:
248275
execution_list.append("sensitive_data_miner.py")
249276
execution_list.append("dir_list.py")
250277
execution_list.append("tree.ps1")
278+
execution_list.append("event_log.py")
251279
log.warning("This flag will use threading!")
252280

253281
if ACTION == "vulnscan_ai":
@@ -262,34 +290,42 @@ def execute_scripts():
262290
"""Executes the scripts in the execution list based on the action."""
263291
# Check weather to use threading or not, as well as execute code
264292
log.info("Starting Logicytics...")
293+
265294
if ACTION == "threaded" or ACTION == "depth":
266-
def threaded_execution(execution_list_thread, index_thread):
267-
log.debug(f"Thread {index_thread} started")
295+
296+
def execute_single_script(script: str) -> tuple[str, Exception | None]:
297+
"""
298+
Executes a single script and logs the result.
299+
300+
This function executes a single script and logs the result,
301+
capturing any exceptions that occur during execution
302+
303+
Parameters:
304+
script (str): The path to the script to be executed
305+
"""
306+
log.debug(f"Executing {script}")
268307
try:
269-
log.parse_execution(Execute.script(execution_list_thread[index_thread]))
270-
log.info(f"{execution_list_thread[index_thread]} executed")
271-
except UnicodeDecodeError as err:
272-
log.error(f"Error in thread: {err}")
308+
log.parse_execution(Execute.script(script))
309+
log.info(f"{script} executed")
310+
return script, None
273311
except Exception as err:
274-
log.error(f"Error in thread: {err}")
275-
log.debug(f"Thread {index_thread} finished")
312+
log.error(f"Error executing {script}: {err}")
313+
return script, err
276314

277315
log.debug("Using threading")
278-
threads = []
279316
execution_list = generate_execution_list()
280-
for index, _ in enumerate(execution_list):
281-
thread = threading.Thread(
282-
target=threaded_execution,
283-
args=(
284-
execution_list,
285-
index,
286-
),
287-
)
288-
threads.append(thread)
289-
thread.start()
290-
291-
for thread in threads:
292-
thread.join()
317+
with ThreadPoolExecutor() as executor:
318+
futures = {executor.submit(execute_single_script, script): script
319+
for script in execution_list}
320+
321+
for future in as_completed(futures):
322+
script = futures[future]
323+
result, error = future.result()
324+
if error:
325+
log.error(f"Failed to execute {script}")
326+
else:
327+
log.debug(f"Completed {script}")
328+
293329
elif ACTION == "performance_check":
294330
execution_times = []
295331
execution_list = generate_execution_list()
@@ -367,8 +403,23 @@ def handle_sub_action():
367403
# log.warning("This feature is not implemented yet! Sorry")
368404

369405

370-
if __name__ == "__main__":
371-
# Get flags and configs
406+
@log.function
407+
def Logicytics():
408+
"""
409+
Orchestrates the complete Logicytics workflow, managing script execution, system actions, and user interactions.
410+
411+
This function serves as the primary entry point for the Logicytics utility, coordinating a series of system-level operations:
412+
- Retrieves command-line configuration flags
413+
- Processes special actions
414+
- Verifies system privileges
415+
- Executes targeted scripts
416+
- Compresses generated output files
417+
- Handles final system sub-actions
418+
- Provides a graceful exit mechanism
419+
420+
Performs actions sequentially without returning a value, designed to be the main execution flow of the Logicytics utility.
421+
"""
422+
# Get flags_list and configs
372423
get_flags()
373424
# Check for special actions
374425
handle_special_actions()
@@ -382,6 +433,10 @@ def handle_sub_action():
382433
handle_sub_action()
383434
# Finish
384435
input("Press Enter to exit...")
436+
437+
438+
if __name__ == "__main__":
439+
Logicytics()
385440
else:
386441
log.error("This script cannot be imported!")
387442
exit(1)

CODE/_debug.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,27 @@ def cpu_info() -> tuple[str, str, str]:
178178

179179

180180
def python_version():
181+
"""
182+
Checks the current Python version against recommended version ranges and logs the result.
183+
184+
This function determines the compatibility of the current Python runtime by comparing its version
185+
against predefined minimum and maximum version thresholds. It provides informative logging about
186+
the Python version status.
187+
188+
Logs:
189+
- Info: When Python version is within the recommended range (3.11.x to 3.12.x)
190+
- Warning: When Python version is below the minimum recommended version (< 3.11)
191+
- Error: When Python version is above the maximum supported version (>= 3.13) or parsing fails
192+
193+
Raises:
194+
No explicit exceptions are raised; errors are logged internally
195+
196+
Example:
197+
Typical log outputs might include:
198+
- "Python Version: 3.11.5 - Perfect"
199+
- "Python Version: 3.10.2 - Recommended: 3.11.x"
200+
- "Python Version: 3.13.0 - Incompatible"
201+
"""
181202
version = sys.version.split()[0]
182203
MIN_VERSION = (3, 11)
183204
MAX_VERSION = (3, 13)
@@ -211,9 +232,28 @@ def get_online_config() -> dict | None:
211232
return None
212233

213234

235+
@log_debug.function
214236
def debug():
215237
"""
216-
Executes system checks and logs results.
238+
Executes a comprehensive system debug routine, performing various checks and logging system information.
239+
240+
This function performs the following tasks:
241+
- Clears the existing debug log file
242+
- Retrieves and validates online configuration
243+
- Checks system version compatibility
244+
- Verifies required file integrity
245+
- Checks SysInternal binaries
246+
- Logs system privileges and environment details
247+
- Checks Python version compatibility
248+
- Retrieves and logs CPU information
249+
250+
Logs are written to the debug log file, capturing system state, configuration, and potential issues.
251+
252+
Notes:
253+
- Requires admin privileges for full system checks
254+
- Logs information about execution environment
255+
- Checks system and Python version compatibility
256+
- Provides insights into system configuration and potential security settings
217257
"""
218258
# Clear Debug Log
219259
log_path = "../ACCESS/LOGS/DEBUG/DEBUG.log"

0 commit comments

Comments
 (0)