leider habe ich noch nicht viel Erfahrung mit objektorientierter Programmierung in Python.
Ich möchte eine Klasse zur Anlage von Firewall-Regeln schreiben (bislang haben wir alles nur in Funktionen und es wird langsam chatoisch).
Die Infos dazu stehen bereits in einem dict (rule_dict).Wir haben allerdings mehrere Firewall-Vendoren (im Beispiel Cisco und Fortinet), die mit verschiedenen Varianten angesteuert werden (ansible und paramiko) und basierend auf verschiedenen Dingen haben diese auch verschiedene Credentials.
Es gibt aber auch viele Gemeinsamkeiten, weshalb ich nicht einfach pro Vendor eine Klasse schreiben und einzelne Zeilen Copy-Pasten will.
Im Endeffekt ist die Idee, dass eine eierlegende Wollmilchsau unter den Klassen geben soll und diese nach Bedarf die Klassen der anderen Vendoren "hinzuzieht".
Generell erst einmal die Frage: Ist das der "richtige" Ansatz oder sollte ich einfach direkt unter der Hauptklasse (FirewallRules) Methoden für die einzelnen Vendoren anlegen? Meine Sorge war, dass das zu unübersichtlich wird.
Wenn ich aber "Unterklassen" habe, habe ich wieder Probleme an die Parent-Class Dinge zu übergeben.
Was ist der python-Weg für mein Problem?
Ich danke euch schonmal für eure Antworten
Code: Alles auswählen
class FirewallRules:
def __init__(self, rule_dict):
self.vendor = self._findVendor()
self.credentials = self._get_credentials()
if self.vendor == "Cisco": # Ja, switch case wär cooler, aber ich muss aus Gründen python 3.6 nutzen.
# Cisco-Klasse verwenden
elif self.vendor == "Fortinet":
# Fortinet-Klasse verwenden
def _findVendor(self):
# Hier soll der Vendor herausgefunden gewerden
Vendor = "Cisco"
return Vendor
def _get_credentials(self):
# Basierend auf verschiedenen Variablen sollen hier Zugangsdaten rausgefunden werden
return ["user123", "sicherespasswort123"]
class Vendor_Cisco:
def __init__(self):
pass
def execute(self):
commands = "" # Hier sollen CLI Commands rausgelassen werden und per paramiko an die Firewall geschickt werden
return commands
class Vendor_Fortinet:
def __init__(self):
pass
def execute(self):
# Hier soll ein Ansible-Plabook ausgeführt und das Ergebnis zurückgegeben werden
playbook_status = "ok"
return playbook_status
rule_dict = {
"hostname": "tolle-firewall",
"rules":[
{
"src_addr": ["1.2.3.4"],
"dst_addr": ["2.3.4.5"],
"services": ["TCP 22"],
"comment": "total wichtige Regel"
},
{
"src_addr": ["4.5.6.7"],
"dst_addr": ["8.9.10.11"],
"services": ["TCP 22"],
"comment": "total wichtige Regel"
},
]
}
firewall_ticket1 = FirewallRules(rule_dict)
# in etwa soll das so funktionieren
print(firewall_ticket1.execute)