Fix 11 bugs found in full codebase review

- deploy_phishing.py: undefined extra_vars on orchestration playbook
- freebird/main_menu.py: set_variable() called as function, is a method; fix to config.prompt_set_variable()
- freebird/tool_manager.py: shell=True with f-string paths; replace with direct pip binary call
- certipy-enum.py: password exposed in process list and logs; pass via env var
- cleanup_engine.py: load_vars_file() called with path string, expects provider name
- ioc-u.py: scapy import not guarded; tool crashed if scapy missing
- um_ops.py + um-vault.py: SQL table names f-stringed directly; quote identifiers
- ops-logger.sh: 63-line duplicate function block; removed second copy; quote config_script var
- recon_tools.py: ir-sandbox + link-sandbox not in TOOLS dict; forensics menu option 5 hidden from user
- um-crack.py: missing --scope flag inconsistent with all other Umbra tools
- heartbeat_ingest.py: openssl subprocess not catching FileNotFoundError; wrap with clear error
This commit is contained in:
n0mad1k
2026-04-01 22:11:01 -04:00
parent 2cc2b0f9a8
commit 1d95a868a0
12 changed files with 4034 additions and 84 deletions
+121
View File
@@ -0,0 +1,121 @@
import os
import subprocess
import argparse
TOOLS_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../tools/') # Directory where all tools will be installed
def install_tool(tool_name, repo_url):
tool_path = os.path.join(TOOLS_DIR, tool_name)
if os.path.exists(tool_path):
print(f"{tool_name} is already installed.")
return
# Clone the repository
print(f"Cloning {repo_url}...")
subprocess.run(['git', 'clone', repo_url, tool_path], check=True)
# Set up a virtual environment if necessary
venv_path = os.path.join(tool_path, 'venv')
print(f"Setting up virtual environment for {tool_name}...")
subprocess.run(['python3', '-m', 'venv', venv_path], check=True)
# Activate virtual environment and install dependencies
requirements_file = os.path.join(tool_path, 'requirements.txt')
if os.path.exists(requirements_file):
print(f"Installing dependencies for {tool_name}...")
pip_bin = os.path.join(venv_path, 'bin', 'pip')
subprocess.run([pip_bin, 'install', '-r', requirements_file], check=True)
print(f"{tool_name} installed successfully.")
def install_tools_list(tools_list):
for tool_name, repo_url in tools_list:
install_tool(tool_name, repo_url)
def update_tool(tool_name):
tool_path = os.path.join(TOOLS_DIR, tool_name)
if not os.path.exists(tool_path):
print(f"{tool_name} is not installed.")
return
# Pull the latest changes
print(f"Updating {tool_name}...")
subprocess.run(['git', '-C', tool_path, 'pull'], check=True)
# Update dependencies if necessary
venv_path = os.path.join(tool_path, 'venv')
requirements_file = os.path.join(tool_path, 'requirements.txt')
if os.path.exists(requirements_file):
print(f"Updating dependencies for {tool_name}...")
pip_bin = os.path.join(venv_path, 'bin', 'pip')
subprocess.run([pip_bin, 'install', '-r', requirements_file], check=True)
print(f"{tool_name} updated successfully.")
def remove_tool(tool_name):
tool_path = os.path.join(TOOLS_DIR, tool_name)
if not os.path.exists(tool_path):
print(f"{tool_name} is not installed.")
return
# Remove the tool directory
print(f"Removing {tool_name}...")
subprocess.run(['rm', '-rf', tool_path], check=True)
print(f"{tool_name} removed successfully.")
def show_status(tool_name):
tool_path = os.path.join(TOOLS_DIR, tool_name)
if os.path.exists(tool_path):
print(f"{tool_name} is installed.")
else:
print(f"{tool_name} is not installed.")
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Tool Manager for Freebird Framework')
subparsers = parser.add_subparsers(dest='command', help='Subcommands')
# Install command
install_parser = subparsers.add_parser('install', help='Install a tool')
install_parser.add_argument('tool_name', help='Name of the tool to install')
install_parser.add_argument('repo_url', help='Git repository URL of the tool')
# Install multiple tools
install_list_parser = subparsers.add_parser('install-list', help='Install a list of tools')
install_list_parser.add_argument('file', help='Path to a file containing the list of tools and their repositories')
# Update command
update_parser = subparsers.add_parser('update', help='Update a tool')
update_parser.add_argument('tool_name', help='Name of the tool to update')
# Remove command
remove_parser = subparsers.add_parser('remove', help='Remove a tool')
remove_parser.add_argument('tool_name', help='Name of the tool to remove')
# Status command
status_parser = subparsers.add_parser('status', help='Show the status of a tool')
status_parser.add_argument('tool_name', help='Name of the tool')
args = parser.parse_args()
if args.command == 'install':
install_tool(args.tool_name, args.repo_url)
elif args.command == 'install-list':
# Read the file to get a list of tools to install
tools = []
with open(args.file, 'r') as f:
for line in f:
name, url = line.strip().split(',')
tools.append((name.strip(), url.strip()))
install_tools_list(tools)
elif args.command == 'update':
update_tool(args.tool_name)
elif args.command == 'remove':
remove_tool(args.tool_name)
elif args.command == 'status':
show_status(args.tool_name)
else:
parser.print_help()