from abc import ABC, abstractmethod from typing import Dict, Type class FWType(ABC): """Abstract base class for firewall types.""" # Registry to store child classes _registry: Dict[str, Type["FWType"]] = {} def __init_subclass__(cls, **kwargs): """Automatically register subclasses with their class name.""" super().__init_subclass__(**kwargs) cls._registry[cls.__name__.lower()] = cls @classmethod def create(cls, fw_type: str, **kwargs) -> "FWType": """ Factory method to create instances of child classes. Args: fw_type: String name of the firewall type class to instantiate **kwargs: Arguments to pass to the child class constructor Returns: Instance of the requested child class Raises: ValueError: If fw_type is not registered """ fw_type = fw_type.lower() if fw_type not in cls._registry: available = ", ".join(cls._registry.keys()) raise ValueError( f"Unknown firewall type: '{fw_type}'. Available: {available}" ) return cls._registry[fw_type](**kwargs) @abstractmethod def getBanlist(self, ips): """Return the ruleset for the specific server"""