2017-06-15 1 views
0

Ich bin kein Software-Ingenieur von Handel (Network Security Engineer) und lerne mehr Automatisierungstechniken und Codierung. Ich bin mir sicher, dass ich gerade etwas ziemlich Offensichtliches in meinem Code verpasse und jede Hilfe würde geschätzt werden.Ausnahmebehandlung mit IP-Adresse Modul

Ich führe ein Eingabeskript aus, das Benutzer auffordert, IP-Adressen entweder in CIDR- oder Host-IPs in IPv4/v6-Formaten in ein Eingabefeld (innerhalb von Tkinter) einzugeben. Ich habe zwei separate Codierungsskripts, die jede dieser Funktionen ausführen (CIDR und Host-IPs). Ich versuche, den Code zu kombinieren, sodass nur eine Anwendung ausgeführt werden muss.

Wenn das IPaddress-Modul verwendet wird, wenn das eingegebene Format nicht korrekt ist (mit IP-Adresse (für Host-Adressen) oder IP-Netzwerk (für CIDR-Adressen)), wird es einen Wert Fehler werfen. Das ist was ich will, da ich diese Ausnahmen behandle.

Das Problem ist, ich brauche sowohl die CIDR und IP-Hosts zu separaten Listen für REST-API-Aufrufe hinzugefügt (da die anderen Aufrufformate erfordern). Und wenn mein unter Code verarbeitet, wenn der Eintrag in das Textfeld CIDR-Format ist, wird es den Wert Fehler werfen (wie der IP-Host ist die erste Anweisung, weshalb es den Fehler auslöst).

Ich habe in der Lage gewesen, es ipaddress Eingänge zur gleichen Zeit mit dem folgenden Code in ersetzen die zweiten elif-Anweisungen zu verarbeiten haben (die erste für leere Eingaben nur ausfallsicher ist):

if self.ip == str(ipaddress.ip_network(self.e1.get())) or self.ip == str(ipaddress.ip_address(self.e1.get())): 

Die Problem mit der obigen Aussage ist, ich habe keine Möglichkeit, self.ip zu entziffern und an die entsprechende Liste anzuhängen (eine für CIDR und eine für IP-Hosts). Das Hauptproblem mit meinem Hauptcode, wie ich bereits sagte, ist, dass, wenn die Eingabe CIDR ist, wird es den Wert Fehler werfen, weil der zweite elif Block ipaddress.ip_address als erste Eingabe hat, und sobald es trifft Der Fehler wird den Code nicht fortsetzen.

Vielleicht ist es ein Strukturproblem, oder ich stelle nicht die richtigen Fragen ... aber jede Hilfe in meinem Code, damit jemand entweder eine Host-IP-Adresse oder CIDR-Format Subnetz eingeben kann, und der Code einen Wert Fehler werfen wenn keiner von diesen beiden eingegeben wird. Auch jedes an ihre entsprechende Liste anhängen würde sehr geschätzt werden.

Hauptcode (FYI: die e1 Variable ist die Eingangs Textbox):

def add_ip(self): 
    self.hostiplist = [] 
    self.cidriplist = [] 
    try: 
     if not self.e1.get():# empty! (empty string is false value) 
     messagebox.showerror(title='Error', message='Ooops, Please enter an acceptible host or network IP Address.') 
     self.e1.delete(0,END) 
     elif self.e1.get() == " ": 
     messagebox.showerror(title='Error', message='Ooops, Please enter an acceptible host or network IP Address.') 
     self.e1.delete(0,END) 
     else: 
     self.ip = self.e1.get() 
     if self.ip == str(ipaddress.ip_address(self.e1.get())): 
      self.hostiplist.append(self.ip) 
      print("IP Host staged for deployment: %s" % (self.ip)) 
      print("") 
      self.e1.delete(0,END) 
     elif self.ip == str(ipaddress.ip_network(self.e1.get())): 
      self.cidriplist.append(self.ip) 
      print("IP Network staged for deployment: %s" % (self.ip)) 
      print("") 
      self.e1.delete(0,END) 
     else: 
      print("Didn't enter valid entry") 

    except ValueError as e: 
     messagebox.showerror(title='Error', message='Ooops,' + str(e) + '.' + ' Please enter an acceptible host or network IP Address.') 
     self.e1.delete(0,END) 
     return 'Value'  
    except TypeError: 
     messagebox.showerror(title='Error', message='Ooops,' + str(e) + '.' + ' Please enter an acceptible host or network IP Address.') 
     self.e1.delete(0,END) 
     return 'Type' 

Hier ist meine einzige Funktion Skript, das mit Fehlerbehandlung funktioniert (wenn alles andere als CIDR-Format eingegeben wird, ein Wert erhalten werden Fehler):

def add_ip_network(): 
    #IPv4 & v6 Address Handling. Nothing but those formats can be entered. 
    try: 
    ip = ipaddress.ip_network(e1.get()) 
    nonsubnethostsList.append(ip) 
    print("IP Network staged for deployment: %s" % (ip)) 
    print("") 
    e1.delete(0,END) 
    except ValueError: 
    print('Incorrect entry, please use IPv4 or IPv6 CIDR Formats') 
    e1.delete(0,END) 
    return 'Value' 
    except TypeError: 
    print('Incorrect entry, please use IPv4 or IPv6 CIDR Formats') 
    e1.delete(0,END) 
    return 'Type' 

Grüße,

Edit:
ich auch mein Haupt Code versucht haben Anpassung der Arbeitszeit anzupassen Einzelformatskript. Daraus:

if self.ip == str(ipaddress.ip_address(self.e1.get())) 

Um dies:

ip = ipaddress.ip_network(e1.get()) 

Es gab mir den gleichen Wert Fehler, so versucht, zu vergleichen ich nur die Saiten mit If-Anweisungen.

Antwort

0

Ich habe eine Antwort auf Reddit/Python für die obige Frage von Benutzer Dagger0 (Danke!).

Also, was Sie tun müssen, ist ... herauszufinden, ob eine Zeichenfolge eine IP-Adresse oder eine Netzwerk-mit-CIDR-Maske ist? Scheint so, als könntest du einfach nach "/" testen.

# Presumably set these in __init__ or something, you don't 
# want to be clearing them each time you add an entry. 
self.hostiplist = [] 
self.cidriplist = [] 

def add_ip(self): 
    input = self.e1.get() 
    try: 
     if "/" in input: 
      ip = ipaddress.ip_address(input) 
      # Append to self.hostiplist. 
     else: 
      network = ipaddress.ip_network(input) 
      # Append to self.cidriplist. 
    except (ValueError, TypeError) as e: 
     msg = 'Ooops: %s. Please enter an acceptable host or network IP Address.' % str(e) 
     messagebox.showerror(title='Error', message=msg) 
     self.e1.delete(0, END) 
     raise e # If you want the caller to get an exception too. Although in that case maybe the 
       # whole try/except business should be in the caller, like in the bottom code block. 

(Völlig ungetestet.)

ich die Prüfungen für „entfernt“ und „“ auf der Grundlage, dass ipaddress.ip_address() wird wahrscheinlich eine Ausnahme mit diesen Eingaben ohnehin so dürfen wir auch werfen benutze einfach den one exception handler. Ich weiß nicht, ob es sich tatsächlich so verhält.

Ihr generelles Problem ist, dass Sie nicht versuchen, versuchen ipaddress.ip_network() nach ipaddress.ip_address() wirft (aber es gibt eine alternative Möglichkeit, die beiden Eingänge in diesem Fall sowieso zu unterscheiden).

Sie könnten auch tun es wie folgt aus:

try: 
    ipaddress.ip_address(input) 
    # It's an IP. 
except (ValueError, TypeError): 
    ipaddress.ip_network(input) 
    # It's a network. 

vielleicht so zu einer Codestruktur führen:

def add_ip(self, input): 
    try: 
     ipaddress.ip_address(input) 
     # It's an IP. 
    except (ValueError, TypeError): 
     ipaddress.ip_network(input) 
     # It's a network. 

def on_button_press(self): 
    try: 
     self.add_ip(self.e1.get()) 
    except (ValueError, TypeError): 
     # Neither. 
     self.e1.delete(0, END) 

ich die unteren beiden Funktionen getestet und sie funktionierte einwandfrei! Hoffe das hilft anderen.