mirror of
https://github.com/GH05TCREW/pentestagent.git
synced 2026-03-07 22:33:38 +00:00
144 lines
3.4 KiB
Python
144 lines
3.4 KiB
Python
"""Dynamic tool loader for GhostCrew."""
|
|
|
|
import importlib
|
|
import sys
|
|
from pathlib import Path
|
|
from typing import List, Optional
|
|
|
|
from .registry import get_all_tools
|
|
|
|
|
|
def discover_tools(tools_dir: Optional[Path] = None) -> List[str]:
|
|
"""
|
|
Discover all tool modules in the tools directory.
|
|
|
|
Args:
|
|
tools_dir: Path to tools directory. Defaults to package tools dir.
|
|
|
|
Returns:
|
|
List of discovered tool module names
|
|
"""
|
|
if tools_dir is None:
|
|
tools_dir = Path(__file__).parent
|
|
|
|
discovered = []
|
|
|
|
for item in tools_dir.iterdir():
|
|
# Skip non-tool items
|
|
if item.name.startswith("_"):
|
|
continue
|
|
if item.name in ("registry.py", "executor.py", "loader.py"):
|
|
continue
|
|
|
|
# Check if it's a tool module
|
|
if item.is_dir() and (item / "__init__.py").exists():
|
|
discovered.append(item.name)
|
|
elif item.suffix == ".py":
|
|
discovered.append(item.stem)
|
|
|
|
return discovered
|
|
|
|
|
|
def load_tool_module(module_name: str, tools_dir: Optional[Path] = None) -> bool:
|
|
"""
|
|
Load a tool module by name.
|
|
|
|
Args:
|
|
module_name: Name of the tool module to load
|
|
tools_dir: Path to tools directory
|
|
|
|
Returns:
|
|
True if loaded successfully, False otherwise
|
|
"""
|
|
if tools_dir is None:
|
|
tools_dir = Path(__file__).parent
|
|
|
|
try:
|
|
# Build the full module path
|
|
full_module_name = f"ghostcrew.tools.{module_name}"
|
|
|
|
# Check if already loaded
|
|
if full_module_name in sys.modules:
|
|
return True
|
|
|
|
# Try to import the module
|
|
importlib.import_module(full_module_name)
|
|
return True
|
|
|
|
except ImportError as e:
|
|
print(f"Warning: Failed to load tool module '{module_name}': {e}")
|
|
return False
|
|
except Exception as e:
|
|
print(f"Warning: Error loading tool module '{module_name}': {e}")
|
|
return False
|
|
|
|
|
|
def load_all_tools(tools_dir: Optional[Path] = None) -> List[str]:
|
|
"""
|
|
Discover and load all tool modules.
|
|
|
|
Args:
|
|
tools_dir: Path to tools directory
|
|
|
|
Returns:
|
|
List of successfully loaded tool module names
|
|
"""
|
|
discovered = discover_tools(tools_dir)
|
|
loaded = []
|
|
|
|
for module_name in discovered:
|
|
if load_tool_module(module_name, tools_dir):
|
|
loaded.append(module_name)
|
|
|
|
return loaded
|
|
|
|
|
|
def get_tool_info() -> List[dict]:
|
|
"""
|
|
Get information about all registered tools.
|
|
|
|
Returns:
|
|
List of tool info dictionaries
|
|
"""
|
|
tools = get_all_tools()
|
|
return [
|
|
{
|
|
"name": tool.name,
|
|
"description": tool.description,
|
|
"category": tool.category,
|
|
"enabled": tool.enabled,
|
|
"parameters": (
|
|
list(tool.schema.properties.keys()) if tool.schema.properties else []
|
|
),
|
|
}
|
|
for tool in tools
|
|
]
|
|
|
|
|
|
def reload_tools():
|
|
"""Reload all tool modules."""
|
|
from .registry import clear_tools
|
|
|
|
# Clear existing tools
|
|
clear_tools()
|
|
|
|
# Unload tool modules from sys.modules
|
|
to_remove = [
|
|
name
|
|
for name in sys.modules
|
|
if name.startswith("ghostcrew.tools.")
|
|
and name
|
|
not in (
|
|
"ghostcrew.tools",
|
|
"ghostcrew.tools.registry",
|
|
"ghostcrew.tools.executor",
|
|
"ghostcrew.tools.loader",
|
|
)
|
|
]
|
|
|
|
for name in to_remove:
|
|
del sys.modules[name]
|
|
|
|
# Reload all tools
|
|
return load_all_tools()
|