1d95a868a0
- 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
122 lines
4.5 KiB
Python
122 lines
4.5 KiB
Python
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()
|