#!/usr/bin/env python3 import sqlite3 import re # Pfade DHCP_CONF = "/etc/dhcp/dhcp.conf" GRAVITY_DB = "/etc/pihole/gravity.db" # Regex zum Auslesen der Hosts host_regex = re.compile(r"host\s+(\S+)\s*{([^}]+)}", re.MULTILINE) mac_regex = re.compile(r"hardware ethernet\s+([0-9A-Fa-f:]+);") ip_regex = re.compile(r"fixed-address\s+([0-9.]+);") router_regex = re.compile(r"option routers\s+([0-9.]+);") # DHCP-Datei einlesen with open(DHCP_CONF, "r") as f: dhcp_data = f.read() hosts = host_regex.findall(dhcp_data) # SQLite DB öffnen conn = sqlite3.connect(GRAVITY_DB) cur = conn.cursor() # Vorhandene Gruppen abfragen cur.execute("SELECT id, name FROM 'group'") groups = {name: gid for gid, name in cur.fetchall()} # Gewünschte Gruppen desired_groups = ["LAN/WAN", "Kindergeräte", "Proxy Zone"] # Fehlende Gruppen anlegen for g in desired_groups: if g not in groups: cur.execute("INSERT INTO 'group' (name) VALUES (?)", (g,)) groups[g] = cur.lastrowid print(f"Gruppe '{g}' angelegt.") for host_name, body in hosts: mac_match = mac_regex.search(body) ip_match = ip_regex.search(body) router_match = router_regex.search(body) if not mac_match: continue mac = mac_match.group(1).lower() ip = ip_match.group(1) if ip_match else None name = host_name # Prüfen, ob Client existiert cur.execute("SELECT id FROM client WHERE hwaddr=? OR ip=?", (mac, ip)) row = cur.fetchone() if row: client_id = row[0] print(f"Client {name} ({mac}) existiert bereits.") else: # Einfügen cur.execute( "INSERT INTO client (ip, hwaddr, name, comment) VALUES (?, ?, ?, ?)", (ip, mac, name, "imported from dhcp.conf") ) client_id = cur.lastrowid print(f"Client {name} ({mac}) hinzugefügt.") # Gruppe zuordnen basierend auf Router/Subnetz if router_match: router_ip = router_match.group(1) if router_ip.startswith("192.168.1."): group_id = groups["LAN/WAN"] elif router_ip.startswith("192.168.2."): group_id = groups["Kindergeräte"] elif router_ip.startswith("192.168.3."): group_id = groups["Proxy Zone"] else: group_id = groups["LAN/WAN"] else: group_id = groups["LAN/WAN"] # Prüfen, ob schon in Gruppe cur.execute("SELECT 1 FROM groupclient WHERE client_id=? AND group_id=?", (client_id, group_id)) if not cur.fetchone(): cur.execute("INSERT INTO groupclient (client_id, group_id) VALUES (?, ?)", (client_id, group_id)) print(f"Client {name} der Gruppe zugeordnet.") conn.commit() conn.close()