Benutzer-Werkzeuge

Webseiten-Werkzeuge


programme:dhcpdnsadmin:dda_dict_20180415

DHCP-/DNS-Admin

https://www.easy-coding.de/Thread/2196-2-Listen-vergleichen-und-gleiche-s-Element-e-ausgeben/

dda_dict20180429.py
#!/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)
 
programme/dhcpdnsadmin/dda_dict_20180415.txt · Zuletzt geändert: 2020/11/13 13:54 von pulsar