==== DHCP-/DNS-Admin ==== https://www.easy-coding.de/Thread/2196-2-Listen-vergleichen-und-gleiche-s-Element-e-ausgeben/ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # # dda_dict.py #import sys from glob import glob verzei = glob("vlans/*") # # Eingabe # print ("""\n\n Welche(r) Rechner/Drucker soll(en) modifiziert werden. Mehrere Rechner mit Leerzeichen trennen. \n\n """) devices = "e4001 e4002 e4003" macadr = "11:11:11 22:22:22 33:33:33" #devices = input("Eingabe der Geräte Namen: ").lower() #macadr = input("Optional Eingabe der MAC Adresse in der dazugehörigen Reihenfolge: ").upper() while True: vlan = input("Eingabe der VLAN Nr.: ") try: i_vlan = int(vlan) except ValueError: print("Keine Nummer! Bitte nur Zahlen eingeben ...") # Alles in Ordnung: else: vlan = "{:04d}".format(i_vlan) # Eingabe: 200 -> 0200 break # # Erzeuge Dict. aus zwei Eingabe Listen # l_devices = devices.split() l_macadr = macadr.split() d_eingabe = {} for dev, mac in zip(l_devices, l_macadr): d_eingabe[dev] = [ mac, None ] # ip = None print (d_eingabe) #if len(l_devices) != len(l_macadr): # raise OSError("Die Eingabelisten sind ungleich lang!") #print (l_devices) #print (l_macadr) # # Fkt. lese Vlan-Datei und erstelle Dict. daraus # def read_vlan_make_dict(vlandat): ''' Lesefunktion für eine beliebige VLAN-Datei. Erzeugt ein Dict. aus VLAN-Dateien ''' l_devices_vlandat = [] l_macadr_vlandat = [] l_ip_vlandat = [] d_vlan = {} with open((vlandat), 'r') as vlandatei: for line in vlandatei: l_elems = line.split() l_devices_vlandat.append(l_elems[0]) l_macadr_vlandat.append(l_elems[1]) l_ip_vlandat.append(l_elems[2]) #print (l_devices_vlandat) #print ((l_macadr_vlandat), "\n\n") for dev, mac, ip in zip(l_devices_vlandat, l_macadr_vlandat, l_ip_vlandat ): d_vlan[dev] = [ mac, ip ] return (d_vlan) # # Fkt. IP generieren # def ipgen(vlan): """ IPs generieren für das jeweilige übergebene VLAN """ zaehler = 1 l_ipgen = [] # "0200" -> 200 s_vlan = str(int(vlan)) if len(s_vlan) > 3: # wenn 1400 -> 14 s_vlan = s_vlan[:2] else: s_vlan = s_vlan[0] while zaehler < 254: ip = "172.16.{}.{}".format(s_vlan, zaehler) l_ipgen.append(ip) #print(ip) zaehler += 1 return (l_ipgen) # # Fkt. Schreibe VLAN-Datei # def write_vlandat(vlandat, d_vlan_fkt): with open((vlandat), 'w') as vlandatei: for k, v in d_vlan_fkt.items(): print ("{} {}".format(k, v)) l_data_write = [] l_data_write.append(k) l_data_write.extend(v) l_datadev_write = l_data_write[0] l_datamac_write = l_data_write[1] l_dataip_write = l_data_write[2] vlandatei.writelines("{} {} {}\n".format(l_datadev_write, l_datamac_write, l_dataip_write)) # # vlan Dateien einlesen # d_vlan = None for vlandat in verzei: d_vlan = read_vlan_make_dict(vlandat) vlanname = "vlans/vlan{}.in".format(vlan) print (vlandat) if vlanname == vlandat: # # Das VLAN den die Eingabe hinzugefügt wird # print ("Die Eingabe wird den Ziel-Vlan hinzugefügt") # Im VLAN belegte IPs auflisten l_ip_vlan = [] macip_d_vlan = list(d_vlan.values()) for ipx in macip_d_vlan: l_ip_vlan.append(ipx[1]) l_ipgen = ipgen(vlan) # IPs filtern, von den generierte IPs 1-253 die IPs aus VLAN-Datei abziehen = noch freie IPs m_ipgen = set(l_ipgen) m_ipvlan = set(l_ip_vlan) m_freeips = m_ipgen.difference(m_ipvlan) l_freeips = list(m_freeips) # # Daten zusammenfügen und ins Dict des gesuchten VLANs eintragen # d_vlan_fkt = d_vlan.copy() print ("Zaehler für while-Schleife erstellen") durchlaeufe = len(l_devices) zaehler = 0 while zaehler < durchlaeufe: dev = l_devices[zaehler] mac = l_macadr[zaehler] freeip = l_freeips[zaehler] d_vlan_fkt[dev] = [mac, freeip] zaehler += 1 # # Schreibe Ziel VLAN-Datei # write_vlandat(vlandat, d_vlan_fkt) else: # # Die restlichen VLANs aus denen die Eingabe abgezogen wird # d_vlan_fkt = d_vlan.copy() durchlaeufe = len(l_devices) print ("Anzahl Schleifen durchläufe", (durchlaeufe)) zaehler = 0 while zaehler < durchlaeufe: try: d_vlan_fkt.pop(l_devices[zaehler]) zaehler += 1 except KeyError: print("Das Device {} wurde nicht im {} gefunden ...".format(l_devices[zaehler], vlandat)) zaehler += 1 if d_vlan_fkt != d_vlan: # # Schreibe VLAN Datei für die restlichen VLANs # write_vlandat(vlandat, d_vlan_fkt)