# setup.py import os import sys import json import shutil import subprocess from pathlib import Path from typing import Dict, List, Optional
def main(): """Entry point for setup script""" import argparse parser = argparse.ArgumentParser(description="SETool Setup Utility") parser.add_argument("--config", help="Path to configuration file") parser.add_argument("--skip-deps", action="store_true", help="Skip dependency installation") parser.add_argument("--force", action="store_true", help="Force reinstall") parser.add_argument("--verify-only", action="store_true", help="Only verify installation") args = parser.parse_args() setup = SEToolSetup(args.config) if args.verify_only: setup.verify_installation() else: success = setup.run(skip_deps=args.skip_deps, force=args.force) sys.exit(0 if success else 1)
@click.group() def main(): """SEtool - Security Enhancement Tool""" pass setool setup
if == " main ": main()
# Load environment env_file = setool_home / ".env" if env_file.exists(): with open(env_file) as f: for line in f: if "=" in line: key, value = line.strip().split("=", 1) os.environ[key] = value # setup
class SEToolSetup: """Professional setup tool for SEtool environment""" def __init__(self, config_path: Optional[str] = None): self.home_dir = Path.home() / ".setool" self.config_file = self.home_dir / "config.json" self.requirements_file = Path(__file__).parent / "requirements.txt" self.setup_config = self.load_or_create_config(config_path) def load_or_create_config(self, config_path: Optional[str]) -> Dict: """Load existing config or create default""" if config_path and Path(config_path).exists(): with open(config_path, 'r') as f: return json.load(f) elif self.config_file.exists(): with open(self.config_file, 'r') as f: return json.load(f) else: return self.get_default_config() def get_default_config(self) -> Dict: """Return default configuration""" return { "installation_dir": str(self.home_dir / "tools"), "data_dir": str(self.home_dir / "data"), "logs_dir": str(self.home_dir / "logs"), "temp_dir": str(self.home_dir / "temp"), "dependencies": [ "requests>=2.28.0", "click>=8.1.0", "colorama>=0.4.6", "rich>=13.0.0", "pydantic>=2.0.0" ], "version": "1.0.0", "setup_complete": False } def create_directories(self) -> bool: """Create necessary directories""" try: dirs = [ self.setup_config["installation_dir"], self.setup_config["data_dir"], self.setup_config["logs_dir"], self.setup_config["temp_dir"] ] for dir_path in dirs: Path(dir_path).mkdir(parents=True, exist_ok=True) print(f"✓ Created directory: {dir_path}") return True except Exception as e: print(f"✗ Failed to create directories: {e}") return False def install_dependencies(self) -> bool: """Install Python dependencies""" print("\n📦 Installing dependencies...") try: # Create requirements.txt with open(self.requirements_file, 'w') as f: for dep in self.setup_config["dependencies"]: f.write(f"{dep}\n") # Install using pip subprocess.check_call([ sys.executable, "-m", "pip", "install", "-r", str(self.requirements_file) ]) print("✓ Dependencies installed successfully") return True except subprocess.CalledProcessError as e: print(f"✗ Failed to install dependencies: {e}") return False def setup_environment_variables(self) -> bool: """Setup environment variables""" try: env_file = self.home_dir / ".env" env_vars = { "SETOOL_HOME": str(self.home_dir), "SETOOL_CONFIG": str(self.config_file), "SETOOL_DATA": self.setup_config["data_dir"], "SETOOL_LOGS": self.setup_config["logs_dir"], "PYTHONPATH": str(Path(__file__).parent) } with open(env_file, 'w') as f: for key, value in env_vars.items(): f.write(f"{key}={value}\n") print(f"✓ Environment variables saved to {env_file}") return True except Exception as e: print(f"✗ Failed to setup environment variables: {e}") return False def create_executable_script(self) -> bool: """Create command-line executable script""" try: script_path = self.home_dir / "setool" script_content = f'''#!/usr/bin/env python3 import sys import os from pathlib import Path
@main.command() def info(): """Show tool information""" table = Table(title="SEtool Information") table.add_column("Property", style="cyan") table.add_column("Value", style="green") table.add_row("Version", "1.0.0") table.add_row("Status", "Ready") console.print(table) Please check the verification output
# requirements.txt requests>=2.28.0 click>=8.1.0 colorama>=0.4.6 rich>=13.0.0 pydantic>=2.0.0 # Run setup python setup.py With options python setup.py --force --skip-deps Verify only python setup.py --verify-only Use custom config python setup.py --config my_config.json
# Import and run main CLI try: from setool.cli import main sys.exit(main()) except ImportError as e: print(f"Error importing SETool: {{e}}") print("Please run 'python setup.py' to complete installation") sys.exit(1) ''' script_path.write_text(script_content) script_path.chmod(0o755) print(f"✓ Executable created at {script_path}") # Add to PATH (Linux/macOS) if sys.platform != "win32": bashrc = Path.home() / ".bashrc" if bashrc.exists(): with open(bashrc, 'a') as f: f.write(f'\nexport PATH="$PATH:{self.home_dir}"\n') print("✓ Added to PATH in .bashrc") return True except Exception as e: print(f"✗ Failed to create executable: {e}") return False def verify_installation(self) -> Dict: """Verify installation completeness""" print("\n🔍 Verifying installation...") checks = { "directories": all(Path(d).exists() for d in [ self.setup_config["installation_dir"], self.setup_config["data_dir"], self.setup_config["logs_dir"] ]), "config_file": self.config_file.exists(), "env_file": (self.home_dir / ".env").exists(), "executable": (self.home_dir / "setool").exists() } for check, passed in checks.items(): status = "✓" if passed else "✗" print(f"{status} {check}: {'OK' if passed else 'FAILED'}") return checks def save_config(self) -> bool: """Save configuration to file""" try: self.home_dir.mkdir(exist_ok=True) with open(self.config_file, 'w') as f: json.dump(self.setup_config, f, indent=4) print(f"✓ Configuration saved to {self.config_file}") return True except Exception as e: print(f"✗ Failed to save configuration: {e}") return False def run(self, skip_deps: bool = False, force: bool = False) -> bool: """Main setup routine""" print("🚀 SETool Setup - Professional Installation\n") print("=" * 50) if force and self.config_file.exists(): print("⚠️ Force mode: Reinstalling...") shutil.rmtree(self.home_dir, ignore_errors=True) # Step 1: Create directories print("\n📁 Creating directories...") if not self.create_directories(): return False # Step 2: Install dependencies if not skip_deps: if not self.install_dependencies(): print("⚠️ Dependency installation failed, continuing...") # Step 3: Setup environment print("\n🌍 Setting up environment...") if not self.setup_environment_variables(): return False # Step 4: Create executable print("\n🔧 Creating executable...") if not self.create_executable_script(): return False # Step 5: Save configuration self.setup_config["setup_complete"] = True if not self.save_config(): return False # Step 6: Verify verification = self.verify_installation() if all(verification.values()): print("\n✅ SETool setup completed successfully!") print(f"\n📍 Installation location: {self.home_dir}") print(f"📝 Configuration file: {self.config_file}") print("\n💡 Next steps:") print(" 1. Restart your terminal or run: source ~/.bashrc") print(" 2. Run 'setool --help' to get started") return True else: print("\n❌ Setup completed with warnings. Please check the verification output.") return False