43 lines
1.3 KiB
Python
43 lines
1.3 KiB
Python
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"""
|