Timeout setzen?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
chpo7234
User
Beiträge: 35
Registriert: Dienstag 29. September 2015, 10:19

Hey!

Vielen Dank für deine ausführliche Hilfestellung! Überwältigend! So eine Hilfsbereitschaft findet man selten..

Deine Tipps werde ich natürlich beherzigen - mir die Code-Richtlinien auch noch mal genauer anschauen!

Die Kommentare waren eigentlich nur für mich gedacht.. Auf der Linux-Konsole bzw. im Nano-Editor habe ich teilweise die Übersicht verloren, aber du hast natürlich Recht.

Freue mich sehr, dass ich nun auf die main-Funktion aufmerksam gemacht wurde! Das habe ich irgendwie schon vermisst..

Der Fehler mit den nackten Excepts ist mir eigentlich aus anderen Programmiersprachen bekannt.. Ich Faulpelz..

lv sollte eigentlich Laufvariable bedeuten, sorry..

Mit dem ergebnislosen string_results hatte ich wohl wirklich etwas anderes vor...Wie der Name teilweise vermuten lässt, wollte ich die Ergebnisse in einen string speichern. Mit dem hätte ich vorzeitig erst mal an PHP übermittelt. Später hatte ich vor, eine Liste / ein Array zu übergeben, aber nun habe ich ja die Abhilfe mit json. Da werde ich mich denn mal reinfuchsen!

Eine Rückmeldung zu dem Code habe ich leider noch: ich verstehe überhaupt nichts mit der ip_range()-Methode anzufangen..

Code: Alles auswählen

def ip_range(start, end):
    return (
        ipconvert.long2ip(i)
        for i in range(ipconvert.ip2long(start), ipconvert.ip2long(end) +1)
    )

Code: Alles auswählen

start = int(conv.ip2long(sys.argv[1]))
end = int(conv.ip2long(sys.argv[2]))
Wieso hast du für den Zweizeiler extra eine neue Methode geschrieben? Ist die zweifache Typumwandlung schlecht? Oder ist es einfach besser lesbar, wenn man ip_range(n,m) statt range(n,m) abfragt?

Und irgendwie verstehe ich die funktionsweise nicht... Ich verstehe darunter folgendes:
Eine bisher nicht zugewiesene Variable "i" wird in eine IP konvertiert. Mit dem Ergebnis wird nichts gemacht, es wird in keiner Variablen gespeichert. Oder nimmt "i" nun dieses Wert an?
In der nächsten Zeile beginnt eine Schleife, die nichts macht.

Entschuldige, dass ich in die Methode nun etwas verständnislos reinblicke.

Lieben Gruß
BlackJack

@chpo7234: Für die Konsole gibt's ja auch Editoren mit Syntaxhervorhebung und allerlei Unterstützung für's Programmieren, wie auflisten und auswählen von Funktion, Klassen, und Methoden. Ansonsten mag ich meinen ”grafischen” Texteditor nicht mehr missen und mounte oft ein Verzeichnis auf einem Server in dem ich mehr als nur ein kleines bisschen in Quelltext editieren muss, lokal mit sshfs.

Das in `ip_range()` ist ein Generatorausdruck. Alles in den Klammern gehört zusammen. Die funktionieren wie „list comprehemsions“ (LCs), nur ”lazy”, dass heisst es werden nicht alle Ergebnisse sofort erzeugt und in einer Liste gespeichert, sondern jedes Element wird erst dann berechnet wenn es von dem Generator/Iterator abgefragt wird.

Die zweifache Umwandlung ist nicht schlecht, die habe ich da ja auch drin, aber ich wollte die gerne an einem Ort weggekapselt haben um das iterieren über einen IP-Bereich über die Angabe von zwei IPs in der üblichen Notation in einer Funktion zu haben. Ich denke halt viel in solchen ”Datenströmen” mit Quellen, Abbildungen, Filtern, und Senken. Und das ist dann eine Quelle von IPs aus einem gegebenen Bereich. Ausserdem hatte ich noch im Hinterkopf das es in Python 3 wohl ein Modul für IP-Adressen gibt und das eventuell auch so etwas bietet, und dann kann man das leichter austauschen. Eigentlich fehlt da noch ein `map()` für meinen üblichen Programmierstil:

Code: Alles auswählen

    ip_checks = []
    for ip_check in map(IpCheck, ip_range(start, end)):
        ip_check.start()
        ip_checks.append(ip_check)
Und im Grunde würde ich das `start()` und das `join()` da noch raushaben, damit man keine ``for``-Schleifen sondern LCs und Generatorausdrücke verwenden kann, dann würde ich aber letztendlich „futures“ selber nachprogrammieren, dafür gibt's ja aber schon ein Modul/Package.
chpo7234
User
Beiträge: 35
Registriert: Dienstag 29. September 2015, 10:19

Moin moin BlackJack,

ich habe die run-Methode mal überarbeitet. Bei Hosts, die nicht verfügbar oder nur teilweise verfügbar waren, tauchte stets folgende Exception auf:
CalledProcessError: Command '[ping', '-q', '-c2', '-W1', '10.81.3.80 ']' returned non-zero exit status 1
Das habe ich nun wie folgt gelöst:

Code: Alles auswählen

import subprocess
[...]

def run(self):
    try:
        output = check_output(['ping', '-q', '-c2',, '-W1', self.ip])
        self.result = check_snmp(self.ip)
    except subprocess.CalledProcessError:
        self.result = 'no response'

[...]
Dadurch werden zwar jene Hosts ausgeblendet, die nur teilweise verfügbar sind, aber ich denke, darüber kann hinweg gesehen werden.

Lieben Gruß
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Dann finde doch mal heraus, was ein von 0 abweichender Returncode bedeutet und werte das entsprechend aus.
Antworten