Lasse Dir die Inhalte der Namen in der Schleife einfach mal ausgeben. Dann siehst Du, was *wirklich* darin steht. Damit kann man dann oftmals schlussfolgern, wieso es noch ein Problem gibt.
Du hast übrigens meine Fragen nach der Herkunft der Daten noch nicht beantwortet (Also wie Du dieses Datenformat bekommst!)
Mehrdimensionales Array abfragen
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Entschulige, das war nicht meine Absicht
Also die Daten kommen von einem Cisco - Switch die per SNMP abgefragt werden, die Dinger sind echt einfachter zu Konfigurieren, als mit Python Wert, Zahlen Strings zu vergleichen
Ich komme jetzt zumindest an den Punkt, das er die 131 frisst, aber in der unteren Schleife komme ich nicht zurecht.
Er findet die info[0] und ids Werte nicht
Also die Daten kommen von einem Cisco - Switch die per SNMP abgefragt werden, die Dinger sind echt einfachter zu Konfigurieren, als mit Python Wert, Zahlen Strings zu vergleichen
Ich komme jetzt zumindest an den Punkt, das er die 131 frisst, aber in der unteren Schleife komme ich nicht zurecht.
Er findet die info[0] und ids Werte nicht
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Das hattest Du schon gesagt. Woher kommt aber *konkret* diese Python-Datenstruktur? Ganz platt formuliert: Wie kommt der Inhalt von ``info`` in Deinen Quellcode?trumm hat geschrieben: Also die Daten kommen von einem Cisco - Switch die per SNMP abgefragt werden, die Dinger sind echt einfachter zu Konfigurieren, als mit Python Wert, Zahlen Strings zu vergleichen
Was ist die untere Schleife? Ich sehe da nur *eine* Schleife‽trumm hat geschrieben: Ich komme jetzt zumindest an den Punkt, das er die 131 frisst, aber in der unteren Schleife komme ich nicht zurecht.
Er findet die info[0] und ids Werte nicht
Gehe Schritt für Schritt durch. Was hat welcher Name in welchem Durchlauf für einen Wert. Lass Dir alles mittels ``print`` ausgeben. Dann überlege, welche Bedingung nicht eingetreten ist und wieso das der Fall sein muss.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Naja das ganze Teil ist für Nagios, Check-MK und so sieht es aus :
Ganz interessant finde ich gerade, das meine Schleife einen Teil "Verschluckt" Deswegen wird hier nichts grün.
Das habe ich auf der Konsole.
Später aber fehlt dieser dann auf einmal. Das macht mich ja jetzt ganz verrückt. Dummerweise ist die 7 normalerweise alive, die 6 down und die 3 wird aufgrund des Filters Ignoriert
Code: Alles auswählen
#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
def inventory_mist(info):
#print(info)
#import pprint ; pprint.pprint(info)
for int_index, interface, cat in info[0]:
if cat == '131':
yield interface, None
def check_mist(item, _no_params, info):
from itertools import chain
inter = info[0]
alive = info[1]
print(inter)
ids = set(chain.from_iterable(alive))
for element in inter:
print(element)
if element[2] == '131':
if element[0] in ids:
return (0, "OK")
else:
return (2, "Not found")
return (3, "UNKNOWN - not yet implemented")
mist_info = [
( ".1.3.6.1.2.1.2.2.1", ["1", "2", "3"]
),
( ".1.3.6.1.4.1.9.9.449.1.4.1.1", ["4"]
)
]
check_info["mist"] = {
"check_function" : check_mist,
"inventory_function" : inventory_mist,
"service_description" : "Status of %s",
"snmp_info" : mist_info
Das habe ich auf der Konsole.
Wie man ganz oben sieht, gibt es in der SNMP Abfrage der info einen index der mit 7 beginnt.[['1', 'GigabitEthernet1', '6'], ['2', 'GigabitEthernet2', '6'], ['3', 'GigabitEthernet3', '6'], ['4', 'Null0', '1'], ['5', 'Loopback10', '24'], ['6', 'Tunnel25', '131'], ['7', 'Tunnel5025', '131']]
['1', 'GigabitEthernet1', '6']
['2', 'GigabitEthernet2', '6']
['3', 'GigabitEthernet3', '6']
['4', 'Null0', '1']
['5', 'Loopback10', '24']
['6', 'Tunnel25', '131']
Status of Tunnel25 CRIT - Not found
[['1', 'GigabitEthernet1', '6'], ['2', 'GigabitEthernet2', '6'], ['3', 'GigabitEthernet3', '6'], ['4', 'Null0', '1'], ['5', 'Loopback10', '24'], ['6', 'Tunnel25', '131'], ['7', 'Tunnel5025', '131']]
['1', 'GigabitEthernet1', '6']
['2', 'GigabitEthernet2', '6']
['3', 'GigabitEthernet3', '6']
['4', 'Null0', '1']
['5', 'Loopback10', '24']
['6', 'Tunnel25', '131']
Status of Tunnel5025 CRIT - Not found
Später aber fehlt dieser dann auf einmal. Das macht mich ja jetzt ganz verrückt. Dummerweise ist die 7 normalerweise alive, die 6 down und die 3 wird aufgrund des Filters Ignoriert
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Irgend wie sehe ich immer noch nicht, *wie* ``info`` jetzt gefüllt wird
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Ich glaube, Hyperion will wissen, wie die eigentliche Struktur zustande kommt. Also nicht, wie du an die fertige Struktur kommst, sondern wo sie zusammengesetzt wird.
Ist das ein Skript, welches du verändern könntest? Ist es ein bestimmter Befehl, den du möglicherweise anders konfigurieren kannst? Oder ist die Struktur fest eingestellt?
Weil: Die Struktur ist halt recht unhandlich. Wenn man das Format dieser Struktur schon beim Erstellen beeinflussen könnte, dann würde man möglicherweise weniger umständlichen Python-Code schreiben müssen.
Ist das ein Skript, welches du verändern könntest? Ist es ein bestimmter Befehl, den du möglicherweise anders konfigurieren kannst? Oder ist die Struktur fest eingestellt?
Weil: Die Struktur ist halt recht unhandlich. Wenn man das Format dieser Struktur schon beim Erstellen beeinflussen könnte, dann würde man möglicherweise weniger umständlichen Python-Code schreiben müssen.
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
@trumm Ich weiß ja nicht, wozu Du das array brauchst, aber wenn es Dir darauf ankommst auf den hinteren Eintrag zu filtern, würde ich ein Dictionary nehmen, Du kannst es ja auch aus Deinem Array erzeugen:
Code: Alles auswählen
Dictionary = {}
def fill_dictionary(arr_entry):
entry = arr_entry[2]
index = arr_entry[0]
name = arr_entry[1]
if entry not in Dictionary: Dictionary[entry] = {}
Dictionary[entry][index] = name
fill_dictionary( ['6', 'Tunnel2','131'])
Guten Morgen,
ich muss nur wissen ob der zweite Eintrag vorhanden ist. Dies bedeutet ob auf einem Cisco Device ein VPN Tunnel steht, oder eben down ist.
Aktuell sieht das auch ganz gut aus. Ich hab noch eine andere Baustelle da muss ich mal gucken, warum er den letzten snmp-walk "verschluckt"
Danke für die Info.
ich muss nur wissen ob der zweite Eintrag vorhanden ist. Dies bedeutet ob auf einem Cisco Device ein VPN Tunnel steht, oder eben down ist.
Aktuell sieht das auch ganz gut aus. Ich hab noch eine andere Baustelle da muss ich mal gucken, warum er den letzten snmp-walk "verschluckt"
Danke für die Info.
Ich möchte mich nochmals bei allen die mir geholfen haben ganz herzlich bedanken.
Heute Vormittag habe ich meinen ersten check_mk check mit Python erfolgreich umsetzten können.
Und während ich so voller Freude war, bat man mich, diesen gleich zu erweitern und da kommt wieder mein Listen Problem.
Jetzt habe ich der Listen und muss ein andere andere hängen und wiederrum eine daraus machen. Wie kann ich zwei "zusammensetzten"
Ein Bsp.
Wie kann ich die Zahlen-Liste in Eins mit dem jeweiligen Wort aus liste zwei ergänzen, oder eine Große daraus machen ?
Das es so aussieht.
Heute Vormittag habe ich meinen ersten check_mk check mit Python erfolgreich umsetzten können.
Und während ich so voller Freude war, bat man mich, diesen gleich zu erweitern und da kommt wieder mein Listen Problem.
Jetzt habe ich der Listen und muss ein andere andere hängen und wiederrum eine daraus machen. Wie kann ich zwei "zusammensetzten"
Ein Bsp.
Code: Alles auswählen
liste = [
[
[1, 1],[2 ,2],[3, 3],[4, 4]
],
[
['Text'],['Wort'],[''],['Hilfe']
]
]
Das es so aussieht.
Code: Alles auswählen
[1, 1, Text], [2, 2, Wort],[3, 3, ''], [4, 4, Hilfe]
Code: Alles auswählen
>>> map(operator.add, *liste)
[[1, 1, 'Text'], [2, 2, 'Wort'], [3, 3, ''], [4, 4, 'Hilfe']]
Code: Alles auswählen
Import operator
Code: Alles auswählen
>>> import pprint
>>> import operator
>>> liste = [[[1, 1],[2 ,2],[3, 3],[4, 4]],[['Text'],['Wort'],[''],['Hilfe']]]
>>> b= map(operator.add, *liste)
>>> pprint.pprint(b)
<map object at 0x0000000002333208>
Wie man Fragen richtig stellttrumm hat geschrieben:leider funktioniert das irgendwie nicht
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Ich habs
Dank für das auf den richtigen Weg bringen
Code: Alles auswählen
import pprint
import operator
liste = [[[1, 1],[2 ,2],[3, 3],[4, 4]],[['Text'],['Wort'],[''],['Hilfe']]]
b = tuple(map(operator.add, *liste))
pprint.pprint(b)
>>>([1, 1, 'Text'], [2, 2, 'Wort'], [3, 3, ''], [4, 4, 'Hilfe'])